2021. 1. 21. 23:57ㆍdev
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
'dev' 카테고리의 다른 글
Python 공백없이 입력받아 list만들기: strip(), rstrip(), lstrip() 사용법 (0) | 2021.04.09 |
---|---|
티스토리 코드블럭 커스터마이징, 폰트 변경방법 (0) | 2021.02.24 |
Local 프로젝트 GitHub에 올릴때 명령어 정리 (0) | 2021.01.23 |
[Spring] 스프링 MVC모델 예제 - Controller와 View연결 (0) | 2021.01.20 |
[Spring] MVC 모델 개념정리 (0) | 2021.01.20 |