CQRS pattern

jihunnit·2023년 11월 11일
0

CQRS - 명령과 쿼리의 책임 분리

Command and Query Responsibility Segregation

데이터를 데이타베이스에 저장하는 일반적 시스템은
데이터에 대한 작업을 두 유형으로 나눔

  • 명령 -> DB의 데이터를 변경시킴(추가, 수정 및 삭제)
    (DB에 레코드 삽입, 업데이트 및 삭제 등 변경 발생)

  • 쿼리 -> DB의 데이터를 조회함
    (DB 데이터의 변경 없음)

CQRS는 시스템의 명령 파트와 쿼리 파트를 명확히 분리함
서비스를 (1)명령 서비스, (2) 쿼리 서비스 라는 두 가지 서비스로 분리하고, 각자 DB를 가지게 함.
이를 통해, 쿼리 서비스(조회)를 고성능으로 유지할 수 있음.

새로운 비즈니스 로직이 추가되어도 명령 서비스에만 변경이 일어나고, 쿼리 서비스는 변경되지 않으므로 테스트하거나 배포할 필요가 없음

CQRS Pattern을 적용할 시 장점:

  • 시스템을 명령, 쿼리 둘 모두에 대해 최적화 할 수 있다.
    -> 그러므로, 읽기와 쓰기 모두 빈번한 시스템에서 특히 중요하다
  • 높은 확장성을 가지게 된다.

CQRS Pattern 적용 시 발생할 수 있는 문제점

  • 최종적 일관성만 보장됨. 엄격한 일관성이 필요할 경우 적합하지 않음
    -> 작업 과정 중간에 명령 서비스 DB와 쿼리 서비스 DB가 다른 상황이 존재할 수 있음
  • 시스템에 오버헤드와 복잡성을 추가시킴
    -> CQRS를 통해 얻는 성능상의 이점이 이러한 부분보다 큰지 검증 후 사용

중요한 부분은, 명령 서비스에서 데이터가 수정되었을 때, 수정된 데이터를 어떻게 쿼리 서비스에 전파하여 동기화시킬 것인지
이를 위해서, 명령 파트에 데이터 변형 요청이 발생할 때 마다 쿼리 서비스가 이를 수신하게 함


동기화 방법

  • 명령 서비스와 쿼리 서비스의 사이에 메세지 브로커 두기
    -> 트랜잭셔널 아웃박스 패턴을 적용하여 단일 트랜잭션에서 DB와 메세지 브로커 모두에 메세지 전달

  • 서비스형 함수(function as a service) 사용하기
    -> 서비스형 함수를 통해 명령 서비스 DB의 변경을 감지


profile
인간은 노력하는 한 방황한다

0개의 댓글