[architecture Series Ddd] 04.03.cqrs
February 22, 2025
CQRS(Command Query Responsibility Segragation)
- 일기와 쓰기 작업의 책임을 분리하는 아키텍쳐
- 시스템 상탤르 변경하는 작업과 데이터를 검색하는 작업을 분리하는 것을 의미
개요
1. 명령이란?
- 시스템 상태를 수정하는 작업을 수행하려는 의도를 나타낸다.
- 명령은 작업을 수행하는 데 필요한 정보와 매개변수를 캡슐화 한다.
- 명령은 엔티티 생성, 업데이트, 이벤트 트리거 또는 비즈니스 로직 실행과 같은 작업을 수행하는 데 사용된다.
2. 쿼리란?
- 수정하지 않고 시스템에서 데이터를 검색하려는 의도를 나타낸다.
- 특정 기준에 따라 정보를 가져오거나 복잡한 데이터 조작을 수행하는데 상요된다.
3. 책임 분리
- 명령과 쿼리 간 책임 분리를 강조한다.
- 읽기·쓰기를 분리하면서 각 작업을 독립적으로 최적화 할 수 있도록 한다.
이점
- 확장성 : 분리하여 각 작업을 각가의 요구사항에 따라 독립적으로 확장할 수 있다.
- 성능 :
- 데이터 저장 및 검색 메커니즘을 각 작업의 특정 요구사항에 맞춰 조정하여 성능을 최적화 한다.
- 예를 들어 쿼리의 경우 읽기 모델을 별도로 생성 및 캐싱하거나 반정규화해서 최적화 할 수도 있다.
- 유연성 : 변화하는 요구사항에 따라 시스템이 독립적으로 진화할 수 있도록 한다.
- 유지보수성 향상 : 쿼리에 서로 다른 책임을 할당하여 문제를 명확하게 분리한다.
구현 고려 사항
- 데이터 지속성 :
- 다양한 데이터 지속성 메커니즘을 활용할 수 있다.
- 특정 쿼리 요구 사항에 데이터 검색을 최적화하기 위해서 읽기 작업을 저장과는 전혀 다른 성격의 저장소에 넣을 수도 있다.
- 이벤트 소싱:
- 시스템에서 발생하는 모든 도베인 이벤트를 캡쳐하고 저장한 다음 이벤트로 엔티티의 상태를 재구성하는 것을 포함한다.
- 통합 및 커뮤니케이션
- 명령 측, 쿼리 측 간의 통신 및 동기화가 필요하다.
- 이벤트, 메시징 시스템, Event 중심 아키텍쳐를 통해 달성할 수 있다.
정리, 핵심 개념
- 명령 : 시스템 상태를 수정하려는 의도를 나타낸다.
- 쿼리 : 시스템에서 데이터를 검색하는 요청을 나타낸다.
- 명령 핸들러 : 명령을 수신하고 처리하는 역할을 담당한다.
- 이벤트 : 이벤트는 시스템에서 어떤 일이 발생했다는 사실에 대한 진술이다.
- 이벤트 핸들러 : 이벤트를 수신하고 이벤트에 반응하는 역할을 담당한다.
- 애그리거트 :
- 애그리거트는 단일 단위로 취급되는 도메인 객체의 클러스터 또는 그룹
- 도메인의 특정 개념과 관련된 비즈니스 규칙 및 동작을 캡슐화
- 명령은 애그리거트에 적용되며, 애그리거트는 규칙의 유효성을 검사하고 명령이 유효한 경우 이벤트 생성
- 명령 버스 :
- 명령을 각각 명령 핸들러로 라우팅하는 역할을 한다.
- 클라이언트와 명령 핸들러 사이의 중재자 역할을 하며 각 명령이 적절한 핸들러에서 처리되도록 한다.
- 이벤트 버스 :
- 이벤트 각각의 이벤트 핸들러에 배포하는 역할을 담당한다.
- 이벤트 생성과 이벤트 처리를 분리하는 메커니즘으로 작동하여 이벤트 처리의 유연성과 확장성을 제공