본문 바로가기
기술지식

[Mybatis] Spring에서 Mybatis 세팅방법, 사이클 정리

by GRITZ 2021. 12. 21.

국비학원에서 Spring을 배우고 있는 중이다. 이전에 인터넷 강의로 Spring Boot를 공부해서 그런지 이해가 잘 되기도 하고, 국비에서하는 강의는 레거시여서 초반에 xml파일로 세팅하는 방법을 중점적으로 공부하였다. 

 

스프링부트만 배워서 SQL문을 매핑하는 마이바티스를 배우지 않았는데, 국비학원에서 배운 겸 세팅 방법을 적어놓으려고한다. 스프링이 워낙 초반 세팅이 복잡하고 어렵기 때문에 어디다 적어놓지 않으면 까먹을 것 같다.

 

 

0. 마이바티스를 세팅하는 전체적인 흐름 알아보기

마이바티스를 사용하기 위해서는 세 가지의 라이브러리가 필요하다.

- Mybatis

- Mybatis-Spring

- Spring-jdbc

 

- (Option) 커넥션 풀 라이브러리(c3p0, Hikari CP 등)

 

아래는 마이바티스가 실행되는 구조를 나타낸 이미지이다. 각 라이브러리가 어떤 구조로 사용되는지 살펴보자.

Mybaits의 구조

마이바티스를 세팅하면서 마이바티스의 구조에 대해 이해할 수 있다. 라이브러리를 추가한 다음 전체적인 세팅방법은 다음과 같다.

 

- pom.xml에 라이브러리 추가 (Maven 기준)

pom.xml에 라이브러리 추가

pom.xml에 라이브러리를 추가한다. mybatis, mybatis-spring, spring-jdbc 총 3개를 추가해 주어야한다.

mvnrepository.com 에서 각 라이브러리를 검색한 다음 복붙하여 추가하도록 하자

 

spring-jdbc의 경우 스프링 프레임워크에 의존하는 라이브러리 이기 때문에 사용하는 스프링과 버전을 맞추어야 한다. version태그에 ${org.springframwork-version} 을 사용하면 현재 사용하는 스프링 버전으로 치환되니 참고하도록 하자.

 

 

 

 

 

- root-servlet.xml 에서 세팅하기

1. DB정보를 불러오는 dataSource 빈을 컨테이너에 등록한다.

(커넥션 풀을 사용하기도 한다. 나는 c3p0를 사용하였다. 히카리CP도 있으니 알아보는 것을 권장한다.) 

dataSource 컨테이너 등록

 

 

 

 

2. SqlSessionFactoryBean 빈을 컨테이너에 등록한다. SqlSessionFactoryBean 객체에는 여러가지 필드변수들이 존재한다. 그 중 dataSource와 mapperLocations에 의존성 주입을 해주어야한다.

 

SqlSessionFactoryBean 컨테이너 등록

dataSource는 1에서 작성한 DB 객체를 넣어주면 되고, mapperLocations에는 SQL문을 매핑한 xml 파일의 패키지경로를 넣어주면 된다.

mapperLocations의 속성에 "classpath:/mapper/*.xml"을 작성하였는데, classpath는 기본적으로 src/main/resources로 설정되어있다. 해당 폴더안에 mapping 패키지 안에 있는 모든 xml 파일을 mapperLocations로 설정하였다.

 

 

 

 

3. SqlSessionTemplate 빈을 컨테이너에 등록한다. 해당 객체는 sqlSessionTemplate 변수가 선언되어있어서 의존성 주입을 해주어야한다. 2번에서 선언한 sqlSessionFactory를 주입하도록 하자.

SqlSessionTemplate 컨테이너 등록

주의해야할 점은 setter 메서드가 없기 때문에 생성자를 통해 주입해주어야한다. constructor-arg 태그를 사용하여 주입하도록 하자.

 

 

 

 

4. Service, Controller에 sqlSessionTemplate 의존성을 주입하면 대략적인 DI 세팅이 완료된다.

 

 

 

 

- Mapper 패키지 생성, SQL문 매핑하기

mapper 패키지 생성

src/main/resources 폴더에 mapper 패키지를 생성하였다. 패키지 안에 xml파일을 만들면 SqlSessionFactory 객체가 매핑된 SQL문을 인식하여 비즈니스 로직에서 사용하게된다. xml 파일을 생성하도록 하자.

 

Emp.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="com.sist.model.EmpDAO">
	<select id="empList" resultType="com.sist.model.EmpDTO">
		select * from emp order by empno desc
	</select>
</mapper>

select 문을 사용하여 데이터를 가져오기위해 작성한 xml파일이다.

가장 먼저 mapper 태그를 사용한 후 내부에 작성하고자 하는 SQL문의 태그를 선택하여 작성할 수 있다.

select, insert, delete, update의 기본적인 태그를 사용하여 SQL문을 매핑할 수 있다.

 

여기서 각 태그에서 필수적으로 사용해야하는 속성들이 있다.

- mapper 태그에는 namespace 속성이 반드시 들어가야한다. SqlSessionFactoryBean에서 mapper 태그를 식별하는데 사용하기 때문이다. 보통 패키지명으로 작성하면 그 패키지 안에서 직접 찾게되므로 패키지명으로 작성하는 것을 권장한다. 자세한 내용은 Mybatis 공식홈페이지에서 확인하자.

 

- SQL 매핑 태그는 id 속성을 사용해주어야한다. 비즈니스 로직에서 매핑된 SQL문을 선택할 때 id를 통해 매개값을 넣기위해서이다. 또한 select, insert, update, delete 태그에 따라서 따로 작성해야하는 속성들이 있다.

예를들어 select 태그를 사용하면 DB에서 데이터를 DTO 객체를 통해 옮겨주어야하므로 resultType 속성을 사용해야한다. 위의 코드를 보면 resultType에 패키지경로와 DTO 클래스명을 작성하여 해당 객체타입으로 데이터를 리턴하도록 설정하였다.

 

 

 

 

이제 비즈니스 로직에서 데이터를 가져와 출력해보도록 하자.

 

EmpDAOImpl.class

SqlSessionTemplate 객체에 의존성 주입을 한 후 데이터를 가져오기위해 selectList를 사용하였다. 파라미터에는 "empList"를 넣어주어 xml파일에 있는 id가 empList인 매핑 SQL문으로 DB에서 데이터를 가져오도록 하는 메서드이다.

 

 

 

 

EmpController.class

Controller에서는 EmpDAO 인터페이스를 의존하고 있으며, EmpDAOImpl 객체에서 가져온 데이터를 model에 넣어서 view 페이지로 리턴하도록 간단하게 작성하였다.

 

 

 

 

 

결과

마이바티스를 사용하면 테이블에서 가져온 데이터의 컬럼들을 일일이 DTO에 설정해줄 필요가 없어진다. 따라서 개발자의 생산성이 증가하게되는 유용한 프레임워크이다. 현업에서는 마이바티스가 거의 필수소양이므로 어떻게 사용하는지, 세팅을 어떻게하는지 반드시 알아둘 필요가 있다고 생각한다. 마이바티스를 통해 CRUD를 구현해보고 더 나아가 페이징처리까지 스스로 해봐야할 것 같다.

댓글