개발/Spring Framework

[Mybatis] SqlSessionTemplate , MapperInterface

멋진놈 2022. 12. 1. 11:02
728x90

Mybatis를 사용하는 방식으로는 크게 두가지로 나뉩니다

1. SqlSessionTemplate - MyBatis3.0 이전

2. MapperInterface - Mybatis 3.0버전

 

 

 

[SqlSessionTemplate]

SqlSessionTemplate는 Mybatis쿼리문을 수행해주는 역할을 합니다.

MyBatis3.0 이전에 사용하던 방식이며 DAO클래스에 직접 SqlSession객체를선언하고 @Autowired로 의존주입하여 쿼리문을 수행 하는 방식입니다.

↓ root-context.xml에 SqlSessionFactory를 등록해야합니다.

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

DAO 메서드 인자값으로 "key" key이름을 부여하며 쿼리문을 수행하는 xml파일의 <select>혹은 <insert> <update> <delete> 태그의 id속성에 동일한 key이름으로 지정  으로 DAO의 메서드와 연동합니다. 예:

  

 

 

[MapperInterface]

MapperInterface는 Mybatis 3.0버전으로, DAO클래스를 쿼리문을 수행해주는 Mapper xml에서 구현합니다.

SqlSessionTemplate방식을 사용할때 작성하는 DAO클래스는 Controller->Service 로 부터 DAO 인터페이스에 선언된 추상메서드를 호출받았을때 추상메서드의 기능을 구현해 주는 클래스 입니다.

DAO클래스에서는 메서드를 통해 쿼리문을 실행하여 DB정보수행 까지 도달하기위한 쿼리문 수행 메서드를 구현합니다.

MapperInterface는 DAO클래스를 생략하고 Mapper xml파일과 DAO인터페이스를 직접 연결해주는 방식입니다.

 ↓ root-context.xml에 <mybatis-spring:scan basepacage="인터페이스의 패키지경로" />를 등록해야합니다.

<mybatis-spring:scan base-package="com.spring.database.mybatis.score.repository"/>

 ↑ 해당경로의 인터페이스를 찾고 인터페이스와 연결되있는 Mapper xml을 컨테이너에 빈등록 해줍니다

Mapper xml에서 <mapper>태그로 namespace를 지정하는데 이곳에 패키지경로.DAO인터페이스명 으로 선언해주면

해당 DAO인터페이스와 연결이 됩니다.

<mapper>태그안에는 반환되는 객체들을 미리 선언하고 <select>,<insert>,<update>,<delete>태그를 사용하여 태그안에 수행할 쿼리문을 작성합니다.

각 쿼리문 태그의 id명을 DAO인터페이스의 추상메서드 이름으로 지정합니다.

인터페이스를 구현받은 클래스에서 추상메서드를 오버라이딩 하는것과 같습니다.  

 

 

빈등록

 

root-context.xml에 MyBatis기능인 mapper/쿼리문수행/mapperinterface  빈 등록

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="ds"/>
<!-- <property name="configLocation" value="classpath:/mybatis-config.xml"/> -->
<!-- <property name="mapperLocations" value="classpath:/mappers/score/ScoreMapper.xml"/> -->
    <property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />
</bean>
    
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>	
</bean>
    
<mybatis-spring:scan base-package="com.spring.database.mybatis.score.repository"/>
<!-- mybatis sql 동작을 위한 핵심객체 sqlSessionFactory클래스 빈 등록 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="ds"/>
<!-- <property name="configLocation" value="classpath:/mybatis-config.xml"/> -->
<!-- <property name="mapperLocations" value="classpath:/mappers/score/ScoreMapper.xml"/> -->
    <property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" /> 
<!-- 와일드카드 매핑 : /mappers폴더안에 /** 모든경로에있는 /*Mapper.xml 로 끝나는 파일은 DAO 설정파일로 다 읽는다.  -->
</bean>

 

 

[SqlSessionTemplate]

    <!-- mybatis쿼리문 수행객체를 설정 -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
    <!-- clearCache는 임시메모리를 깨끗이 지웁니다. -->
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>	
        <!-- 생성자를 통한 의존성 DI설정. constructor는 생성자를 말한다. ref가 bean의 id를 호출합니다. -->
    </bean>

[MapperInterface] 

    <!-- mybatis xml파일을 빈으로 등록하기 위한 스캔 설정 -->
    <mybatis-spring:scan base-package="com.spring.database.mybatis.score.repository"/>

SqlSessionTemplate와 MapperInterface 기능을 수행하기위해 빈을 등록해주는 코드입니다.

두가지 방식중 사용할 방식만 선택하여 선언 및 주입시키면 되지만, 두가지 모두 주입시켜도 무관합니다.

 

 

출처 : 

https://u-it.tistory.com/entry/Mybatis%EB%9E%80-Mapperxml%EC%9D%98-%EC%A3%BC%EC%9A%94%EC%86%8D%EC%84%B1

 

[Mybatis]란? / SqlSessionTemplate, MapperInterface 개념/빈 등록 설정

[MyBatis]란 무엇인가 에 대해서 또 SqlSessionTemplate/MapperInterface 두가지 방식에 따른 전체적인 구조 차이와 Mapper.xml 속성 차이에 대해 정리합니다. [MyBatis]란? 앞서 사용해 보았던 Jdbc-Template도 상당히

u-it.tistory.com