들어가기
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.
반응형
'3.구현 > Java or Kotlin' 카테고리의 다른 글
[Springboot] Spring boot WebFlux 사용하기 (2) | 2023.11.14 |
---|---|
[spring boot] 다중 DB 사용하기: ApacheShardingSphere 활용 (2) | 2023.11.01 |
[spring boot] 다중 DB 사용하기: 설정 활용 (2) | 2023.10.30 |
[spring boot] jackson대신에 gson으로 사용하기 (0) | 2023.10.27 |
[spring] Spring Framework에서 DB연동 테스트 (0) | 2023.10.26 |