본문 바로가기

Spring

AbstractRoutingDataSource

AbstractRoutingDataSource란?

spring-jdbc 모듈에 포함되어 있는 클래스로써, 여러 DataSource를 등록하고 특정 상황에 맞게 원하는 DataSource를 사용할 수 있도록 추상화한 클래스이다.

 

이 친구가 나오게 된 배경은?

Spring Boot를 사용해 Database Sharding 처리 니즈로 인해 생겨난 것으로 보인다.

알고있다시피 NoSQL에서는 샤딩 기능에 대해 많은 편의를 제공하고 있으며 RDBMS의 몇몇 벤더들 또한 샤딩 기능을 제공하기 위한 방법들은 제공중에 있을 것이다. 

그러나 Spring에서는 이러한 NoSQL, RDBMS에 의존해서 샤딩을 구현하지 않고 Spring Boot로 편리하게 설정을 추상화하여 사용할 수 있는 방법을 만들고자 이러한 친구가 생겨난 것으로 파악된다

 

어떻게 동작하는가?

일단 AbstractRoutingDataSource는 이름 기반으로 다중 DataSource 정보를 등록하는 방법이다.

AbstractRoutingDataSource의 public void setTargetDataSources(Map<Object, Object> targetDataSource)를 호출하여 String:DataSource 키:값으로하는 Map을 저장할 수 있다. 또한 Object determineCurrentLooupKey()를 오버라이드해서 상황에 맞게 Key를 반환하도록 구현할 수 있다.

 

소스코드로 이해하기

여기 블로그에서 내용을 퍼왔다. 예제보고 이해가 너무잘되서 >__<.. Spring AOP 이용해서 설정하는 방법도 있으니 시간될때 읽어보자

public class ReplicationRoutingDataSource extends AbstractRoutingDataSource {
  // 1
  public ReplicationRoutingDataSource(DataSource master, List<DataSource> slaves) {
    // ...
    super.setDefaultTargetDataSource(master);
    Map<Object, Object> targetDataSources =
      IntStream.range(0, slaves.size)
               .boxed()
               .collect(toMap(n -> "slave_" + n, n -> slaves.get(n));
    targetDataSources.put("master", master);
    super.setTargetDataSources(targetDataSources);
  }

  // 2
  @Override
  protected Object determineCurrentLookupKey() {
    boolean transactionActive = TransactionSynchronizationManager.isActualTransactionActive();
    if (transactionActive) {
      boolean readOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();
      if (readOnly) {
        return "slave_" + dataSourceSelectPolicy.select(slaves);
      }
    }
    return "master";
  }
}

1: 생성자를 통해서 master로 사용할 DataSource와 slave로 사용할 DataSource 목록을 받고 있다.
2: 현재 트랜잭션이 활성화되어 있고, 읽기 전용이면 slave 중에 하나를 선택해서 반환하도록 되어 있다.

 

이를 응용해서 이름 기반으로 동작하는 AbstractRoutingDataSource를 구현할 수 있다.

'Spring' 카테고리의 다른 글

QueryDSL  (0) 2020.01.28
Spring Cloud Data Flow  (0) 2020.01.06
토비의 스프링 2장 - 테스트  (0) 2019.06.02
토비의 스프링 1장 - 오브젝트와 의존관계  (0) 2019.06.01