한국어

SQL 포맷터 — SQL 쿼리 정리·들여쓰기 예쁘게

SQL 쿼리 정리 (MySQL·PostgreSQL 등 방언, 키워드 대소문자, 들여쓰기)

브라우저에서 처리 · 서버로 전송되지 않음

키워드 대소문자
들여쓰기

정리된 SQL

소개

복사해 온 쿼리가 한 줄로 길게 이어져 있거나 들여쓰기가 제각각이면 읽기도, 코드 리뷰도 어렵습니다. 이 도구는 SQL을 SELECT, FROM, WHERE 같은 절 단위로 줄을 나누고 일정하게 들여써 줍니다. 입력하는 즉시 결과가 바뀝니다.

사용법

  1. SQL을 입력 칸에 붙여 넣습니다. 세미콜론으로 구분된 여러 문장도 됩니다.
  2. 사용하는 데이터베이스에 맞춰 방언을 고릅니다.
  3. 키워드를 대문자, 소문자, 입력 그대로 중에서 고릅니다.
  4. 들여쓰기를 2칸, 4칸, 탭 중에서 고르고 결과를 복사합니다.

기준

  • 서식 변환은 오픈소스 sql-formatter 라이브러리가 맡습니다. 입력을 토큰으로 나눈 뒤 절과 괄호의 깊이에 따라 줄바꿈과 들여쓰기를 정합니다.
  • 지원 방언은 표준 SQL, MySQL, PostgreSQL, MariaDB, SQLite, BigQuery, Oracle(PL/SQL), SQL Server(T-SQL)입니다. 방언에 따라 식별자 따옴표(`, ", [ ]), 파라미터 표기(?, $1, @name), 연산자가 달라집니다.
  • 키워드 대소문자 옵션은 예약어에만 적용합니다. 문자열 리터럴, 주석, 식별자(테이블·열 이름, 한글 포함)는 바꾸지 않습니다.
  • 들여쓰기 탭 옵션은 한 단계마다 탭 문자 하나를 씁니다.
  • 서식만 바꾸며 쿼리를 실행하거나 문법의 의미를 검증하지 않습니다.

예시

입력:

select id, name from users where age > 20 and city = '서울' order by name

결과(표준 SQL, 대문자, 2칸):

SELECT
  id,
  name
FROM
  users
WHERE
  age > 20
  AND city = '서울'
ORDER BY
  name

참고

  • 코드 리뷰나 이슈에 쿼리를 붙이기 전에 정리해 두면 어느 절에서 조건이 걸리는지 한눈에 보입니다.
  • 서브쿼리나 CASE 문은 괄호와 END를 기준으로 한 단계씩 더 들여씁니다.
  • 프로시저나 트리거처럼 방언 고유 구문이 긴 스크립트는 일부가 기대와 다르게 정리될 수 있으니 결과를 한 번 읽어 보세요.
  • 입력 SQL에 한글 테이블명이나 열 이름이 있어도 그대로 유지되며, 방언에 맞는 따옴표로 감싸 두면 더 안전합니다.

자주 겪는 경우

  • JOIN이 여러 개인 쿼리는 각 JOIN ... ON 조건이 별도 줄로 나뉘어, 어떤 테이블이 어떤 조건으로 연결되는지 위에서 아래로 읽을 수 있습니다.
  • -- 한 줄 주석과 /* */ 블록 주석은 위치와 내용을 그대로 유지합니다. 주석 안의 키워드는 대문자로 바뀌지 않습니다.
  • MyBatis의 #{id}, #{name,jdbcType=VARCHAR}, ${table}은 어떤 방언을 골라도 그대로 둡니다. MySQL에서 #은 원래 한 줄 주석 기호지만, #{로 시작하는 부분은 주석이 아니라 파라미터로 다룹니다. 여러 줄에 나눠 쓴 #{name, jdbcType=VARCHAR}도 그대로 두지만, #{list[${i}]}처럼 중괄호가 겹친 형태는 지원하지 않습니다.
  • 바인드 파라미터는 ?와 :name을 표준 SQL·MySQL·MariaDB에서, $1과 :name을 PostgreSQL에서, :name을 Oracle에서, @name을 SQL Server·BigQuery에서 받습니다. SQLite는 ?, ?1, :name, @name, $name을 모두 받습니다. 이 밖의 표기를 쓰면 오류가 날 수 있으니 방언을 바꿔 보세요.
  • INSERT ... VALUES처럼 값 목록이 긴 구문은 괄호 단위로 줄을 나눕니다. 수백 행짜리 덤프도 입력할 수 있지만 매우 크면 느려질 수 있습니다.
  • 서식을 바꿔도 쿼리의 의미는 같으므로, 정리한 쿼리를 그대로 실행해도 결과가 달라지지 않습니다. 다만 문자열 안의 공백은 건드리지 않습니다.

활용 팁

  • 방언 선택이 중요합니다. 같은 쿼리라도 PostgreSQL의 ::int 형 변환이나 MySQL의 백틱 식별자는 해당 방언을 골라야 올바르게 정리됩니다. 모르겠다면 표준 SQL로 시작해 오류가 나는지 보세요.
  • 팀 코드 스타일에 맞춰 키워드는 대문자, 들여쓰기는 2칸으로 통일하면 쿼리 리뷰가 훨씬 수월해집니다. 한 번 정한 옵션을 매번 같게 쓰는 것이 핵심입니다.
  • ORM이 로그로 남긴 한 줄짜리 쿼리를 붙여 넣으면 어떤 조건과 조인이 생성됐는지 바로 파악할 수 있습니다. 바인드 파라미터 ?와 MyBatis #{…}는 그대로 남으니 실제 값은 직접 대입해 보세요.
  • 정리한 쿼리를 문서에 붙일 때는 코드 블록에 sql을 지정하세요. 가독성이 올라갑니다.
  • 데이터베이스 접속 정보나 개인정보가 포함된 쿼리라도 서버로 전송되지 않으므로 안심하고 붙여 넣으세요.

더 알아두면 좋은 점

  • 세미콜론으로 끝나는 여러 문장은 각각 정리되고 문장 사이에 빈 줄이 들어갑니다. 마이그레이션 스크립트처럼 긴 파일도 한 번에 붙여 넣을 수 있습니다.
  • WITH로 시작하는 CTE는 이름마다 괄호 블록으로 나뉘어 읽기 쉬워집니다. UNION 앞뒤의 쿼리도 서로 분리됩니다.
  • 쿼리가 문법적으로 완전하지 않더라도, 일부만 붙여 넣어 서식을 확인하는 용도로 쓸 수 있습니다.
  • 서식을 적용해도 ; 위치와 문장의 순서는 바뀌지 않습니다. 정리 전후를 비교하고 싶다면 두 결과를 diff 도구에 넣어 공백 차이만 있는지 확인하세요.
  • 따옴표로 감싼 문자열 안의 select 같은 단어는 키워드로 보지 않으므로 대소문자 옵션을 바꿔도 값이 달라지지 않습니다.
  • 입력이 비어 있으면 아무것도 표시하지 않습니다.

추가 예시

입력(일부) 정리 결과의 특징
select * from a join b on a.id=b.a_id JOIN과 ON 조건이 각각 새 줄로 나뉩니다
insert into t (a,b) values (1,2) 열 목록과 값 목록이 괄호 단위로 정리됩니다
update t set a=1 where id=2 SET과 WHERE가 각각 절 단위로 나뉩니다
with x as (select 1) select * from x CTE 본문이 괄호 안에서 한 단계 들여써집니다

같은 입력이라도 키워드 옵션만 바꾸면 select가 SELECT로, 또는 그 반대로 바뀝니다. 입력 그대로 옵션은 사용자가 쓴 대소문자를 유지하므로 일부만 대문자인 쿼리도 건드리지 않습니다. 정리 전의 쿼리와 정리 후의 쿼리는 같은 토큰으로 이루어져 있으니 안심하고 비교하세요.

정리한 결과를 팀 위키나 이슈 트래커에 붙여 넣으면 다른 사람이 쿼리의 구조를 빠르게 이해할 수 있습니다. 긴 쿼리는 절별로 나뉘어 있어서 코멘트를 달기도 쉽습니다.

옵션은 입력을 지우지 않고 바꿀 수 있으므로 대문자와 소문자, 들여쓰기 칸 수를 번갈아 선택하며 팀의 스타일에 가장 잘 맞는 모양을 고르세요. 결과 칸의 복사 버튼은 현재 선택한 옵션이 적용된 내용을 가져갑니다.

자주 묻는 질문

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

아니요. 정리는 브라우저에서 sql-formatter 라이브러리가 처리하며 쿼리를 전송하거나 저장하지 않습니다. 그래도 실제 비밀번호나 개인정보가 든 쿼리는 공유 화면에 띄우지 않도록 주의하세요.

방언은 어떤 걸 골라야 하나요?

쓰는 데이터베이스에 맞춰 고르세요. MySQL의 백틱(`)이나 PostgreSQL의 `::` 캐스트, `$1` 파라미터처럼 방언마다 다른 문법을 올바르게 인식하게 됩니다. 잘 모르겠다면 표준 SQL로 시작하세요.

MyBatis 매퍼의 #{id}나 ${table}도 정리되나요?

네. 매퍼 XML에서 쿼리 부분만 복사해 붙여 넣으면 #{…}와 ${…}는 글자 그대로 두고 나머지만 정리합니다. MySQL 방언에서도 #{가 주석으로 바뀌지 않습니다. if·foreach 같은 동적 SQL 태그는 SQL이 아니어서 지우고 넣어야 합니다.

정리하면 쿼리 결과가 달라지나요?

공백, 줄바꿈, 키워드 대소문자만 바뀌고 문자열·주석·식별자 내용은 그대로입니다. 따옴표 안의 값은 대소문자를 바꿀 때도 건드리지 않으므로 쿼리의 동작은 같습니다.

오류가 난다고 하면 어떻게 하나요?

닫히지 않은 따옴표나 선택한 방언이 지원하지 않는 기호가 있으면 해석하지 못합니다. 오류 문구에 막힌 줄과 칸, 그 자리의 글자가 나오니 그 위치를 확인하거나 다른 방언을 시도해 보세요. 이 도구는 문법 검사기가 아니라 서식 도구라서 모든 오류를 찾아 주지는 않습니다.

필요한 도구가 있나요?