SQL 포매터

로그나 ORM에서 복사한 한 줄짜리 SQL 문을 붙여 넣으면, 포매터가 이를 들여쓰기된 절로 나눕니다, 일관된 키워드 대소문자, SELECT·FROM·WHERE·GROUP BY 앞 줄 바꿈, 프로젝션의 정렬된 컬럼까지요. MySQL, PostgreSQL, SQL Server, Oracle, SQLite, BigQuery 방언을 지원하며, 각각 키워드와 예약어가 조금씩 다릅니다.

포매팅이 작동하는 방식

  1. 1

    SQL 붙여넣기

    한 줄짜리 덩어리, Hibernate의 압축된 출력 등 무엇이든요. `;`로 구분된 여러 문장도 모두 포맷됩니다.

  2. 2

    방언과 스타일 선택

    방언은 키워드 목록을 제어하고, 스타일은 쉼표 위치(선행 vs 후행), 들여쓰기 폭, 키워드 대/소문자를 제어합니다.

  3. 3

    정규식 치환이 아니라 토큰 파싱

    토크나이저가 문자열, 주석, 괄호, 서브쿼리를 올바르게 처리합니다. 문자열 리터럴은 그대로 보존됩니다.

  4. 4

    포맷된 출력 복사

    검증된 SQL: 의미는 그대로, 레이아웃은 더 깔끔합니다.

변환 전후

변환 전:

SELECT u.id,u.name,COUNT(o.id) AS orders FROM users u LEFT JOIN orders o ON o.user_id=u.id WHERE u.created_at>='2024-01-01' GROUP BY u.id,u.name HAVING COUNT(o.id)>5 ORDER BY orders DESC LIMIT 50;

변환 후(선행 쉼표, 대문자 키워드, 2칸 들여쓰기):

SELECT
    u.id
  , u.name
  , COUNT(o.id) AS orders
FROM users u
LEFT JOIN orders o
  ON o.user_id = u.id
WHERE u.created_at >= '2024-01-01'
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 5
ORDER BY orders DESC
LIMIT 50;

중요한 스타일 선택

  • 대문자 vs 소문자 키워드. 대문자는 전통적이고 눈에 잘 띕니다. 소문자는 구문 강조가 있는 현대 코드 에디터에서 더 깔끔합니다.
  • 선행 vs 후행 쉼표. 선행( , col)은 단일 컬럼을 주석 처리하기 쉽습니다. 후행(col,)은 글로 읽을 때 더 자연스럽습니다.
  • GROUP BY의 쉼표 위치. 긴 절은 한 줄에 하나씩, 짧은 절은 인라인으로 두는 경우가 많습니다.
  • JOIN 들여쓰기. ON을 다음 줄에(걸린 들여쓰기) vs 같은 줄에. 긴 조건은 걸린 들여쓰기가 유리합니다.
  • 서브쿼리. 여는 괄호만이 아니라 서브쿼리 전체를 들여씁니다.

방언별 함정

  • MySQL 백틱 vs PostgreSQL 식별자용 큰따옴표.
  • WITH CTE, MS SQL은 WITH 앞에 ;가 필요합니다. 포매터가 처리합니다.
  • 윈도우 함수, 긴 OVER (...) 절은 PARTITION BYORDER BY를 줄 바꿈하면 유리합니다.
  • BigQuery에는 토크나이저가 깨뜨려서는 안 되는 ARRAY_AGG, STRUCT, 테이블 접미사(*_yyyymmdd)가 있습니다.
  • Oracle에는 (+) 외부 조인 구문이 있습니다, 포매터는 이를 보존하되 레거시로 표시합니다.

포매터가 하지 않는 것

  • 버그 수정, 잘못된 JOIN은 잘못된 채로 남습니다.
  • SELECT * 전개, 컬럼 목록은 스키마에서 추론되지 않습니다.
  • 쿼리 최적화, 레이아웃만, 실행 계획은 아닙니다.
  • 서브쿼리를 CTE로 재작성, 별개의 문제입니다.

자주 묻는 질문

아니요, 순전히 외형적입니다. 공백, 줄 바꿈, 쉼표 위치는 이동하지만 키워드, 연산자, 리터럴, 식별자는 정확히 보존됩니다.

지원합니다, CREATE TABLE, ALTER, CREATE PROCEDURE, 트리거까지요. 포매터는 블록 구문(BEGIN ... END)과 프로시저 내부의 줄 연속을 처리합니다.

깨지지 않아야 합니다, 만약 깨진다면 방언 불일치일 가능성이 높습니다. 방언을 바꿔 보세요. 지속되는 실패는 신고해 주세요. 버그로 취급합니다.

Flink SQL과 Cassandra CQL은 비슷해 보이지만 주류 포매터가 망가뜨리는 방언별 키워드가 있습니다. 주의해서 쓰고 출력이 실행되는지 검증하세요.

관련 도구

이 도구는 다른 언어로도 제공됩니다