SpringFramework/BASIC

[MyBatis] resultType / 객체 별칭 관리기능 mapperLocations 주입

유혁스쿨 2020. 9. 4. 16:20
728x90
반응형

resultType 속성

 

resultType이란 MyBatis에서 쿼리문 수행후 메서드 반환타입이 String이나 객체를 반환할수 있도록 지정하는 속성입니다.

어떤타입으로 반환할것이다. 라고 반환 유형을 정해주는것 입니다.

 

이 속성은 <select>문에서 주로 쓰입니다.

<select>쿼리문 에서는 주로 결과값이 한 행이 나오도록 조건절을 설정하여 한행의 결과를 반환 받을것 이라면 객체

결과값이 모든 행을 반환하거나 여러행을 반환게 된다면 List, 하나의 컬럼만을 반환할때는 String으로 반환을 합니다

 

JDBC에서는 쿼리문의 수행결과를 반환하는데 있어서 결과 값이 객체에 반환될때 객체에 저장을 해줘야했습니다.

class BoardMapper implements RowMapper<DataVO>{

	@Override
	public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException {
		BoardVO b = new BoardVO();
		b.setBoardNo(rs.getInt("board_no"));
		b.setWriter(rs.getString("writer"));
		b.setTitle(rs.getString("title"));
		b.setContent(rs.getString("content"));
		return b;
	}
		
}

SqlSessionTemplate에서는 RowMapper 인터페이스를 통해 유용하게 처리할수 있었죠

 

resultMap에서는 이 RowMapper기능과 같이 반환할 객체에 저장을 자동으로 처리해줄 수 있도록 추가 컬럼으로 설정하였습니다.

 

물론 resultType에서도 RowMapper기능이 자동으로 처리됩니다. 

하지만 resultType에서는 resultMap과 같이 따로 컬럼명과 필드명을 비교해주는 종속 태그가 존재하지 않기 때문에 객체의 필드명과 테이블의 컬럼명이 동일한 경우에만 자동으로 RowMapper기능을 수행하여 반환해줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Data">

    <resultMap type="com.spring.database.mybatis.score.model.DataVO" id="DataMap">
        <id property="dataNo" column="dataNo"/> 
        <result property="dataId" column="dataId"/>
        <result property="dataName" column="dataName"/>
    </resultMap>
    
    <select id="d_list" resultMap="DataMap">
        select * from Data order by dno desc 
    </select>
    
    <select id="d_info" resultType="com.spring.database.mybatis.score.model.DataVO">
        select * from Data where dno=#{dno}
    </select>

</mapper>




컬럼명이 같지만 Map으로 처리해준것과 Type으로 처리해준 두가지 코드입니다.

 

당연히 아래코드가 더 간략해서 유용합니다.

 

하지만 이렇게 resultType에 패키지경로를 포함하여 직접 지정하면 불편합니다

 

MyBatis 기능중에는 객체 별칭으로 미리 등록해놓고 그 별칭으로 등록해주는 방법이 있습니다

 

그것은 바로 우리가 root-context.xml에서 Mybatis의 SqlSessionFactoryBean를 컨테이너에 빈 등록 할 때

주입 설정을 해줘야합니다.


MapperLocations 객체 별칭 관리

 

<bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource"ref="dataSource"/>
  <property name="configLocation"value="classpath:/mybatis-config.xml"/>
  <property name="mapperLocations"value="classpath:/org/zerock/mappers/*/*.xml"/>
</bean>

root-context.xml에 우리가 configLocation 속성으로 mybatis-config.xml이라는 파일을 찍고있었죠

이게 바로 별칭을 지정하고 관리해주는 역할을 수행해 줍니다.

 

 

[ mapperLocations ] mybatis-config.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="org.zerock.vo.DataVO" alias="d" />
        
        <typeAlias type="org.zerock.vo.BoardVO" alias="b" />
        
        <typeAlias type="org.zerock.vo.ReplyVO" alias="r" />
        
        <typeAlias type="org.zerock.vo.MessageVO" alias="message" />
        
    </typeAliases>
</configuration>

이렇게 객체 별칭을 미리 등록해 놓는다면

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Data">

    <resultMap type="com.spring.database.mybatis.score.model.DataVO" id="DataMap">
        <id property="dataNo" column="dataNo"/> 
        <result property="dataId" column="dataId"/>
        <result property="dataName" column="dataName"/>
    </resultMap>
    
    <select id="d_list" resultMap="DataMap">
        select * from Data order by dno desc 
    </select>
    
    <select id="d_info" resultType="d">
        select * from Data where dno=#{dno}
    </select>

</mapper>




 

resultType에서 등록된 객체 별칭만 그대로 가져다 쓸수 있게 됩니다.

728x90
반응형