본문 바로가기
Java/Mybatis

[Mybatis] 마이바티스 sql과 include 사용하기

by 산코디 2023. 2. 17.

[Mybatis] 마이바티스 sql과 include 사용하기

 

 

안녕하세요.

오늘은 마이바티스에서 <sql> 태그와 <include> 태그를 사용하는 방법에 대해 포스팅하려고 합니다. 

<sql> 태그와 <include> 태그를 사용하는 경우는 공통 sql를 만들어서 필요한 쿼리 영역에 추가하여 재사용성을 올릴 때 사용을 합니다.

보통은 유사한 쿼리마다 쿼리를 생성하게 되는데 하나의 xml이나 유사한 xml에서 겹치는 부분의 쿼리를 많이 사용하게 되는 경우가 있습니다. 가독성은 쿼리별로 작성하는 것이 좋지만 그만큼 재사용성이 떨어지기 때문에 큰 무리가 없다면 위의 태그들을 활용해서 처리해 보는 것도 좋을 것 같습니다.

그러면 <sql> 태그와 <include> 태그를 어떻게 사용하는지 예제를 통해 알아보도록 하겠습니다.


<sql>과 <include>
<sql> : 공통으로 사용할 쿼리 일부분을 <sql> 태그 내에 넣어두는 요소
<include> : 원하는 <sql> 태그를 연동하고자 하는 영역에서 include를 시켜주는 요소

1. <sql> 태그와 <include> 태그를 사용하지 않았을 경우

<mapper namespace="com.demo.system.model.mapper.TestMapper">

	<!-- Member 목록 조회 mapper -->
	<select id="selectMemberList" resultMap="memberMap">
		SELECT
			Idx		,
			Name	,
			EmpNo	,
			Age
		  FROM Member
		 WHERE Age 	 	= #{age}
		   AND EmpNo 	= #{empNo}
		   AND Name 	= #{name}
		   
		 ORDER BY Name, Age
		 LIMIT 10
	</select>
	
	<!-- Member 목록 카운트 조회 mapper -->
	<select id="selectMemberListCount" resultType="long">
		SELECT
			COUNT(*)
		  FROM Member
		 WHERE Age 	 	= #{age}
		   AND EmpNo 	= #{empNo}
		   AND Name 	= #{name}
	</select>
	
</mapper>

위의 예제 소스 코드를 보게 되면 selectMemberList의 테이블 목록 조회하는 쿼리와 selectMemberListCount의 테이블 카운트를 조회하는 쿼리가 유사하게 작성되어 있는 것을 확인할 수 있습니다. 

위의 두 쿼리를 비교해 보면 조회하는 칼럼 정보와 ORDER BY, LIMIT절을 제외하면 동일하다는 것을 확인할 수 있습니다. 이런 경우에 동일한 부분만 <sql> 태그로 빼고 <include> 태그를 이용해 include를 시켜주면 훨씬 생산성이 좋아집니다.

그러면 <sql> 태그와 <include> 태그를 사용해서 처리하는 방법을 알아보도록 하겠습니다.

 


반응형

1. <sql> 태그와 <include> 태그를 사용하는 경우

<mapper namespace="com.demo.system.model.mapper.TestMapper">

	<!-- Member 목록 조회 mapper -->
	<select id="selectMemberList" resultMap="memberMap">
		SELECT
			Idx		,
			Name	,
			EmpNo	,
			Age
			
	  <!-- 공통 쿼리 -->		
	  <include refid="commonSql"></include>
		   
		 ORDER BY Name, Age
		 LIMIT 10
	</select>
	
	<!-- Member 목록 카운트 조회 mapper -->
	<select id="selectMemberListCount" resultType="long">
		SELECT
			COUNT(*)
			
	  <!-- 공통 쿼리 -->		
	  <include refid="commonSql"></include>
	</select>
	
	<!-- 공통 쿼리 -->
	<sql id="commonSql">
		 FROM Member
		WHERE Age 	= #{age}
		  AND EmpNo = #{empNo}
		  AND Name 	= #{name}
	</sql>

</mapper>

위의 예제 소스 코드는 <sql> 태그와 <include> 태그를 사용한 방법입니다.

우선 가장 마지막 부분에 <sql> 태그에 공통으로 사용할 쿼리 일부분을 작성해 줬고, id는 commonSql이라고 설정해 줬습니다.

그리고 두 쿼리마다 해당 <sql> 태그를 적용할 위치에 include 시켜줬습니다.

<sql> 태그의 id값과 <include> 태그의 refid값이 연동이 되어 두 쿼리에 각각 동일한 쿼리가 추가가 됩니다.

 

사용하는 방법은 위처럼 간단하지만 직관적이지 않아서 가독성은 좀 떨어지는 것 같네요. 하지만 복잡하고 긴 쿼리를 작성해야 하는 경우에 위처럼 공통이 되는 부분이 있다면 가독성이 조금 떨어져도 <sql> 태그를 사용해서 공통으로 처리하고 include 시켜주는 것이 좋습니다.

 


마무리

오늘은 마이바티스의 <sql> 태그와 <include> 태그의 사용하는 방법을 정리해 봤습니다.

프로그래밍 언어를 개발하는 것이 가독성도 중요하지만 결국에는 운영체제가 인식하는 언어이기 때문에 가독성보다는 효율성과 재사용성을 생각하는 것이 더 바람직하다고 생각합니다.

오늘 예제처럼 사용하는 방법을 숙지하고 업무에서 적용해 보면 보다 간결해진 소스 코드를 작성할 수 있을 거예요.

 

그럼 오늘도 저의 작고 소중한 글을 읽어주셔서 감사합니다.

 


 

반응형