[Spring To-do] MyBatis와 Spring 연동/mapper

Jeskey·2024년 1월 23일

[Spring Legacy] To-do

목록 보기
6/9

스프링 프레임워크의 중요한 특징 중 하나는 다른 프레임워크들을 쉽게 결합해서 사용할 수 있다는 점이다.
DB와 관련된 스프링 프레임워크는 자체적으로 'spring-jdbc'와 같은 라이브러리를 사용할 수도 있고, MyBatisJPA 프레임워크를 이용하는 방식도 존재한다.
JPA는 스프링 부트에서 사용해보기로 하고, 스프링 프로젝트에서는 JDBC를 익힌 후에 가장 쉽게 사용할 수 있는 MyBatis를 이용해보기로 한다.

MyBatis의 장점

  • 기존 SQL문을 그대로 사용할 수 있다.
  • Servlet에서 DB연결을 위해 사용하던 PreparedStatement/ResultSet, close 처리 등 직접 메소드를 작성해야 했던 과정들을 MyBatis가 자동으로 처리해준다(코드 간소화).
  • SQL을 별도의 파일로 분리할 수 있기 때문에 유지보수가 쉽다.

MyBatis는 단독으로 실행이 가능한 독립적인 프레임워크지만, 스프링 프레임워크는 MyBatis와 쉽게 연동을 할 수 있는 라이브러리와 API들을 제공한다.

MyBatis를 단독으로 개발하고 스프링에서 DAO를 작성해서 처리하는 방식 : 기존의 DAO에서 SQL의 처리를 MyBatis를 이용하는 구조로써 MyBatis와 스프링 프레임워크를 독립적인 존재로 봄. 참고

MyBatis와 스프링을 연동하고 Mapper 인터페이스만 작성하는 방식 : 'mybatis-spring' 라이브러리를 이용해서 스프링이 DB 전체를 처리하고 MyBatis는 일부 기능 개발에 활용하는 방식. 인터페이스만으로 모든 개발이 가능함.


📌 MyBatis 설정하기

이미 앞에서 pom.xml을 이용해 MyBatis 관련 라이브러리들을 설치했다.(mybatis., mybatis-spring)

root-context.xmlmybatis-spring 라이브러리에 있는 클래스를 이용해서 <bean>을 등록한다.

📂 root-context.xml


<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
</bean>

SqlSessionFactory : DB 연결과 SQL 실행을 해주는 중요한 객체이다. mybatis의 SqlSessionFactoryBean 클래스를 사용해 SqlSessionFactory 객체를 생성한다.


📌 Mapper 인터페이스 활용하기


mapper 패키지를 만든 후 TodoMapper 인터페이스를 작성한다.

📂 TodoMapper.java

import org.apache.ibatis.annotations.Select;

public interface TodoMapper {
	
	@Select("select sysdate from dual")
	String getTime();	//테스트 메소드
}

MyBatis는 @Select 어노테이션을 이용해서 쿼리를 작성할 수 있다.

매퍼 인터페이스는 작성한다고 자동으로 등록되는 것이 아니며 어느 매퍼 인터페이스를 설정했는지 root-context.xml에 등록해주어야 한다.

📂 root-context.xml


mybatis-spring 네임스페이스를 체크한다.

<mybatis-spring:scan base-package="org.jeskey.todo.mapper"></mybatis-spring:scan>

mybatis-spring:scan을 이용해 매퍼 인터페이스가 있는 패키지 위치를 알려준다.

테스트 코드를 작성해 쿼리가 정상적으로 동작하는 것을 확인한다.


📌 XML로 SQL 분리하기

쿼리를 XML로 분리하기 위해 TodoMapper의 @Select 어노테이션을 지운다.

resources 아래에 mapper 폴더를 만든 후 TodoMapper.xml을 만든다.

📂 TodoMapper.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.jeskey.todo.mapper.TodoMapper">
		<select id="getTime" resultType="string">
			select sysdate from dual
		</select>
</mapper>

namespace : 매퍼 인터페이스의 이름과 동일해야 함
id : 매퍼 인터페이스의 메서드 이름과 동일해야 함
resultType : 결과를 어떤 타입으로 처리할 것인지에 대한 설정


TodoMapper.xml도 마찬가지로 root-context.xmlMyBatis 설정에 지정해두어야 한다.

📂 root-context.xml

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

mapperLocations : 매퍼 XML 파일들의 위치를 지정한다

마찬가지로 테스트 코드를 실행해 xml에 작성한 쿼리가 제대로 실행되는 것을 확인한다.

0개의 댓글