uju's Tech

TypeORM Replication Mode 지정 본문

Node

TypeORM Replication Mode 지정

ujusy 2023. 2. 11. 22:38

이번 포스팅에서는 TypeORM의 Replication 적용 부터 Master , Slaves를 지정하는 것을 다뤄보고자 한다.

 

개발을 하다보면 다양한 쿼리, 그리고 여러 쿼리들로 구성된 하나의 동작을 구현하게 되는데 어떤 동작인지, 어떤 쿼리인지에 따라 Master에 수행해야만 하는 작업이 있을 수도 있고, Read Replica에서 수행할 수 있는 작업이 있을 수도 있다.

 

TypeORM도 replication이 적용된 데이터베이스에 대한 쿼리를 지원하는데, 그렇다면 TypeORM은 어떤 경우에 어떤 데이터베이스로 연결되는지 알아보자.


 

TypeORM 은 Read, Write Replication이 있을 때 기본적으로 다음과 같이 데이터베이스를 선택한다.

 

  1. update, insertMaster DB
  2. find ~ 메서드, selecQueryBuilderSlave instance 중 랜덤
  3. query 메서드Master DB

 

이번 포스팅은 단순히 Master, Slave 중 어디로 연결되는지 확인하는게 중점이므로 Master와 Slave로 사용된 데이터베이스가 Cluster로 구성되어있지 않고 각각의 데이터베이스로 구성하여 연결을 확인하였다.

 

1. docker-compose 구성

로컬에서 어디로 연결이 되는지 확인하기 위해 각각 데이터베이스를 컨테이너로 띄우고자 docker-compose 를 다음과 같이 구성하였다.

Master 1대, Slave 1대로 구성하였다.

command: ["postgers", "-c", "log_statement=all"] 옵션을 주어 쿼리를 수행할 때 모두 로그를 찍도록 설정해준다.

2. TypeOrm Replication 구성

TypeOrmModule.forRoot에 replication 옵션을 활용하여 master, slaves 를 지정한다.

더 자세한 내용을 보고싶다면 다음 공식문서를 참고해보자.

 

3. Connection 확인

0.2.x 버전에서는 Connection을 활용하였고 0.3.x 버전에서는 Connection이 Deprecated되어 DataSource를 사용하여 테스트할 수 있다.

 

첨부된 예제는 TypeORM 0.2.37 이고 0.3.x 버전으로 테스트하려면 Connection -> DataSource 로 교체해주면 된다.

다음은 공식문서에 명시된 것을 제외하고 궁금했던 두 가지 케이스를 테스트해보았다.

(테스트 전 dokcer compose up 하는 것을 잊지말자)

 

case1. Transaction

아래 쿼리로 테스트를 해보자. transaction은 어떤 데이터베이스 connection을 잡을까?

정답은 master로 커넥션을 잡아 transaction을 시작함을 확인할 수 있다.

 

case2. ReplicationMode 지정

 

QueryBuilder를 사용할 경우 옵션으로 QueryRunner를 지정해줄 수 있다. QueryRunner에서 ReplicationMode(Master, Slave) 를 지정할 수 있다. 도커 로그를 보면 지정한 데이터베이스로 연결이 되는 것을 확인할 수 있다. 

마찬가지로 ReplicationMode를 slave로 지정하면 다음과 같이 Slave로 연결되는 것을 볼 수 있다.

 

* 주의할 점 *
queryRunner 사용 후 반드시 queryRunner.release() 를 해주어야한다.

 

 

다음은 createQueryBuilder description이다. 참고해보기를 바란다.

 

 

** 참고

https://typeorm.io/multiple-data-sources#replication

 

Comments