데이터 읽기(R) / 쓰기(CUD) 역할의 분리
기존 아키텍쳐에서는 쿼리와 업데이트 모두 동일한 모델을 사용하였다. 하지만 이는 기본적인 CRUD 작업에 적합하나, 복잡한 애플리케이션에서는 적절한 방법이 아니다. 요즘의 복잡한 애플리케이션을 사용할 때 CUD와 R 작업을 사용시 동일한 Domain Model로 처리한다면 필요치 않은 Domain 속성들로 인해 복잡도는 더 증가할 것이다.
이를 해결하기 위해 생겨난 패턴이 CQRS패턴이다. CQRS 패턴에서는 업데이트인(CUD) command, 읽기(R) query 로 나눔
CQRS 패턴을 구현하는 방식은 크게 3가지로 나뉜다.
업데이트용 DB , 읽기용 DB(보통 업데이트용 DB를 복제)
이벤트 소싱이란 애플리케이션 내의 모든 Activity를 이벤트로 전환해서 이벤트 스트림(Event Stream)을 별도의 DB에 저장하는 방식을 말한다.
애플리케이션의 모든 상태를 이벤트의 시퀀스로 저장하여 사용하는 방식이다.
CUD 명령이 들어오면 이벤트 스트림을 담당하는 DB(이벤트 저장소)에 저장이 되고(추가만 가능한 DB) 쌓인 데이터를 R로 조회하는 DB(읽기 저장소)에 저장하게 된다.
이벤트 소싱을 사용하려면 CQRS는 필수적으로 사용된다.