스마트웹앱콘텐츠전문가

MyBatis 동적 SQL 태그 완벽 가이드: 조건별 쿼리 생성하기

9D4U 2025. 3. 26. 12:35
728x90
반응형

MyBatis는 자바 애플리케이션에서 데이터베이스와의 상호작용을 처리하는 인기 있는 ORM(Object-Relational Mapping) 프레임워크입니다. MyBatis의 강력한 기능 중 하나는 동적 SQL을 작성할 수 있다는 점입니다. 동적 SQL을 사용하면 쿼리를 실행하기 전에 조건에 따라 SQL 문을 동적으로 변경할 수 있어 유연하고 효율적인 데이터베이스 작업을 할 수 있습니다. 이 글에서는 MyBatis에서 동적 SQL을 작성하는 다양한 방법과 그 활용 사례를 살펴보겠습니다.

 

 

img

 


1. MyBatis 동적 SQL이란?

 

동적 SQL은 SQL 문장이 실행되기 전에 조건에 따라 변경되는 SQL입니다. 예를 들어, 사용자의 입력 값에 따라 조건이 다르게 처리되는 경우, 동적 SQL을 사용하면 효율적으로 SQL을 생성하고 실행할 수 있습니다. MyBatis는 이를 <if>, <choose>, <foreach>, <trim>, <set>, <bind>와 같은 태그를 사용하여 동적으로 SQL을 생성할 수 있는 기능을 제공합니다.

 

 

 


2. 주요 MyBatis 동적 SQL 태그

 

MyBatis에서 동적 SQL을 작성하기 위한 주요 태그는 다음과 같습니다.

 

 

1) <if> 태그

<if> 태그는 특정 조건이 참일 때 SQL 문에 해당 부분을 추가할 수 있도록 해줍니다. test 속성을 사용하여 조건을 지정하고, 해당 조건이 참일 경우에만 SQL 문에 포함됩니다.

 

예시:

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

위 예시에서는 name이나 age가 null이 아닐 경우 해당 조건이 SQL에 추가됩니다.

 

 

MyBatis에서 String 비교 시 == 대신 equals()를 사용해야 하는 이유

MyBatis는 Java와 SQL을 매핑하여 데이터베이스 쿼리를 실행하는 프레임워크입니다. MyBatis에서 조건을 설정할 때, 특히 String 객체를 비교하는 경우, 주의해야 할 점이 있습니다. 자주 발생하는 오류

9d4u.tistory.com

 

 

2) <choose>, <when>, <otherwise> 태그

 

<choose> 태그는 여러 조건 중 하나를 선택하는 데 사용됩니다. 여러 조건을 지정할 때 하나의 조건만 선택하고, 나머지는 무시합니다. when 태그는 조건을 정의하고, otherwise는 조건이 모두 거짓일 때 실행할 부분을 정의합니다.

 

예시:

<select id="selectUser" resultType="User">
  SELECT * FROM users
  WHERE 
  <choose>
    <when test="id != null">
      id = #{id}
    </when>
    <when test="email != null">
      email = #{email}
    </when>
    <otherwise>
      username = 'default'
    </otherwise>
  </choose>
</select>

위 예시에서는 id가 null이 아니면 id 조건을 사용하고, id가 null이면 email 조건을 사용합니다. 둘 다 null이면 username = 'default'로 기본값을 설정합니다.

 

반응형

 

 

 

3) <foreach> 태그

 

<foreach> 태그는 컬렉션(리스트, 배열 등)을 반복하며 SQL 쿼리에서 동적으로 값을 삽입할 수 있게 해줍니다. 주로 IN 절과 같은 다수의 조건을 동적으로 생성할 때 사용됩니다.

 

예시:

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

위 예시에서는 ids라는 리스트에 포함된 값을 IN 절로 처리하여 여러 조건을 동적으로 처리합니다.

 

4) <trim> 태그

 

<trim> 태그는 SQL 문에서 불필요한 접두사나 접미사를 제거하는 데 사용됩니다. 예를 들어, 여러 조건을 연결할 때 불필요한 AND나 OR을 제거할 수 있습니다.

 

예시:

<select id="selectUsers" resultType="User">
  SELECT * FROM users
  <where>
    <trim prefix="WHERE" prefixOverrides="AND">
      <if test="name != null">AND name = #{name}</if>
      <if test="age != null">AND age = #{age}</if>
    </trim>
  </where>
</select>

위 예시에서는 WHERE 앞에 있는 AND를 제거하여 올바른 SQL을 만듭니다.

 

 

5) <set> 태그

<set> 태그는 UPDATE 문에서 동적으로 수정할 컬럼을 추가할 때 사용됩니다. set 구문을 사용하면 조건에 맞는 값만 동적으로 업데이트할 수 있습니다.

 

예시:

<update id="updateUser">
  UPDATE users
  <set>
    <if test="name != null">name = #{name},</if>
    <if test="email != null">email = #{email},</if>
  </set>
  WHERE id = #{id}
</update>

위 예시에서 name이나 email이 null이 아니면 해당 컬럼을 업데이트합니다. 그리고 불필요한 ,(쉼표)를 자동으로 제거해줍니다.

 

 

6) <bind> 태그

<bind> 태그는 동적으로 변수나 표현식을 선언하여 사용할 수 있도록 합니다. 일반적으로 SQL을 동적으로 생성할 때 유용합니다.

 

예시:

<select id="selectUsers" resultType="User">
  <bind name="userName" value="'%' + name + '%'" />
  SELECT * FROM users WHERE username LIKE #{userName}
</select>

위 예시에서는 name 파라미터를 %name% 형식으로 변환하여 LIKE 조건에 적용합니다.

 

 

 

 


3. 동적 SQL을 사용한 쿼리 작성의 장점

 

동적 SQL을 사용하면 쿼리를 유연하게 작성할 수 있어 다양한 조건에 맞춰 SQL을 최적화할 수 있습니다. 예를 들어, 사용자가 검색할 때 조건이 많고 복잡해도 MyBatis의 동적 SQL 기능을 활용하면 효율적으로 쿼리를 작성할 수 있습니다. 또, 코드가 간결해지고 유지보수하기 쉬운 구조로 만들어집니다.

 

 

 


4. 실제 활용 예시

 

MyBatis의 동적 SQL은 복잡한 쿼리 작성 시 큰 도움이 됩니다. 예를 들어, 검색 조건이 여러 가지인 대규모 애플리케이션에서 동적 SQL을 사용하면 쿼리의 재사용성을 높이고, 성능을 최적화할 수 있습니다.

 

예시:

<select id="searchUsers" resultType="User">
  SELECT * FROM users
  <where>
    <if test="name != null">AND name = #{name}</if>
    <if test="age != null">AND age = #{age}</if>
    <choose>
      <when test="sortBy != null">
        ORDER BY ${sortBy}
      </when>
      <otherwise>
        ORDER BY name
      </otherwise>
    </choose>
  </where>
</select>

위 예시에서는 name, age를 동적으로 추가하고, sortBy 파라미터에 따라 정렬 방식을 결정합니다. 이를 통해 사용자에게 맞춤형 결과를 제공합니다.

 

 

 


 

 

MyBatis의 동적 SQL 기능은 복잡한 SQL 쿼리를 작성할 때 유용한 도구입니다. 조건에 따라 쿼리를 동적으로 구성하고, 이를 통해 쿼리의 효율성을 높이며 코드의 가독성 및 유지보수성을 향상시킬 수 있습니다. 이 글에서 소개한 다양한 MyBatis 동적 SQL 태그들을 활용하여 더욱 유연하고 효율적인 데이터베이스 작업을 구현해보세요.

728x90