에스제이

반응형

안녕하세요, 오늘은 MYSQL 질의문에서 WHERE 1=1을 사용하는 이유에 대해서 알아보도록 하겠습니다. 다른 개발자가 개발한 프로젝트를 유지 보수하거나, 처음 개발자로 입문하여 선임들이 작성한 쿼리문을 보면 WHERE 1=1 조건문을 볼 수 있는데요, 어떤 이유로 사용하는지 한번 알아봅시다.

 

1. WHERE 1=1 참(true)을 의미

말그대로 WHERE 1=1은 조건문에서 항상 참을 의미합니다. 즉 특별히 의미가 있는 조건은 아닙니다.

WHERE 1 = 1

WHERE 2 = 2

WHERE 3 = 3

모두 같은 의미입니다.

 

2. 사용하는 이유

쿼리의 조건을 동적으로 변경한다거나, SQL 작성 시 조건을 주석 처리하며 질의문을 변경할 수 있기 때문에 사용합니다. 예제를 통해 알아봅시다.

 

SELECT
      userid
    , phone
    , address
FROM user
WHERE address = 'ssd0908.tistory.com'
AND phone = '010-1234-5678'

위와 같이 조건이 2개인 질의문이 있을 때 AND절의 phone번호가 010-1234-5678이 맞는지 우선적으로 확인하고 싶다면 WHERE 조건 address = 'ssd0908.tistory.com'을 주석 처리해야 하는데요,

SELECT
      userid
    , phone
    , address
FROM user
-- WHERE address = 'ssd0908.tistory.com'
AND phone = '010-1234-5678'

위와 같이 WHERE 절을 주석 처리하고 쿼리를 실행한다면 오류가 발생하겠죠?

SELECT
      userid
    , phone
    , address
FROM user
-- WHERE address = 'ssd0908.tistory.com'
WHERE phone = '010-1234-5678' -- AND 를 WHERE로 변경

아니면 AND를 WHERE로 잠시 변경했다가 조건을 맞을 경우 다시 AND로 변경해야 하는 귀찮음이 발생하죠.

SELECT
      userid
    , phone
    , address
FROM user
WHERE 1=1
AND address = 'ssd0908.tistory.com'
AND phone = '010-1234-5678'

자, 위와 같이 WHERE 1=1을 선언했을 경우 주석을 좀 더 쉽게 처리하면서 디버깅을 수월하게 할 수 있죠. 즉, 동적으로 SQL툴에서 쿼리를 작성할 때 유용한 방법이죠.

 

그렇다면, MYBATIS에서는 의미 없는 조건인 WHERE 1=1을 어떻게 처리할까요??

SELECT 
    * 
FROM user
<where>
    <if test="phone != null and phone != ''">
        AND phone = '010-1234-5678'   
    </if>
    <if test="address != null and address != ''">
        AND address = 'ssd0908.tistory.com'   
    </if>
</where>

MYBATIS에 <where> 태그를 이용하여 처리할 수 있는데요, 위와 같이 질의 조건에 따라 동적쿼리의 생성여부가 결정되는데 조건태그(<if>)를 <where> 태그로 감싸서 생성을 한다면 MYBATIS에서 자동으로 질의조건에 따라 WHERE를 생성하거나 생략합니다. 즉, WHERE 1=1과 같은 처리를 하죠.

 

3. WHERE 1=1 주의사항

쿼리의 조건을 동적으로 변경하여 질의를 좀 더 효율적으로 할 수 있지만, 반대로 지양해야 할 요소도 분명히 존재합니다. SELECT문 이외에 데이터를 수정 및 삭제하는 쿼리에는 사용을 지양하는 것이 좋습니다. UPDATE, DELETE문에 WHERE 1=1을 사용했을 경우 조건이 없기 때문에 데이터가 변경 또는 삭제될 우려가 있기 때문입니다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band