감 잃지말고 개발하기

[Spring][STS] 개발 환경 설정 #4. MyBatis와 스프링 연동 본문

코드로 배우는 스프링 웹 프로젝트(개정판)/Part 1 스프링 개발 환경 구축

[Spring][STS] 개발 환경 설정 #4. MyBatis와 스프링 연동

persii 2023. 8. 16. 20:27

설치 버전

  • Oracle DB : 11gR2 Express Edition
  • SQL Developer : 23.1.0.097.1607
  • HikariCP : 5.0.1
  • Spring Framework : 5.0.7.RELEASE
  • Java : 11
  • MyBatis : 3.5.6

 

목표

♠ 스프링 프레임워크와  MyBatis를 연동할 수 있다.

 

 

MyBatis 프레임워크

SQL 매핑 프레임워크로, 이를 이용해 복잡한 JDBC 코드를 간단하게 작성할 수 있다.

전통적인 JDBC 프로그램 vs MyBatis

♠ 전통적인 JDBC 프로그램

  • 개발자가 직접 Connection을 맺고 자원 반납(close())해야 한다.
  • 개발자가 직접 PreparedStatement 객체를 생성하고 처리해야 한다.
  • 개발자가 직접 PreparedStatement 객체의 setXXX() 등에 대한 모든 작업을 처리해야 한다.
  • SELECT의 경우 직접 ResultSet을 처리해야 한다.

 

♠ MyBatis

  • 자동으로 Connection을 맺고 close()한다.
  • 내부적으로 PreparedStatement 객체를 처리한다.
  • 기존의 SQL을 그대로 활용할 수 있다.
  • #{prop}을 이용하여 필요 파라미터를 처리한다.
  • 리턴 타입을 지정한 경우 자동으로 객체를 생성해  ResultSet을 처리한다.

 

 

MyBatis와 스프링 프레임워크 연동

MyBatis는 'MyBatis-Spring'이라는 라이브러리를 통해 쉽게 스프링 프레임워크와 연동할 수 있다.

1. MyBatis 관련 라이브러리 추가

- MyBatis를 Spring 프레임워크와 연동하기 위해 필요한 라이브러리를 pom.xml에 추가한다.

 

♠ 관련 라이브러리

  • mybatis / mybatis-spring : MyBatis와 스프링을 연동하는 라이브러리
  • spring-tx / spring-jdbc : 스프링에서 DB 및 트랜잭션을 처리하는 라이브러리

 

♠ Spring FW에 따른 MyBatis 버전 확인

- 나는 Spring 프레임워크 5.0.7v을 사용하므로 MyBatis는 3.5v 이상, MyBatis-Spring은 2.1v으로 추가한다.

mybatis-spring / mybatis 버전 확인

 

♠ pom.xml에 추가

- 아래 코드를 pom.xml에 추가한 후, Maven Update를 진행한다.

라이브러리 추가

 


♠ Spring FW에 따른 MyBatis 버전 확인

 

https://mybatis.org/spring/

 

mybatis-spring –

Introduction What is 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, trans

mybatis.org


 

2.  SqlSessionFactoryBean 빈으로 등록

MyBatis에서 가장 핵심적인 객체는 SqlSession과 SqlSessionFactory이다.

SqlSessionFactory 클래스는 SqlSession을 생성하고 SQL 매퍼 파일을 로드해 SQL문을 실행한다..

SqlSession 클래스는 Connection을 생성하여 원하는 SQL문을 전달하고, 결과를 리턴한다.

SQLSessionFactory와 SQLSession

 

1.  스프링에 SqlSessionFactoryBean 등록

♠ SqlSessionFactoryBean 클래스

SqlSessionFactory 객체는 SqlSessionFactoryBean 클래스를 통해 생성되는데,

SqlSessionFactoryBean 클래스는 MyBatis에서 DB와의 세션을 관리하고 SQL 매퍼 파일과의 연결을 제공한다.

 

 

♠ XML 설정(root-context.xml)

- SqlSessionFactoryBean을 등록하는 코드를 root-context.xml에 추가해준다.

  SqlSessionFactoryBean는 DB 연결 정보를 설정하고, DB 커넥션 풀을 통해 세션을 관리하므로 

  DB 연결에 대한 설정이 저장된 "dataSource" 빈을 참조하도록 설정해준다.

root-context.xml에서 빈 등록

 

♠ Java 설정(RootConfig.java)

java 설정으로 빈 등록

 

♠ Beans Graph 확인

- 설정 코드를 저장한 후, Beans Graph를 살펴보면 스프링에 등록한 빈의 설정을 확인할 수 있다.

    1. 빈 sqlSessionFactory는 빈 dataSource을 참조하여 인스턴스 변수 dataSource에 저장한다.

    2. 빈 dataSource는 빈 hikariConfig를 참조하여 초기화한다.

    3. 빈 hikariConfig는 사용할 DB의 연결 정보를 각각의 인스턴스 변수에 저장한다.

Beans Graph

 

2.  SqlSession 테스트

SqlSession 테스트

 


테스트 결과

테스트 결과


 

 

Mapper 설정

Mapper는 쉽게 말해 SQL 쿼리와 그에 대한 처리를 지정하는 역할을 한다.

 

'MyBatis-Spring'은 스프링 FW와의 연동과 함께 SQL 작성 및 그에 대한 처리를 편리하게 작업해주는 Mapper를 지원한다.

MyBatis-Spring은 Mapper 인터페이스를 이용해 실제 SQL 처리가 되는 클래스를 자동으로 생성하는데,

이를 통해 개발자는 인터페이스와 SQL을 작성하는 방식만으로도 모든 JDBC 처리를 끝낼 수 있다.

 

MyBatis-Spring을 이용하는 경우, XML 또는 인터페이스 + 어노테이션의 형태로 Mapper를 작성할 수 있다.

mybatis-spring 라이브러리

 

1. Mapper 인터페이스 + 어노테이션 형태

1. Mapper 인터페이스 설정

- TimeMapper 인터페이스를 추가한 후, MyBatis의 어노테이션을 이용해 SQL을 메서드에 추가한다.

Mapper 인터페이스 + 어노테이션

 

2. 스프링에서 Mapper 등록

스프링이 동작할 때, MyBatis에서 Mapper를 인식할 수 있도록 추가적인 설정을 해준다.

XML 설정의 경우, <mybatis-spring:scan> 태그를, Java 설정의 경우 @MapperScan 어노테이션을 이용한다.

 

♠ XML 설정(root-context.xml)

- 'Namespaces' 항목에서 'mybatis-spring' 탭을 선택한다.

Namespaces 설정

 

- <mybatis-spring:scan> 태그의 base-package 속성을 이용해 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아

  처리하도록 한다.

mapper 인식

 

♠ Java 설정

- 클래스 선언부에 @MapperScan 어노테이션을 이용해 처리한다.

java 설정

 

3. Mapper 테스트

TimeMapper 인터페이스가 정상적으로 사용 가능한지 확인하기 위해 아래 코드를 작성한다.

아래 코드가 정상적으로 작동한다면,

스프링 내부에는 TimeMapper 타입(인터페이스)으로 만들어진 빈(스프링 객체)이 생성되었다는 뜻이 된다.

Mapper 테스트

 


테스트 결과

테스트 결과


 

2. XML 형태

SQL이 복잡하거나 길어지는 경우, 어노테이션보다 XML을 이용하는 방식이 더 선호된다.

MyBatis-Spring의 경우, Mapper 인터페이스와 XML을 동시에 이용할 수 있는데,

이는 메서드 선언은 Mapper 인터페이스에 존재하고, SQL에 대한 처리는 XML을 이용하는 방식이라고 볼 수 있다.

 

때문에 XML을 작성해서 사용할 때에는 XML 파일의 위치XML 파일에 지정하는 namespace 속성이 중요하다.

파일 위치의 경우,

Mapper 인터페이스가 있는 곳에 같이 작성하거나, src/main/resources 구조에 XML을 저장할 폴더를 생성할 수 있다.

파일 이름에 대한 규칙은 없지만, 가독성을 위해 Mapper 인터페이스와 동일한 이름을 이용한다.

 

1. XML 파일 생성

- src/main/resources 구조 하위에 TimeMapper.xml 파일을 생성한다.

파일 생성

 

2. Mapper 인터페이스에 메서드 추가

- 기존의 TimeMapper 인터페이스에 getTimeUsingXML() 메서드를 추가한다.

  TimeMapper.xml 파일에서 SQL문을 작성할 것이므로 해당 메서드에서는 @Select와 같은 MyBatis 어노테이션과

  SQL문을 따로 작성하지 않는다. 

Mapper 인터페이스에 메서드 추가

 

3. XML 파일 설정 및 SQL문 작성

XML 파일 설정 및 SQL문 작성

 

♠ <mapper namespace=""> 속성값

MyBatis는 Mapper 인터페이스와 XML을 인터페이스의 이름과 namespace 속성값을 가지고 판단한다.

'com.zerock.mapper.TimeMapper'라는 인터페이스가 존재하고,

XML의 <mapper namespace="com.zerock.mapper.TimeMapper">가 존재하면 이를 병합해서 처리한다.

 

♠ <select> 태그

  • id 속성값은 Mapper 인터페이스 메서드명으로 작성한다.
  • resultType 속성값은 메서드의 리턴 타입과 동일하게 작성한다.

 

4. XML 설정 테스트(1)

XML 설정 테스트

 


테스트 결과

테스트 결과


 

5. XML 설정 테스트(2)

<select> 태그의 id 속성값을 메서드명과 틀리게 작성한 후 테스트해 보자. 

<select> 태그 id 속성값 다르게 설정

 


테스트 결과

테스트 결과


 

 

정리

1. MyBatis를 사용한 코드의 간결화

프로젝트와 DB를 연결하기 위해 기존에 작성해야 했던 귀찮은 JDBC 코드를 MyBatis를 이용해 간단하게 작성할 수 있다.

특히, 필요한 객체를 개발자가 직접 생성할 필요가 없으며, 기존의 SQL문을 그대로 활용할 수 있다는 점에서 간편하다.

 

2. MyBatis-Spring 라이브러리

1. MyBatis와 스프링 FW를 연동해주는 라이브러리이다.

     - Spring FW 버전에 호환되는 버전을 사용하도록 한다.

 

2. SqlSessionFactoryBean 클래스를 이용해 DB와의 세션을 관리한다.

     - 해당 클래스는 SqlSessionFactory 객체를 생성한다.

     - SqlSessionFactory 객체는 SqlSession 객체를 생성한다.

 

3. SQL 작성과 그에 관한 처리를 편리하게 작업해주는 Mapper를 지원한다.

     - Mapper를 작성하는 방법에는 Mapper 인터페이스 + MyBatis 어노테이션 형식과 XML 형식이 있다.

       Mapper 인터페이스와 XML 형식을 같이 사용하려면

       XML 파일에서 <mapper> 태그의 namespace 속성값을 인터페이스 이름으로 설정하고,

       인터페이스에서 정의한 메서드명과 XML 태그 id명을 일치시켜야 한다.