“이 쿼리, 너무 빽빽해서 읽을 수가 없네…”

운영 시스템이 한 줄로 뭉쳐 뱉어낸 거대한 SQL 쿼리. 혹은 중첩된 JOIN이 미로처럼 쌓인 스토어드 프로시저. “이 조건은 어디서 갈라지는 거지?”—이런 SQL 벽을 마주하는 건 익숙한 좌절감입니다.

**SQL 포매터**는 붙여넣은 SQL을 완전히 브라우저 안에서 재정리합니다. 민감한 프로덕션 쿼리도 절대 밖으로 나가지 않습니다.

SQL 포맷터로 쿼리를 읽기 쉽게 만드는 방법: 방언 선택이 왜 중요한가

정리 전/후

select users.id,users.name,count(orders.id) from users left join orders on users.id=orders.user_id where users.deleted_at is null group by users.id,users.name order by users.id desc;
SELECT
  users.id,
  users.name,
  COUNT(orders.id)
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE users.deleted_at IS NULL
GROUP BY
  users.id,
  users.name
ORDER BY users.id DESC;

레이아웃만 정돈해도 빠진 조건, JOIN의 방향, 집계 단위를 훨씬 쉽게 알아챌 수 있습니다.

왜 “방언(dialect)” 선택이 필수인가

SQL 포맷터는 줄바꿈과 들여쓰기를 결정하기 전에 토큰화하고 문법을 이해해야 합니다. 즉 방언별 확장 문법이 정리의 성패를 직접 좌우합니다.

방언 차이표준 SQLMySQLPostgreSQLBigQuery
식별자 인용"name"`name`"name"`project.dataset.table`
문자열 결합||CONCAT()||||
LIMIT 구문LIMIT nLIMIT nLIMIT n OFFSET mLIMIT n
배열/구조체비표준미지원ARRAY[...]STRUCT<...>

예를 들어 MySQL의 백틱 인용 식별자를 표준 SQL로 파싱하면, 토큰 경계가 어긋나 정리 결과가 완전히 깨질 수 있습니다. “정리 결과가 이상하다”는 문제의 대부분은 방언을 잘못 선택했기 때문입니다. 이 도구는 PostgreSQL, MySQL, MariaDB, SQL Server, BigQuery 등 주요 방언을 지원하며, 실제로 사용 중인 데이터베이스에 맞춰 선택하면 방언을 바꿀 때마다 자동으로 재정리됩니다.

SQL 리뷰에서 확인할 점

정리한 뒤에는 몇 가지를 더 확인하면 리뷰의 질이 올라갑니다.

  • WHERE 조건이 의도한 대로 동작하는가
  • JOIN 조건이 빠지지 않았는가
  • LEFT JOININNER JOIN의 선택이 올바른가(SQL JOIN 완전 레퍼런스에서 전체 내용을 다룹니다)
  • GROUP BY의 집계 단위가 예상과 같은가
  • 필요한 곳에 ORDER BYLIMIT이 들어있는가
  • 서브쿼리와 CTE가 각각 명확한 역할을 하는가

로그에서 뽑아낸 SQL은 플레이스홀더가 전부 전개되어 있어 특히 길어지기 쉽습니다. 읽기 전에 정리하는 것만으로 조사 시간을 크게 줄일 수 있습니다.

정리는 “보기 좋게”만이 아니다

포맷터를 거치는 진짜 가치는 겉모습보다 다음 3가지 효과에 있습니다.

  1. 구문 오류의 조기 발견 — 파싱 실패는 어딘가 깨졌다는 뜻. 실행 전 무료 검증이 됩니다
  2. 안정적인 diff — 정리 규칙을 고정하면 쿼리 변경의 diff가 실질적인 변경분만 남습니다
  3. 기계 생성 SQL 해독 — ORM이 뱉어낸 한 줄짜리 쿼리는 정리하고 나서야 무엇을 JOIN하는지 보입니다

첫 번째는 특히 놓치기 쉽습니다. 괄호 개수가 안 맞거나 쉼표가 빠진 실수는 정리 처리가 실패하는 것으로 알아챌 수 있어, 실행 전에 미리 잡아낼 수 있습니다.

자주 묻는 질문

MySQL이나 PostgreSQL의 SQL도 지원하나요?

네. 표준 SQL, MySQL, PostgreSQL, MariaDB, SQL Server, BigQuery 등 주요 방언에 맞춰 정리할 수 있습니다. 방언 고유의 구문이 포함된 경우에도 실행 전에는 반드시 직접 확인하세요.

정리하면 SQL의 의미가 바뀌나요?

아니요. 정리는 공백·줄바꿈·들여쓰기·대소문자만 조정하는 처리로, 쿼리의 의미(실행 결과)는 바뀌지 않습니다. 다만 실행 전에는 항상 원래 SQL과 의도가 달라지지 않았는지 확인하는 것이 안전합니다.

방언을 잘못 선택하면 어떻게 되나요?

식별자의 인용 방식이나 키워드 해석이 어긋나면서 들여쓰기가 깨지거나 예상치 못한 위치에서 줄바꿈이 일어날 수 있습니다. “정리 결과가 이상하다”고 느껴진다면 먼저 방언 선택을 다시 확인하세요.

기밀 데이터가 포함된 SQL을 붙여넣어도 괜찮나요?

네. 정리는 모두 브라우저 안에서 완결되며 네트워크 통신이 발생하지 않습니다. 테이블명이나 컬럼명이 포함된 쿼리도 외부로 전송되지 않습니다.

정리

  • 포맷터 본체는 라이브러리에 한 줄 위임하는 수준이지만, 방언 선택이 결과를 좌우하는 본질적인 파라미터
  • 식별자 인용 부호 하나로 파싱이 달라지므로 사용 중인 DB에 맞춰 방언을 선택해야 합니다
  • 정리는 보기 좋게 만드는 것을 넘어 구문 오류 조기 발견·diff 안정화·기계 생성 SQL 해독에 효과가 있습니다

로그에서 쿼리를 뽑아냈다면, 읽기 전에 먼저 포맷터에 통과시켜 보세요.