Oracle Database 강좌

오라클 SQL문을 보기 좋게 정렬하는 코딩 원칙

_Blue_Sky_ 2025. 4. 16. 00:02
728x90

오라클 SQL은 데이터베이스 작업에서 강력한 도구이지만, 복잡한 쿼리는 가독성이 떨어질 수 있습니다. 가독성 높은 SQL 코드는 유지보수, 디버깅, 협업을 쉽게 만듭니다. 이 글에서는 긴 SQL문을 보기 좋게 정렬하는 코딩 원칙을 소개합니다.
1. 키워드와 절의 대문자 사용
SQL 키워드(SELECT, FROM, WHERE 등)는 대문자로 작성하여 코드 구조를 명확히 합니다. 테이블명, 컬럼명 등은 소문자나 CamelCase로 구분하여 혼동을 줄입니다.
 
SELECT employee_id, first_name
FROM employees
WHERE department_id = 10;
2. 일관된 들여쓰기
절마다 들여쓰기를 적용해 계층 구조를 시각화합니다. 일반적으로 2~4칸 공백을 사용하며, 서브쿼리나 조인은 추가 들여쓰기로 구분합니다.
 
SELECT d.department_name,
       (SELECT COUNT(*)
        FROM employees e
        WHERE e.department_id = d.department_id) AS emp_count
FROM departments d
WHERE d.location_id = 1700;
3. 컬럼과 조건의 세로 정렬
다중 컬럼이나 조건은 세로로 정렬해 가독성을 높입니다. 각 컬럼이나 조건을 새 줄에 배치하고, 쉼표를 앞/뒤로 일관되게 배치합니다.
 
SELECT employee_id,
       first_name,
       last_name,
       hire_date
FROM employees
WHERE department_id = 20
  AND hire_date > TO_DATE('2020-01-01', 'YYYY-MM-DD');
4. 조인 조건 명시적 구분
JOIN 구문은 ON 절을 명확히 구분하고, 조인 조건을 세로로 정렬합니다. 테이블 별칭을 사용해 코드를 간결하게 유지합니다.
 
SELECT e.first_name,
       e.last_name,
       d.department_name
FROM employees e
INNER JOIN departments d
    ON e.department_id = d.department_id
WHERE d.location_id = 1800;
5. 서브쿼리와 CTE 활용
복잡한 쿼리는 서브쿼리나 공통 테이블 표현식(CTE)을 사용해 논리를 분리합니다. CTE는 쿼리 가독성을 크게 향상시킵니다.
 
 
WITH emp_summary AS (
    SELECT department_id,
           COUNT(*) AS emp_count
    FROM employees
    GROUP BY department_id
)
SELECT d.department_name,
       es.emp_count
FROM departments d
INNER JOIN emp_summary es
    ON d.department_id = es.department_id;
6. 주석으로 의도 설명
긴 쿼리에는 주석을 추가해 쿼리의 목적이나 복잡한 로직을 설명합니다. -- 또는 /* */를 활용합니다.
 
-- 부서별 직원 수를 계산
SELECT d.department_name,
       COUNT(e.employee_id) AS emp_count
FROM departments d
LEFT JOIN employees e
    ON d.department_id = e.department_id
GROUP BY d.department_name;
7. 불필요한 코드 제거
중복 조건, 사용되지 않는 컬럼, 불필요한 서브쿼리는 제거해 간결함을 유지합니다. 예를 들어, WHERE 절에서 상수 조건을 최적화합니다.
8. 일관된 네이밍 규칙
테이블, 컬럼, 별칭은 의미 있고 일관된 네이밍 규칙을 따릅니다. 예: emp는 직원, dept는 부서를 나타내는 식으로 약어를 통일합니다.
결론
위 원칙을 따르면 긴 SQL문도 가독성과 유지보수성이 크게 향상됩니다. 일관된 스타일, 명확한 구조, 적절한 주석은 팀 협업과 코드 품질을 높이는 핵심입니다. 연습을 통해 자신만의 스타일을 정립하세요!

하노이 탑 스타일로 SQL문 정렬하기: 가독성을 높이는 동사-목적어 분리 원칙


728x90
SQL, 특히 오라클에서 긴 쿼리를 작성할 때 가독성은 유지보수와 협업의 핵심입니다. 복잡한 쿼리가 한눈에 들어오지 않으면 디버깅이나 수정이 어려워집니다. 이를 해결하기 위한 방법 중 하나가 바로 하노이 탑 스타일로 SQL문을 정렬하는 것입니다. 이 방식은 **동사(키워드)**와 **목적어(컬럼, 테이블 등)**를 분리하고, 스페이스를 일치시켜 수직으로 정렬하여 마치 하노이 탑처럼 계층적이고 깔끔한 구조를 만듭니다. 이번 글에서는 이 원칙을 자세히 설명하고, 요청하신 "스페이스 하나로 정확히 가운데 수직 정렬" 방식을 예시로 다룹니다.

하노이 탑 스타일이란?
하노이 탑 스타일은 SQL문의 키워드(SELECT, FROM, WHERE 등)를 동사로, 그에 따른 항목(컬럼, 테이블, 조건 등)을 목적어로 보고, 이들을 시각적으로 분리하여 정렬하는 방법입니다. 특히, 스페이스를 일치시켜 모든 키워드와 항목이 수직으로 정렬되도록 하여 쿼리의 구조를 한눈에 파악할 수 있게 만듭니다. 이 방식은 긴 쿼리에서 특히 빛을 발하며, 마치 하노이 탑처럼 계층이 점진적으로 좁아지는 모양을 연상시킵니다.
요청하신 방식에서는 키워드와 항목 사이에 스페이스를 최소화(스페이스 하나)하고, 가운데 수직선을 기준으로 모든 요소가 정확히 정렬되는 점이 특징입니다. 이는 불필요한 공백을 줄이고 깔끔함을 극대화하는 접근입니다.

 


정렬 원칙
  1. 동사와 목적어 분리:
    • 동사: SELECT, FROM, JOIN, WHERE, ON, AND 등 SQL의 주요 키워드.
    • 목적어: 컬럼명(employee_id), 테이블명(employees), 조건(hire_date > '2010-01-01') 등.
    • 키워드와 항목 사이에 스페이스 하나만 두어 간결하게 분리.
  2. 수직 정렬:
    • 모든 키워드는 동일한 열(왼쪽)에, 항목은 그 오른쪽에 정렬.
    • 항목들은 가운데 수직선을 기준으로 세로로 일치하도록 공백을 조정.
  3. 최소 들여쓰기:
    • 불필요한 들여쓰기를 피하고, 스페이스 하나로 키워드와 항목을 연결.
    • JOIN의 ON이나 WHERE의 AND는 상위 키워드와 수직으로 정렬.
  4. 줄 바꿈으로 계층 표현:
    • SELECT, FROM, WHERE 등 주요 절은 줄 바꿈으로 구분.
    • 서브쿼리나 복잡한 조건은 추가 줄 바꿈으로 논리적 단위를 명확히.
  5. 하노이 탑 모양:
    • 쿼리의 상위 구조(SELECT, FROM)가 넓고, 하위 요소(ON, AND)가 점차 좁아지는 계층적 모양.
    • 요청하신 스타일은 공백을 최소화해 더 컴팩트한 하노이 탑을 형성.

예시로 보는 정렬 비교
요청하신 대로, 기존 SQL문과 가운데 수직 정렬 스타일을 비교해보겠습니다.
기존 SQL (일반 하노이 탑 스타일)
 
 
SELECT    e.employee_id
        , e.first_name
        , d.department_name
  FROM    employees     e
  JOIN    departments   d
    ON    e.department_id = d.department_id
 WHERE    e.hire_date   > '2010-01-01'
   AND    d.location_id = 1700
 ORDER BY e.employee_id;
  • 특징: 키워드와 항목 사이에 공백이 넉넉히 들어가며, 들여쓰기로 계층을 강조.
  • 문제점: 공백이 많아 다소 길어 보일 수 있음.
요청하신 스타일 (가운데 수직 정렬)
 
  SELECT e.employee_id
       , e.first_name
       , d.department_name
    FROM employees e
    JOIN departments d
      ON e.department_id = d.department_id
   WHERE e.hire_date > '2010-01-01'
     AND d.location_id = 1700
ORDER BY e.employee_id;
  • 특징:
    • 키워드(SELECT, FROM 등)와 항목 사이에 스페이스 하나만 사용.
    • 모든 키워드는 왼쪽 끝에, 항목은 가운데 수직선을 따라 정렬.
    • ON, AND 등은 상위 키워드와 수직으로 맞춰 계층을 유지.
    • 쉼표(,)는 항목 바로 뒤에 붙여 간결함 강조.
  • 효과: 공백이 최소화되어 컴팩트하고, 수직선이 명확해 구조 파악이 쉬움.

왜 이 방식이 좋은가?
  1. 가독성 극대화:
    • 스페이스 하나로 키워드와 항목이 분리되어, 눈이 자연스럽게 쿼리 흐름을 따라감.
    • 가운데 수직 정렬로 컬럼, 테이블, 조건이 일렬로 보이며 혼란 감소.
  2. 컴팩트한 구조:
    • 불필요한 공백을 줄여 긴 쿼리도 화면에 더 많이 표시 가능.
    • 하노이 탑의 계층감은 유지하면서도 간결함을 더함.
  3. 디버깅 용이:
    • 잘못된 조인이나 누락된 조건이 수직선에서 쉽게 드러남.
    • 예를 들어, ON 절의 컬럼명이 틀리면 정렬이 어긋나 눈에 띔.
  4. 협업 효율성:
    • 팀원 모두가 동일한 포맷을 사용하면 코드 리뷰가 빨라짐.
    • 특히 복잡한 쿼리에서 논리적 오류를 빠르게 공유 가능.

적용 시 주의점
  1. 일관성 유지:
    • 팀 내에서 스페이스 하나 규칙을 합의하고, 모든 쿼리에 적용.
    • 혼합된 포맷(스페이스 2칸, 4칸 섞임)은 오히려 혼란 초래.
  2. 도구 활용:
    • SQL Developer, DBeaver 같은 툴의 포맷팅 기능을 커스터마이징해 이 스타일을 자동 적용.
    • 수동 정렬은 시간이 걸리므로, 툴 설정으로 효율화 추천.
  3. 쿼리 길이 관리:
    • 너무 긴 쿼리는 CTE나 서브쿼리로 나눠 가독성을 더 높임.
    • 예: 복잡한 JOIN은 WITH 절로 분리 후 정렬.
  4. 과도한 최적화 피하기:
    • 스페이스 하나만 쓰는 방식은 깔끔하지만, 지나치게 압축하면 오히려 읽기 어려울 수 있음.
    • 필요한 경우 주석(--)으로 논리적 단위를 설명.

더 복잡한 예시
복잡한 쿼리에 이 스타일을 적용해보겠습니다.
 
      SELECT d.department_name
           , COUNT(e.employee_id) AS emp_count
           , AVG(e.salary) AS avg_salary
        FROM employees e
   LEFT JOIN departments d
          ON d.department_id = e.department_id
       WHERE e.hire_date >= '2015-01-01'
         AND e.job_id IN ('SA_REP', 'IT_PROG')
    GROUP BY d.department_name
      HAVING COUNT(e.employee_id) > 5
    ORDER BY emp_count DESC;
  • 분석:
    • SELECT의 컬럼과 집계 함수가 수직으로 정렬.
    • FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY가 왼쪽에, 항목은 오른쪽에 스페이스 하나로 연결.
    • IN 절의 값도 깔끔히 정렬되어 가독성 유지.

마무리
하노이 탑 스타일로 SQL문을 정렬하는 것은 단순히 예쁘게 보이려는 것이 아니라, 가독성과 유지보수성을 높이는 실용적인 방법입니다. 특히 요청하신 스페이스 하나로 가운데 수직 정렬 방식은 공백을 최소화하면서도 쿼리의 논리적 구조를 명확히 드러냅니다. 이 포맷을 팀 규칙으로 정하고, 포맷팅 도구를 활용하면 긴 오라클 SQL문도 쉽게 다룰 수 있습니다.

 

728x90