[Spring] MyBatis 연동 및 설정방법

2021. 1. 21. 23:57dev

MyBatis 프레임워크 특징

  • 간단한 자바코드만으로 DB 연동을 처리한다
  • SQL 명령어를 자바 코드에서 분리하여 XML 파일에 따로 관리할 수 있다

위의 두가지 특징이 MyBatis의 가장 중요한 특징이며, 기존에 사용하던 JDBC 기반의 DB연동 방법보다 훨씬 간편하다.

 

프로젝트 생성

Mybatis를 사용해 간단한 SQL쿼리문을 테스트해보자. 

 

개발환경

DBMS: Oracle Database 11g Express Edition Release 11.2.0.2.0
WEB Server: apache-tomcat-8.5.61 8
Language: Java EE 8
Framework: Spring 5.2.12.Release

 

1. MyBatis관련 라이브러리 설치 

다음은 pom.xml에 필요한 라이브러리들을 추가하기위해 작성한 코드이다.

<!-- pom.xml -->
	<properties>
		<spring.version>5.2.12.RELEASE</spring.version>
	</properties>
    
    	<!-- MyBatis 라이브러리 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
    		<groupId>org.mybatis</groupId>
    		<artifactId>mybatis</artifactId>
    		<version>3.5.3</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
    		<groupId>org.mybatis</groupId>
    		<artifactId>mybatis-spring</artifactId>
    		<version>2.0.5</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
		<dependency>
    		<groupId>com.oracle.database.jdbc</groupId>
    		<artifactId>ojdbc8</artifactId>
         	<version>19.7.0.0</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
		<dependency>
    		<groupId>org.apache.commons</groupId>
    		<artifactId>commons-dbcp2</artifactId>
    		<version>2.7.0</version>
		</dependency>
  • spring-orm : 스프링과 Mybatis를 연결해주는 라이브러리
  • mybatis : Mybatis를 사용하기 위한 라이브러리
  • mybatis-spring : mybatis와 스프링을 연동시키기 위한 모듈
  • ojdbc8 : 오라클사용위해 필요한 라이브러리
  • commons-dbcp2 : 데이터소스 사용하기 위해 필요한 라이브러리 (톰캣에서 connection pool을 이용할 수 있도록 아파치에서 제공)

2. SQL Mapper XML파일 작성

<!-- MembersMapper.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="exam.spring.board.dao.MembersMapper">
	<select id="getMember" resultType="exam.spring.board.dto.Member">
		select id, name, password, email, join_date from members where id = #{id}
	</select>
	<insert id="addMember" parameterType="exam.spring.board.dto.Member">
		insert into members (id, name, password, email, join_date) values(#{id}, #{name}, #{password}, #{email}, sysdate)  
	</insert>
</mapper>

이 SQL Mapper XML파일은 Mybatis에서 가장 중요한 파일이다. XML 파일안에 DB연동에 필요한 SQL명령어들이 저장된다. SQL Mapper 파일은 <mapper>를 루트 엘리먼트로 사용하고 <insert>, <update>, <delete>, <select> 엘리먼트를 이용해서 필요한 sql구문을 등록한다.

 

쿼리문을 보면 id 속성값이 있는데 이 값이 해당 쿼리문의 이름이다.

 

3. MyBatis 환경설정 파일 생성하기

<!-- configuration.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

XML 문서의 유효성 체크를 위해 필요한 코드이다.

 

4. SqlSession 객체 생성하기

// MyBatisConfig.java

import java.io.IOException;
import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(
		basePackages="exam.spring.board.dao",
		sqlSessionFactoryRef="sqlSessionFactoryBean"
)
public class MyBatisConfig {
	@Bean
	public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource, ApplicationContext applicationContext) throws IOException {
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(dataSource);
		factoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis/configuration.xml"));
		factoryBean.setMapperLocations(applicationContext.getResources("classpath:mybatis/mappers/MembersMapper.xml"));
		// mappers/**/*.xml -> mappers 이하 xml 확장자를 갖는 모든 경로를 불러옵니다 
		return factoryBean;
	}
}

SqlSessionFactoryBean 객체가 실질적인 매핑을 수행하는 객체이다. 

 

=> 이 부분이 핵심코드인데, SqlSessionFactoryBean는 위와 같이 3가지 정보를 등록시킨다.

  • DataSource 정보 (설정관련된 파일은 config 패키지에 따로 생성해주었다)
  • MyBatis 설정 정보
  • Mapper 설정 정보 → 이곳에 SQL문에 대한 정보가 담겨져 있다

5. DataSource 정보 등록

다음은 DB커넥션 정보가 담겨있는 DataSource이다. 

// ApplicationConfig.java

import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;

@Configuration
@ComponentScan(basePackages = {"exam.spring.board.dao","exam.spring.board.service"})
@Import({MyBatisConfig.class})
public class ApplicationConfig {
	@Bean
	public DataSource dataSource() { 
		SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
		dataSource.setDriverClass(oracle.jdbc.driver.OracleDriver.class);
		dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		dataSource.setUsername("master");
		dataSource.setPassword("1004");
		return dataSource;
	}
}

Mybatis는 특정 DBMS로부터 커넥션을 획득하고 DB연동을 처리하기 위해 반드시 DataSource 정보가 필요하다.

 

6. DAO & DTO 클래스 작성

데이터베이스 연동을 처리할 DTO와 DAO클래스를 구현한 것이다.

위의 Mapper 설정파일에서 등록한 쿼리문의 id 속성값을 메서드로 사용한다. 

// MemberMapper.java
package exam.spring.board.dao;

import org.apache.ibatis.annotations.Mapper;
import exam.spring.board.dto.Member;

@Mapper
public interface MembersMapper {
	public Member getMember(String id);
	public void addMember(Member member);
}

 

다음은 데이터 전송을 처리할 DTO객체를 생성한 것이다. 

XML파일에 저장된 SQL 명령어에 사용자가 입력한 값들을 전달하고 실행결과를 매핑한다. 

// Member.java 

public class Member {
	private String id;
	private String name;
	private String password;
	private String email;
	private String joinDate;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
    
	...
	
	@Override
	public String toString() {
		return "Member [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + ", joinDate="
				+ joinDate + "]";
	}
	
}

 

7. 테스트 클라이언트 작성 및 실행

다음은 DAO클래스의 메소드를 테스트하는 클라이언트 프로그램이다.

DAO 파일과 동일한 패키지 경로로 설정해서 테스트해본다. 

 

mybatis 연결 테스트를 위해 jUnit을 사용했으며, 다음과 같이 junit 라이브러리를 불러와야한다. 

	<!-- junit -->
	<!-- https://mvnrepository.com/artifact/junit/junit -->
	<dependency>
   		<groupId>junit</groupId>
   		<artifactId>junit</artifactId>
   		<version>4.13.1</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<version>${spring.version}</version>
	</dependency>
  • junit : junit은 자바용 단위 테스트 작성을 위한 산업 표준 프레임워크다.
  • spring-test : 스프링에 Mybatis가 정상적으로 연동되었는지 확인하는 용도

 

쿼리문에서 insert구문 결과를 출력해보자

// MembersMapperTest.java

package exam.spring.board.dao;

import org.junit.Assert;
...
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import exam.spring.board.config.ApplicationConfig;
import exam.spring.board.dto.Member;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ApplicationConfig.class})
public class MembersMapperTest {

	@Autowired
	MembersMapper membersMapper;

	@Test
	public void addMember() throws Exception{
		Member testMember = new Member();
		testMember.setId("test");
		testMember.setName("테스트");
		testMember.setPassword("test");
		testMember.setEmail("test@test.com");
		
		membersMapper.addMember(testMember);
		Assert.assertNotNull(membersMapper.getMember("test"));
	}
}

 

8. 실행결과


전체 소스코드

https://github.com/jiyoung-dev/TIL/tree/master/Spring/MVCmodel