Verity's Daily Logs_

[Spring-Framework]MyBatis와 연동하기 본문

Spring Framework

[Spring-Framework]MyBatis와 연동하기

johye0 2020. 8. 25. 15:43
반응형

[참고도서: https://book.naver.com/bookdb/book_detail.nhn?bid=13993776]

 

MyBatis는 흔히 SQL 매핑 프레임워크로 분류되는데, 개발자들은 JDBC 코드의 복잡하고 지루한 작업을 피하는 용도로 많이 사용한다. MyBatis 의 장점으로는 자동으로 Connection colse()기능을 수행한다는점, 속성 값 지정이 편하다는 점, 자동으로 객체 생성 및 ResultSet 처리가 가능하다는 점이 있다. 

 

1. pom.xml Dependency 추가

원하는 버전으로 Dependency 를 추가한다.

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>${org.springframework-version}</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

 

2. SQLSessionFactory 추가

MyBatis에서 가장 핵심적인 객체는 SQLSession이라는 존재와 SQLSessionFactory이다. SQLSessionFactory는 내부적으로 SQLSession이라는 것을 만들어 내는 존재인데, 개발에서는 SQLSession을 통해서 Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 리턴 받는 구조로 작성된다.

RootConfig 클래스에 @Bean 을 이용하여 설정한다.

@Bean
	 public SqlSessionFactory sqlSessionFactory() throws Exception {
		 SqlSessionFactoryBean sqlSessionFactory=new SqlSessionFactoryBean();
		 sqlSessionFactory.setDataSource(dataSource());
	        
		 return (SqlSessionFactory) sqlSessionFactory.getObject();
	 }

 

3. MyBatis 연결 테스트 (JUnit)

잘 연결 되었는지 JUnit 테스트를 통해 확인한다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {RootConfig.class})
@Log4j
public class DataSourceTests {
	
	@Setter(onMethod_ = @Autowired)
	private DataSource dataSource;
	
	@Setter(onMethod_ = {@Autowired})
    private SqlSessionFactory sqlsessionFactory;
	
	@Test
	public void testMyBatis() {
		try (SqlSession session = sqlsessionFactory.openSession();
				Connection con = session.getConnection();
				) {
			log.info(session);
			log.info(con);
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
}    

 

4. Mapper 생성 처리

Mapper는 SQL과 그에 대한 처리를 지정하는 역할을 한다. MyBatis-Spring을 이용하는 경우에는 Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성할 수 있다.

 

- [도메인.mapper]패키지 내 TimeMapper라는 인터페이스를 추가한다.

package com.package.itapp.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	@Select("SELECT sysdate FROM dual")
	public String getTime();
}

 

- 클래스 선언부에 mybatis-spring에서 사용하는 @MapperScan을 이용해서 MyBatis가 동작할 때 Mapper를 인식할 수 있도록한다.

@Configuration
@ComponentScan(basePackages= {"com.package.itapp.sample"})
@MapperScan(basePackages = {"com.package.itapp.mapper"})
public class RootConfig {
	
    // 내용 생략

}

 

5. Mapper 생성 테스트 (JUnit)

package com.package.itapp.persistence;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.package.itapp.config.RootConfig;
import com.package.itapp.mapper.TimeMapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {RootConfig.class})
@Log4j
public class TimeMapperTests {
 
    @Setter(onMethod_=@Autowired)
    private TimeMapper timeMapper;
    
    @Test
    public void testGetTime() {
        log.info(timeMapper.getClass().getName());
        log.info(timeMapper.getTime());
    
    }
}

 

6. Mapper 생성 처리 (XML 이용)

MyBatis를 이용해서 SQL을 처리할 때 어노테이션을 이용하는 방식이 편리하기는 하지만, SQL이 복잡하거나 길어지는 경우에는 어노테이션 보다 XML을 이용하는 방식을 더 선호하게 된다. 다행히도 MyBatis-Spring의 경우 Mapper 인터페이스와 XML을 동시에 이용할 수 있다.

 

- src/main/resources 구조에 XML을 저장할 폴더를 생성한다. & TimeMapper.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.package.itapp.mapper.TimeMapper">
 
	<select id="getTime2" resultType="string">
		SELECT sysdate FROM dual
	</select>
</mapper>

 

- 기존의 TimeMapper인터페이스에 추가적인 메서드를 선언함

package com.package.itapp.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	@Select("SELECT sysdate FROM dual")
	public String getTime();
	
	public String getTime2();
}

 

7. Mapper 생성 테스트 (JUnit)

package com.package.itapp.persistence;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.package.itapp.config.RootConfig;
import com.package.itapp.mapper.TimeMapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {RootConfig.class})
@Log4j
public class TimeMapperTests {
 
    @Setter(onMethod_=@Autowired)
    private TimeMapper timeMapper;
    
    @Test
    public void testGetTime() {
        log.info(timeMapper.getClass().getName());
        log.info(timeMapper.getTime());
    
    }
    
    @Test
    public void testGetTime2() {
        log.info("getTime2");
        log.info(timeMapper.getTime2());
    
    }
}

 

 

반응형
Comments