👉 MyBatis
- ORM 프레임워크 중 하나이다.
- ORM 프레임워크는 객체와 관계형 데이터베이스 간의 데이터를 변환하고 상호 작용하는 데 사용되는 프레임워크이다.
- 또다른 ORM 프레임워크인 JPA과는 다르게 SQL 쿼리를 직접 작성해야 한다.
🚩 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})이 있다면
- 해당 어노테이션은 DB 설정을 제외하는 어노테이션이다.
- 따라서
프로젝트명Application
클래스에 해당 어노테이션이 있다면 제거한다.- 제거 후
ctrl/command + shift + O
로 불필요한 import도 함께 제거해야 한다.
- 기존 설정 클래스(
프로젝트명Application
)에 추가하는 방법- 새로운 설정 클래스에 추가하는 방법(권장)
@Mapper
를 사용하는 방법(Spring Data JPA와 함께 사용 시, 위의 2개의 방법이 오류가 날 수 있으므로 해당 방법 사용)
편의를 위해 아래와 같이 설정했다.
- 베이스 패키지: com.example
- 프로젝트명: SpringExample
프로젝트명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
아래에 만든다.
- 1️⃣ 새로운 설정 클래스 생성
- 2️⃣ 새로운 설정 클래스에 @Configuration, @MapperScan 추가
- 3️⃣ 새로운 설정 클래스에 MyBatis 프레임워크 동작 설정 메소드 작성
- 4️⃣ DataSource 설정 코드 작성(
application.properties
파일/application.yml
파일)- 5️⃣ XML 매퍼 파일을 위한 폴더 생성
1️⃣ 새로운 설정 클래스 생성
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
파일)
5️⃣ XML 매퍼 파일을 위한 폴더 생성
@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 매퍼 파일을 위한 폴더 생성
return List<Map<String, Object>>
로 반환하는 컨트롤러를 만들어 테스트한다.)