콘텐츠로 바로가기

CQRS Pattern

Command Query Responsibility Segregation: 데이터 쓰기(Command)와 읽기(Query) 모델을 물리적으로 분리하는 아키텍처 패턴. Write Model의 이벤트를 구독하여 Read Model을 동기화하는 비동기 프로세스. 결과적...

sys.entry
M

Me

hyunyoun's Blog

system-architecture-distributed-systems1 min read

CQRS Pattern

Command Query Responsibility Segregation: 데이터 쓰기(Command)와 읽기(Query) 모델을 물리적으로 분리하는 아키텍처 패턴.

핵심 분리

CODE
Client
  ├── Command → Write Model (이벤트 저장소 / 정규화 DB)
  └── Query  → Read Model  (비정규화 캐시 / 검색 인덱스)

Write Model: 도메인 불변식(Invariant) 검증에 최적화. 정규화, 트랜잭션 중심.

Read Model: 조회 성능에 최적화. 비정규화된 Materialized View. 스키마를 쿼리 요구사항에 맞게 자유롭게 설계.

Projection

Write Model의 이벤트를 구독하여 Read Model을 동기화하는 비동기 프로세스. 결과적 일관성(Eventual Consistency) 허용.

언제 쓰는가

  • 읽기 부하가 쓰기보다 압도적으로 높을 때 (일반적 웹 서비스)
  • 동일 데이터를 다양한 형태로 조회해야 할 때 (대시보드, 검색, 리포트)
  • 이벤트 소싱과 결합하여 완전한 감사 추적이 필요할 때

주의점

  • 읽기/쓰기 모델 간 동기화 지연 → 사용자가 방금 작성한 데이터가 즉시 안 보일 수 있음
  • 두 모델 유지로 시스템 복잡도 증가 → 단순 CRUD 서비스에는 과설계

연결 노트