스마트웹앱콘텐츠전문가

MyBatis SQL 관리의 핵심! <include> 태그와 property 사용법 정리

9D4U 2025. 4. 2. 21:53
728x90
반응형

MyBatis는 SQL을 효율적으로 관리하고 재사용할 수 있도록 다양한 기능을 제공합니다. 그중에서도 <include> 태그는 반복되는 SQL 문을 모듈화하여 재사용할 수 있도록 돕는 중요한 요소입니다. 또한, property 속성을 활용하면 SQL 문 내에서 동적으로 값을 설정할 수 있습니다.

이 글에서는 MyBatis의 <include> 태그와 property 속성의 개념, 사용법, 그리고 예제까지 상세히 다뤄보겠습니다.

 

 

 

img

 


1. MyBatis <include> 태그란?

 

<include> 태그는 MyBatis에서 SQL 문을 재사용할 때 사용하는 기능입니다. 이를 활용하면 동일한 SQL 구문을 여러 곳에서 중복 작성하지 않고도 간결하고 유지보수하기 쉽게 관리할 수 있습니다.

 

 

기본 사용법

아래 예제는 <sql> 태그를 이용해 공통 SQL 구문을 정의하고 <include>를 통해 재사용하는 방식입니다.

 

<sql id="userColumns">
    id, username, email, created_at
</sql>

<select id="getUsers" resultType="map">
    SELECT <include refid="userColumns"/> FROM users
</select>

 

 id="userColumns"로 공통 컬럼 목록을 정의하고 <include refid="userColumns"/>를 통해 여러 곳에서 재사용할 수 있습니다.

 

 

 

 

 


2. <include> 태그의 property 속성

 

property 속성을 사용하면 <include> 태그 내부에서 SQL 문에 동적으로 값을 전달할 수 있습니다.

 

 

property 속성을 활용한 예제

 

<sql id="filterByStatus">
    status = #{status}
</sql>

<select id="getUsersByStatus" resultType="map">
    SELECT id, username, email FROM users WHERE <include refid="filterByStatus">
        <property name="status" value="active"/>
    </include>
</select>

 

property 속성을 통해 status 값을 동적으로 설정할 수 있습니다. 실행 시 status = 'active' 조건이 적용됩니다.

 

여러 개의 property 전달

 

<sql id="filterByCondition">
    ${column} = #{value}
</sql>

<select id="getUsersByDynamicColumn" resultType="map">
    SELECT id, username, email FROM users WHERE <include refid="filterByCondition">
        <property name="column" value="email"/>
        <property name="value" value="test@example.com"/>
    </include>
</select>

 

실행 시 email = 'test@example.com'과 같은 SQL 문이 생성됩니다.

 

 

 

 

반응형

 


3. <include> 태그 및 property 사용 시 주의할 점

 

⚠️ SQL 인젝션 위험

  • ${}를 사용하면 입력값이 SQL 문에 직접 삽입되므로 보안상 위험할 수 있습니다.
  • 컬럼명과 같은 고정된 값에만 ${}를 사용하고, 값에는 반드시 #{}를 사용하세요.

 

⚠️ MyBatis 버전 호환성

  • MyBatis 3.x 기준으로 property 사용이 제한될 수 있습니다.
  • 복잡한 동적 SQL이 필요한 경우 <if>, <choose> 등의 태그와 함께 사용하는 것이 유리합니다.

 

 

 

MyBatis 3.x에서 <property> 사용이 제한되는 이유와 해결 방법

MyBatis 3.x 버전에서는 태그 내부에서 를 활용하여 동적 값을 전달하는 기능이 제한될 수 있습니다. 이는 MyBatis의 SQL 처리 방식과 태그의 동작 방식 때문입니다.   1. MyBatis 태그의 동작 방식  

9d4u.tistory.com

 

 

 


4. <if> 태그를 활용한 대체 방법

 

MyBatis에서는 <if> 태그를 활용하여 property 없이도 유사한 기능을 구현할 수 있습니다.

 

 

<if>를 활용한 예제

<select id="getUsersByStatus" resultType="map">
    SELECT id, username, email FROM users
    WHERE 1=1
    <if test="status != null">
        AND status = #{status}
    </if>
</select>

 

status 값이 있을 때만 AND status = #{status} 조건이 추가됩니다.

 

 

 

 


 

 

MyBatis <include> 태그와 property 속성은 SQL 재사용과 동적 SQL 작성에 유용한 기능입니다. 하지만 보안 문제를 고려하여 신중하게 사용해야 하며, 상황에 따라 <if>, <choose> 등의 기능을 적절히 조합하여 활용하는 것이 좋습니다.

이제 MyBatis의 <include> 태그와 property 속성을 활용하여 더 효율적인 SQL을 작성해 보세요! 

728x90