어떻게 적용할까?
전통적인 CRUD 시스템은 아래와 같이 계층 구조로 구성되어 있습니다. 이러한 시스템 구조에 CQRS를 적용하기 위한 방법은 크게 3가지가 있습니다.
(1) Simple CQRS Architecture
데이터베이스는 분리하지 않고 모델 계층만 커맨드와 쿼리로 분리합니다. 분리된 모델은 각자의 도메인 계층에 대해서만 모델링하기 때문에 단순하게 구현할 수 있습니다. 그러나 여전히 DB 사용에 대한 성능상의 문제는 개선이 되지 않습니다.
(2) CQRS with separated persistence mechanisms
Simple 구조와 비교하여, 커맨드용 디비와 쿼리용 디비를 분리하여 별도의 브로커를 두어 두 디비 간의 데이터를 동기화합니다. 이렇게 구성하면 데이터를 조회하고자 하는 서비스들이 각자 자신의 시스템에 맞는 저장소(RDBMS, NoSql, Cache..)를 선택할 수 있어 폴리글랏 저장소(다수의 디비를 혼용하여 사용하는 것)로 구성할 수 있고, 각각의 모델에 맞게 저장소를 튜닝하여 사용할 수 있습니다. 또한 디비가 분리되기 때문에 Simple 구조에서 언급한 성능 문제를 해결할 수 있습니다. 그러나 이 경우 동기화 처리를 위한 브로커의 가용성과 신뢰성이 보장되어야 하는 리스크가 생기게 됩니다.
(3) CQRS & 이벤트 소싱(Event Sourcing)
이벤트 소싱(Event Sourcing)은 CQRS와 같이 하나의 패턴이며, 일련의 이벤트를 통해 데이터를 조작하는 방식입니다. 이벤트 소싱 패턴에서는 이벤트 스트림을 별도의 데이터베이스에 저장하는 방식을 사용합니다. 이벤트 스트림을 저장하는 디비에는 오직 데이터 추가만이 가능하며, 계속적으로 쌓인 데이터를 구체화시키는 시점까지 구축된 데이터를 바탕으로 조회대상 데이터를 작성합니다. 간단히 말해서, 데이터가 변경되었을 때 데이터의 현재 상태만 도메인에 저장하던 방식을, 추가로 전용 저장소를 두어 해당 데이터에 수행된 전체 작업을 기록하는 방식으로 바꾼 것이라 생각하면 쉽습니다. 애플리케이션 내의 상태 변경에 대한 데이터를 이력으로 남겨 관리하는 패턴이 발전된 형태라고 보면 됩니다.
참고. CQRS 패턴은 이벤트 소싱 패턴과 함께 사용되는 경우가 많지만 필수 사항은 아닙니다. 반대로 이벤트 소싱 패턴의 경우 CQRS를 함께 적용하는 것이 필수라고 말합니다.
[references]
CQRS and Event Sourcing with Lagom
CQRS - Command Query Responsibility Segregation
Cutting Edge - Event Sourcing for the Common Application
'Design Patterns' 카테고리의 다른 글
Memoization Pattern (0) | 2020.11.15 |
---|---|
[CQRS] CQRS 어떻게 사용할까? (0) | 2020.10.12 |
[CQRS] CQRS는 언제/어디서 사용할까? (0) | 2020.08.06 |
[CQRS] CQRS(Command and Query Responsibility Segregation)란? (0) | 2020.08.05 |
댓글