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 프로젝트 작업순서
- 테이블 생성
- 스프링 mvc 프로젝트 생성
- 프로젝트 라이브러리 설정(pom.xml)
- mybatis 의존 관계 설정(root-context.xml)
- mybatis 공통 설정(mapper.xml , mybatis-config.xml)
- mybatis , db 연동 단위 테스트
- 도메인 클래스
- dao 인터페이스 , dao 클래스
- mapper 생성과 sql 문 작성
- mapper에관한 root-context.xml 설정
- dao 스프링 빈등록, 단위 테스트
- service 인터페이스 , service 클래스
- service 클래스 스프링 빈 등록
- 컨트롤러 작성
- 뷰 페이지 작성
- 컨트롤러 스프링 빈 등록
프로젝트 라이브러리 설정(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&useUnicode=true&characterEncoding=utf8&
useSSL=false&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 프로젝트가 끝난다
뒤는 다음 글에
'Backend > Spring' 카테고리의 다른 글
[Spring] AOP(Aspect Oriented Programming) (0) | 2023.06.09 |
---|---|
[Spring] Mybatis_2 (0) | 2023.06.09 |