동적 쿼리 WHERE 1=1 사용을 지양하는 이유
1. WHERE 1=1 이란
WHERE 1=1은 항상 참을 의미한다. 즉, 의미 없는 조건이다.
2. 사용 이유
주석처리가 편하며, WHERE 문을 유동적으로 작성해야 할 때 편하다. WHERE 1=1을 사용하면 AND 조건을 사용할 때 WHERE 문을 신경 쓰지 않고 AND 조건문을 편리하게 사용할 수 있다.
3. 잠재적인 위험성
1) 회원 정보 1명을 조회하는 쿼리
- SELECT 문
1
2
3
4
5
6
7
8
9
10
<select id="select">
SELECT
id, name, email, address
FROM member
WHERE 1=1
<if test="name != null and name != ''">
AND id = #{id}
AND name = #{name}
</if>
</select>
- id와 name의 값이 null이면 만들어지는 SQL문
1
2
3
4
SELECT
id, name, email, address
FROM member
WHERE 1=1
모든 member 정보를 조회하는 쿼리이기 때문에 여러개의 행이 조회 된다. SELECT 문이기 때문에 큰 문제는 없지만, UPDATE, DELETE 문에서는 심각한 문제가 발생한다.
2) 회원 정보 1명을 수정하는 쿼리
- DELETE 문
1
2
3
4
5
6
7
8
<update id="update">
UPDATE member
SET use_yn = 'N'
WHERE 1=1
<if test="id != null">
AND id = #{id}
</if>
</update>
- id의 값이 null이면 만들어지는 SQL문
1
2
3
UPDATE member
SET use_yn = 'N'
WHERE 1=1
모든 member의 use_yn이 N으로 업데이트 되는 문제가 발생한다.
null 체크는 당연히 해야되는 것이다. 그러나 사람은 실수를 하기 때문에 문제가 발생한다. 애초에 WHERE 1=1이라는 구문을 사용하지 않는 것이 잠재적인 오류를 없애는 방법일 것이다.
[출처 및 참고]
This post is licensed under CC BY 4.0 by the author.