Mybatis/고급 매핑 기법
SQL 재사용 (<sql>, <include>)
DEVLIB
2025. 4. 17. 09:05
728x90
핵심 개념 요약
태그 | 역할 |
<sql id="..."> | 재사용 가능한 SQL 조각 정의 |
<include refid="..."> | 해당 SQL 조각을 삽입 |
사용 예시: 컬럼 목록 재사용
XML 매퍼 예시
<sql id="userColumns">
id, name, email, created_at
</sql>
<select id="selectUserById" resultType="User">
SELECT <include refid="userColumns" />
FROM users
WHERE id = #{id}
</select>
<select id="selectAllUsers" resultType="User">
SELECT <include refid="userColumns" />
FROM users
</select>
refid는 같은 XML 파일 안에 있어야 하며, 다른 파일에서 사용하려면 namespace 포함으로 참조해야 해요.
고급 예시: 동적 조건도 재사용 가능
<sql id="userWhereClause">
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</sql>
<select id="searchUsers" resultType="User">
SELECT * FROM users
<include refid="userWhereClause"/>
</select>
namespace 간 공유 예시
- common-sql.xml에 공통 SQL 정의
- user-mapper.xml에서 참조할 때는 namespace.refid 형식으로 사용
<!-- common-sql.xml -->
<mapper namespace="commonSql">
<sql id="baseColumns">
id, name, email
</sql>
</mapper>
<!-- user-mapper.xml -->
<mapper namespace="userMapper">
<select id="getUsers" resultType="User">
SELECT <include refid="commonSql.baseColumns"/>
FROM users
</select>
</mapper>
실전
팁 | 설명 |
컬럼 목록을 모듈화하면 유지보수가 쉬워져요 | 컬럼 변경 시 하나만 수정 |
조건문을 <sql>로 분리하면 재사용이 가능 | 여러 검색 조건에 재활용 |
SQL 조각은 텍스트 수준이라 완전한 SQL은 아닐 수도 있어요 | 쿼리의 일부분만 넣는 게 원칙 |
마무리 정리
태그 | 기능 | 실무 사용 |
<sql> | SQL 조각 정의 | SELECT 컬럼, WHERE 조건 공통화 |
<include refid="..."> | SQL 조각 삽입 | 여러 쿼리에서 반복 사용 |
LIST