SQL 포맷터

SELECT·JOIN·서브쿼리가 뒤엉킨 SQL을 절 단위로 줄바꿈해 읽기 좋게 정렬하고, 한 줄로 압축합니다.

📁 .sql 파일을 끌어다 놓거나 클릭해서 선택
파일은 브라우저에서만 읽습니다 · 최대 8MB
결과

토크나이저 기반이라 안전합니다. 문자열 리터럴('...')과 주석(--, /* */) 안의 내용은 원문 그대로 둡니다. 문자열 안에 select 같은 단어가 있어도 키워드로 착각해 대문자로 바꾸거나 그 자리에서 줄을 바꾸지 않습니다.
방언 차이 — MySQL: 백틱(`ident`) 식별자, 문자열 안 역슬래시 이스케이프. PostgreSQL: 달러 인용($$ ... $$), 중첩 블록 주석. 표준: 큰따옴표·대괄호 식별자. 문법 전체를 검증하지는 않으며 토큰 경계를 잡기 위한 차이입니다.

SQL 포맷터란?

로그에 찍힌 쿼리나 ORM이 뱉어낸 SQL은 대개 한 줄로 길게 뭉쳐 있어서 어디가 JOIN 조건이고 어디가 서브쿼리인지 눈으로 따라가기 어렵습니다. 이 포맷터는 SELECT·FROM·WHERE·JOIN·GROUP BY·HAVING·ORDER BY·LIMIT 같은 주요 절마다 줄을 바꾸고, 괄호 안에 SELECT가 들어 있으면 서브쿼리로 보고 한 단계 들여씁니다. WHERE 절의 AND·OR, CASE 문의 WHEN·ELSE·END 도 줄을 나눠 조건 구조가 한눈에 보이게 합니다. 콤마를 줄 끝에 둘지 앞에 둘지, 키워드를 대문자로 쓸지 소문자로 쓸지는 팀 컨벤션에 맞춰 고르면 됩니다. 중요한 건 토크나이저를 제대로 짰다는 점입니다. 문자열 리터럴 안의 내용이나 -- 와 /* */ 주석 안의 글자는 절대 건드리지 않기 때문에, 문자열 안에 우연히 select 라는 단어가 들어 있어도 대문자로 바뀌거나 줄이 잘리는 일이 없습니다.

사용 방법

  1. 입력창에 SQL을 붙여넣거나 .sql 파일을 끌어다 놓습니다.
  2. 방언(표준/MySQL/PostgreSQL)을 고릅니다. 백틱(`)이나 대괄호 식별자, 달러 인용($$) 처리가 달라집니다.
  3. 키워드 대소문자와 콤마 위치(뒤/앞), 들여쓰기 칸 수를 취향에 맞게 설정합니다.
  4. "정렬"을 누르면 절 단위로 줄바꿈된 SQL이, "압축"을 누르면 한 줄로 뭉친 SQL이 나옵니다.
  5. 결과를 복사하거나 .sql 파일로 저장합니다.

SQL 포맷터 사용 가이드

실제 작업에서 이 도구를 어떻게 쓰는지, 무엇을 조심해야 하는지 정리했습니다.

포맷이 유지보수 비용인 이유

한 줄로 뭉친 200자짜리 쿼리는 "지금 당장" 읽기만 어려운 게 아닙니다. 진짜 비용은 6개월 뒤에 옵니다. 조건 하나를 추가하려고 커서를 세 번 잘못 놓고, 리뷰어는 어디가 바뀌었는지 몰라 통째로 다시 읽습니다.

절 단위로 줄이 나뉘어 있으면 git diff 가 "WHERE 절에 조건 한 줄이 추가됨"으로 보입니다. 한 줄짜리 쿼리는 같은 변경이 "이 줄이 통째로 바뀜"으로 나옵니다. 코드 리뷰가 되느냐 마느냐가 여기서 갈립니다.

그래서 정렬은 취향 문제가 아니라, 저장소에 커밋할 SQL이라면 팀 안에서 한 가지 설정으로 통일해 두는 편이 이득입니다. 이 도구의 키워드 대소문자·콤마 위치·들여쓰기 설정은 브라우저에 저장되므로, 한 번 맞춰 두면 계속 같은 모양으로 나옵니다.

콤마 앞이냐 뒤냐 — 오래된 논쟁의 실제 근거

보기에는 취향 싸움 같지만, 앞 콤마(leading comma)를 고집하는 쪽에는 구체적인 이유가 있습니다. SQL은 마지막 항목 뒤의 콤마(trailing comma)를 문법 오류로 봅니다. 자바스크립트와 다른 지점입니다.

sql
-- 줄 뒤 콤마: 마지막 줄에 컬럼을 추가하면 앞줄도 함께 고쳐야 한다
SELECT
  id,
  name,        -- 여기에 콤마 추가를 잊으면 문법 오류
  email
FROM users

-- 줄 앞 콤마: 새 줄만 추가하면 끝. 마지막 줄을 주석 처리해도 안전하다
SELECT
  id
  , name
  , email
FROM users
줄 뒤 (a,)줄 앞 (, a)
읽기자연스러움 — 대부분의 팀 기본값익숙해지기 전엔 어색함
컬럼 추가·삭제앞줄 콤마를 함께 고쳐야 함해당 줄만 건드리면 끝
diff 노이즈컬럼 추가 시 2줄이 바뀜1줄만 바뀜
마지막 줄 임시 주석 처리앞줄에 콤마가 남아 오류안전
정답은 없습니다. 다만 하나만 고르세요. 한 파일 안에 두 스타일이 섞이는 것이 어느 쪽을 고르는 것보다 나쁩니다. "SELECT 컬럼 한 줄에 하나씩"을 끄면 컬럼이 한 줄에 이어지므로, 컬럼이 두세 개뿐인 짧은 쿼리에는 그쪽이 나을 수 있습니다.

문자열·주석을 건드리지 않는 것이 왜 결정적인가

인터넷에 굴러다니는 SQL 포맷터 중 상당수는 정규식 치환으로 만들어져 있습니다. "select 를 SELECT 로 바꾸고 from 앞에서 줄을 바꾼다" 식입니다. 평범한 쿼리에서는 잘 돌아갑니다.

문제는 데이터에 그 단어가 들어 있을 때입니다. 이 도구는 SQL을 토큰 단위로 쪼갠 뒤 문자열 리터럴과 주석을 통째로 하나의 토큰으로 다루기 때문에, 안에 무슨 글자가 있든 원문 그대로 나옵니다.

  • WHERE memo NOT LIKE '%select from where%' — 정규식 포맷터는 문자열 한가운데서 줄을 바꿔 쿼리를 망가뜨립니다.
  • WHERE title = 'Order by 판매량' — 한국어 상품명·게시글 제목에 영문 키워드가 섞이는 일은 흔합니다.
  • -- 여기는 order by 를 넣지 말 것 — 주석 안의 단어까지 대문자로 바뀌면 리뷰가 지저분해집니다.
  • SELECT '3''4' — 작은따옴표 두 개로 이스케이프한 값의 경계를 정확히 잡습니다.
압축(Minify)은 기본적으로 주석을 지웁니다. -- 주석은 줄 끝까지가 주석 범위라, 한 줄로 뭉치면 뒤에 오는 SQL 전체가 주석에 먹혀 버리기 때문입니다. 주석을 남겨야 한다면 "압축할 때 주석 유지"를 켜세요. 이 경우 -- 주석 뒤에는 줄바꿈이 남으므로 완전한 한 줄이 되지는 않습니다.

방언 선택은 언제 의미가 있나

표준·MySQL·PostgreSQL 선택은 문법 검증이 아니라 토큰 경계를 잡기 위한 것입니다. 어떤 문자가 식별자 인용이고 어떤 것이 문자열인지가 방언마다 다릅니다. 아래 경우가 아니면 표준으로 둬도 결과가 같습니다.

방언달라지는 것이걸 골라야 할 때
MySQL백틱 식별자, 문자열 안의 역슬래시 이스케이프백틱을 쓰거나 역슬래시가 든 문자열이 있을 때
PostgreSQL달러 인용($$ … $$), 중첩되는 블록 주석함수 본문(CREATE FUNCTION … $$)이 들어 있을 때
표준큰따옴표·대괄호 식별자위 두 경우가 아닐 때 · SQL Server 스타일
"예시 넣기"를 누르면 방언이 MySQL로 바뀌면서, 문자열 안의 키워드·한글 별칭·CASE 문·서브쿼리가 모두 들어간 쿼리가 채워집니다. 정렬 결과를 한번 보고 팀 설정을 정하기 좋습니다.

한계 — 이건 포맷터지 파서가 아닙니다

문법 오류가 있는 SQL도 토큰 단위로는 정렬됩니다. 실행되지 않을 쿼리가 예쁘게 나올 수 있다는 뜻입니다. 다만 따옴표가 안 닫혔거나 괄호 짝이 안 맞아 토큰 경계가 깨지면 경고를 표시합니다.

ORM이 뱉은 로그를 넣을 때는 플레이스홀더에 주의하세요. ? 나 $1 은 그대로 남고, 파이썬 로거가 %s 로 찍은 쿼리도 값이 채워지지 않은 상태입니다. 실제로 실행해 볼 거라면 로그의 파라미터 배열을 보고 직접 채워야 합니다.

결과 통계의 "서브쿼리 깊이"는 점검의 출발점이 됩니다. 깊이가 3을 넘고 IN (SELECT …) 이 섞여 있으면 한 번 들여다볼 만합니다. 다만 이 도구는 실행 계획을 알지 못하므로, 성능 판단은 반드시 실제 DB의 EXPLAIN 으로 하세요.

자주 묻는 질문

문자열이나 주석 안의 내용도 바뀌나요?

아니요. 이 도구는 SQL을 토큰 단위로 쪼갠 뒤 문자열 리터럴과 주석은 통째로 하나의 토큰으로 다뤄 원문 그대로 출력합니다. 문자열 안에 select, from 같은 단어가 있어도 키워드로 오인해 대문자로 바꾸거나 그 자리에서 줄을 바꾸는 일이 없습니다. 단순 정규식 치환으로 만든 포맷터와의 결정적인 차이입니다.

방언을 고르면 뭐가 달라지나요?

MySQL을 고르면 백틱으로 감싼 식별자와 문자열 안의 역슬래시 이스케이프를 인식합니다. PostgreSQL을 고르면 $$ 달러 인용 문자열과 중첩 가능한 블록 주석을 처리합니다. 표준을 고르면 큰따옴표와 대괄호 식별자를 인식합니다. 문법 전체를 검증하는 게 아니라 토큰 경계를 정확히 잡기 위한 차이입니다.

압축하면 주석은 어떻게 되나요?

기본적으로 주석을 제거합니다. -- 주석은 줄 끝까지가 주석이라 한 줄로 뭉치면 뒤에 오는 SQL이 통째로 주석에 먹히기 때문입니다. 주석을 남기고 싶으면 "압축 시 주석 유지"를 켜세요. 이 경우 -- 주석 뒤에는 줄바꿈이 남습니다.

문법 오류도 잡아 주나요?

이 도구는 포맷터이지 파서·검증기가 아닙니다. 문법이 틀린 SQL도 토큰 단위로는 정렬됩니다. 다만 닫히지 않은 따옴표나 짝이 맞지 않는 괄호처럼 토큰 경계가 깨지는 경우에는 경고를 표시합니다.

입력한 쿼리가 서버로 전송되나요?

아니요. 포맷팅은 전부 브라우저 안에서 실행됩니다. 실제 운영 DB의 테이블명이나 조건이 들어 있는 쿼리도 외부로 나가지 않습니다.