spring

MyBatis와 스프링 연동하기(코드로 배우는 스프링 웹 프로젝트)

두두(DoDu) 2022. 3. 13. 01:25
반응형

※ 코드로배우는 스프링 웹 프로젝트를 참고한 정리글

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'을 클릭한다.

▲ root-context.xml파일을 열고 아래쪽에 보면 'Namespaces'가 있다.

3) 'mybatis-spring'탭을 선택한다.

▲ 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을 저장할 폴더를 생성할 수 있다.

▲ src/main/resources구조에 org폴더, 패키지명폴더, mapper폴더를 생성 후 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속성을 가지는데 이 값은 인터페이스에 선언된 메서드의 리턴타입과 동일하게 작성해야 한다.

 

반응형