본문 바로가기

BackEnd/Spring

[코드로 배우는 스프링 웹 프로젝트] ch04 MyBatis와 스프링 연동 1

728x90
반응형

1. MyBatis

   ▷ SQL 매핑 프레임워크, 개발자들은 JDBC 코드의 복잡하고 지루한 작업을 피하는 용도로 많이 사용

   ▷ 스프링 프레임워크와 MyBatis를 연동해서 좀 더 빠르게 SQL 처리 가능

   ▷ 기존의 SQL을 그대로 사용할 수 있고 진입장벽이 낮아 JDBC 대안으로 사용할 수 있음

 

◎ MyBatis의 특징

 

 

◎ pom.xml 수정(MyBatis 관련 라이브러리 내용 추가)

...(생략)...
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.6</version>
	</dependency>

	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>1.3.2</version>
	</dependency>

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

 

 

 

◎ SQLSessionFactory

   ▷ MyBatis에서 핵심적인 객체는 SQLSession, SQLSessionFactory

   ▷ SQLSessionFactory는 SQLSession이라는 것을 만들어 냄.

   ▷ 개발에서 SQLSession을 통해 Connection을 생성하거나 원하는 SQL을 전달, 결과를 리턴 받는 구조로 작성

 

 

◎ src/main/webapp/WEB-INF/spring → root-context.xml(내용 추가)

...(생략)...
<!-- 추가 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
...(생략)...


스프링에 SqlSessionFactory 등록하는 작업은 SqlSessionFactoyBean을 이용하며 MyBatis 패키지가 아니라 스프링 연동 작업을 처리하는 mybatis-spring 라이브러리 클래스임

 

 

◎ src/test/java/org/codehows/persistence → DataSourceTests.java

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


아래와 같은 화면이 나타나면 됩니다.

 

 

 

2. 스프링과의 연동 처리

   ▷ SQLSessionFactory 통해서 코드 작성해도 직접 Connection을 얻어 JDBC 코딩이 가능,

        좀 더 편하게 작업하기 위해 SQL 처리를 위한 설정 분리 및 자동 처리를 이용하는 게 좋음

   ▷ 이를 위해 MyBatis의 Mapper라는 존재를 작성해야 함

   ▷ Mapper는 SQL과 그에 대한 처리를 지정하는 역할을 함

   ▷ MyBatis - Spring을 이용할 경우 Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성 가능

 

 

◎ Maper 인터페이스

   ▷ Mapper를 작성하는 작업은 XML도 가능하고 최소한의 코드를 작성하는 Mapper 인터페이스 사용가능

 

 

◎ ex00 → src/main/java → org.codehows.mapper → TimeMapper.java

 

 

◎ TimeMapper 인터페이스

package org.codehows.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	@Select("SELECT sysdate FROM dual")
	public String getTime();
}

 

 

root-context.xml

   ▷ MyBatis가 동작할 때 Mapper를 인식할 수 있돌고 root-context.xml에 추가적인 설정 필요   

   ▷ <mybatis:scan> 태그 이용

1. Namespaces


2. Source
...(생략)...

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
    <!-- 추가 -->
	<mybatis-spring:scan base-package="org.codehows.mapper"/>
    
    <context:component-scan
	base-package="org.zerock.sample"></context:component-scan>

...(생략)...​


<mybatis-spring:scan> 태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아 처리

자동으로 org.codehwos.mapper 패키지를 인식하도록 합니다.

 

 

◎ Mapper 테스트

   ▷ MyBatis-Spring은 Mapper 인터페이스를 이용해 실제 SQL 처리가 되는 클래스를 자동으로 생성

   ▷ 개발자들이 인터페이스와 SQL만을 작성하는 방식으로 모든 JDBC 처리 끝낼 수 있음

 

 

◎ src/test/java → org.codehows.persistence → TimeMapperTests.java 생성

package org.codehows.persistence;

import static org.junit.Assert.fail;

import java.sql.Connection;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.codehows.mapper.TimeMapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class TimeMapperTests {

	@Setter(onMethod_ = { @Autowired })
	private TimeMapper timeMapper;
	
	@Test
	public void testGetTime() {
		log.info(timeMapper.getClass().getName());
		log.info(timeMapper.getTime());
	}
}

 


TimeMapperTests 클래스는 TimeMapper가 정상적으로 사용 가능한지 알아보기 위한 테스트 코드
코드가 정상적으로 동작한다면 스프링 내부에는 TimeMapper 타입으로 만들어진 스프링 객체(빈)가 존재한다는 뜻

timeMapper.getClass().getName()은 실제 동작하는 클래스 이름을 확인해 줍니다.
실행 결과는 개발 시 인터페이스만 만들어 주었지만 내부적으로 적당한 클래스가 만들어 짐

스프링이 인터페이스를 이용해 객체를 생성한다는 것이 중요

 

 

◎ XML 매퍼와 같이 쓰기

   ▷ MyBatis를 이용해 SQL을 처리할 때 어노테이션을 이용하는 방식이 편리하지만 SQL이 복잡하거나 길어지면 어노테이션보다는 XML을 이용하는 방식을 더 선호

   ▷ MyBatis-Spring은 Mapper 인터페이스와 XML을 동시에 이용할 수 있음

 

 

◎ src/main/java → org.codehows.mapper → TimeMapper.java(인터페이스)

package org.codehows.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	@Select("SELECT sysdate FROM dual")
	public String getTime();
	
	public String getTime2();
}

 

 

src/main/resources → org.codehows.mapper → TimeMapper.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.codehows.mapper.TimeMapper">

	<select id="getTime2" resultType="string">
		SELECT sysdate FROM dual
	</select>

</mapper>

 

 

src/test/java → org.codehows.persistence → DataSourceTests.java 수정

...(생략)...

	@Test
	public void testConnection() {
		try (Connection con = dataSource.getConnection()){
			log.info(con);
		} catch(Exception e) {
			fail(e.getMessage());
		}
	}
    
...(생략)...

 


다음과 같이 내용을 추가했을 때 실행이 된다면 연결이 완료된 것입니다.

 

MyBatis를 이용해서 스프링과 연결하고 실제 SQL문들을 사용해 보았습니다.

 

작성한 인터페이스, 클래스와 DB와 연결이 잘 되면 문제 없이 진행된 거네요!

 

스프링이 간단하긴 하지만 처음에 개념이 좀 어렵네요,,ㅎㅎ

 

그래도 반복해서 보면서 익혀볼게요!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

 

 

728x90
반응형