MODOO HUB ← 모두의 툴
Dev · Instrument

SQL 최소화

SQL 쿼리 공백·주석 제거 → 한 줄 압축

결과 복사

📖 SQL 압축기가 문자열 속 --를 만나면 쿼리를 통째로 잘라먹는다 가이드 보기

SQL 최소화란?

SQL 쿼리의 불필요한 공백, 줄바꿈, 주석을 제거해 크기를 줄입니다. 문자열 리터럴('...') 내부는 임시 플레이스홀더로 치환한 뒤 공백 압축·키워드 대문자화를 적용하고 마지막에 복원하는 방식이라 공백 압축과 대문자화는 문자열 값을 건드리지 않습니다. 다만 주석 제거는 이 문자열 보호 로직보다 먼저 실행되기 때문에, 문자열 값 안에 --/*가 포함되어 있으면 실제 주석으로 오인되어 뒤 내용이 통째로 잘려나가거나 문자열이 훼손될 수 있습니다. 예를 들어 WHERE note='a--b' AND x=1을 넣으면 결과가 WHERE note='a에서 그대로 끊깁니다(따옴표가 닫히지 않은 깨진 SQL).

자주 묻는 질문

주석 제거가 문자열 값을 잘라먹을 수 있다는 게 사실인가요?

네, 실제로 재현됩니다. WHERE note='a--b' AND x=1을 주석 제거 옵션 켠 채로 넣으면 -- 이후가 한 줄 주석으로 처리되어 결과는 WHERE note='a로 끝나버립니다. 뒤에 있던 AND x=1과 닫는 따옴표까지 전부 사라지는, 단순한 "주의가 필요한" 수준이 아니라 쿼리를 깨뜨리는 문제입니다.

왜 이런 일이 생기나요?

코드 흐름상 -- ·/* */ 주석 제거가 문자열 리터럴을 플레이스홀더로 치환해 보호하기 전에 먼저 실행됩니다. 그래서 문자열 안에 있는 --/*도 실제 주석 시작 기호와 구분되지 않고 그대로 제거 대상이 됩니다.

블록 주석 기호(/* */)가 문자열 안에 있으면 어떻게 되나요?

note='a/*b*/c'처럼 문자열 안에 /* */가 있으면 쿼리가 끊기지는 않지만 note='a c'로 값 자체가 바뀝니다. 저장하려던 실제 문자열 값이 조용히 손상되는 것이라 알아채기 어렵습니다.

공백 압축이나 키워드 대문자화도 같은 문제가 있나요?

아니요. 공백 압축과 대문자화는 문자열 리터럴을 __STR0__ 같은 플레이스홀더로 먼저 치환한 뒤 처리하고 마지막에 원래 문자열로 복원하므로, 문자열 값 내부의 공백이나 대소문자는 그대로 보존됩니다. 문제는 주석 제거 단계에서만 발생합니다.

이 문제를 피하려면 어떻게 해야 하나요?

SQL 문자열 값 안에 우연히 --/* 같은 조합이 들어가는 경우(URL, 코드 스니펫, 자유 텍스트 등)가 있다면 주석 제거 옵션을 끄고 사용하거나, 최소화 후 결과를 반드시 눈으로 대조 확인하는 것이 안전합니다.

키워드 대문자화는 어떻게 동작하나요?

SELECT, FROM, WHERE 등 사전 정의된 예약어 목록을 단어 경계(\b) 기준으로 찾아 대문자로 바꿉니다. 이 방식은 AS_OF_DATE처럼 예약어가 식별자 일부로 포함된 경우는 단어 경계 조건 때문에 건드리지 않아 올바르게 동작합니다.

세미콜론은 유지되나요?

네, 세미콜론(;)은 문장 구분자로서 압축 과정에서 삭제되지 않고 그대로 유지됩니다.

역방향(포맷팅)도 지원하나요?

이 도구는 압축만 지원합니다. 들여쓰기·줄바꿈을 추가하는 포맷팅은 sql-validator 도구를 이용하세요.