MyBatis를 연동해서 좀 더 빠르게 SQL을 처리 할 수 있도록 만들어 보겠음.(이거 중요)
▶MyBatis
MyBatis는(http://www.mybatis.org/mybatis-3/) 흔히 SQL매핑(mapping)'프레임워크'로 분류되는데,개발자들을 JDBC 코드의 복잡하고 지루한 작업을 피하는 용도로 많이 사용함.전통적인 JDBC 프로그래밍의 구조와 비교해 보면 MyBatis의 장점을 파악할 수 있다.
전통적인 JDBC프로그램 |
MyBatis |
직접Connection을 맺고 마지막에close() PreparedStatement직접 생성 및 처리 PreparedStatement의 setxxx() 등에 대한 보든 작업을 개발자가 처리 SELECT의 경우 직접ResultSet처리 |
자동으로 Connection close()가능 MyBatis 내부적으로 PreparedStatement처리 #{prop}와 같이 속성을 지정하면 내부적으로 자동처리 리턴 타입을 지정하는 경우 자동으로 객체 생성 및 ResultSet 처리 |
MyBatis는 기존의 SQL을 그대로 활용할 수 있다는 장점이 있고 ,진입벽이 낮은 편이어서 JDBC 대안으로 많이 사용함.
스프링의 특징중 한나는 다른 트레임워크들을 배척하는 대신에 다른 프레임워크들과의 연동을 쉽게 하는 추가적인 라이브러리들이 많다 .
MyBatis도 라이브러를 통해 쉽게 연동가능.
예제 사용 구조
▶MyBatis 관련 라이브러리 추가
MyBatis 와 Mybatis-Spring을 사용하기 위해 pom.xml에 추가한다
-spring-jdbc/spring-tx:스프링에서 데이터베이스 처리와 트랜젝션 처리
(해당 라이브러리들을 MyBatis와 무관하게 보이지만 추가하지 않을 경우 에러가 발생하니 주의 )
-mybatis/mybatis-spring: MyBatis와 스프링 연동용 라이브러리
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!--mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- mybatis-spring --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <!--spring-tx --><!-- mybatis --> <!--자기 버전에 맞춰 주세요 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.7.RELEASE</version> </dependency> <!--spring-jdbc --><!-- mybatis --> <!--자기 버전에 맞춰 주세요 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.7.RELEASE</version> </dependency> | cs |
책에서 보시면 version부분이 '${org.springframework-version}' 이렇게 되어 있음.(지금 버전 5.0.7 에 맞추겠다는 뜻이다. 안될씨 직접 입력)
▶SQLSessionFactory
MyBatis에서 가장 핵심적인 객체는 SQLSession이라는 존재와SQLSessionFactory임.
SQLSessionFactory는 내부적으로 SQLSession이라는 것을 만들어 내는 존재인데 , 개발에서는 SQLSession을 통해서 Connection을 생성하거나
원하는 SQL을 전달하고 ,결과를 리턴 받는 구조로 작성됨.
root-context.xml 작성
1 2 3 4 5 6 7 8 9 | <!--HikariCP Configration--> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> </bean> | cs |
스프링에 SQLSessionFactory를 등록하는 작업은 SQLSessionFactoryBean을 이용함.
패키지명을 보면 MyBatis의 패키지가 아니라 스프링과 연동 작업을 처리하는 mybatis-spring 라이브러리의 클래스입을 알 수 있음.
JAVA 방식(root-context.xml이 없는 )
RootConfig 클래스에 @Bean을 이용해서 설정.
1 2 3 4 5 6 7 | @Bean public SqlSessionFactory sqlSessionFactory()throws Exception{ SqlSessionFactoryBean sqlSessionFactory=new SqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource()); return (SqlSessionFactory) sqlSessionFactory.getObject(); } | cs |
SQLSessionFactoryBean을 이용해서 SqlSession을 사용해 보는 테스트는 기존의 DataSourceTests클래스에 추가함.!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class DataSourceTests { @Setter(onMethod_ = {@Autowired}) private DataSource dataSource; @Setter(onMethod_ = {@Autowired}) private SqlSessionFactory sessionFactory; @Test public void testConnection() { try (Connection con= dataSource.getConnection()){ log.info(con); } catch (Exception e) { fail(e.getMessage()); } } } | cs |
testMyBatis()는 설정된 SqlSessionFactory 인터페이스 타입이 SqlSessionFactoryBean을 이용해서 생성하고 ,이를 이용해서 Connection까지를 테스트함.
테스트코드가 정상적으로 실행 된다면 아래와 유사한 코드가 출력됨.
(JAVA와XML 두가지 방법이 다되는 지 확인하세요)
1 2 3 | INFO : com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. INFO : org.zeorck.persistence.DataSourceTest - HikariProxyConnection@945834881 wrapping oracle.jdbc.driver.T4CConnection@ba54932 INFO : org.zeorck.persistence.DataSourceTest - org.apache.ibatis.session.defaults.DefaultSqlSession@65b104b9 | cs |
▶스프링과의 연동 처리
SQLSessionFactory를 이용해서 코드를 작성해도 직접Connection을 얻어서 JDBC코딩이 가능하지만, 좀더 편하게 작업하기 위해서는 SQL을 어떻게 처리할 것인지를 별도의 설정을 분리해 주고 ,자동으로 처리되는 방식을 이용하는 것이 좋음.(MyBatis의 Mapper을작성해줘야함.)
Mapper=SQL과 그에 대한 처리를 지정하는 역할을 함.(Mybatis-Spring을 이용하는 경우에는 Mapper를 XML과 인터페이스+어노테이션의 형태로 작성 할 수 있음.)
▶Mapper인터페이스
Mapper를 작성하는 작업은 XML을 이용할 수 있지만 ,이번 예제에서는 최소한의 코드를 작성하는 Mapper인터페이스를 사용하겠음.
우서 org.zeorck.mapper를 만들고 TimeMapper인터페이스 만들어줌
.
TimeMapper인터페이스 MyBatis의 어노테이션을 이용해서 SQL을 메서드에 추가함.
1 2 3 4 5 6 7 8 9 10 11 | package org.zeorck.mapper; import org.apache.ibatis.annotations.Select; public interface TimeMapper { @Select("SELECT sysdate FROM dual") public String getTime(); } | cs |
Mapper설정
MyBatis가 동작할 때 Mapper를 인식할 수 있도록 root-context.xml에 Namespaces 항목에 mybatis-spring 탭을 선택해줌.
root-context.xml상태
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property> <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"></property> <property name="username" value="TEST_EX"></property> <property name="password" value="1234"></property> </bean> <!--HikariCP Configration--> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> </bean> <mybatis-spring:scan base-package="org.zeorck.mapper"/> <context:component-scan base-package="org.zeorck.sample"></context:component-scan> </beans> | cs |
<mybatis-spring:scan>태그의 base-package 속성은 지정된 패키지의 모든 MyBatis관련 어노테이션을 찾아 처리함.
Mapper를 설정하는 작업은 각각의 XML이나Mapper 인터페이스를 설정할 수도 있지만, 매번 너무 번잡하기 때문에 예제는 자동으로 org.zeorck.mapper 패키지를 인식하는 방식으로 작성하는 것이 가장 편리하다
JAVA설정을 이용하는 경우
클래스 선언부에 mybatis-spring에서 사용하는 @MapperScan을 이용해서 처리
RootConfig클래스 일부
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; @Configuration //xml대신하는 클래스 (xml 대신 설정 파일을 직접 만듬 )/@Configuration= 해당클래스의 인스턴스를 이용해서 설정 파일을 대신함 @ComponentScan(basePackages = {"org.zeorck.sample"}) @MapperScan(basePackages = {"org.zeorck.mapper"}) public class RootConfig { @Bean public DataSource dataSource() { 일부분... 생략 | cs |
'코드로배우는 스프링 웹 프로젝트 ' 카테고리의 다른 글
MyBatis와 스프링 연동 4-3 (0) | 2018.12.15 |
---|---|
MyBatis와 스프링 연동 4-2 (0) | 2018.12.14 |
스프링과 Oracle Datadase연동3-3 (0) | 2018.12.13 |
스프링과 Oracle Datadase연동3-2 (0) | 2018.12.13 |
스프링과 Oracle Datadase연동3-1 (0) | 2018.12.12 |