[ MyBatis + Spring Framework 작동 원리 ]
- Spring Container의 역할 : IOC, AOP, MVC를 지원한다.
- DBCP : DataBase Connection Pool이다.
- SqlSessionFactoryBean : Bean - 자바의 컴포넌트, SqlSessionFactory 생성
- SqlSessionFactory : MyBatis의 전역 정보를 가지고 실행을 제어, SqlSession 생성
- SqlSession : 쿼리를 실행한다 (작업 단위 별로 factory에서 생성됨) - SqlSessionTemplate : Template Pattern 중 하나이다. template은 sql 실행만 담당한다.
나머지 일은 SqlSessionFactoryBean, Mapper.xml 정보를 DI로 주입받아 사용한다. - MemberDAOImpl : template을 주입받아 사용한다. (return template.selectOne(""))
[ MyBatis & Spring 사용 환경 설정 ]
> maven pom.xml 에 1)Spring, 2)DBCP, 3)MyBatis, 4)Spring을 적용한 MyBatis, 5)JDBC 추가
/pom.xml
<dependencies>
<!-- Spring Framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- MyBatis Framework -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!-- Spring과 MyBatis 연동 Framework -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- DBCP ver.2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<!-- JDBC(*Spring ver과 같아야한다) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>
> Spring configure 기본 설정
1) DBCP 정의
2) MyBatis와 Spring 연동 설정
- SqlSessionFactory 생성 (DBCP(datebase connection pool) 주입)
*factory : DBCP와 SQL 정보가 들어있다.
- MyBatis에서 쓸 mapper location(path) 주입
3) typeAliasesPackage(패키지 별칭 타입) 설정 ex) org.kosta.model.vo.MemberVO -> memberVO
4) MyBatis와 Spring 연동 시, 생산성을 위해 SqlSessionTemplate 클래스 이용
- 생성자로 SqlSessionFactory 주입
- 개발 생산성을 위해 SqlSessionTemplate 클래스를 이용, SqlSessionTemplate은 선언적 방식의 트랜잭션 제어를 지원
(= AOP 기반 Transaction 제어)
5) DAO bean 생성 (template을 생성자로!)
/spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- DBCP 정의 -->
<bean id="dbcp" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</bean>
<!-- MyBatis와 Spring 연동 설정-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- DBCP(datebase connection pool) 주입 -->
<property name="dataSource" ref="dbcp"/>
<!-- MyBatis에서 쓸 mapper loation(path) 주입 -->
<property name="mapperLocations" value="classpath:/mybatis/config/*.xml"/>
<!-- Package에 별칭주기 -->
<property name="typeAliasesPackage" value="org.kosta.model.vo"/>
</bean>
<!-- MyBatis + Spring 연동 시,
개발 생산성을 위해 SqlSessionTemplate 클래스를 이용
SqlSessionTemplate은 선언적 방식의 트랜잭션 제어를 지원
(= AOP 기반 Transaction 제어)-->
<bean id="SqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean"/>
</bean>
<!-- DAO 생성 -->
<bean id="memberDAO" class="org.kosta.model.dao.MemberDAOImpl">
<constructor-arg ref="SqlSessionTemplate"/>
</bean>
</beans>
[ 적용 ]
mapper (/mybatis.config)
/member.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Sql Mapper -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="member">
<select id="findMemberById" resultType="memberVO">
SELECT id, password, name, address
FROM spring_member
WHERE id=#{value}
</select>
</mapper>
/model.vo
/MemberVO.java
package org.kosta.model;
public class MemberVO {
private String id;
private String password;
private String name;
private String address;
//기본 생성자가 반드시 있어야 한다!
public MemberVO() {
super();
}
public MemberVO(String id, String password, String name, String address) {
super();
this.id = id;
this.password = password;
this.name = name;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
}
}
/model.dao
/MemberDAO.java <<interface>>
package org.kosta.model.dao;
import org.kosta.model.vo.MemberVO;
public interface MemberDAO {
public MemberVO findMemberById(String id);
}
/MemberDAOImpl.java
package org.kosta.model.dao;
import org.kosta.model.vo.MemberVO;
import org.mybatis.spring.SqlSessionTemplate;
public class MemberDAOImpl implements MemberDAO {
//MyBatis sql 실행 메서드를 제공하는 객체
private SqlSessionTemplate template;
//Spring Container로부터 DI(주입)
public MemberDAOImpl(SqlSessionTemplate template) {
super();
this.template = template;
}
//findMemberById method
@Override
public MemberVO findMemberById(String id) {
return template.selectOne("member.findMemberById", id);
}
}
/test
/TestMyBatis.java
package test;
import org.kosta.model.dao.MemberDAO;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*
* Spring과 MyBatis를 연동해서 DAO를 실행한다.
*/
public class TestMyBatis {
public static void main(String[] args) {
ClassPathXmlApplicationContext factory
= new ClassPathXmlApplicationContext("spring-mybatis.xml");
MemberDAO memberDAO = (MemberDAO) factory.getBean("memberDAO");
System.out.println(memberDAO.findMemberById("java"));
factory.close();
}
}
[ 결과 ]