MyBatis FrameWork 개념 및 설정
Spring의 Mybatis에서 기본적으로 DataBase 설정 및 주요 컴포넌트의 역할에 대해서 알아본 적이 있다. 그렇다면 스키마가 여러개인 경우에는 어떻게 설정해야할까?
application.yml
spring:
my-lab-db1:
datasource:
jdbc-url: jdbc:mysql://localhost:3306/my_lab_db1?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: id
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 10 # pool에 유지시킬 수 있는 최대 커넥션 수 (default: 10)
minimum-idle: 10 # 아무런 일을 하지않아도 커넥션을 유지시키는 수 (default: 10)
idle-timeout: 0 # 유휴상태의 커넥션 유지시간 (0은 무제한)
max-lifetime: 2700000 # 커넥션의 최대 유지시간 (45분)
my-lab-db2:
datasource:
jdbc-url: jdbc:mysql://localhost:3306/my_lab_db2?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: id
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 10
minimum-idle: 10
idle-timeout: 0
max-lifetime: 2700000
my-lab-db3:
datasource:
jdbc-url: jdbc:mysql://localhost:3306/my_lab_db3?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: id
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 10
minimum-idle: 10
idle-timeout: 0
max-lifetime: 2700000
Config.java
package com.ys.test.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
// ys-lab-db1 Schema Config
@Configuration
@MapperScan(value = "com.ys.test.lab.api.mapper.mylabdb1", sqlSessionFactoryRef = "myLabDB1SqlSessionFactory")
public class MyLabDB1DataSourceConfig {
@Primary // 같은 이름의 Bean이 여러개 있을경우, 우선하여 적용한다.
@Bean(name = "myLabDB1DataSource")
@ConfigurationProperties(prefix = "spring.my-lab-db1.datasource")
public DataSource myLabDB1DataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "myLabDB1SqlSessionFactory")
public SqlSessionFactory myLabDB1SqlSessionFactory(
@Qualifier("myLabDB1DataSource") DataSource myLabDB1DataSource,
ApplicationContext applicationContext) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(myLabDB1DataSource);
sqlSessionFactoryBean.setVfs(SpringBootVFS.class);
sqlSessionFactoryBean.setTypeAliasesPackage("com.ys.test.lab");
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
sqlSessionFactoryBean.setMapperLocations(
applicationContext.getResources("classpath:mybatis/mapper/mylabdb1/*.xml")
);
return sqlSessionFactoryBean.getObject();
}
@Primary
@Bean(name = "myLabDB1SessionTemplate")
public SqlSessionTemplate myLabDB1SqlSessionTemplate(
@Qualifier("myLabDB1SqlSessionFactory") SqlSessionFactory myLabDB1DataSource) {
return new SqlSessionTemplate(myLabDB1DataSource);
}
}
- 마찬가지로 my-lab-db2, my-lab-db3을 각각 myLabDB2, myLabDB3의 DataSourceConfig 파일을 만들어서 적용하면 된다.
- 연결한 DB 스키마에 맞게 쿼리문 로직을 작성 진행
(!) 환경변수 분기에 따라 @ConditionalOnProperty 어노테이션을 사용하여 @Configuration을 실행할지, 실행하지 않을지를 선택이 가능하다.
@ConditionalOnProperty(prefix = "spring.profiles", name = "active", havingValue = "prod")
'SpringFramework > Spring' 카테고리의 다른 글
Spring - 스케줄러 중복실행 이슈분석 (0) | 2022.03.14 |
---|---|
Spring - Mybatis 샵(#)과 달러($)의 차이 (0) | 2022.03.10 |
Spring - 인스턴스 변수 참조 (0) | 2021.10.20 |
Spring - Redis 연동 (0) | 2021.10.20 |
Spring - Validation (0) | 2021.10.20 |