bertrand meyer의 책 객체 지향 소프트웨어에서 시작된 개념. 상태를 변경하는 명령과 단순 질의를 분리하여, 응집력있는 프로그램을 만드는 것.
구현 방식 : command가 발생하면 변경된 결과가 query에 전달되어 update된 상태를 반영한다. db는 두 model간 communication을 담당.
복잡도가 늘어날 수 있다. 대부분은 CRUD mental model에 맞으며, 큰 이점이 없는 이상 함부러 사용해서는 안되며 전체 시스템에 적용해서는 더욱 안된다.
CQRS에는 적합하지 않지만, query나 성능 문제를 해결해야 하는 경우, ReportingDatabase를 사용하면 된다.
command model는 update에 대한 이벤트를 생성하고, query model은 event poster를 활용하여 같이 사용할 수 있다.
사용자의 operation 요구사항과 report 되는 요구사항은 다를 수 있다. 이런 경우 특정 operation만을 copy해온 report db를 별도로 유지한다.
어플리케이션은 주로 어떤 상태에 대한 표시를 사용자에게 보여주는 것이며, 변경 사항은 저장/큐에 쌓을 수 있는 event 목록으로 만들어진다. DB는 현재의 상태를 저장할 필요가 없으며, 초기값과 이후의 event를 저장하기만 하면 된다. 특정 상태를 복원하고 싶으면 그 상태까지 replay만 하면 된다.
일반적으로 모든 event를 유지하는 것은 어려우므로 주기적으로 최신 스냅샷을 생성한다.
어플리케이션의 모든 변경 사항을 이벤트로 저장한다. 저장된 이벤트로 특정 시점의 상태를 재구성할 수 있다.