[Mybatis] 스프링 mybatis 사용 시, 객체 alias 설정하는 방법

보통 mybatis xml 파일에 쿼리문을 작성할 때 parameterType 과 resultType을 적어 파라미터의 자료형과 반환 타입의 자료형을 적습니다.

<select id="getBoardContent" parameterType="Integer" resultType="com.test.project.model.CommonVO">
  select *
  from tblBoard
  where boardSeq = #{boardSeq}
</select>

이 쿼리문의 parameterType은 Integer이고 resultType은 개발자가 직접정의한 VO 객체입니다. 

resultType의 VO객체의 주소를 적는 부분에 클래스 주소명이 들어가게 되는데... 저렇게 많이 들어가게 될경우 한눈에 보기 불편하고 매번 저렇게 VO에 있는 패키지 주소를 긁어와서 복붙해주어야 안전하게 될겁니다. 하지만 이런 객체타입을 return 할때 불필요하게 패키지 주소를 적지 않고도 할수 있는 방법이 있습니다.!!

 

바로 alias를 주는 방법입니다.

 

1. alias를 지정할 xml 파일을 지정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	자주 사용하는 타입의 별칭	
	<typeAliases>
		<typeAlias type="com.test.spring.LikeHateVO" alias="likehatevo"/>
	</typeAliases>
	
</configuration>

이런 구조로 객체의 typeAlias 태그의 type 속성에 클래스의 패키지주소를 적어두고 alias 속성에 alias로 지정할 클래스의 명을 정해줍니다.

 

2. 위에 생성한 xml파일을 root-context에서 sessionFactory 빈을 설정할때 읽어주도록 합니다.

<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionfactory">
	<property name="dataSource" ref="datasource"></property>
	<property name="mapperLocations" value="classpath*:co/worker/threeminutessul/mapper/*.xml"></property><!-- 이거 패키지명임 -->
	<property name="configLocation" value="/WEB-INF/mybatisAlias/mybatisAlias.xml"></property> <!--이부분입니다.-->
</bean>

name 속성으로 configLocation으로 지정된 property 태그의 value 속성의 값이 제가 지정한 alias 설정 xml이 있는 주소입니다. root-context를 설정하면서 sessionfactory 빈 객체를 생성할 때 프로퍼티 값으로 mybatisAlias.xml 파일을 읽어 alias로 저장할 VO클래스를 설정하는 것입니다.

 

3. mybatis를 이용하여 SQL 쿼리문을 xml로 작성하려고 할때. parameterType 이나 resultType에 alias 명으로 접근합니다.

<select id="getLikeHate" parameterType="likehatevo" resultType="java.util.HashMap">
	select 
		coalesce(sum(isLike)::integer,0) as like, 
		coalesce(sum(isHate)::integer,0) as hate,
		(select count(*) from tblLikeHate where userSeq = #{userSeq} and boardSeq = #{boardSeq})::integer as isMyClicked,--접속한유저가 그글에서 좋아요 싫어요를 눌렀는지 여부
		(select case when isLike = 1 then 'clicklike' else 'clickhate' end 
		 from tblLikeHate where userSeq = #{userSeq} and boardSeq = #{boardSeq}) as isLikeHate
	from tblLikeHate 
	where boardSeq = #{boardSeq}
	  and (isLike=1
	  or isHate=1)
</select>

쿼리문은 상관하지말고 위 select의 parameterType을 보면 위 1번에서 alias로 지정한 likehatevo라는 alias 명으로 반환타입 클래스를 지정하였습니다.

 

사소한 부분이지만 간단한 설정하나로 개발을 편리하게 진행할 수 있다면 아니 진행하지 않을 수 없는 설정이 아닐까 합니다. 감사합니다.

댓글

Designed by JB FACTORY