본문 바로가기
Java Web Programming/6. Spring | MyBatis

[MyBatis/Spring] 스프링에 마이바티스 적용해보기

by 파프리카_ 2020. 10. 30.
728x90
반응형

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

[ 결과 ]  

728x90
반응형