요즘IT에서 데이터리안의 윤선미님의 글 'SQL 가독성을 높이는 다섯 가지 사소한 습관'을 정리한 내용입니다.
예약어는 대문자로 작성하자
SELECT, FROM, GROUP BY, HAVING, AS, AND와 같은 SQL 예약어를 대문자로 쓰면 훨씬 잘 읽힌다.
에디터가 예약어를 하이라이팅해주기는 하지만 에디터마다 규칙이 다르기 때문에 대문자로 작성해서 가독성을 높이는 것이 좋다.
SELECT tip, total_bill
FROM tips
select tip, total_bill
from tips
행갈이를 자주 하자
쭉 작성한 코드는 작성하기에는 편하지만, 의미를 파악하기 위해서 모든 코드를 다 읽어봐야 한다.
적절히 행갈이를 해준 코드는 에약어만 확인하더라도 작성자의 의도와 코드 구조를 쉽게 파악할 수 있다.
SELECT day
, time
, SUM(total_bill)
FROM tips
GROUP BY day, time
SELECT day, time, SUM(total_bill) FROM tips GROUP BY day, time
행갈이를 더! 자주 하자
행갈이를 더! 자주하는 습관을 들이자.
SELECT day
, time
, SUM(total_bill)
FROM tips
WHERE sex = 'Femail'
AND smoker = 'Yes'
GROUP BY day
, time
SELECT day, time, SUM(total_bill)
FROM tips
WHERE sex = 'Femail' AND smoker = 'Yes'
GROUP BY day, time
위 첫 번째 예시처럼 코드를 작성하게 되면 주석처리를 할 때 진가를 발휜한다.
만약 위 코드에서 time 컬럼을 로직에서 제외하고 싶다고 해보자
SELECT day
-- , time
, SUM(total_bill)
FROM tips
WHERE sex = 'Femail'
AND smoker = 'Yes'
GROUP BY day
-- , time
이렇게 가끔 쿼리를 작성할 때 어떤 로직을 제외했다가 다시 포함해야 하는 일이 생길 수 있다.
WHERE절에서도 AND, OR이 붙을 때마다 행갈이를 해주면 아래와 같이 활용할 수 있다.
SELECT day
, time
, SUM(total_bill)
FROM tips
WHERE 1 = 1
-- AND sex = 'Femail'
AND smoker = 'Yes'
GROUP BY day
, time
가끔 SQL을 잘하는 분들을 보면 위와 같이 WHERE 절이 시작하자마자 1=1이라는 의미 없는 조건을 넣어주고 행가리을 한 다음 AND로 진짜 필터링 조건을 쓰는 경우가 있다.
주석을 쓰자
코드를 쓴 의도를 짧게 적어 놓는 습관을 들이는 것이 좋다.
특히 서브쿼리가 많아지고 코드가 길어질수록 각 코드 단락이 어떤 의도로 작성되었는지 적어 놓아야 다음에 그 코드를 읽었을 때 이해할 수 있다.
SELECT AVG(sales) avg_sales
FROM (
-- 요일별 매출액 합계 계산
SELECT day -- 일별 X 요일별 O
, SUM(total_bill) sales
FROM tips
WHERE sex = 'Female' -- 결제자의 성별이 여성인 경우
GROUP BY day
) daily_sales
주석은 서브쿼리 단위로 쓸 수도 있고, CASE, IF, 조건문 또는 WHERE절 필터링 조건을 쓸 때도 적어주는 것이 좋다.
- 서브쿼리의 단위로 의미를 작성
- 조건에 적는 주석의 경우, 단순히 '이 조건은 이거다'(What)라고 서술하는 건 별로 의미가 없다. 그러나 컬럼 이름만 보고 해석에 오해가 있을 수 있거나, 추가 설명이 필요한 경우에는 적어주는 것이 좋다.
- 조건이 왜 필요한지(Why), 어떻게 동작하는지(How) 같은 내용을 자세하게 적어 놓으면 다음에 코드를 이해하는 데 반드시 도움을 준다.
Alias를 잘 쓰자
주석을 잘 적는 것도 중요하지만, 결국 코드를 잘 써야 전체를 빠르게 이해할 수 있다.
혹시 서브쿼리, 컬럼 Alias를 x, y, t, df, a 등으로 대충 쓰고 있지는 않은가?
FROM절 서브쿼리 이름을 t1이라고 지었다가 아우터 쿼리 어디에서 t1.x + t2.y라는 코드를 발견했다고 가정해보자.
그 코드가 어떤 동작을 하는지 알려면 저 Alias를 쓴 서브쿼리까지 결국 다시 찾아가야 한다.
가장 중요한 건 합의된 규칙
가장 중요한 것은 내가 같이 일하는 사람들과 합의된 규칙이다.
아무리 좋은 방법이라도 팀에서 사용하고 있는 컨벤션에 위배된다면, 기존 구성원들을 설득하고 레거시 코드들을 죄다 바꾸는 수고를 하지 않는 한 일단 기존 제도를 따라야 한다.
무엇보다 이 코드를 나 말고 누군가가 볼거로 생각하면서 작성하고 정리하는 것이 중요하다.
마무리
항상 클린 코드를 비즈니스 로직 단에서의 코드에서만 고려했었는데, 앞으로 SQL을 작성할 때도 클린 코드의 개념을 고려하면서 작성해야겠다.
참조
'SQL' 카테고리의 다른 글
Oracle - LISTAGG (여러 컬럼을 하나의 컬럼으로 가져오기) (0) | 2023.07.24 |
---|---|
SQL - Oracle과 MySQL 문법 차이 (0) | 2023.06.28 |
SQL - MySQL 워크밴치에서 Foreign key 삭제하기 (0) | 2023.06.20 |
MySQL - 프로그래머스 164670. 조건에 맞는 사용자 정보 조회하기 (0) | 2023.05.29 |
Querydsl - Querydsl 프로젝션으로 DTO 조회 (0) | 2023.05.08 |