[java] MyBatis에서 동적 버퍼 사용하기

MyBatis는 자바와 SQL 사이의 매핑을 단순화시켜주는 ORM(Object-Relational Mapping) 프레임워크입니다. 이 프레임워크를 사용하여 동적으로 SQL을 생성하고 실행하는 방법을 알아보겠습니다.

동적 SQL 구문

MyBatis에서 동적으로 SQL을 생성하기 위해서는 <trim>, <if>, <choose>, <when>, <otherwise>와 같은 동적 SQL 구문을 사용할 수 있습니다.

<if> 구문

<if> 구문은 조건에 따라 SQL 구문을 추가하거나 생략할 수 있습니다. 다음은 예제입니다:

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

위 예제에서 nameemail이 null이 아닌 경우에만 해당 조건이 추가됩니다.

<choose>, <when>, <otherwise> 구문

<choose><when><otherwise>를 함께 사용하여 다중 조건에 따라 SQL 구문을 선택할 수 있습니다.

<select id="selectUsers" resultType="User">
  SELECT * FROM users
  WHERE 1=1
  <choose>
    <when test="name != null">
      AND name = #{name}
    </when>
    <when test="email != null">
      AND email = #{email}
    </when>
    <otherwise>
      AND status = 'ACTIVE'
    </otherwise>
  </choose>
</select>

위 예제에서 name이나 email이 null이 아닌 경우 해당 조건을 추가하고, 그렇지 않은 경우 status = 'ACTIVE' 조건이 추가됩니다.

동적 버퍼 사용하기

동적 SQL을 생성할 때, MyBatis에서는 동적으로 생성된 SQL을 임시로 저장하기 위한 버퍼를 사용할 수 있습니다. 이를 위해 <script> 태그를 사용하여 SQL 구문을 감싸고, ${}를 사용하여 변수를 참조할 수 있습니다.

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

위 예제에서 <script> 태그 안에 동적 SQL 구문을 작성하고, <if> 구문을 사용하여 필요한 조건을 추가하였습니다.

이렇게 작성된 동적 SQL은 런타임 시점에 MyBatis에서 평가되어 실제 SQL로 변환됩니다.

결론

MyBatis에서 동적 SQL을 사용하여 조건에 따라 다른 SQL을 생성하고 실행하는 방법을 알아보았습니다. <if>, <choose>, <when>, <otherwise>와 같은 동적 SQL 구문을 사용하여 필요한 조건을 추가하고, <script> 태그를 사용하여 동적 SQL을 생성할 수 있습니다. 이를 통해 코드의 유연성을 높이고, 보다 간편하게 SQL을 다룰 수 있습니다.

참고 자료