본문 바로가기
Spring/Spring Legacy

Spring Legacy / MyBatis 연동 및 사용하기

by LWM 2020. 9. 23.
반응형

Spring에서 SQL 맵핑 프레임워크인 MyBatis를 사용하려면 어떻게 해야할까? 순서는 다음과 같다.

 

  1. MyBatis 관련 라이브러리 추가
  2. SqlSessionFactory 등록
  3. Mapper 스캔 설정
  4. Mapper 작성 (사용예제)

 

1. MyBatis 관련 라이브러리 추가

MyBatis를 연동하기 위해 필요한 라이브러리는 총 4개가 있다.

 

- mybatis / mybatis-spring : MyBatis와 스프링 연동용 라이브러리

//mybatis
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>

//mybatis-spring
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>

 

- spring-jdbc / spring-tx : 스프링에서 DB처리와 트랜잭션 처리(해당 라이브러리들은 MyBatis와 무관해보이지만 없을                                      경우 에러가 발생한다.)

//spring-jdbc
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
        
//spring-tx      
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

 

 

2. SqlSessionFactory 등록

MyBatis에는 SQLSession과 SQLSessionFactory라는 핵심적인 객체들이 존재한다. SQLSessionFactory는 SQLSession을 만드는 존재로, 개발에서 SQLSession을 통해서 Connection을 생성하거나 원하는 SQL을 전달하고 결과를 리턴 받는 구조로 작성한다.

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

 

!참고

SQLSession 사용 테스트 코드 예시

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={RootConfig.class})
@Log4j
public class DataSourceTests {

    @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());
        
        }
    }
}

 

 

3. Mapper 스캔 설정

@MapperScan(basePackages= {"org.zerock.mapper"})

 

 

4. Mapper 작성

Mapper를 작성하는 방법은 2가지가 있다. XML을 활용하거나 또는 인터페이스에서 쿼리를 활용하는 것이다.

각 방법에 대한 예시 코드는 다음과 같다.

 

- 인터페이스에서 어노테이션을 활용한 Mapper 작성

public interface BoardMapper {
	
	@Select("select * from tbl_board where bno > 0")
	public List<BoardVO> getList();

}

 

- XML을 활용한 Mapper 작성

//자바파일
public interface BoardMapper {
	
	public List<BoardVO> getList();

}


//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="org.zerock.mapper.BoardMapper">

<select id="getList" resultType="org.zerock.domain.BoardVO">
	<![CDATA[select * from tbl_board where bno > 0]]>
</select>

</mapper>

 

XML을 활용한 Mapper 작성시 주의할 점은 3가지가 있다.

첫째, XML파일에서 XML맵퍼를 이용하는 태그에 대한 설정이 필요하다.

둘째, namespace 작성에 실수가 없어야한다.

셋째, XML파일 위치의 경우 Mapper인터페이스가 있는 곳에 같이 작성하거나, src/main/resources 구조에 XML을 작성해야 한다.

 

MyBatis를 이용해서 SQL을 처리할 때 인터페이스를 이용하는 방식이 압도적으로 편리하기는 하지만, SQL문이 복잡하거나 길어지는 경우에는 어노테이션으로 처리하는 것 보다는 XML을 이용하여 처리하는 것이 좋다. MyBatis-Spring의 경우 Mapper인터페이스와 XML을 동시에 이용할 수 있기 때문에 고민없이 동시에 두가지 방법을 동시에 사용하면 된다.

 

!참고

Mapper 테스트 코드 예시

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { RootConfig.class })
@Log4j
public class BoardMapperTests {
	
    @Setter(onMethod_ = { @Autowired })
    private BoardMapper mapper;
    
    @Test
    public void testGetList() {
    	log.info(mapper.getClass().getName());
        log.info(mapper.getList());
    }
    
}
반응형