잡다

SqlSessionTemplate, MapperInterface 개념/빈 등록 설정 본문

개발/DB

SqlSessionTemplate, MapperInterface 개념/빈 등록 설정

크로우 2021. 12. 19. 13:58

[MyBatis]란 무엇인가 에 대해서 또 SqlSessionTemplate/MapperInterface 두가지 방식에 따른 전체적인 구조 차이와 Mapper.xml 속성 차이에 대해 정리합니다.

 

[MyBatis]란?

앞서 사용해 보았던 Jdbc-Template도 상당히 좋은 방식 중 하나지만 이것보다 좀더 편하게 데이터베이스 엑세스를 할 수있는 추가 프레임워크가 있습니다.

MyBatis라는건데요, 이것은 꼭 스프링이 아니더라도 스프링 뿐만아니라 다른 언어와도 결합할 수 있는 프레임워크이기 때문에 배워둔다면 스프링 프레임워크가 아닌 다른언어로 웹 어 플리케이션을 제작할때도 활용할수 있는 추가 프레임워크입니다.

스프링에서 제공하는것은 아니고 iBatis라는곳에서 제공을 했지만 구글이 인수를하면서 MyBatis라는 이름으로 새롭게 지원하고있는 프레임워크입니다.

 

마이바티스를 사용했을때 어떠한 방식에 구해받지않고 공통적인 장점을 두가지를 나열해 보겠습니다.

1. 쿼리문을 수행해주는 PreparedStatement를 직접생성하지않고 해당 기능이 내부적으로 자동으로 처리됩니다.

?처리마저도 #{필드명} 매핑을통해서 자동으로 처리가 됩니다

2. RowMapper로 익명클래스를쓰느니 내부클래스를 쓰느니 했던것들을 mybatis가 내부적으로 다 처리해줘서 간편함을 얻을 수 있습니다.

 

스프링에서 사용하기 위해서는 Mybatis-Spring module을 다운로드 받아야 합니다.

참조포스팅 : https://u-it.tistory.com/35

 

MyBatis를 스프링과 결합하여 강력한 Orm 프레임워크, DB작업을 수행시킬수 있습니다. 

1. Mapper인터페이스 방식을 사용한다면 인터페이스만 설계하고 구현클래스를 직접 만들지 않아도 됩니다. 
2. ResultSet 세팅 JDBC템플릿에서는 RowMapper를 사용하여 직접 추가적인 작업을 해줬지만 그런것 마저도 마이바티스가        내부적으로 수행해줍니다.
- 개발자가 지정한 SQL과 고급 매핑을 지원하는 프레임워크 입니다.
- 복잡한 JDBC코드를 걷어내며 깔끔한 소스를 유지합니다.
   @ #{필드명} -> vo.get필드명(); -> 필드명과일치하는getter메서드 호출후 값 반환
   @ return할때 RowMapper(객체에 일일히 저장)를 사용하는것 까지도 내부적으로 진행됩니다.
- DAO계층을 대신합니다. 
- 기존DAO의 Interface의 구현클래스를 xml파일이 대신합니다.
   @ xml파일에서는 단순 sql쿼리문만 작성해 놓으면 알아서 값매칭이나 ResultSet 리턴을 (multi or single return)알아          서 처리해 줍니다.
   @ ResultMap으로 mybatis-config.xml에 미리 선언된 객체를 참조하여 다시한번 객체 별칭화를 시켜주며, Mapper NameSpace와 일치하는 인터페이스와 연결해줍니다. DAO클래스역할을 Mapper xml파일이 대신 해주는것입니다. 
인터페이스의 추상메서드가 호출되면 해당 인터페이스 경로가 namespace에 등록되있는 xml파일로 넘어간 후 <resultMap>으로 쿼리 수행결과의 반환타입의 객체를 미리 지정하는데, mybatis-context.xml에 미리 등록된 객체 별칭을 참조하여 <resultMap>의 id속성으로 별칭을 한번 더 지정해 둡니다.
또한 <select> id속성은 네임스페이스로 인터페이스와 연결되어 있을때 <select> id속성을 메서드명으로 지정해주면 컨트롤러로 부터 해당 메서드가 호출되었을때 메서드와 일치하는 select id명을 찾아가게되고 그id가 등록된 <select>태그의 쿼리문을 수행해 줍니다.
이렇게 xml과 인터페이스를 직접 연결하게되면 DAO클래스를 만들지 않게되며 굳이 SqlSession 객체를 자동 의존성 주입을 하지 않아도 됩니다.
- JDBC 코드와 수동으로 세팅하는 파라미터와 결과 매핑을 제거합니다.
    @ 수동: 바인딩변수를 일일히 채워주는 과정을 알아서 찾아서 매핑해줍니다.


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인터페이스의 추상메서드 이름으로 지정합니다.

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

 

<mapper>
속성 방식 기능
namespace  SqlSessionTemplate 관련성이 높은 이름으로 지어줍니다.
MapperInterface 인터페이스 전체경로 작성(인터페이스와 동일한 이름으로 병합하여 처리합니다)

 

<select>
속성 방식 기능
id SqlSessionTemplate DAO클래스의 메서드에 주어진 키이름과 동일하게 작성
MapperInterface 메서드를 찾기 위한 구분자(인터페이스 메서드명과 동일)
parameterType  구문에 전달될 파라미터 타입(패키지 경로 포함, 전체 클래스명)
resultMap 결과 반환 타입 (패키지 경로 포함, 전체 클래스명)
resultMap 외부 Map타입을 이용한 반환타입

 

<Insert> <update> <delete>
속성 방식 기능
id SqlSessionTemplate DAO클래스의 메서드에 주어진 키이름과 동일하게 작성
MapperInterface 메서드를 찾기 위한 구분자(인터페이스 메서드명과 동일)
parameterType 구문에 전달될 파라미터 타입(패키지 경로 포함, 전체 클래스명)

 

SQL 구분값의 전달(바인딩? )
#{필드명}

 

 

 


빈등록

 

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

'개발 > DB' 카테고리의 다른 글

예외처리(Exception)에 대하여.  (0) 2020.12.24
Comments