[Spring Boot] DB 연동하기(MyBatis) - Mapper 설정

hameee·2023년 12월 14일
0

Spring Boot

목록 보기
5/20
post-thumbnail

👉 MyBatis

  • ORM 프레임워크 중 하나이다.
  • ORM 프레임워크는 객체와 관계형 데이터베이스 간의 데이터를 변환하고 상호 작용하는 데 사용되는 프레임워크이다.
  • 또다른 ORM 프레임워크인 JPA과는 다르게 SQL 쿼리를 직접 작성해야 한다.

🚩 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})이 있다면

  • 해당 어노테이션은 DB 설정을 제외하는 어노테이션이다.
  • 따라서 프로젝트명Application 클래스에 해당 어노테이션이 있다면 제거한다.
  • 제거 후 ctrl/command + shift + O로 불필요한 import도 함께 제거해야 한다.

📍 Mapper 설정하기

  • 기존 설정 클래스(프로젝트명Application)에 추가하는 방법
  • 새로운 설정 클래스에 추가하는 방법(권장)
  • @Mapper를 사용하는 방법(Spring Data JPA와 함께 사용 시, 위의 2개의 방법이 오류가 날 수 있으므로 해당 방법 사용)

편의를 위해 아래와 같이 설정했다.

  • 베이스 패키지: com.example
  • 프로젝트명: SpringExample

1) 기존 설정 클래스(프로젝트명Application)에 추가하는 방법

  • 1️⃣ 기존 설정 클래스에 @MapperScan 추가
  • 2️⃣ 기존 설정 클래스에 MyBatis 프레임워크 동작 설정 메소드 작성
  • 3️⃣ DataSource 설정 코드 작성(application.properties 파일)
  • 4️⃣ XML 매퍼 파일을 위한 폴더 생성

1️⃣ @MapperScan 추가

  • @MapperScan: 매퍼 인터페이스를 자동으로 검색하고 등록한다.

// 🟢 src/main/java/com/example/Application.java

package com.example;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan(basePackages = "com.example.*") // ⭐️ 베이스 패키지 하위에서 매퍼 인터페이스를 검색
@SpringBootApplication
public class SpringExampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringExampleApplication.class, args);
	}

}

2️⃣ MyBatis 프레임워크 동작 설정 메소드 작성

  • 🚩 메소드 작성 후 import 시, org.springframework.core.io.Resource로 임포트한다.

// 🟢 src/main/java/com/example/SpringExampleApplication.java
   
package com.example;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@MapperScan(basePackages = "com.example.*")
@SpringBootApplication
public class SpringExampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringExampleApplication.class, args);
	}

	// ⭐️ MyBatis 프레임워크 동작 설정 코드
	@Bean // 스프링 빈으로 등록
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
	
		// 1. SqlSessionFactoryBean 객체 생성
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
	
		// 2. DataSource 설정, 매퍼 파일 위치 설정
		sessionFactory.setDataSource(dataSource); 
		Resource[] res = new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*Mapper.xml"); //  XML 매퍼 파일들의 위치를 찾아 배열로 저장
		sessionFactory.setMapperLocations(res); 

		// 3. 생성된 SqlSessionFactory 객체 반환
		return sessionFactory.getObject(); 
		
	}

}

3️⃣ DataSource 설정 코드 작성(application.properties 파일/application.yml 파일)

  • MyBatis 프레임워크 동작 설정 메소드(sqlSessionFactory)가 인자로 받는 DataSource를 설정하는 과정이다.
  • application.properties 파일에 작성하는 방법
  • application.yml 파일에 작성하는 방법

1) application.properties 파일에 작성하는 방법

# 🔵 src/main/resources/application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://⭐️서버⭐️:⭐️포트⭐️/⭐️DB이름⭐️? serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=⭐️아이디⭐️
spring.datasource.password=⭐️비밀번호⭐️

# ex)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test_230914? serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root

2) application.yml 파일에 작성하는 방법

# 🔵 src/main/resources/application.yml

spring:
	datasource:
    	driver-class-name: com.mysql.cj.jdbc.Driver
		url: jdbc:mysql://⭐️서버⭐️:⭐️포트⭐️/⭐️DB이름⭐️?serverTimezone=UTC&characterEncoding=UTF-8
		username: ⭐️아이디⭐️
		password: ⭐️비밀번호⭐️

# ex)
spring:
	datasource:
    	driver-class-name: com.mysql.cj.jdbc.Driver
		url: jdbc:mysql://localhost:3306/test_230914?serverTimezone=UTC&characterEncoding=UTF-8
		username: root
		password: root

4️⃣ XML 매퍼 파일을 위한 폴더 생성

  • MyBatis 프레임워크 동작 설정 메소드(sqlSessionFactory)에서 설정한 경로에 맞게 만들어야 한다.
  • src/main/resources 아래에 만든다.

2) 새로운 설정 클래스에 추가하는 방법

  • 1️⃣ 새로운 설정 클래스 생성
  • 2️⃣ 새로운 설정 클래스에 @Configuration, @MapperScan 추가
  • 3️⃣ 새로운 설정 클래스에 MyBatis 프레임워크 동작 설정 메소드 작성
  • 4️⃣ DataSource 설정 코드 작성(application.properties 파일/application.yml 파일)
  • 5️⃣ XML 매퍼 파일을 위한 폴더 생성

1️⃣ 새로운 설정 클래스 생성

  • com.example.config.DatabaseConfig.java 생성

2️⃣ 새로운 설정 클래스에 @Configuration, @MapperScan 추가

  • @Configuration: 해당 클래스가 하나 이상의 @Bean 메서드를 제공하고 스프링 컨테이너에 의해 관리되는 클래스임을 나타낸다.
  • @MapperScan: 매퍼 인터페이스를 자동으로 검색하고 등록한다.
// 🟢 src/main/java/com/example/config/DatabaseConfig.java

package com.example.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@MapperScan(basePackages = "com.example.*") // ⭐️ 베이스 패키지 하위에서 매퍼 인터페이스를 검색
@Configuration // ⭐️ 하나 이상의 @Bean 메서드를 제공하고 스프링 컨테이너에 의해 관리되는 클래스
public class DatabaseConfig {

}

3️⃣ 새로운 설정 클래스에 MyBatis 프레임워크 동작 설정 메소드 작성

// 🟢 src/main/java/com/example/config/DatabaseConfig.java

package com.example.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@MapperScan(basePackages = "com.example.*")
@Configuration
public class DatabaseConfig {

	// ⭐️ MyBatis 프레임워크 동작 설정 코드
 	@Bean // 스프링 빈으로 등록
 	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
 	
 		// 1. SqlSessionFactoryBean 객체 생성
 		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
 	
 		// 2. DataSource 설정, 매퍼 파일 위치 설정
 		sessionFactory.setDataSource(dataSource); 
 		Resource[] res = new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*Mapper.xml"); //  XML 매퍼 파일들의 위치를 찾아 배열로 저장
 		sessionFactory.setMapperLocations(res); 
 
 		// 3. 생성된 SqlSessionFactory 객체 반환
 		return sessionFactory.getObject(); 
 		
 	}
}

4️⃣ DataSource 설정 코드 작성(application.properties 파일/application.yml 파일)

  • 방법 1)의 3️⃣과 동일

5️⃣ XML 매퍼 파일을 위한 폴더 생성

  • 방법 1)의 4️⃣와 동일

3) @Mapper를 사용하는 방법

  • 🚩 Spring Data JPA와 함께 사용 시, 위의 2개의 방법이 오류가 날 수 있다.
    • 설정 클래스에서 자동으로 repository를 Bean으로 등록 후, JpaRepository를 상속받을 때 한번 더 Bean으로 등록을 시도하기 때문에 중복된 Bean에 대한 에러가 나타날 수 있다.
  • 1️⃣ DataSource 설정 & Mapper 파일 경로 설정 코드 작성(application.properties 파일/application.yml 파일)
  • 2️⃣ Mapper 인터페이스에 @Repository가 아닌 @Mapper 작성
  • 3️⃣ XML 매퍼 파일을 위한 폴더 생성

1️⃣ DataSource 설정 & Mapper 파일 경로 설정 코드 작성(application.properties 파일/application.yml 파일)

1) application.properties 파일에 작성하는 방법

# 🔵 src/main/resources/application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://⭐️서버⭐️:⭐️포트⭐️/⭐️DB이름⭐️? serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=⭐️아이디⭐️
spring.datasource.password=⭐️비밀번호⭐️
mybatis.mapper-locations=mappers/*Mapper.xml

# ex)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test_230914? serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=mappers/*Mapper.xml

2) application.yml 파일에 작성하는 방법

  • mybatis.mapper-locations=mappers/*Mapper.xml는 MyBatis가 Mapper.xml 파일을 찾을 위치를 지정한다.
# 🔵 src/main/resources/application.yml

spring:
	datasource:
    	driver-class-name: com.mysql.cj.jdbc.Driver
		url: jdbc:mysql://⭐️서버⭐️:⭐️포트⭐️/⭐️DB이름⭐️?serverTimezone=UTC&characterEncoding=UTF-8
		username: ⭐️아이디⭐️
		password: ⭐️비밀번호⭐️
mybatis:
	mapper-locations: mappers/*Mapper.xml

# ex)
spring:
	datasource:
    	driver-class-name: com.mysql.cj.jdbc.Driver
		url: jdbc:mysql://localhost:3306/test_230914?serverTimezone=UTC&characterEncoding=UTF-8
		username: root
		password: root
mybatis:
	mapper-locations: mappers/*Mapper.xml

2️⃣ Mapper 인터페이스에 @Repository가 아닌 @Mapper 작성

@Mapper
public interface ExampleMapper {
	// ...
}

3️⃣ XML 매퍼 파일을 위한 폴더 생성

  • 방법 1)의 4️⃣와 동일

📍 완료 후 체크 사항

  • 특정 테이블이 select가 되는가? (간단하게 테스트하기 위해 BO와 domain을 생략하고 return List<Map<String, Object>>로 반환하는 컨트롤러를 만들어 테스트한다.)

0개의 댓글