티스토리 뷰

BackEnd/Java

Spring boot + Mybatis 연결하기

철철22 2019. 3. 26. 13:11
반응형

안녕하십니까


Spring boot를 연결하면서 DB를 사용해 보신적 있나요?


Spring boot를 사용하시면 JPA를 이용해서 Entity 부터 해서 쿼리 메소드를 이용해 연결이 가능한데요.


그 외에도 직접 DataSource를 만들고 Mybatis를 이용해 xml로 쿼리를 직접 짜서 db를 연결하는 방법도 있습니다. ( 그 외에도 다양한 방법들이 있으니 찾아보세요 )


그리고 오늘은 Spring boot + Mybatis의 연결에 대해 작성을 하겠습니다.


그 전에 일단 Mybatis가 무엇인지 간단한 개념에 대해 알아보겠습니다. 


"마이바티스(MyBatis)는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 애너테이션(annotation)을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결시킨다."                                 - 위키 백과 -


위키 백과 링크를 들어가시면 더 자세한 내용을 확인하실 수 있습니다.



그럼 구조를 잡아보겠습니다.



구조 자체는 그렇게 어렵게 잡진 않았습니다.


일단 application.properties에는 다음과 같이 설정을 해줬습니다. Spring boot 2.0 부터 HikariCP가 Default DataSource로 잡혀 있다는데 아직 확실히 되는지 감이 안잡혀서 다음과 같이 설정했어요.

spring.datasource.hikari.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.hikari.jdbc-url=
spring.datasource.hikari.password=
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.connection-timeout=60000


그리고 Bean 설정을 위해 DataSourceConfiguration을 만들었습니다.

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import com.zaxxer.hikari.HikariDataSource;

@Configuration
@MapperScan(basePackages="com.company.cheolmin.mapper.**", sqlSessionFactoryRef="sqlSessionFactory")
public class DataSourceConfiguration{
	
    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari")  // application.properties 중 prefix 가 들어간 key들을 찾는다.
    public DataSource DataSource() {
		return new HikariDataSource();
    }
	
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(
    		@Qualifier("dataSource") DataSource dataSource, 
    		ApplicationContext applicationContext) throws Exception {
    	
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("mapper/**/*.xml"));
        
        return sqlSessionFactory.getObject();
    }
	
    @Bean(name="sqlSession")
    public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
       
}

글을 작성하면서 SqlSessionTemplate를 만든 이유에 대한 글을 참조했습니다.


마이바티스에서는 SqlSession를 생성하기 위해 SqlSessionFactory를 사용한다. 세션을 한번 생성하면 매핑구문을 실행하거나 커밋 또는 롤백을 하기 위해 세션을 사용할수 있다. 마지막으로 더 이상 필요하지 않은 상태가 되면 세션을 닫는다.


SqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다. SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 한다.SqlSessionTemplate 은 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유할수 있다.

getMapper()에 의해 리턴된 매퍼가 가진 메서드를 포함해서 SQL을 처리하는 마이바티스 메서드를 호출할때 SqlSessionTemplate은 SqlSession이 현재의 스프링 트랜잭션에서 사용될수 있도록 보장한다. 추가적으로 SqlSessionTemplate은 필요한 시점에 세션을 닫고, 커밋하거나 롤백하는 것을 포함한 세션의 생명주기를 관리한다. 또한 마이바티스 예외를 스프링의 DataAccessException로 변환하는 작업또한 처리한다.

SqlSessionTemplate은 마이바티스의 디폴트 구현체인 DefaultSqlSession 대신 항상 사용된다. 왜냐하면 템플릿은 스프링 트랜잭션의 일부처럼 사용될 수 있고 여러개 주입된 매퍼 클래스에 의해 사용되도록 쓰레드에 안전하다. 동일한 애플리케이션에서 두개의 클래스간의 전환은 데이터 무결성 이슈를 야기할수 있다.

SqlSessionTemplate은 생성자 인자로 SqlSessionFactory를 사용해서 생성될 수 있다.


이제 Configuration을 생성했으니 사용을 해보겠습니다. 


mapper를 만들어 sql문을 작성하겠습니다.


resources/mapper/mapper.xml

<?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="com.company.cheolmin.mapper.solution2.Solution2Mapper">
<select id="goodsSelectSus01" resultType="com.company.cheolmin.service.goods.GoodsVO">
<![CDATA[ SELECT * FROM sus_goods WHERE sus_id = 'sus01' ]]> </select> <select id="goodsSelectSus02" parameterType="com.company.cheolmin.service.goods.GoodsVO" resultType="com.company.cheolmin.service.goods.GoodsVO">
<![CDATA[ SELECT * FROM sus_goods WHERE sus_id = 'sus02' AND good_barcode = #{good_barcode} ]]> </select> </mapper>


mapper/Mapper.java

@Repository
public class Mapper {

    @Autowired
    @Qualifier("sqlSession")
    private SqlSessionTemplate sqlSession;
    
    private final static String NAMESPACE = "com.company.cheolmin.mapper.Mapper.";
    
    public List rawDataSelectList() throws Exception {
    	return sqlSession.selectList(NAMESPACE + "rawDataSelectList");
    }
    
    public void rawDataInsertVO(GoodsInfoVO vo) throws Exception {
    	sqlSession.insert(NAMESPACE + "rawDataInsertVO", vo);
    }
	
}


그리고 마지막으로 service단에서 로직 추가와 함께 sqlSession을 사용하면 됩니다.


@Service
public class GoodsService {
	
	@Autowired
	private Mapper mapper;
	
	/**
	 * 데이터 조회
	 * 
	 * @param GoodsVO
	 * @return 
	 * @throws Exception
	 */
	public List rawDataInsertVO(GoodsInfoVO vo) throws Exception {
		return mapper.rawDataInsertVO(vo);
	}
}


기본적으로 사용해 봤는데

여기서 나중에 트랜젝션도 추가해주고 필요하신 기능들을 넣어서 사용하시면 됩니다.


Jpa도 사용해보고 Mybatis도 사용해 봤는데 아무래도 복잡한 프로세스 같은 경우에는 Jpa보다는

Mybatis연동이 아직까지는 편한거 같은데 나중에는 둘 다 잘할 수 있으면 좋겠네요.


이상입니다.




참고 및 출처 


Mybatis 개념

https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4


http://www.mybatis.org/spring/ko/sqlsession.html

반응형

'BackEnd > Java' 카테고리의 다른 글

Spring boot AWS S3를 이용한 File Upload/Download  (1) 2019.08.26
Java send HTTP request  (0) 2019.04.02
Spring boot Redis 사용하기  (3) 2019.03.12
Spring boot jwt token 사용하기  (5) 2019.03.05
spring boot properties파일 분리하기  (0) 2019.03.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함