🗃️ 지저분한 SQL 쿼리 포맷팅하는 방법

한 줄 SQL을 절 단위로 정렬하는 법

ORM이 생성한 쿼리나 로그에서 복사한 SQL은 한 줄로 길게 이어져 있어 읽기 힘든 경우가 많습니다. 이 글에서는 SQL이 왜 지저분해지는지, 절 단위로 줄바꿈하면 무엇이 좋아지는지, 그리고 포맷팅이 실제로 버그를 잡는 데 어떻게 도움이 되는지 정리합니다.

왜 SQL은 한 줄로 뭉쳐서 나올까

직접 손으로 짠 SQL은 보통 절마다 줄바꿈을 해서 읽기 좋게 작성하지만, 실무에서 마주치는 SQL은 그렇지 않은 경우가 훨씬 많습니다. 대표적인 원인이 ORM(Object-Relational Mapping)입니다. Sequelize, TypeORM, Hibernate, Django ORM 같은 라이브러리는 코드에서 자동으로 SQL을 생성하는데, 사람이 읽기 좋게 만드는 것보다 실행에 필요한 최소한의 문자열을 만드는 데 최적화되어 있어 대개 한 줄로 출력됩니다. 두 번째는 로그와 모니터링 도구입니다. 슬로우 쿼리 로그, APM 대시보드, DB 프록시 로그 등은 저장 공간을 아끼고 파싱을 쉽게 하려고 개행 문자를 제거한 채로 쿼리를 기록합니다. 세 번째는 DB 관리 도구나 마이그레이션 파일을 export할 때 압축(minify)된 형태로 저장되는 경우입니다. 결과적으로 개발자는 SELECT·FROM·WHERE·JOIN·GROUP BY가 뒤섞인 100자가 넘는 한 줄짜리 문자열을 눈으로 해독해야 하는 상황에 자주 놓입니다.

절 단위로 나누면 구조가 보인다

SQL 포맷팅의 핵심은 쿼리를 절(clause) 단위로 나누어 각 절을 새 줄에 배치하는 것입니다. SELECT로 어떤 컬럼을 가져오는지, FROM으로 어느 테이블에서 가져오는지, WHERE로 어떤 조건을 거는지, JOIN으로 어떤 테이블을 어떻게 연결하는지, GROUP BY·ORDER BY로 어떻게 집계·정렬하는지가 각각 한 줄씩 분리되면 쿼리의 논리적 흐름이 눈에 들어옵니다. 한 줄로 뭉쳐 있을 때는 괄호 안에 괄호가 겹친 WHERE 조건이나, 여러 개의 JOIN이 어떤 순서로 어떤 컬럼을 기준으로 연결되는지 한눈에 파악하기 어렵지만, 절 단위로 줄바꿈하고 들여쓰기를 맞추면 각 요소가 독립된 블록으로 보여 구조 파악이 훨씬 쉬워집니다.

포맷팅으로 버그를 잡는 예시

가독성 개선은 단순히 보기 좋으라고 하는 작업이 아닙니다. 예를 들어 다음과 같이 한 줄로 이어진 쿼리가 있다고 해봅시다.

select o.id, u.name from orders o join users u on o.user_id = u.id where o.status = 'paid' and (o.amount > 100 or u.vip = 1) order by o.id

이 쿼리를 절 단위로 정렬하면 다음과 같이 펼쳐집니다.

이렇게 펼쳐 놓으면 JOIN 조건이 정확한 컬럼끼리 연결되어 있는지, WHERE의 괄호가 의도한 대로 AND/OR 우선순위를 감싸고 있는지가 바로 보입니다. 한 줄로 뭉쳐 있을 때는 괄호 하나가 빠지거나 조건 순서가 바뀌어도 눈치채기 어렵지만, 절과 들여쓰기가 분리되면 이런 실수가 시각적으로 두드러집니다. 코드 리뷰 전이나 복잡한 쿼리를 디버깅할 때 직접 줄바꿈을 넣는 대신, 붙여넣기만 하면 SELECT·FROM·WHERE·JOIN 등 절 단위로 자동 정렬해 주는 도구를 쓰면 훨씬 빠릅니다.

🗃️ 이 작업, 도구로 바로 해보세요

지저분한 SQL 쿼리 포맷팅하는 방법 — 한 줄 SQL을 절 단위로 정렬하는 법

다른 가이드

🔁
도메인 IP 주소 확인하는 방법
도메인이 가리키는 실제 서버 IP를 찾는 법
🛰️
DNS 전파 확인하는 방법 (TTL이란?)
네임서버 변경 후 전파 여부와 TTL 개념 정리
📡
내 IP 주소 확인하는 가장 쉬운 방법
공인 IP·사설 IP 차이와 확인 방법
📐
CIDR 표기법과 서브넷 마스크 계산법
/24 같은 CIDR 표기를 서브넷 마스크로 바꾸는 법
🩺
SSL 인증서 만료일 확인하는 방법
브라우저 없이 인증서 만료일을 확인하는 법
🪪
JWT 토큰 구조 이해하고 디코딩하는 방법
Header·Payload·Signature 3부분 구조 설명
🗝️
Apache Basic 인증(.htpasswd) 파일 만드는 법
APR1-MD5 해시로 .htpasswd 생성하는 법
🔑
안전한 비밀번호 만드는 기준과 생성 방법
길이·문자 조합·엔트로피로 보는 비밀번호 강도
🔐
Base64 인코딩이란? 언제 어떻게 쓰나
이메일 첨부·데이터 URI에 쓰이는 이유
📘
JSON Formatter로 API 응답 가독성 높이기
압축된 JSON을 보기 좋게 정리하는 법
🗓️
유닉스 타임스탬프 변환하는 방법
1970년 기준 초 단위 시간을 날짜로 바꾸는 법
🎨
HEX RGB HSL 색상 코드 변환하는 방법
세 가지 색상 표기법의 차이와 변환법
🔠
카멜케이스 스네이크케이스 등 표기법 정리
camelCase·snake_case·PascalCase 언제 쓰나
🆚
두 텍스트 파일 차이 비교하는 방법
코드·문서 버전 간 차이를 빠르게 찾는 법
🔤
Punycode란? 한글 도메인이 xn--으로 보이는 이유
국제화 도메인(IDN)을 ASCII로 안전하게 표현하는 인코딩 방식.
🔀
IPv4를 IPv6로 매핑하는 법
시스템 로그의 ::ffff:192.168.1.1 같은 표기, 정체와 계산법.
🕸️
텍스트에서 도메인만 뽑아내는 법
로그·이메일처럼 뒤섞인 텍스트에서 도메인만 정확히 골라내기.
🚪
URL 여러 개를 한 번에 여는 법
매일 확인하는 사이트 목록, 하나씩 클릭하지 말고 한 번에.
📮
이메일 주소 유효성 확인하는 법
형식 검사와 MX 레코드로 알 수 있는 것, 알 수 없는 것.
📋
HTTP 응답 헤더 확인하는 법
캐시 정책, 서버 정보, 압축 여부까지 헤더 하나로.
🛡️
보안 헤더 점검하는 법
HSTS·CSP·X-Frame-Options — 없으면 생기는 위험까지.
📇
Whois/RDAP로 도메인 등록 정보 조회하는 법
누가, 언제 등록했고 언제 만료되는지 확인하는 법.
📍
IP 주소로 대략적인 위치 확인하는 법
동작 원리와 정확도 한계, VPN 때문에 틀리는 이유까지.
🖼️
OGP 메타태그 확인하는 법
카톡·SNS 공유 카드가 이상하게 뜰 때 확인할 것.
📑
제목 태그(h1~h6) 구조 확인하는 법
SEO·접근성의 기본, 제목 계층 구조 점검하기.
🏷️
TITLE·META 태그 확인하는 법
검색결과에 어떻게 노출되는지 결정하는 핵심 태그들.
#️⃣
해시 함수란? MD5·SHA-256 차이
어떤 해시를 언제 써야 하는지, 되돌릴 수 없다는 게 무슨 뜻인지.
📱
QR코드 동작 원리
일부가 가려져도 인식되는 이유와 QR 피싱 주의사항.
🔍
SSL 인증서 항목 읽는 법
CN·SAN·발급기관·유효기간, 각각 뭘 의미하나.
📜
CSR이란?
SSL 인증서를 발급받으려면 왜 CSR부터 만들어야 하나.
♻️
PEM vs DER 인증서 포맷
왜 같은 인증서를 형식만 바꿔서 다시 써야 할 때가 있나.
🤝
인증서·개인키가 안 맞을 때
짝이 맞는지 확인하는 원리와 흔한 불일치 원인.
🪄
자체서명 SSL 인증서 쓰는 법
테스트·개발 환경에서만 쓰고 프로덕션엔 절대 쓰면 안 되는 이유.
🔑
HTTP Basic vs Bearer 인증
Authorization 헤더 값이 어떻게 만들어지는지, 언제 뭘 써야 하는지.
🎫
안전한 랜덤 토큰 만드는 기준
API 키·세션 시크릿, 얼마나 길어야 하고 어떤 형식이 맞나.
🔒
Jasypt로 설정값 암호화하기
application.properties의 ENC(...) 값, 어떻게 동작하나.
🧩
JSON 문자열 이스케이프란?
따옴표·줄바꿈이 든 텍스트를 JSON에 안전하게 넣는 법.
JS·CSS 포맷팅과 압축의 차이
코드 정리할 땐 포맷팅, 배포할 땐 압축 — 왜 반대인가.
✂️
코드 압축의 안전 범위
공백·주석 제거는 안전, 변수명 변경은 왜 위험할 수 있나.
🧽
HTML 들여쓰기가 중요한 이유
구조가 보여야 실수도 보인다.
🧹
XML 들여쓰기 정리가 필요한 상황
한 줄 XML에서 엘리먼트 중첩 구조 파악하기.
🔣
HTML 엔티티란?
<, >, & 문자를 화면에 그대로 보여주고 싶을 때.
📊
엑셀 표를 HTML TABLE로 바꾸는 법
복사-붙여넣기만으로 표 데이터를 HTML로.
⛓️
HTML에서 링크 한 번에 뽑는 법
href·src 속성값을 전부 골라내는 법.
🐘
PHP·MySQL 구문 검사기의 한계
괄호·따옴표 짝 검사로 알 수 있는 것, 알 수 없는 것.
🗄️
MySQL 쿼리 짝 검사가 유용할 때
긴 서브쿼리, 동적으로 조립한 쿼리에서 실수 찾기.
🔍
HTML5 검증에서 자주 걸리는 실수
태그 짝·중복 id·alt 누락, 각각 왜 문제인가.
✍️
비주얼 HTML 에디터, 언제 쓰나
위지윅 편집이 유리한 경우, 코드 직접 작성이 유리한 경우.
📝
Markdown 미리보기가 필요한 이유
코드로만 보면 놓치는 렌더링 결과.
🔗
URL 퍼센트 인코딩이란?
한글·공백이 %EC%95%88 같은 형태로 바뀌는 이유.
✏️
정규식으로 찾아 바꾸기
단순 검색으로 안 되는 패턴 치환, 정규식으로.
↕️
목록 정렬, 알아야 할 정렬 기준
가나다순과 숫자순은 왜 다르게 동작하나.
📧
텍스트에서 이메일만 뽑는 법
정규식 패턴과 흔히 발생하는 오탐 실수.
🔢
글자 수와 바이트 수, 왜 다른가
한글 한 글자가 3바이트인 이유.
🔤
전각·반각 문자란?
숫자처럼 보이는데 검색이 안 되는 이유.
🈚
유니코드 코드포인트란?
모든 문자가 가진 고유 번호, U+XXXX 표기 읽는 법.
🔟
텍스트를 숫자로 바꾸는 원리
10진수·16진수·2진수, 어떻게 같은 값을 다르게 표현하나.
🧾
UTF-8 바이트 인코딩 기초
왜 영어는 1바이트, 한글은 3바이트인가.
0️⃣
텍스트가 0과 1로 저장되는 원리
비트란 무엇이고 텍스트는 어떻게 비트가 되나.
🔡
아스키 아트는 어떻게 만들어지나
문자만으로 큰 글자 배너를 그리는 원리.