SQL 포맷터

SQL 쿼리를 붙여넣으면 각 절(SELECT, FROM, WHERE, JOIN, GROUP BY 등)이 들여쓰기된 자신만의 줄로 재정렬됩니다.

조회수 1,124회

작동 원리

한 줄로 작성된 긴 SQL 쿼리는 구조를 한눈에 파악하기 어렵습니다 — WHERE 절은 어디서 끝나고 GROUP BY는 어디서 시작하는지, 어떤 JOIN이 어떤 테이블에 속하는지 알기 힘듭니다. 이 도구는 원본 SQL을 받아 주요 절 경계마다 별도의 줄로 나눕니다: SELECT, FROM, WHERE, JOIN 계열 전체(INNER JOIN, LEFT JOIN, RIGHT JOIN 등), GROUP BY, ORDER BY, HAVING, UNION. AND/OR로 연결된 조건과 ON 뒤에 오는 조인 조건은 그것이 속한 절 아래 한 단계 들여쓰기되며, 키워드는 선택적으로 대문자로 통일됩니다. select id,name from users where active=1 and role='admin' order by name 같은 쿼리는 SELECT, FROM, WHERE, ORDER BY가 각각 자신만의 줄에서 시작하고 AND 조건이 WHERE 아래에 들여쓰기되는 블록이 됩니다 — 정보는 동일하지만, 코드 리뷰에서 사람이 손으로 작성했을 법한 형태로 배치될 뿐입니다.

이는 손으로 하기 가장 어려운 바로 그 지점에서 가장 큰 힘을 발휘합니다: 여러 테이블을 조인한 쿼리, WHERE 절 안에 파묻힌 서브쿼리, 여러 분기를 가진 CASE 표현식 등입니다. 일관된 들여쓰기 덕분에 검토자는 한 글자씩 읽어 내려가는 대신 누락된 조인 조건이나 잘못 놓인 괄호를 한눈에 알아챌 수 있습니다.

알아두어야 할 점

이것은 포맷터이지 검증기가 아닙니다 — 인식하는 고정된 키워드 집합을 기준으로 공백과 줄바꿈만 재배치할 뿐, 쿼리를 구문 트리로 파싱하지도, 데이터베이스에 대해 실행하지도 않습니다. 진정으로 방언을 인식하는 검증기가 되려면 각 SQL 변형마다 완전한 파서가 필요한데, MySQL, PostgreSQL, SQL Server, SQLite는 식별자 인용 방식, 날짜 함수, 심지어 어떤 문장이 유효한지에 이르기까지 세부적으로 서로 다르기 때문입니다 — 이런 것을 검증하는 척하는 얕은 브라우저 측 검사는 잘못된 안도감만 줄 뿐입니다. 포맷된 결과가 이상해 보인다면 대개 입력에 이미 오타나 짝이 맞지 않는 괄호가 있었다는 뜻입니다. 이 도구는 그것을 표시하는 대신 그 주위를 감싸서 포맷할 뿐입니다.

순전히 텍스트 배치만 다루기 때문에 운영 환경의 쿼리에도 안전하게 사용할 수 있습니다: 식별자, 문자열 리터럴, 숫자 값, 연산자는 절대 다시 쓰이거나 추가되거나 제거되지 않습니다 — 오직 공백과 (선택적인) 키워드 대소문자만 바뀝니다. 아무것도 어디로도 전송되지 않고 실행되지도 않습니다. 쿼리는 브라우저를 절대 벗어나지 않습니다.

자주 묻는 질문

이 도구가 제 SQL이 맞는지 알려주나요?

아니요 — 의도적으로 그렇습니다. 진짜 SQL 검증은 어떤 데이터베이스를 대상으로 하느냐에 따라 달라지며(MySQL, PostgreSQL, SQL Server는 문법 특성이 모두 다릅니다), 가벼운 브라우저 도구로는 이를 정직하게 해낼 수 없습니다. 이 도구는 레이아웃만 재정렬할 뿐, 쿼리가 유효한지 아닌지는 절대 판단하지 않습니다.

제 쿼리가 손상될 수 있나요?

아니요 — 줄바꿈과 들여쓰기만 추가하고, 선택적으로 키워드를 대문자로 바꿀 뿐입니다. SQL 텍스트 자체(식별자, 값, 연산자)는 절대 변경되지 않습니다.

이 도구를 어떤 SQL 방언(MySQL, PostgreSQL, SQL Server)에도 쓸 수 있나요?

레이아웃 수준에서는 그렇습니다 — 이 포맷터가 인식하는 절 키워드(SELECT, FROM, WHERE, JOIN, GROUP BY 등)는 사실상 모든 SQL 방언에 공통으로 존재합니다. 다만 방언별 문법, 함수, 인용 규칙은 검증하지 않습니다 — 이런 것들은 엔진마다 차이가 커서 실제 데이터베이스에 쿼리를 실행해 봐야만 정확성을 확인할 수 있습니다.

서브쿼리나 CTE는 어떻게 처리되나요?

중첩된 SELECT 문과 WITH(공통 테이블 표현식) 블록도 동일한 절 분리 규칙이 재귀적으로 적용되어, 안쪽 쿼리가 바깥쪽 쿼리 안에서 자신만의 들여쓰기된 구조를 갖게 됩니다 — 깊이 중첩된 쿼리일수록 한 줄로는 가장 읽기 어렵기 때문에, 바로 이런 경우에 포맷팅이 가장 큰 도움이 됩니다.

포맷팅이 쿼리의 동작 방식을 바꾸나요?

아니요. 공백, 줄바꿈, 그리고 선택적인 키워드 대소문자만 바뀝니다. 모든 식별자, 리터럴, 비교, 연산자는 작성된 그대로 유지되므로, 포맷된 쿼리는 원본과 기능적으로 완전히 동일합니다 — 어느 쪽을 실행하든 같은 결과 집합을 만들어냅니다.

댓글

아직 댓글이 없습니다 — 첫 댓글을 남겨보세요!

비슷한 도구