NestJS · CQRS

CQRS에서 명령과 조회를 분리하는 기준

CQRS는 폴더를 command와 query로 나누는 패턴이 아니라, 상태를 바꾸는 명령과 읽기 모델을 가져오는 조회의 요구가 달라질 때 적용하는 구조다.

01

행위 분류

주문 생성, 취소, 승인처럼 상태를 바꾸는 작업을 command로 둔다.

02

조회 분리

목록, 상세, 통계처럼 화면에 맞춘 읽기 모델을 query로 둔다.

03

이벤트 발행

command 성공 후 domain event가 후속 처리와 projection 갱신을 트리거한다.

04

일관성 판단

조회 모델이 즉시 최신이어야 하는지 eventual consistency가 허용되는지 정한다.

CommandHandler
쓰기 유스케이스 검증, 권한, transaction, event 발행을 담당
idempotency 고려
QueryHandler
읽기 유스케이스 화면에 맞춘 projection과 pagination을 반환
부작용 금지
EventHandler
후속 처리 메일, 알림, 검색 색인, audit log를 비동기로 처리
실패 재처리 필요
Projection
읽기 모델 쓰기 모델과 다른 shape로 조회 최적화
동기화 지연 표시

도입 근거 · transaction · 일관성 점검

도입 근거 단순 CRUD에 과한 CQRS를 적용하지 않는다.
transaction command의 상태 변경 단위가 명확하다.
일관성 eventual consistency가 사용자 경험에 어떤 영향을 주는지 정했다.
재처리 event handler 실패와 중복 실행을 처리한다.