티스토리 뷰

SpringBoot에서 1개의 Datasource 만 사용할 경우 application.yml 파일에 datasource 만 작성하면 Spring 이 알아서 맵핑을 해주지만 2개 이상의 Datasource는 맵핑에 어려움이 있습니다. 따라서 다중 맵핑에는 Config 파일을 추가로 작성하여야 합니다. 아래는 Config 파일을 작성하는 방법입니다.

1. application.yml

server:
  port: 1221
  servlet:
    encoding:
      charset: UTF-8

mybatis:
  config-location: classpath:config/mybatis-config.xml

spring:
  config:
    activate:
      on-profile: "local"

  datasource:
    oracle:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      jdbcUrl: jdbc:oracle:thin:@localhost:65022/xe
      username: system
      password: root

    mariadb:
      driver-class-name: org.mariadb.jdbc.Driver
      jdbcUrl: jdbc:mariadb://localhost:3306/MYMSG
      username: mymsg_cyb
      password: q1w2e3r4T%
  • 공통적으로 사용할 Mybatis 설정을 작성하고, 각각 "oracle"과 "mariadb"를 작성합니다. 원하시는 이름으로 작성하셔도 됩니다.

 

2. mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <setting name="callSettersOnNulls" value="true"/>
    <setting name="jdbcTypeForNull" value="NULL"/>
  </settings>
</configuration>
  • mapUnderscoreToCamelCase: 이 설정은 데이터베이스의 칼럼 이름이 스네이크 케이스(underscore_case)인 경우 해당 칼럼 이름을 자바 객체의 카멜 케이스(camelCase)로 변환할지를 결정합니다. 
  • callSettersOnNulls: 이 설정은 MyBatis가 NULL 값을 가진 칼럼에 대한 setter 메서드를 호출할지 여부를 결정합니다. 
  • jdbcTypeForNull: 이 설정은 MyBatis가 NULL 값을 처리할 때 사용할 JDBC 타입을 지정합니다. 이 값이 NULL로 설정되면 MyBatis는 JDBC 드라이버의 기본 NULL 타입을 사용합니다.

 

3. DataSourceConfig

package com.example.mulitds.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

  @Bean
  @ConfigurationProperties(prefix = "spring.datasource.oracle")
  public DataSource oracleDataSource(){
    return DataSourceBuilder.create().build();
  }

  @Bean
  @ConfigurationProperties(prefix = "spring.datasource.mariadb")
  public DataSource mariadbDataSource() {
    return DataSourceBuilder.create().build();
  }
}
  • application.yml 파일에서 작성하였던 datasource 관련 필드들의 prefix를 지정합니다. 이렇게 되면 메서드명으로 Bean 이 생성이 됩니다. 해당 Bean 은 추후에 맵핑할 때 사용됩니다.

 

4. OracleMybatisConfig

package com.example.mulitds.config;

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

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mulitds.dao.oracle", sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleMybatisConfig {

  @Bean
  public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    factoryBean.setDataSource(dataSource);
    factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/oracle/*.xml"));
    return factoryBean.getObject();
  }

}
  • MapperScan 으로 @Mapper 파일을 지정하고 @Qualifier를 통해 위에서 작성하였던 DataSource Bean을 맵핑합니다. MariaMyBatisConfig.java 도 같은 방식으로 작성해 줍니다.

 

5. 호출

package com.example.mulitds.service;

import com.example.mulitds.dao.maria.MariaDAO;
import com.example.mulitds.dao.oracle.OracleDAO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class MainService {

  private final OracleDAO oracleDAO;
  private final MariaDAO mariaDAO;

  public void getQuery() {
    String oraResult = oracleDAO.selectSysdate();
    String marResult = mariaDAO.selectNow();

    System.out.println("ora : " + oraResult + " / maria : " + marResult);
  }

}
  • @Mapper 와 쿼리 xml 파일을 잘 작성한 후 @Service에서 해당 mapper를 호출합니다.



전체소스는 Github 를 참고하세요.


감사합니다.

최근에 올라온 글
Total
Today
Yesterday