[java] MyBatis를 사용한 동적 쿼리 작성 팁

MyBatis는 자바 개발자들이 SQL 쿼리를 쉽게 작성하고 실행할 수 있도록 도와주는 유용한 도구입니다. MyBatis를 이용하여 동적 쿼리를 작성하려면 몇 가지 팁을 알고 있어야 합니다. 이 글에서는 MyBatis를 사용한 동적 쿼리 작성에 대한 몇 가지 유용한 팁에 대해 알아보겠습니다.

명시적인 조건절 사용

MyBatis에서 동적 쿼리를 작성할 때, 가능한 한 명시적인 조건절을 사용하는 것이 좋습니다. 이는 SQL문이 명확하고 이해하기 쉽게 만들어 줍니다. 실제 조건이 존재하지 않을 때는 해당 조건을 무시하는 방법을 사용할 수 있습니다.

<select id="getUserList" parameterType="map" resultType="User">
  SELECT * FROM users
  <where>
    <if test="userId != null">
      AND id = #{userId}
    </if>
    <if test="userName != null">
      AND name = #{userName}
    </if>
  </where>
</select>

위의 코드에서 볼 수 있듯이 <if> 태그를 사용하여 동적으로 조건절을 구성할 수 있습니다.

SQL 쿼리 분리

동적 쿼리를 작성할 때 SQL문을 가능한 한 분리하는 것이 유용합니다. 이렇게 하면 각각의 조건에 따른 다양한 동적 쿼리를 간편하게 작성할 수 있습니다. 이는 코드의 재사용성을 높여줄 뿐만 아니라 유지보수에도 도움이 됩니다.

<select id="getUserList" parameterType="map" resultType="User">
  SELECT * FROM users
  <include refid="userConditions"/>
</select>

<sql id="userConditions">
  <where>
    <if test="userId != null">
      AND id = #{userId}
    </if>
    <if test="userName != null">
      AND name = #{userName}
    </if>
  </where>
</sql>

위의 예시에서는 <include> 태그를 사용하여 SQL을 분리하였습니다.

동적 SQL문 사용 시 주의사항

동적 SQL문을 사용할 때는 SQL Injection 공격에 노출될 수 있으므로 만약 동적 SQL문을 사용해야 할 경우에는 쿼리를 안전하게 처리할 수 있는 방법을 찾아야 합니다. MyBatis에서는 <![CDATA[ ]]> 태그를 사용하여 SQL Injection 공격을 방어할 수 있습니다.

<select id="getUserList" parameterType="map" resultType="User">
  SELECT * FROM users WHERE id = ${id}
</select>

위의 코드에서는 ${id} 부분에 들어올 수 있는 값에 대한 검증이 빠져 있어 SQL Injection 공격에 취약한 코드입니다.

MyBatis를 사용하여 동적 쿼리를 작성할 때 이러한 팁들을 활용하여 코드의 가독성과 보안을 높일 수 있습니다.

참고 자료:

함께 보기: [Java] Spring Boot 프로젝트에서 MyBatis 연동하기