본문 바로가기

SpringFramework/Spring

Spring - Mybatis FrameWork 여러 스키마 적용하기

 

MyBatis FrameWork 개념 및 설정

 

Spring - Mybatis FrameWork 개념 및 설정

MyBatis란? : 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM 프레임워크이다. Hibernate나 JPA처럼 새로운 DB프로그래밍 패러다임을 익혀야하는 부담 없이 SQL 쿼리를 그대로 사용한다. 따라

xggames.tistory.com

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