AWS Aurora database를 생성하면 기본적으로 Write, Read 엔드포인트가 생성됩니다.
서비스를 운영하면서 많은 읽기 요청이 DB에 발생할 때 Read 엔드포인트로 조회 쿼리를 실행하도록 구성하면
AWS Aurora는 Replication을 통해 자동으로 부하분산을 수행해줍니다.
위 그림과 같이 Aurora database를 사용하기 위해선 Read, Write 엔드포인트를 구분하여야 합니다.
이번 글에서는 typeorm-transactional-cls-hooked 이라는 라이브러리를 통해 Decorator 형태로 Read, Write 엔드포인트를 구분하여 사용하는 방법에 대해 다룹니다.
Node 프로젝트를 생성하시고, 위 라이브러리를 설치해주세요.
yarn add typeorm-transactional-cls-hooked
저의 경우는 Nest.js를 사용하여 진행했습니다.
커넥션 생성
먼저 2개의 Connection을 선언하고,
해당 커넥션들을 Injection 해줍니다.
마지막으로 App을 실행시키기 전에
initializeTransactionalContext();
를 선언해줍니다.
커넥션 사용
이제 위에서 만든 커넥션을 사용해봅시다.
Repository를 생성하고, Method 별로 Transcational Decorator를 통해 커넥션 타입을 지정해줍니다.
앱을 실행시키고,
readonlyConnection()
함수를 여러차례 호출하여 쿼리를 날려봅니다.
AWS Cloudwatch에서 각각 커넥션에 대한 정보를 확인해봅니다.
읽기전용 인스턴스에서 0개였던 Read 커넥션이 증가한 걸 확인할 수 있습니다.
또한 테스트를 위해 수차례 쿼리를 수행한 후 그래프를 보면
위와 같이 Read 엔드포인트로 리퀘스트가 라우팅된 것을 확인할 수 있었습니다.