Spring 개발을 하다보면 mapper.xml 에 간혹 ' WHERE 1=1 ' 을 보게 된다.
where 1=1 은 어떤이유 때문에 소스에 사용 되는지와 사용하지않는다면 어떤 대안이 있는지 알아볼까 한다..
( 필자는 where 1=1 을 사용시 DB실행에 불필요한 수식연산이 들어가여 자원을 잡아먹어 선호하지 않는 의견을 몇번 들어보긴 하였다.. )
WHERE 1=1 참(ture)을 의미
쿼리의 조건을 동적으로 사용하기위해 사용한다고 한다.
하지만, DLETE(삭제), UPDATE(수정) 기능을 수행하는 쿼리에서는 null판별이 옳바르게 전처리 작업이 수행되지 않는 상황에서 삭제나 수정 기능에 사용한다면 원치않는 결과를 초래할수 있다고한다. 왜냐하면 1=1 은 참이기때문에 모든 데이터를 삭제하거나, 모든데이터를 수정하는 일이 발생할수 있기때문이다.
정리하자면, 대부분에 동적인 상황을 고려하여 WHERE 1=1을 사용하는 경우가 대부분의 사용하는 이유가 될것이라고 필자는 생각한다, 하지만 의도치않는 예외적인 상황이 발생한다는 점을 고려한다면 좋은 방법은 아닌것이라고 생각이된다.
WHERE 1=1 에대해서 사용하는 이유와 반대로 WHERE 1=1 을 사용하지 말아야 한다는 이유를 찾다가 잘 정리된 2개의 블로그 게시글이 있어 공유한다. (판단은 본인이...)
[MYSQL] WHERE 1=1 사용하는 이유?? 주의사항으로는??
안녕하세요, 오늘은 MYSQL 질의문에서 WHERE 1=1을 사용하는 이유에 대해서 알아보도록 하겠습니다. 다른 개발자가 개발한 프로젝트를 유지 보수하거나, 처음 개발자로 입문하여 선임들이 작성한
ssd0908.tistory.com
OKKY - 동적 쿼리 만들때 where 1=1 쓰면 안되는 이유에 대하여..
동적 쿼리 만들때 where 1=1을 쓰지 말아야 하는 이유에 대하여.. 안녕하세요.. 예전에 이 부분에 대해 댓글을 달은적이 있었습니다.. 그때 저는 where 1=1을 쓰면 안된다고 했습니다..잠재적 버그를
okky.kr
WHERE 1=1 의 대안으로는 <where> 태그와 <c:if> 태그를 사용하여 대체하는 방법을 권고한다.
예시
WHERE 1=1
and user_id = #{userId}
<where>
<if test="userId != null and userId != ' ' ''>
and user_id = #{userId}
</if>
</where>
마지막으로 해당 mybtais 동적SQL에 대한 자세한 내용은 mybatis 공식사이트에서 확인할 수 있다.
mybatis – MyBatis 3 | Dynamic SQL
Dynamic SQL One of the most powerful features of MyBatis has always been its Dynamic SQL capabilities. If you have any experience with JDBC or any similar framework, you understand how painful it is to conditionally concatenate strings of SQL together, mak
mybatis.org