[java] MyBatis에서 동적 쿼리 작성하기

MyBatis는 자바 언어를 위한 간편한 SQL 매핑 프레임워크로, 동적 쿼리 작성을 지원합니다. 동적 쿼리란 실행 시에 쿼리의 일부를 조건에 따라 생성하거나 변경해야할 때 사용되는 기능입니다. 이를테면, 사용자의 입력에 따라 WHERE 절의 조건을 동적으로 추가하거나, ORDER BY 절을 동적으로 변경하는 것 등이 동적 쿼리의 예시입니다.

이번 포스트에서는 MyBatis에서 동적 쿼리를 작성하는 방법에 대해 알아보겠습니다.

1. <if> 태그를 사용한 동적 쿼리

MyBatis에서 동적 쿼리를 작성하기 위해 가장 일반적으로 사용되는 방법은 <if> 태그를 사용하는 것입니다. <if> 태그는 조건에 따라 SQL 문을 동적으로 생성할 수 있도록 해줍니다.

<select id="getUserList" resultType="User">
  SELECT * FROM users
  WHERE 1=1
  <if test="name != null">
    AND name = #{name}
  </if>
  <if test="age != null">
    AND age = #{age}
  </if>
</select>

위의 예시에서는 name과 age라는 파라미터 값에 따라서 WHERE 절이 동적으로 생성됩니다. name이 null이 아닌 경우 AND name = #{name}이 생성되고, age가 null이 아닌 경우 AND age = #{age}이 생성됩니다.

2. <choose>, <when>, <otherwise> 태그를 사용한 동적 쿼리

단순한 if-else 문을 작성하는 경우에는 <choose>, <when>, <otherwise> 태그를 사용할 수 있습니다. 이를 사용하면 복잡한 조건문을 작성할 수 있습니다.

<select id="getUserList" resultType="User">
  SELECT * FROM users
  WHERE 1=1
  <choose>
    <when test="age &lt; 20">
      AND age &lt; 20
    </when>
    <when test="age &gt;= 20 and age &lt; 30">
      AND age &gt;= 20 AND age &lt; 30
    </when>
    <otherwise>
      AND age &gt;= 30
    </otherwise>
  </choose>
</select>

위의 예시에서는 age 파라미터 값에 따라서 WHERE 절이 동적으로 생성됩니다. age가 20보다 작은 경우에는 AND age < 20이 생성되고, age가 20보다 크거나 같고 30보다 작은 경우에는 AND age >= 20 AND age < 30이 생성되며, 그 이외의 경우에는 AND age >= 30이 생성됩니다.

3. <foreach> 태그를 사용한 동적 쿼리

MyBatis에서는 반복문을 사용해 IN 절의 값을 동적으로 생성할 수도 있습니다. 이를 위해 <foreach> 태그를 사용합니다.

<select id="getUserList" resultType="User">
  SELECT * FROM users
  WHERE id IN
  <foreach item="item" collection="userIds" separator="," open="(" close=")">
    #{item}
  </foreach>
</select>

위의 예시에서는 userIds 파라미터 값에 담긴 id들을 IN 절에 사용합니다. userIds의 각각의 요소에 대해 #{item}으로 대체되며, separator는 요소들 사이에 삽입할 구분자를 정의합니다.

이처럼 MyBatis에서는 여러 가지 방법을 통해 동적 쿼리를 작성할 수 있습니다. 동적 쿼리를 사용하면 어플리케이션에서 동적으로 쿼리를 생성하고 실행할 수 있으며, 쿼리의 재사용성과 유연성을 높일 수 있습니다.