Spring/Maven Project

Spring에 MyBatis 적용 (MyBatis 3.5.10, MyBatis-Spring 2.0.7, spring-jdbc 5.2.22)

carrotweb 2022. 9. 24. 22:10
728x90
반응형

Spring Framework에서 MyBatis을 사용하기 위해서는 MyBatis와 MyBatis를 연동하여 처리해 주는 MyBatis-Spring, 데이터베이스를 처리(Transaction - 트랜잭션)해주는 Spring-JDBC가 필요합니다.

 

그럼 MyBatis-Spring에 대해 알아보겠습니다.

 

 

MyBatis-Spring

MyBatis-Spring integrates MyBatis seamlessly with Spring. This library allows MyBatis to participate in Spring transactions, takes care of building MyBatis mappers and SqlSessions and inject them into other beans, translates MyBatis exceptions into Spring DataAccessExceptions, and finally, it lets you build your application code free of dependencies on MyBatis, Spring or MyBatis-Spring.

 

http://mybatis.org/spring/index.html

 

MyBatis-Spring은 MyBatis와 Spring을 원활(완벽)하게 통합합니다. 이 라이브러리는 MyBatis가 Spring Transaction(spring-tx)과 연동 처리되게 하고 MyBatis Mapper와 SqlSession을 구축하고 다른 빈(Bean)에 주입(Injection)합니다. 그리고 MyBatis의 예외를 Spring DataAccessExceptions으로 변환하여 처리해 줍니다. 마지막으로, MyBatis가 Spring(MyBatis-Spring)에 종속성 없이 애플리케이션 코드를 빌드할 수 있게 처리해 줍니다.

 

간단하게 설명하면, MyBatis-Spring으로 생성된 SqlSession을 사용하여 데이터베이스에 접속하고 MyBatis Mapper를 사용하여 쿼리를 실행할 수 있습니다.

 

 

다음은 MyBatis-Spring의 버전 별 설정 정보입니다.

  • MyBatis-Spring 2.0.X은 MyBatis 3.5 이상, Spring Framework 5.0 이상, Java 8 이상이어야 합니다.
  • MyBatis-Spring 1.3.X은 MyBatis 3.4 이상, Spring Framework 3.2.2 이상, Java 6 이상이어야 합니다.

 

 

Maven Spring Project에 MyBatis, MyBatis-Spring, Spring-JDBC 적용하기

 

1. 메이븐 리포지토리(https://mvnrepository.com)에서 "mybatis"으로 검색합니다. 검색된 결과 중에 "org.mybatis > mybatis"인 MyBatis를 선택합니다.

 

2. "Version"중에서 "3.5.10"를 선택합니다. 그리고 [Maven] 탭을 선택하고 복사합니다.

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

 

3. 메이븐 프로젝트에서 pom.xml 파일을 오픈하고 복사한 내용을 붙여 넣기 합니다.

 

4. 메이븐 리포지토리(https://mvnrepository.com)에서 "mybatis-spring"으로 검색합니다. 검색된 결과 중에 "org.mybatis > mybatis-spring"인 MyBatis Spring를 선택합니다.

 

5. "Version"중에서 "2.0.7"를 선택합니다. 그리고 [Maven] 탭을 선택하고 복사합니다.

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

 

6. 메이븐 프로젝트에서 pom.xml 파일을 오픈하고 복사한 내용을 붙여 넣기 합니다.

 

7. 메이븐 리포지토리(https://mvnrepository.com)에서 "mybatis-spring"으로 검색합니다. 검색된 결과 중에 "org.springframework > spring-jdbc"인 Spring JDBC를 선택합니다.

 

8. "Version"중에서 "5.2.22.RELEASE"를 선택합니다. 그리고 [Maven] 탭을 선택하고 복사합니다.

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.22.RELEASE</version>
</dependency>

 

9. 메이븐 프로젝트에서 pom.xml 파일을 오픈하고 복사한 내용을 붙여 넣기하고 저장합니다.

그러면 자동으로  MyBatis, MyBatis-Spring, Spring-JDBC 라이브러리 파일(JAR)들이 다운로드됩니다.

mybatis-3.5.10.jar
mybatis-spring-2.0.7.jar
spring-jdbc-5.2.22.RELEASE.jar
spring-tx-5.2.22.RELEASE.jar

 

MyBatis-Spring에 필요한 라이브러리 파일들이 설치되었으니 MyBatis-Spring을 사용하여 어떻게 SqlSession 객체가 어떻게 생성되고 주입(Injection)되는지 알아보겠습니다.

 

 

1. SqlSessionFactoryBean은 MyBatis에서 Spring의 FactoryBean 인터페이스를 구현한 클래스로 DataSource와 MyBatis 설정 파일, Mapper XML 파일들을 이용하여 sqlSession 객체를 생성합니다.

 

2. SqlSessionTemplate은 SqlSessionFactoryBean을 이용하여 SqlSession 객체를 생성하고 데이터를 처리하는 클래스(DAO)에 SqlSession 객체를 주입(Injection)시켜 줍니다.

  • SqlSessionTemplate은 생성된 SqlSession이 Transaction(트랜잭션)으로 처리될 수 있도록 세션을 종료하거나 Commit(커밋)하거나 Rollback(롤백)하는 세션의 생명주기를 관리합니다.
  • 생성된 SqlSession을 데이터를 처리하는 클래스(DAO)에서 주입(Injection)시켜 줍니다. (데이터를 처리하는 클래스(DAO)에서는 sqlSession 객체의 메서드를 사용하여 Mapper(매퍼) XML 파일들에 있는 Query(쿼리) 문을 로드하고 처리할 수 있습니다.)

이처럼, SqlSessionTemplate은 MyBatis와 Spring를 연결시켜 주는 핵심 모듈입니다.

 

반응형

 

그럼, Spring에서 MyBatis-Spring이 처리되도록 설정하겠습니다.

 

Spring에서 MyBatis-Spring를 전역에서 사용할 수 있게 하기 위해서는 ContextLoaderListener를 통하여 로드해야 합니다. 이전에 web.xml에서 ContextLoaderListener를 설정하면서 여러 개의 Context를 로드할 수 있게 처리하였습니다.

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		classpath*:com/home/study/**/config/context-*.xml
	</param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

그래서 Java Resource > src/main/resource > com/home/study/test1/config 폴더에 context-mapper-mariadb.xml 파일을 생성하면 ContextLoaderListener에서 로드하게 됩니다.

 

파일명을 context-mapper-mariadb.xml으로 한 이유는 다양한 데이터베이스들과 연결될 수 있기 때문에 데이터베이스 별로 구분을 하기 위해서입니다. 만약, MySQL도 사용한다면 context-mapper-mysql.xml로 파일을 생성하면 됩니다.

 

 

Maven Spring Project에 MyBatis-Spring 적용하기

 

1. Java Resource > src/main/resource > com/home/study/test1/config 폴더에 context-mapper-mariadb.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"
		xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
</beans>

 

2. SqlSessionFactoryBean 객체를 생성합니다.

  1. SqlSessionFactory 객체를 생성하기 위해 클래스로 MyBatis의 SqlSessionFactory(org.mybatis.spring.SqlSessionFactoryBean)를 입력합니다.
  2. DataSource를 사용하기 위해서 dataSource 속성에 이전에 생성한 DataSource인 "dataSourceMariaDB"를 입력합니다.
  3. MyBatis 설정 파일의 경로를 설정하기 위해서 configLocation 속성에 MyBatis 설정 파일의 경로를 입력합니다.
  4. Query(쿼리) 문이 있는 Mapper(매퍼) XML 파일들을 가져오기 위해 mapperLocations 속성에 Mapper(매퍼) XML 파일들의 경로를 입력합니다.
<bean id="sqlSessionFactoryMariaDB" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSourceMariaDB" />
	<property name="configLocation" value="classpath:/com/home/study/test1/sqlmap/mariadb-config.xml" />
	<property name="mapperLocations" value="classpath*:/com/home/study/test1/sqlmap/mappers/mariadb/**/*Mapper.xml"/>
</bean>

 

MyBatis 설정 파일과 Mapper(매퍼) XML 파일들은 Java Resource > src/main/resource > com/home/study/test1/sqlmap 하위 폴더에 있는 것으로 하겠습니다.

 

MyBatis 설정 파일에서 타입 별칭 설정을 위한 <typeAliases>와 설정을 위한 <settings>를 설정할 수 있습니다. 만약, 타입 별칭과 설정 정보가 없으면 configLocation 속성을 입력하지 않아도 됩니다.

MyBatis 설정 파일에 대한 자세한 설명은 아래에서 하겠습니다.

 

mapperLocations 속성 값은 Java Resource에서 여러 개의 Mapper(매퍼) XML 파일들의 로드하기 위해서 classpath*로 경로를 입력합니다.

 

mapperLocations 속성 값에 입력된 경로를 해석하면

  • Java Resource > src/main/resource > com/home/study/test1/sqlmap 하위 폴더에 mappers 폴더가 있는 이유는 MyBatis 설정 파일과 Mapper(매퍼) XML 파일들 분리하기 위해서입니다.
  • 하위 폴더에 mariadb 폴더가 있는 이유는 데이터베이스 별로 Mapper(매퍼) XML 파일들을 구분하기 위해서입니다.
  • 하위 폴더에 /** 가 있는 이유는 모듈 별로 Mapper(매퍼) XML 파일들을 분리하기 위해서입니다.
  • 파일 명이 *Mapper.xml인 이유는 "Mapper"로 끝나는 .xml 파일들만 로드하기 위해서입니다.

 

MyBatis 설정 파일에서 타입 별칭 설정을 위한 <typeAliases>을 설정하지 않고 typeAliasesPackage 속성으로 Alias(별칭)으로 등록할 수 있습니다.

 

typeAliasesPackage 속성 값에 패키지 경로를 입력하면 패키지를 스캔하여 별칭으로 등록됩니다.

클래스 파일 안에 @Alias Annotation(어노테이션)이 있으면 설정된 별칭으로 적용되고 없으면 클래스 명을 소문자하여 별칭으로 등록됩니다. 단, 클래스 명이 동일하지 않아야 합니다.

<bean id="sqlSessionFactoryMariaDB" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSourceMariaDB" />
	<property name="configLocation" value="classpath:/com/home/study/test1/sqlmap/mariadb-config.xml" />
	<property name="typeAliasesPackage" value="com.home.study.test1.**.model" />
	<property name="mapperLocations" value="classpath*:/com/home/study/test1/sqlmap/mappers/mariadb/**/*Mapper.xml"/>
</bean>

typeAliasesPackage 속성 값에 입력된 경로를 해석하면 com.home.study.test1 하위 패키지에서 model 패키지로 끝나는 패키지들만 스캔하는 겁니다.

 

3. SqlSessionTemplate 객체를 생성합니다.

  1. SqlSessionTemplate 객체를 생성하기 위해 클래스로 MyBatis의 SqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)를 입력합니다.
  2. qualifier 값은 SqlSessionTemplate의 별칭을 입력합니다.
  3. constructor-arg는 생성자 인자로 생성된 SqlSessionFactory 객체의 ID를 입력합니다. 
<bean id="sqlSessionMariaDB" class="org.mybatis.spring.SqlSessionTemplate">
	<qualifier value="sqlSessionMariaDB" />
	<constructor-arg index="0" ref="sqlSessionFactoryMariaDB" />
</bean>

 

데이터를 처리하는 클래스(DAO)에서 @Qualifier Annotation(어노테이션)의 값과 SqlSessionTemplate의 qualifier 값이 같으면 sqlSession 변수에 SqlSession이 주입(Injection)됩니다.

@Autowired
@Qualifier("sqlSessionMariaDB")
private SqlSession sqlSession;

 

SqlSessionFactory 객체의 mapperLocations 속성에 여러 개의 Mapper(매퍼) XML 파일 경로가 있을 수 있습니다. 그럴 경우 mapperLocations 속성에서 <list><value>로 여러 개의 Mapper(매퍼) 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-4.3.xsd">

	<bean id="sqlSessionFactoryMariaDB" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSourceMariaDB" />
		<property name="configLocation" value="classpath:/com/home/study/test1/sqlmap/mariadb-config.xml" />
		<property name="typeAliasesPackage" value="com.home.study.test1.**.model" />
		<property name="mapperLocations">
			<list>
				<value>classpath*:/com/home/study/test1/sqlmap/mappers/mariadb/**/*Mapper.xml</value>
			</list>
		</property>
	</bean>
	
	<bean id="sqlSessionMariaDB" class="org.mybatis.spring.SqlSessionTemplate">
		<qualifier value="sqlSessionMariaDB" />
		<constructor-arg index="0" ref="sqlSessionFactoryMariaDB" />
	</bean>
</beans>

 

 

Maven Spring Project에 MyBatis Configuration 파일 적용하기

 

1. Java Resource > src/main/resource > com/home/study/test1 폴더에 sqlmap 폴더를 생성하고 mariadb-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>

</configuration>

 

MyBatis Configuration은 <properties>, <settings>, <typeAliases>, <typeHandlers>, <objectFactory>, <plugins>,<environments>, <databaseIdProvider>, <mappers> 등 다양한 설정을 할 수 있습니다.

 

그중에서 타입 별칭 설정을 위한 <typeAliases>를 많이 사용하기 때문에 <typeAliases> 설정 방법을 알아보도록 하겠습니다.

 

 

MyBatis Configuration 파일에서 typeAliases 설정 방법

 

Mapper(매퍼) XML 파일에서 resultType이나 resultMap의 type 속성에 전체 클래스 경로(패키지 + 클래스, FQN)를 대신 Alias(별칭)으로 사용할 수 있습니다.

// 전체 클래스 경로(패지키 + 클래스)
<resultMap id="BoardMap" type="com.home.study.test1.board.model.Board">
</resultMap>

<select id="selectBoardList" resultType="com.home.study.test1.board.model.Board">
</select>

전체 클래스 경로(패키지 + 클래스, FQN)로 입력할 경우 패키지 명이 길 경우 매번 입력해야 하는 번거로움이 있고 패키지가 변경될 경우 수정할 부분이 많아 불편합니다.

 

그래서, Alias(별칭)을 사용하면 클래스를 짧게 표현할 수 있습니다. 단, Alias(별칭)이 중복되지 않아야 합니다.

// Alias(별칭)
<resultMap id="BoardMap" type="Board">
</resultMap>

<select id="selectBoardList" resultType="Board">
</select>

 

Alias(별칭)을 추가하는 방법은 클래스마다 Alias(별칭)을 설정하는 방법과 패키지를 설정하는 방법이 있습니다.

 

클래스마다 Alias(별칭)을 설정하는 방법

typeAlias의 type 속성에 전체 클래스 경로를 입력하고 alias 속성에 Mapper(매퍼) XML 파일에서 사용할 별칭을 입력하면 됩니다.

<typeAliases>
	<typeAlias alias="Board" type="com.home.study.test1.board.model.Board"/>
</typeAliases>

 

패키지를 설정하는 방법

package의 name 속성에 클래스들이 있는 패키지를 입력하면 됩니다. 패키지에 있는 모든 클래스들이 별칭으로 등록됩니다.

<typeAliases>
	<package name="com.home.study.test1.board.model"/>
</typeAliases>

 

클래스 파일 안에 @Alias Annotation(어노테이션)이 있으면 설정된 별칭으로 적용되고 없으면 클래스 명을 소문자하여 별칭으로 등록됩니다.

package com.home.study.test1.board.model;

@Alias("Board")
public class Board {
}

패키지로 Alias(별칭)을 추가할 경우 다른 패키지에 있는 클래스의 이름과 중복되는지 확인하시기 바랍니다.

 

예를 들어, 위에서 설명한 <typeAliases> 설정 방법으로 설정하면 다음처럼 될 겁니다.

<?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>
		<typeAlias alias="Board" type="com.home.study.test1.board.model.Board"/>
	</typeAliases>
</configuration>

 

이번 프로젝트에서는 SqlSessionFactoryBean 객체의 typeAliasesPackage 속성을 사용하여 자동으로 패키지를 스캔하여 별칭이 등록되게 할 겁니다. 그래서 mariadb-config.xml 파일에는 <typeAliases>을 설정하지 않겠습니다.

 

 

이제 MyBatis-Spring으로 데이터를 처리하는 클래스(DAO)에서 쉽게 MyBatis을 사용할 수 있게 되었습니다.

 

이이서, 데이터를 처리하는 클래스(DAO)에서 SqlSession를 사용하여 Mapper(매퍼) XML 파일에 있는 쿼리를 처리해 보겠습니다.

728x90
반응형