![[Mybatis] 마이바티스 where 태그 사용하기](https://blog.kakaocdn.net/dna/boNkW9/btrZjyRoWtL/AAAAAAAAAAAAAAAAAAAAAKf2ya6QS-orSgFfRS_rCUB8oTl6ST2DQLBAjZtTSH8g/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1764514799&allow_ip=&allow_referer=&signature=IuNBNmLA1O4n0rrYBVURwpr7Jfk%3D)
안녕하세요.
오늘은 마이바티스에서 where 태그를 사용하는 방법에 대해서 포스팅하려고 합니다.
where 태그를 사용하는 이유는 마이바티스에서 쿼리를 작성하다 보면 where절에서 동적으로 처리해야 하는 경우가 있습니다. 파라미터 값이 있는 경우에만 조건을 추가하는 경우나 where 1=1 조건을 사용하지 않고 동적으로 처리하는 경우 등이 해당됩니다.
그렇다면 where 태그는 어떻게 사용하는 것인지 예제를 통해서 알아보도록 하겠습니다. :)
1. where 태그를 사용하지 않는 경우
<mapper namespace="com.demo.system.model.mapper.TestMapper">
<!-- Member 목록 조회 mapper -->
<select id="selectMemberList" resultType="member">
SELECT
Idx ,
Name ,
EmpNo ,
Age
FROM Member
WHERE Age = #{age}
AND EmpNo = #{empNo}
AND Name = #{name}
</select>
</mapper>
위의 예제 소스 코드는 일반적인 방법으로 쿼리를 그대로 작성한 예제입니다.
특별한 조건은 없기 때문에 위의 방식대로라면 where 태그를 사용하지 않아도 크게 문제 되진 않습니다. 그러면 위의 예제를 조금 수정해 보도록 하겠습니다.
2. if 태그를 이용하여 WHERE 조건절 처리
<!-- Member 목록 조회 mapper -->
<select id="selectMemberList" resultMap="memberMap">
SELECT
Idx ,
Name ,
EmpNo ,
Age
FROM Member
<if test='age != null'>
WHERE Age = #{age}
</if>
<if test='empNo != null'>
AND EmpNo = #{empNo}
</if>
<if test='name != null'>
AND Name = #{name}
</if>
</select>
WHERE와 AND 조건절마다 if 태그를 사용해서 조건 처리를 하였습니다. 위의 예제는 파라미터 값이 있다면 크게 문제는 없지만 첫 번째 age 항목이 없다면 쿼리는 에러가 발생하게 됩니다. 그 이유는 현재 쿼리는 다이내믹하게 처리되지 않고, age 항목의 조건이 성립하지 않으면 WHERE절 자체가 생성되지 않기 때문입니다. 그래서 위와 같은 경우에는 보통 WHERE 1=1 조건을 기본으로 추가하고 조건처리를 하게 됩니다.
3. WHERE 1=1 처리
<!-- Member 목록 조회 mapper -->
<select id="selectMemberList" resultMap="memberMap">
SELECT
Idx ,
Name ,
EmpNo ,
Age
FROM Member
WHERE 1=1
<if test='age != null'>
AND Age = #{age}
</if>
<if test='empNo != null'>
AND EmpNo = #{empNo}
</if>
<if test='name != null'>
AND Name = #{name}
</if>
</select>
위와 같이 WHERE 1=1 조건을 추가하고 age 항목은 AND절로 변경해 줬습니다. 이렇게 되면 세 파라미터 값이 없더라도 쿼리에 문제가 되지 않습니다. 하지만 위의 쿼리에서 WHERE 1=1 조건마저도 사용하지 않고 동적으로 다이내믹하게 처리해야 하는 경우도 있습니다.
그런 경우에 where 태그를 사용해서 처리를 하면 됩니다. 다음 예제를 통해서 확인해 보도록 하겠습니다.
4. <where> 태그 처리
<!-- Member 목록 조회 mapper -->
<select id="selectMemberList" resultMap="memberMap">
SELECT
Idx ,
Name ,
EmpNo ,
Age
FROM Member
<where>
<if test='age != null'>
AND Age = #{age}
</if>
<if test='empNo != null'>
AND EmpNo = #{empNo}
</if>
<if test='name != null'>
AND Name = #{name}
</if>
</where>
</select>
위의 예제 소스는 WHERE 1=1 조건을 없애고 <where> 태그를 추가한 예시입니다.
보게 되면 WHERE 절은 명시하지 않고 <where> 태그 하위에는 조건별로 AND 절만 작성되어 있습니다. 소스 코드만 보게 되면 WHERE절이 없기 때문에 에러가 발생할 것 같지만 <where> 태그를 사용하게 되면 자동으로 맨 앞에 WHERE절을 붙여주게 됩니다.
<where> 태그 안에 있는 조건 값에서 맨 앞의 값이 AND 절인 경우 WHERE절로 변경을 해주고, 아무것도 없는 경우에는 WHERE절을 추가해 주게 됩니다.
예시
예시 1)
AND Age = #{age} AND EmpNo = #{empNo} AND Name = #{name}
ㄴ> WHERE Age = #{age} AND EmpNo = #{empNo} AND Name = #{name}
예시 2)
Age = #{age} AND EmpNo = #{empNo} AND Name = #{name}
ㄴ> WHERE Age = #{age} AND EmpNo = #{empNo} AND Name = #{name}
위의 두 예시처럼 맨 앞에 AND가 있는 경우와 없는 경우 모두 동일하게 앞에 WHERE절을 붙여주거나 바꿔주는 기능을 하게 됩니다.
마무리
오늘은 이렇게 마이바티스에서 <where> 태그를 사용하는 방법을 정리해 봤습니다.
사용 방법은 정말 간단합니다. 조건절이 복잡하거나 위의 예시처럼 if문을 사용해야 하는 경우, WHERE 1=1을 사용하지 않는 경우 등 <where> 태그를 사용해야 하는 경우는 많기 때문에 사용 방법을 알아 두는 것이 좋을 거예요!
마지막에 정리한 예시처럼 <where> 태그를 사용하면 맨 앞에 무조건 WHERE절을 붙여주기 때문에 동적으로 다이내믹하게 처리가 되는 것을 확인할 수 있고, 저는 개인적으로 많이 사용하는 방식은 가장 첫 번째 조건에 AND를 제외하는 방법입니다.
사용하는 방법은 개인의 성향에 맞게 처리를 하면 됩니다.
그럼 오늘도 저의 작고 소중한 글을 읽어주셔서 감사합니다.

'Java > Mybatis' 카테고리의 다른 글
| [Mybatis] 마이바티스 foreach를 이용하여 IN절 처리하기 (0) | 2023.07.20 |
|---|---|
| [Mybatis] 마이바티스 컬럼 자동 매핑하기 (auto mapping) (0) | 2023.02.21 |
| [Mybatis] 마이바티스 동적 쿼리 trim 사용하기 (0) | 2023.02.20 |
| [Mybatis] 마이바티스 sql과 include 사용하기 (0) | 2023.02.17 |
| Mybatis '요소 콘텐츠는 올바른 형식의 문자 데이터 또는 마크업으로 구성되어야 합니다' 에러 해결하기 (0) | 2023.02.11 |