본문 바로가기

3.구현/Java or Kotlin

[spring boot] 다중 DB 사용하기: AbstractionRoutingDataSource 활용

들어가기

AbstractionRoutingDataSource을 사용해서 다중 DB를 구현하는 방식이다.

작성자: ospace114@empal.com, http://ospace.tistory.com/

설정파일 구성

다중 DB에서 사용할 설정파일에 어떻게 설정값을 할당하는지 살펴보자. 다중 DB에 사용할 application.properties 내용은 아래와 같다.

spring.datasource.master.jdbc-url = jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=UTC
spring.datasource.master.username = foo
spring.datasource.master.pasword = foopass
spring.datasource.slave.jdbc-url = jdbc:mysql://127.0.0.1:3306/db2?serverTimezone=UTC
spring.datasource.slave.username = foo
spring.datasource.slave.pasword = foopass

설정할 DB 구성은 master와 slave 형태로 2가지가 있다. master는 읽기와 쓰기 가능한 DB이고 slave는 master의 복제로서 읽기 전용 DB 이다. 읽을 때에는 master와 slave을 사용할 수 있고, 쓰기에는 master만 사용한다. 이 형태는 mysql의 replication 구조에 적용하기 적합한 형태라고 보면 된다.

ReplicationRoutingDataSource 클래스

datasource 생성 하는 클래스이다.

public class ReplicationRoutingDataSource extends AbstractRoutingDataSource {
    private boolean masterSelected = false;

    public ReplicationRoutingDataSource(DataSource master, DataSource slave) {
        super.setDefaultTargetDataSource(master);
        Map<Object, Object> targets = new HashMap<>();
        target.put("master", master);
        target.put("slave", slave);
        super.setTargetDataSources(targets);
    } 

    @Override
    protected Object determineCurrentLookupKey() {
        boolean transactionActive = TransactionSynchronizationManager.isActualTransactionActive();
        if(transactionActive) {
            boolean readOnley = TransactionSynchronizationManager.isCurrentTransactionReadOnly();
            if(readOnly) {
                if(masterSelected) {
                    masterSelected = false;
                    return "slave";
                } else {
                    masterSelected = true;
                    return "master";
                }
            }
        }
        return "master";
    }
}

설정파일 적용

Spring boot 설정에 적용해보자. master와 slave 각자 설정을 읽어와서 HikariDataSource을 생성한다.
그리고, ReplicationRoutingDataSource 생성할 때에 master와 slave을 넘겨서 사용할 DataSource을 생성해서 반환한다.

@Configuration
public class DBConfiguration {
    @Bean
    @ConfigurationProperties(prefix="spring.datasource.master")
    public HikariConfig masterConfig() {
        return new HikariConfig();
    }

    @Bean
    @ConfigurationProperties(prefix="spring.datasource.slave")
    public HikariConfig slaveConfig() {
        return new HikariConfig();
    }

    @Bean
    public DataSource dataSource() {
        DataSource master = new HikariDataSource(masterConfig());
        DataSource slave = new HikariDataSource(slaveConfig());

        return ReplicationRoutingDataSource(master, slave);
    }
}

결론

일단 정해진 DB 설정 키워드로 자동으로 불러와서 설정하도록 했다. 또한, 설정 속성도 기존 DB 설정과 동일하게 되어 있어서 코드도 간편하게 작성된다. 부족한 내용이지만 여러분에게 도움이 되었으면 하네요. 즐프하세요. ospace.

반응형