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

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을 작성해 보세요!
'스마트웹앱콘텐츠전문가' 카테고리의 다른 글
지리공간 데이터 분석의 핵심! 벡터 데이터 유형 완벽 가이드 (0) | 2025.04.09 |
---|---|
MyBatis 3.x에서 <property> 사용이 제한되는 이유와 해결 방법 (0) | 2025.04.02 |
MyBatis 동적 SQL 태그 완벽 가이드: 조건별 쿼리 생성하기 (0) | 2025.03.26 |
MyBatis에서 String 비교 시 == 대신 equals()를 사용해야 하는 이유 (0) | 2025.03.26 |
동적 SQL과 MyBatis include: 효율적인 쿼리 재사용 방법 (0) | 2025.03.25 |