본문 바로가기
Mybatis/동적 SQL 작성

if, choose, where, trim 태그 사용

by DEVLIB 2025. 4. 17.
728x90

1. <if> 태그 – 조건 분기 처리

예시: 검색 조건 있을 때만 추가

<select id="searchUsers" resultType="User">
  SELECT * FROM users
  <where>
    <if test="name != null">
      name = #{name}
    </if>
    <if test="email != null">
      AND email = #{email}
    </if>
  </where>
</select>
  • test는 자바 조건식 (!= null, > 0, == 'admin' 등)
  • <where>와 함께 쓰면 자동으로 WHERE 키워드 붙여주고, AND/OR 정리까지 해줘요

2. <choose>, <when>, <otherwise> – 다중 조건 분기

예시: 조건 우선순위 처리

<select id="searchByPriority" resultType="User">
  SELECT * FROM users
  <where>
    <choose>
      <when test="name != null">
        name = #{name}
      </when>
      <when test="email != null">
        email = #{email}
      </when>
      <otherwise>
        status = 'active'
      </otherwise>
    </choose>
  </where>
</select>
  • if-else if-else 구조처럼 작동
  • 첫 번째 조건만 실행됩니다 (순서 중요!)

3. <trim> – 접두어/접미어 다듬기

  • 복잡한 SQL에서 WHERE, SET 등의 앞뒤 공백이나 불필요한 쉼표/AND 등을 제거할 수 있어요.

예시: UPDATE 구문에서 쉼표 제거

<update id="updateUser" parameterType="User">
  UPDATE users
  <trim prefix="SET" suffixOverrides=",">
    <if test="name != null"> name = #{name}, </if>
    <if test="email != null"> email = #{email}, </if>
  </trim>
  WHERE id = #{id}
</update>
  • prefix="SET": 앞에 SET 자동 붙임
  • suffixOverrides=",": 마지막 쉼표 제거

4. <where> – 자동 WHERE 처리

  • <where>는 조건이 하나라도 있으면 자동으로 WHERE을 추가
  • 첫 번째 조건 앞에 AND, OR이 있으면 자동 제거해줘요

예시

<where>
  <if test="name != null"> AND name = #{name} </if>
  <if test="email != null"> AND email = #{email} </if>
</where>

결과:

WHERE name = ? AND email = ?

마무리 요약

태그 역할 주요 속성
<if> 조건에 따라 SQL 삽입 test 필수
<choose> 조건 중 하나만 선택 <when>, <otherwise> 조합
<where> 조건이 있을 경우 WHERE 자동 추가 AND, OR 정리
<trim> 접두어/접미어 자동 정리 prefix, suffixOverrides 등

응용

  • 검색 조건 필터: <where> + <if>
  • 동적 업데이트: <trim prefix="SET"> + <if>
  • 우선순위 조건 처리: <choose>
LIST

'Mybatis > 동적 SQL 작성' 카테고리의 다른 글

동적 정렬/페이징 구현  (0) 2025.04.17
동적 조건 검색 처리  (0) 2025.04.17