MyBatis는 SQL을 XML로 작성하는 방식이기 때문에, 동적 SQL 처리는 매우 중요합니다.
실무에서는 입력값에 따라 조건을 달리하거나, 특정 필드만 업데이트하는 등 유연한 쿼리 작성이 필요합니다.
이럴 때 MyBatis의 <if>, <choose>, <where>, <trim> 같은 동적 SQL 태그를 잘 활용하면 효과적으로 처리할 수 있습니다.
1. <if>: 조건 분기 처리의 기본
가장 많이 사용하는 태그입니다.
조건에 따라 SQL 일부를 추가하거나 생략할 수 있습니다.
<select id="selectUser" resultType="User">
SELECT * FROM users
WHERE 1 = 1
<if test="username != null">
AND username = #{username}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
WHERE 1=1은 조건이 없어도 SQL 문법 오류가 나지 않게 하기 위한 패턴입니다.
뒤에 오는 AND 조건들을 자연스럽게 붙일 수 있도록 해줍니다.
2. <where>: 자동으로 WHERE 정리
<where> 태그는 내부에 조건이 하나라도 있으면 자동으로 WHERE 키워드를 붙여줍니다.
또한 불필요한 AND, OR 같은 접두 연산자를 정리해주는 기능도 있습니다.
<select id="selectUser" resultType="User">
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
조건문 앞에 AND가 있어도 <where>가 알아서 정리해주므로, 더 깔끔하게 쿼리를 구성할 수 있습니다.
3. <choose>: if-else처럼 하나만 선택
<choose>는 여러 조건 중 하나만 선택해서 실행하고 싶을 때 사용합니다.
Java의 if-else if-else 구조와 비슷합니다.
<select id="selectUser" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="username != null">
username = #{username}
</when>
<when test="email != null">
email = #{email}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</where>
</select>
여러 조건이 동시에 참이어도 첫 번째 참 조건만 실행되기 때문에, 명확한 우선순위 처리가 가능합니다.
4. <trim>: prefix/suffix 자동 처리
<trim> 태그는 prefix, suffix, 그리고 자동으로 불필요한 쉼표 등을 제거하는 데 유용합니다.
주로 UPDATE SET 구문이나 IN (...) 구문에서 많이 사용됩니다.
<update id="updateUser">
UPDATE users
<trim prefix="SET" suffixOverrides=",">
<if test="username != null">
username = #{username},
</if>
<if test="email != null">
email = #{email},
</if>
</trim>
WHERE id = #{id}
</update>
prefix="SET" 덕분에 SET 키워드를 자동으로 붙여주며,suffixOverrides=","를 통해 마지막 쉼표도 자동으로 제거해줍니다.
실무 팁 요약
- 조건이 많을 땐
<where>로 깔끔하게 관리 - 하나만 선택해야 할 땐
<choose>사용 SET,IN같은 구문은<trim>으로 정리- 디버깅을 위해
log4jdbc,MyBatis-Log-Plugin활용 추천
MyBatis의 동적 SQL 태그는 초반에 익히기 어렵지만, 익숙해지면 코드 양도 줄고 유지보수도 쉬워집니다.
실제 프로젝트에서도 매우 자주 사용되므로, 오늘 소개한 네 가지 태그(<if>, <where>, <choose>, <trim>)는 꼭 숙지해두세요.
'IT > Spring' 카테고리의 다른 글
| @Transactional이 작동하지 않는 진짜 이유 (0) | 2025.05.24 |
|---|---|
| Spring - MySQL 대량의 데이터 삭제하는 법(batch) (0) | 2025.02.09 |
| Spring Profile 설정법 (0) | 2022.01.07 |
| DB Replication에 따른 Spring 설정 (0) | 2021.12.10 |
| Springboot에서 h2 Database 설정 (399) | 2021.12.10 |
댓글