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