개발/일지

CQRS 패턴

Zziny 2022. 12. 16. 17:16

Command와 Query 분리

 

CQRS는 개념적 모델을 업데이트와 읽기로 나누는 방식을 제시한다.

CommandQuerySeparation 에서 사용한 Command와 Query의 용어 정의를 참고하자.

Command: Change the state of a system but do not return a value. 시스템의 상태를 변경하고 값을 반환받지 않는 행동.

Queries: Return a result and do not change the observable state of the system. 값을 반환받고 관측 가능한 시스템의 상태를 변경하지 않는 행동

(https://www.martinfowler.com/bliki/ObservableState.html 참고)

같은 개념적 모델에 Command와 Query 두가지 모두를 사용하는 건 모델을 복잡하게 만들고 특히 복잡한 도메인 일 수록 더 복잡해지기 때문에 두 행동을 나누는 것을 제시한다.

 

 

여러 방식으로 구현 할 수 있다.

예를 들어 인 메모리에 있는 두 개의 모델은 같은 데이터베이스를 공유하고 있는데 이때 데이터베이스는 두 모델 간의 통신 역할을 할 수 있다.

반면에 두 모델이 나뉘어진 데이터베이스를 사용한다면, query 용도로 사용하는 데이터베이스를 효과적으로 실시간 ReportingDatabase 로 만들 수 있다.

다만 이런 경우에는 두 개의 모델 간 또는 각 모델의 데이터베이스 간에 특정한 통신이 필요 할 수 있다.

 

CQRS를 사용하면 좋은 경우

  • 여러 사용자가 동일한 데이터에 동시에 액세스 하는 공동 작업 도메인
  • 개발자 중 한 팀은 쓰기 모델에 포함되는 복잡한 도메인 모델에 집중하고 또 한 팀은 읽기 모델과 사용자 인터페이스에 집중할 수 있는 시나리오

CQRS가 권장 되지 않는 경우

  • 도메인 또는 비즈니스 규칙은 간단
  • 간단한 CRUD 스타일 사용자 인터페이스 및 데이터 액세스 작업으로 충분

원문