MyBatis와 스프링 연동하기(코드로 배우는 스프링 웹 프로젝트)
※ 코드로배우는 스프링 웹 프로젝트를 참고한 정리글
1. MyBatis
MyBatis를 스프링과 연동하면 좀 더 빠르게 SQL을 처리할 수 있다.
즉, 오라클DB나 MySQL에 적은 쿼리문(select...from... 등)을 스프링에서 바로 사용할 수 있다고 해석할 수 있다.
▶ MyBatis를 연동하지 않고 JDBC 프로그램을 쓴다면?
- 직접 Connection을 맺고 마지막에 close()를 적어줘야 한다.
- PreparedStatement를 직접 생성하고 처리해야한다.
- PreparedStatement의 setXXX()등에 대한 모든 작업을 개발자가 처리해야한다.
- SELECT의 경우 직접 ResultSet을 처리해야한다.
☆ jdbc란?
- Java Database Connectivity
- 자바 프로그램이 데이터베이스와 연결되어 데이터를 주고받을 수 있도록 해주는 프로그래밍 인터페이스다.
▶ 왜 MyBatis를 쓸까?
- MyBatis 내부적으로 PreparedStatement를 처리해준다.
- #{prop}와 같이 속성을 지정하면 내부적으로 자동처리해준다.
2. MyBatis관련 라이브러리 추가
- pom.xml 파일에 추가적인 라이브러리들을 설정해야한다.
- 총 4개
- spring-jdbc / spring-tx : 스프링에서 데이터베이스 처리와 트랜잭션 처리를 담당한다.
- mybatis / mybatis-spring : MyBatis와 스프링 연동용 라이브러리다.
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
3. SQLSessionFactory
- 이름에서 보이듯이 내부적으로 SQLSession이라는 것을 만들어 내는 존재
- 개발에서는 SQLSession을 통해서 Connection을 생성하거나 원하는 SQL을 전달하고 결과를 리턴받는 구조로 작성하게 된다.
- root-context.xml에 아래 코드 작성
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
4. Mapper인터페이스
- xml을 이용할 수 있지만 여기서는 Mapper인터페이스를 사용한다.
- 해당되는 프로젝트의 src/main/java에 mapper패키지를 생성
- TimeMapper라는 인터페이스 추가
public interface TimeMapper {
@Select("SELECT sysdate FROM dual")
public String getTime();
}
Mapper을 작성하고 MyBatis가 동작할 때 Mapper를 인식할 수 있도록 root-context.xml에 추가적인 설정이 필요하다.
가장 간단한 방식은 <mybatis:scan>이라는 태그를 이용하는 것이다.
1) root-context.xml파일을 연다.
2) 아래쪽 'Namespaces'을 클릭한다.
3) 'mybatis-spring'탭을 선택한다.
4) root-context.xml에 아래 코드를 추가한다.
<mybatis-spring:scan base-package="com.패키지명적기.mapper"/>
5. XML 매퍼와 같이 쓰기
- MyBatis를 이용해서 SQL을 처리할 때 어노테이션을 이용하는 방식이 압도적으로 편리하다.
- BUT, SQL이 복잡하거나 길어지는 경우는 어노테이션보다는 XML을 이용하는 방식을 더 선호하게 된다.
※ XML을 작성해서 사용할 때에는 XML파일의 위치와 XML파일에 지정하는 namesapce속성이 중요함.
그렇다면 XML파일의 위치는?
1) Mapper인터페이스가 있는 곳에 같이 작성하거나
2) src/main/resources구조에 XML을 저장할 폴더를 생성할 수 있다.
XML파일에는 MyBatis의 XML매퍼에서 이용하는 태그에 대한 설정이 필요하다.
자세한 정보는 http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html 을 통해 확인하면 된다고 한다.
Mapper인터페이스와 XML을 같이 이용해 보기 위해서 기존의 TimeMapper인터페이스에 추가적인 메서드를 선언한다.
public interface TimeMapper {
@Select("SELECT sysdate FROM dual")
public String getTime();
public String getTime2(); //해당 줄 추가!!
}
▲getTime2()를 보면 @Select와 같이 MyBatis의 어노테이션이 존재하지 않고 SQL역시 존재하지 않는 것을 볼 수 있다.
실제 SQL은 XML을 이용해서 처리할 것이므로 생성한 TimeMapper.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.패키지명.mapper.TimeMapper">
<select id="getTime2" resultType="string">
SELECT sysdate FROM dual
</select>
</mapper>
XML매퍼를 이용할 때 주의할 점
1. <mapper>태그의 namespace속성값을 주의하자.
- MyBatis는 Mapper인터페이스와 XML을 인터페이스의 이름과 namespace속성값을 가지고 판단한다.
- 위의 소스처럼 org.패키지명.mapper.TimeMapper인터페이스가 존재하고 XML의 <mapper namespace="org.패키지명.mapper.TimeMapper">와 같이 동일한 이름이 존재하면 이를 병합해서 처리한다.
∴ 위의 경우 메서드 선언은 인터페이스에 존재하고 SQL에 대한 처리는 XML을 이용하는 방식이라고 볼 수 있다.
2. <select>태그의 id속성의 값은 메서드의 이름과 동일하게 맞춰야한다.
- <select>태그의 경우 resultType속성을 가지는데 이 값은 인터페이스에 선언된 메서드의 리턴타입과 동일하게 작성해야 한다.