작성일자 : 2023-11-14
Ver 0.1.1
0. Intro
쿼리를 작성할 때 종종 WHERE 1=1 을 작성하는 경우가 있다.
1=1 은 말그대로 True / 참 이라는 의미이다.
SELECT *
FROM SCOTT.EMP
WHERE 1=1
AND DEPTNO = '30';
위 코드가 WHERE 1=1 을 적은 경우이다.
부서코드가 '30'인 데이터들을 모두(참) 조회하는 코드인데, 1=1이란 조건은 있으나마나 한 조건이기도 하다.
1. Pros and Cons
그렇다면 무조건 참이라는 'WHERE 1=1' 조건을 적어주는 이유는 무엇일까?
1-1. 'WHERE 1=1' 사용의 장점
아래와 같이 EMP Table에서 직업이 'SA'문자로 시작하고, 부서 코드가 30인 데이터를 조회하는 쿼리가 있다고 하자.
SELECT *
FROM SCOTT.EMP
WHERE JOB LIKE 'SA%'
AND DEPTNO = '30';
이때 첫번째 조건인 JOB 조건을 주석처리하고자한다면, 아래와 같이 주석 처리를 두번해야한다.
SELECT *
FROM SCOTT.EMP
WHERE -- JOB LIKE 'SA%'
--AND
DEPTNO = '30';
이런 경우에 WHERE 1=1을 활용한다면 아래와 같이 주석처리를 한번만 해도 된다.
SELECT *
FROM SCOTT.EMP
WHERE 1=1
-- AND JOB LIKE 'SA%'
AND DEPTNO = '30';
결과적으로 'WHERE 1=1'은 쿼리의 결과에 대해서는 영향을 미치지 않지만, 이후 추가되는 조건절에서 AND나 OR 조건을 쉽게 추가할 수 있도록 해준다.
위 예시를 포함한 'WHERE 1=1' 사용시 장점은 아래와 같다.
1) 코드 작성 용이성
'WHERE 1=1'은 동적 쿼리에서 매우 유용하다. 동적 쿼리에서는 다양한 조건절이 추가될 수 있으며, 앞서 살펴봤듯이 이러한 조건절을 쉽게 추가 및 삭제하기 쉽도록 미리 'WHERE 1=1'을 작성해 놓는 것이다. 이렇게 하면 조건절을 추가할 때마다 "AND"를 추가하는 대신에, 'WHERE'절에 '1=1'을 유지한 채로 'AND'나 'OR' 조건절을 추가할 수 있으므로 코드의 가독성과 유지보수성 측면에서 이점이 있다.
2) 쿼리의 가독성
'WHERE 1=1'은 쿼리의 가독성을 향상시켜준다. 앞선 예시처럼 " WHERE JOB LIKE 'SA%' AND DEPTNO = '30'"라는 쿼리에서 DEPTNO = '30' 조건절을 삭제하면 'WHERE JOB LIKE 'SA%' AND'와 같은 쿼리가 되어 문법 오류가 발생할 수 있다. 그러나 'WHERE 1=1'을 사용하면 이러한 문제를 방지할 수 있다.
3) 유지보수성
'WHERE 1=1'은 쿼리를 수정할 때 실수를 방지할 수 있다. 쿼리를 수정하다 보면, AND나 OR 조건절의 순서가 바뀌거나 조건절을 빠뜨리는 등의 실수가 발생할 수 있지만, 'WHERE 1=1'을 사용하면 쿼리를 수정할 때 이러한 실수를 방지할 수 있다.
4) 실행 계획 최적화
'WHERE 1=1'은 데이터베이스 서버에서 실행 계획 최적화를 위해 사용된다. 대부분의 데이터베이스 서버는 실행 계획을 최적화할 때, 쿼리의 WHERE절을 분석하여 인덱스를 사용할지 여부 등을 결정한다. 'WHERE 1=1'을 사용하면 WHERE절이 있음을 알리면서도, 실제로는 어떤 조건도 만족하지 않으므로 실행 계획이 최적화된다.
1-2. 'WHERE 1=1' 사용의 단점 및 주의점
1. 쿼리 성능 저하
"WHERE 1=1" 자체로는 성능에 큰 영향을 미치지 않는다. 이유는 "WHERE 1=1"을 사용하더라도, 데이터베이스 엔진이 적절한 실행 계획을 수립하면 쿼리의 성능은 크게 저하되지 않기 때문이다.
하지만 "WHERE 1=1"은 실행 계획을 수립할 때, 조건절에 따라 적절한 인덱스를 선택하는 것과 같은 최적화 작업을 수행하는 데이터베이스 엔진에게 혼동을 줄 수 있다. 따라서 "WHERE 1=1"을 사용하면 실행 계획을 수립하는 데 시간이 더 걸릴 수 있다.
2. 보안 위협
'WHERE 1=1'을 사용하는 경우, 쿼리의 WHERE절을 추가하기 쉽게 만들어주기 때문에, 취약한 코드를 작성할 가능성이 있습니다.
예를 들어, 동적으로 생성된 쿼리에서 사용되는 경우, SQL Injection과 같은 보안 위협을 초래할 수 있습니다.
3. 코드 가독성 저하
쿼리문의 상황에 따라 'WHERE 1=1'을 사용하면 쿼리의 WHERE절이 있는지 없는지 구분하기 어려워져서 코드의 가독성이 저하될 수 있다.
4. 잘못된 조건 추가 가능성
'WHERE 1=1'을 사용하면 쿼리에서 조건절을 추가하는 것이 매우 쉬워져서, 쿼리를 작성하는 과정에서 실수로 잘못된 조건이 추가될 가능성이 높아진다.
5. 캐시 성능 저하
'WHERE 1=1'을 사용하면, 쿼리의 결과가 변경되지 않기 때문에 쿼리 결과가 캐시에 저장될 때, 다른 쿼리 결과와 구분이 어렵다.
이로 인해 캐시 성능이 저하될 수 있다. 따라서 "WHERE 1=1"은 주의해서 사용해야 한다.
쿼리문이 짧을 시에는 큰 문제가 없지만, 큰 데이터베이스에서는 쿼리의 성능을 저하시키고 보안 문제를 초래할 수 있으므로 사용을 최소화하는 것이 좋다.
3. Wrap up
이번 포스팅에서는 'WHERE 1=1' 사용의 장점 그리고 단점 및 주의점에 대해서 정리해보았다.
나 같은 경우는 RDB를 데이터 원본으로 Tableau Dashboard를 개발하고 검증을 할때 여러가지 필터(조건)을 걸어서 검증을 하곤 한다. 이때 쿼리문에서 많은 조건을 걸곤 하는데, 이럴때 'WHERE 1=1' 를 통해 조건을 쉽게 추가 및 삭제 할 수 있다. 실제로 유용하게 사용할 수 있는 팁 중하나이다.
다만 이러한 유용함 및 편리함이 있지만 만약 쿼리문이 길어지거나, 큰 DB에서는 성능 저하에 영향을 미칠 수 있음을 알게되었다. 긴 쿼리라는 것과 큰 DB라는 정의가 상황에 따라 상대적인 개념이긴 하지만, 이 역시 상황에 맞게 적용 여부를 판단할 줄 알아야 할것 같다.