데이터를 데이타베이스에 저장하는 일반적 시스템은
데이터에 대한 작업을 두 유형으로 나눔
명령 -> DB의 데이터를 변경시킴(추가, 수정 및 삭제)
(DB에 레코드 삽입, 업데이트 및 삭제 등 변경 발생)
쿼리 -> DB의 데이터를 조회함
(DB 데이터의 변경 없음)
CQRS는 시스템의 명령 파트와 쿼리 파트를 명확히 분리함
서비스를 (1)명령 서비스, (2) 쿼리 서비스 라는 두 가지 서비스로 분리하고, 각자 DB를 가지게 함.
이를 통해, 쿼리 서비스(조회)를 고성능으로 유지할 수 있음.
새로운 비즈니스 로직이 추가되어도 명령 서비스에만 변경이 일어나고, 쿼리 서비스는 변경되지 않으므로 테스트하거나 배포할 필요가 없음
중요한 부분은, 명령 서비스에서 데이터가 수정되었을 때, 수정된 데이터를 어떻게 쿼리 서비스에 전파하여 동기화시킬 것인지
이를 위해서, 명령 파트에 데이터 변형 요청이 발생할 때 마다 쿼리 서비스가 이를 수신하게 함
동기화 방법
명령 서비스와 쿼리 서비스의 사이에 메세지 브로커 두기
-> 트랜잭셔널 아웃박스 패턴을 적용하여 단일 트랜잭션에서 DB와 메세지 브로커 모두에 메세지 전달
서비스형 함수(function as a service) 사용하기
-> 서비스형 함수를 통해 명령 서비스 DB의 변경을 감지