주문 내역 조회 기능을 구현하기 위해서는 주문 애그리거트와 연관된 여러 애그리거트에서 데이터를 가져와야 한다. Order, Product, Member … 즉시로딩으로 처리해야 할지, 지연로딩으로 처리해야 할지, 아니면 JPA 네이티브 쿼리를 사용해야 할지 고민이 많아진다. 그 이유는, 조회와 애그리거트 상태 변경을 구분하지 않기 때문이다. 조회의 경우 하나의 애그리거트만 수정하면 되지만, 조회는 모든 애그리거트를 JOIN 등을 통해 전부 찾아야 하기 때문에 하나의 DB 모델만으로는 조회 성능을 향상시키는 데 한계가 있다.
Command Query Responsibility Segregation은 조회 모델과 상태변경을 위한 명령 모델을 분리하는 패턴이다.
다음과 같이, 조회 모델과 명령 모델을 구분하여, 조회 모델이 복잡해지는 것을 막고 조회 시 성능을 향상시킬 수 있다.
다음과 같이 구분하여, 서로 다른 데이터 저장소를 사용할 수도 있다. 상태 변경의 경우 트랜잭션을 지원하는 RDBMS를 사용하고, 조회 모델은 NoSQL을 사용하는 식으로 변경할 수 있다. 상태 변경 시 NoSQL 업데이트는 이벤트로 처리할 수 있다.
특히 웹의 경우 상태 변경보다 조회 요청이 매우 많다는 특성을 가진다. 조회 성능을 높이기 위해 CQRS 패턴을 적용하는 것은 대규모 트래픽에서 성능을 매우 향상시킬 수 있는 좋은 방법이 된다.
그러나 구현이 다소 복잡하고, 여러 기술을 사용할 줄 알아야 하기 때문에, 유지보수비용과 성능 향상으로 인한 이득을 비교하여 적용하는 것이 좋다.