본문 바로가기
IT/Spring

MyBatis에서 동적 SQL 제대로 쓰는 법 (if, choose, where, trim)

by eddie_factory 2025. 6. 7.
반응형

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>)는 꼭 숙지해두세요.

반응형

댓글