반응형
해당 글에서는 MyBatis 환경에서 중복 쿼리를 줄이기 위해 sql, include, property태그를 이용하는 방법에 대해 알아봅니다.
💡 [참고] MyBatis를 활용하는 방법에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 링크 |
MyBatis 환경 설정 방법 | https://adjh54.tistory.com/65 |
MyBatis Query Formatter 설정 방법: log4jdbc-log4j2 | https://adjh54.tistory.com/228 |
MyBatis Insert 이후 키 값 리턴 방법 : SelectKey, useGeneratedKeys, keyProperty | https://adjh54.tistory.com/406 |
MyBatis 중복 쿼리 줄이기 방법 : sql, include, property | https://adjh54.tistory.com/407 |
MyBatis 저장 프로시저 호출 방법: CALL, MyBatis Parameter | https://adjh54.tistory.com/409 |
1) 상황
💡 상황
- MyBatis를 사용하는 경우에 ‘동일하게 사용되는 중복 쿼리’가 있어서 xml 파일을 관리하는데 소스코드가 길어져서 가독성이 떨어지는 점이 있습니다.
- 그렇기에 공통으로 사용되는 SQL문을 미리 선언한 이후 불러오는 형태로 구성하는 방식을 이용하여 중복된 쿼리를 줄입니다.
2) sql 태그
💡 sql 태그
- MyBatis에서 SQL 태그는 재사용 가능한 SQL 코드 조각을 정의하는 데 사용됩니다. 이 태그의 주요 목적은 SQL 코드의 중복을 줄이는 것입니다.
- SQL 섹션에 정의된 쿼리는 동일한 네임스페이스 내에 다른 쿼리에서 재사용할 수 있습니다.
1. sql 태그 속성
속성 | 설명 |
id | SQL 문장의 고유 식별자입니다. |
databaseId | 특정 데이터베이스 벤더에 SQL을 연결합니다. |
lang | 언어 처리기를 지정합니다. 기본값은 XML입니다. |
2. 사용 예시-1 : Alias가 존재하지 않는 경우
<!--사용자 컬럼을 지정합니다.-->
<sql id="userColumns">
user_sq,
user_id,
user_pw,
user_nm,
user_st
</sql>
3. 사용 예시-2 : 고정 Alias가 있는 경우
<!--사용자 컬럼을 지정합니다.-->
<sql id="userColumns">
t1.user_sq,
t1.user_id,
t1.user_pw,
t1.user_nm,
t1.user_st
</sql>
4. 사용예시 -3: 가변 Alias가 있는 경우
<!--사용자 컬럼을 지정합니다.-->
<sql id="userColumns">
${alias}.user_sq,
${alias}.user_id,
${alias}.user_pw,
${alias}.user_nm,
${alias}.user_st
</sql>
3) Include 태그
💡 Include
- sql 태그에 정의된 SQL 구문을 재사용할 수 있게 해 줍니다. 이를 이용하면 코드의 중복을 줄이고 유지 관리를 쉽게 할 수 있습니다.
- refid 속성에 재사용하려는 SQL 구문이 정의된 id를 지정합니다. 이 id는 동일한 매핑 파일 내에 있거나 다른 매핑 파일에 있을 수 있습니다.
- 다른 매핑 파일에 있는 경우에는 네임스페이스를 포함한 완전한 경로를 지정해야 합니다.
- Include 태그 내부에는 property 속성을 이용하여 동적인 값을 전달할 수 있습니다. 이렇게 전달된 값은 원본 SQL 구문에서 ${property} 형태로 사용될 수 있습니다.
1. Include 속성
속성 | 설명 |
refid | 재사용할 SQL 구문이 정의된 id를 지정합니다. 이 id는 동일한 매핑 파일 내에 있거나 다른 매핑 파일에 있을 수 있습니다. |
2. 사용예시-1 : property 속성이 존재하지 않는 경우
<!--사용자 컬럼을 지정합니다.-->
<sql id="userColumns">
user_sq,
user_id,
user_pw,
user_nm,
user_st
</sql>
<!--사용자 리스트 조회 -->
<select id="selectUserList" resultType="userDto">
<include refid="userColumns"/>
FROM tb_user
WHERE user_st = 'S'
</select>
4) property 태그
💡 property
- SQL 구문에 필요한 변수 값을 사전에 설정하는 데 사용됩니다.
- <select>, <insert>, <update>, <delete>와 같은 SQL 매핑 태그 안에 들어가며 name과 value 두 가지 속성을 가집니다.
1. property 태그 속성
속성 | 설명 |
name | SQL 구문에서 참조할 변수의 이름을 설정합니다. |
value | name에서 설정한 변수의 값을 설정합니다. |
2. 사용예시 : 변수로 사용하기
💡 사용예시 : 변수로 사용하기
- name, age라는 property 이름을 지정하고 value로 값을 선언하였습니다.
- 해당 값은 #{name}, #{age} 형태로 매핑이 됩니다.
<insert id="insertAuthor">
<property name="name" value="John Doe"/>
<property name="age" value="30"/>
INSERT INTO Author (name, age) VALUES (#{name}, #{age})
</insert>
5) sql + include + property 태그 활용하기
1. 활용 예시
💡 활용 예시
- sql 태그에 SQL문을 작성하고 include 태그 내에서 이를 호출합니다.
- 또한 sql 태그에서 사용할 수 있는 변수에 대해서는 property 태그 내에서 선언하여 이를 구성합니다.
<!--사용자 컬럼을 지정합니다.-->
<sql id="userColumns">
${alias}.user_sq,
${alias}.user_id,
${alias}.user_pw,
${alias}.user_nm,
${alias}.user_st
</sql>
<!--사용자 리스트 조회 -->
<select id="selectUserList" resultType="userDto">
SELECT
<include refid="userColumns">
<property name="alias" value="t1"/>
</include>
FROM tb_user t1
WHERE t1.user_st = 'S'
</select>
오늘도 감사합니다. 😀
반응형