데이터 백업 및 데이터베이스 접근 속도 향상을 위해 데이터베이스를 Master-Slave 구조로 지정하는 방법이 있다. 이때 Slave는 읽기 전용으로 사용하고 Master는 쓰기 전용으로 사용한다. 이 둘 사이에 Replication을 걸어 Master에서 변경된 데이터가 주기적으로 Slave로 복사되도록 설정하여 사용한다.
따라서 데이터를 읽을때는 Slave 에, 데이터를 쓸때 (Create/Update/Delete) 는 Master에 연결하여 작업하게 된다. 때문에 JPA에서 데이터베이스 커넥션을 두개를 유지해야 하는 상황이 생기는데, 이를 위한 샘플을 만들어본다.
- 데이터베이스를 여러개 연결할때는
DataSource를 연결할 데이터베이스마다 설정해주어야 한다. 여기서는 Master와 Slave용DataSource를 정의해줄것이다. (DataSourceConfig클래스 참고) - 생성된
DataSource는 데이터소스를 동적으로 선택할 수 있게끔routingDataSource로 등록을 한다. (DataSourceConfig클래스 참고) - 트랜잭션의 상태가
read-only이면 Slave DB에 접근하고 그 밖에는 Master DB에 접근하도록 하여야 한다.AbstractRoutingDatasource클래스를 이용하여 트랜잭션의 읽기 상태에 따라 Master 혹은 Slave를 리턴하도록 작성해준다. (ReplicationRoutingDataSource클래스 참고) @Transactional어노테이션에readOnly=true가 설정되면 자동으로 Slave DB 에 접근하게 된다. (UserService클래스 참고)