개발을 잘하고 싶은 개발자

[Spring] JPA DB Connection 다중으로 사용하기! 본문

Backend/spring

[Spring] JPA DB Connection 다중으로 사용하기!

_소피아 2021. 8. 3. 20:40

한 개의 DB Connection만을 사용하던 "나의 Config"에서 

다른 DB Connection을 붙여야 하는 미션이 주어졌다.

기존 소스는 아래와 같다.

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
@MapperScan(
        basePackages = {"com.test.testapi.mappers"},
        sqlSessionFactoryRef = "testDbSqlSessionFactory"
)
public class TestConfig {

    @Bean
    @ConfigurationProperties(prefix = "test.datasource")
    public DataSource testDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public PlatformTransactionManager testTransactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public static SqlSessionFactory testDbSqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }
}

이제 여기에 새로운 DB Connection을 붙여야 하는데

1. 다른 파일로 빼서 나눌까...? ( NewConfig.java로?)
2. 아래에 @Bean하나를 더 생성해서 붙일까?

선택은 2번. 디비 커넥션이 이제 더 이상 추가되지 않을 거라는... 막연한 확신?

prefix로 나눠 한파일에서 보기 쉽게 정리.

중간에 " @Primary "를 넣어주지 않아 헤매긴 했는데 그래도 뚝딱 해결했다

new로 추가한 다중 DB Connection Config는 아래와 같다.

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
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 org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
@MapperScan(
        basePackages = {"com.logisvalley.portalapi.mappers"},
        sqlSessionFactoryRef = "testDbSqlSessionFactory"
)
public class TestConfig {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "test.datasource")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "new.datasource")
    public DataSource newDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "testTransactionManager")
    @Primary
    public PlatformTransactionManager testTransactionManager(DataSource dataSource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }

    @Bean(name = "newTransactionManager")
    public PlatformTransactionManager newTransactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "testDbSqlSessionFactory")
    public static SqlSessionFactory portalDbSqlSessionFactory(DataSource testDataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(testDataSource);
        return sqlSessionFactoryBean.getObject();
    }
}

 

디비 연결 성공!