Backend/Spring

[Spring] Mybatis

양원준 2023. 6. 9. 11:17
728x90

MyBatis란?

sql과 자바 객체를 매핑하는 사상에서 개발된 db 접근용 프레임워크

sql 기반으로 db 접근을 수행하는 기존 방식과 큰 규모의 애플리케이션 개발에서 발생하는 과제를 해결함

 

이거 왜 사용함? 장점이 뭐임?

sql을 체계적으로 관리 할수 있고, 자바 객체와 sql 입출력 값의 바인딩

->mapper 인터페이스를 통해 sql 설정 파일과 연동

->비지니스 로직에서 mapper 인터페이스를 통해 sql문 실행

 

 

 

주요 컴포넌트

MyBatis 설정파일

sqlSessionFactoryBuilder : mybatis 설정 파일을 바탕으로 SqlSessionFactory 생성

SqlSessionFactory : sqlSesson 생성을 위한 컴포넌트

SqlSssion : sql 발행과 트랜잭션 관리

mapper 인터페이스: 매핑 파일과 sql에 대응하는 자바 인터페이스

매핑 파일 : sql과 or 매핑을 xml에 파일 기술

 

or 매핑이 뭐임?

그냥 객체지향프로그래밍에서 설계한 db 테이블간 매핑 작업과정임

 

 

sqlSession 인터페이스 -> mybatis의 핵심 API

org.mybatis.spring.SqlSessionTemplate : sqlSession 인터페이스를 구현

 

sqlSession 어캐 사용함?

sqlSession 객체를 Dao 객체에 의존관계 주입

mapper 에 등록된 sql을 실행하기 위한 다양한 api 제공

 

private static final String namespace = "org.tukorea.wonjoon.mapper.BoardMapper";
BoardVO vo = sqlSession.selectOne(namespace+".selectByid",id);

이렇게 namespace와 sql id 조합으로 접근

 

 

위와 같이 sqlSession 객체를 Dao 객체에 의존관계 주입

myBatis의 sqlSession 인터페이스를 구현한 sqlSessionTemplate 객체

 

 

 

 

 

 

MyBatis 연동을 위한 라이브러리

spring-jdbc : 스프링이 제공하는 jdbc 매핑 모듈

MyBatis-Spring : mybatis과 제공하는 프레임워크 간의 연동 라이브러리

MyBatis : 프레임워크 모듈

 

++

커넥션 풀 지원 라이브러리 :  commons-dbcp

mysql jdbc 라이브러리 : mysql-connector-java

 

 

 

 

 

 

일반적인 mybatis 를 이용한 스프링 mvc 프로젝트 작업순서

  1. 테이블 생성
  2. 스프링 mvc 프로젝트 생성
  3. 프로젝트 라이브러리 설정(pom.xml)
  4. mybatis 의존 관계 설정(root-context.xml)
  5. mybatis 공통 설정(mapper.xml , mybatis-config.xml)
  6. mybatis , db 연동 단위 테스트
  7. 도메인 클래스
  8. dao 인터페이스 , dao 클래스
  9. mapper 생성과 sql 문 작성
  10. mapper에관한 root-context.xml 설정
  11. dao 스프링 빈등록, 단위 테스트
  12. service 인터페이스 , service 클래스
  13. service 클래스 스프링 빈 등록
  14. 컨트롤러 작성
  15. 뷰 페이지 작성
  16. 컨트롤러 스프링 빈 등록

 

프로젝트 라이브러리 설정(pom.xml)

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency>
<dependency>
    <groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.30</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.10</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>2.0.7</version>
</dependency>

 

 

 

MyBatis 의존 관계 설정(root-context.xml)

//커넥션 풀 지원하는 데이터 소스 빈
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
	<property name="url" value="jdbc:mysql://127.0.0.1:3306/springdb?
		allowPublicKeyRetrieval=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;
		useSSL=false&amp;serverTimezone=UTC" />
	<property name="username" value="spring" />
	<property name="password" value="passwd" />
	<property name="maxActive" value="5" />
</bean>

//스프링의 트랜잭션 관리자 빈
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"></property>
</bean>

//MyBatis의 SqlSessionFactory 빈
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<property name="configLocation" value="classpath:/mybatis-config.xml"></property>
	<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"></property>
</bean>

//MyBatis-Spring의 SqlSessionTemplate빈
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
	<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
  • 커넥션 풀을 지원하는 데이터 소스 빈 등록
  • 트랜잭션 관리자 빈 등록 -> 스프링의 트랜잭션 제어를 사용해서 mybatis 트랜잭션 api는 사용하지 않음
  • mybatis의 sqlsessionfactory 빈 등록
  • mybatis-spring의 sqlsessiontemplate 빈 등록

 

mybatis 공통 설정(mapper.xml , mybatis-config.xml)

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<property name="configLocation" value="classpath:/mybatis-config.xml"></property>
	<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"></property>
</bean>

이렇게 빈을 등록한 뒤

 

//mapper파일

<mapper namespace="org.tukorea.wonjoon.mapper.BoardMapper">

이런식으로 mapper.xml 생성

 

mybatis-config.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">
<configuration>
	<typeAliases> 
		<package name="org.tukorea.wonjoon.domain" />
	</typeAliases>
</configuration>

//typeAliases는 매핑파일에서 지정하는 자바 클래스에 대한 별칭을 할당
//mapper파일에서 parameterType이나 resultType에 사용하는 클래스 네임에서 org.tukorea.wonjoon.domain 를 생략 가능

 

데이터 소스 연결 작동 여부 테스트

package org.tukorea.wonjoon.test;
...................................................
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {“file:src/main/webapp/WEB-INF/spring/root-context.xml“ })
public class DataSourceTest {

	@Inject
	private DataSource ds;
	@Test
	public void testConntection() throws Exception {
		try(Connection con = ds.getConnection()) {
		System.out.println(con);
	}
    
	catch(Exception e) {
	e.printStackTrace();
	}
}
}

 

sqlSession 객체 생성 여부 테스트

package org.tukorea.wonjoon.test;
...................................................
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml" })
public class DataSourceTest {
	@Inject
	private SqlSessionFactory sqlFactory;
	@Test
		public void testFactory() throws Exception {
		try(SqlSession session = sqlFactory.openSession()) {
			System.out.println(session);
			}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}

 

여기서 스프링 테스트에 간략히 얘기하자면

스프링 테스트란?

스프링 빈(@Controller, @Service, @Repository, @Conponent 등이 붙은 클래스)를 테스트 하는 모듈임

JUnit 테스팅 프레임워크를 사용하여 스프링의 DI 컨테이너를 동작시키는 기능

 

//pom.xml

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>${org.springframework-version}</version>
	<scope>test</scope>
</dependency>

이렇게 스프링 테스트 사용을 위한 라이브러리를 등록하고 사용

 

테스트 케이스 작성을 위한 주요 애노테이션

@RunWith : DI컨테이너 로딩

@ContextConfiguration: DI 컨테이너의 설정 파일 위치 또는 설정 클래스를 지정

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml" })

//스프링 테스트는 Junit에서 스프링 testcontext 프레임워크를 동작시킬 수 있도록 지원하기 위해 org.springframework.text.context.junit4.SpringJunit4ClassRunner를 제공

 

 

 

 

 

여기까지 mybatis 관련 설정이 끝났다아~

이제부턴 dao, service, controller 작성하구 이거에 관련하여 설정해주면 스프링 mybaits 프로젝트가 끝난다

뒤는 다음 글에

728x90

'Backend > Spring' 카테고리의 다른 글

[Spring] AOP(Aspect Oriented Programming)  (0) 2023.06.09
[Spring] Mybatis_2  (0) 2023.06.09