CQRS (Command And Query Responsibility Segregation)
: 데이터 저장소로부터 읽기와 업데이트 작업을 분리하는 패턴
: 애플리케이션의 성능과 확장성, 보안성을 극대화 할 수 있음
: 지속적인 시스템 발전과 여러 요청으로 부터 들어온 복수의 업데이트 명령들에 대한 충돌 방지
전통적인 아키텍처에서의 문제점
: DB에서 데이터를 조회하고 업데이트 하는데 같은 데이터 모델을 사용
: 이로인해 간단한 CRUD에서는 문제가 없으나, 복잡한 애플리케이션의 경우 유지 보수가 어려워진다
: 읽기와 쓰기 작업에서 사용되는 데이터 표현들이 일치하지 않을 수 있다
- 해결 방법
: CQRS 패턴을 통해 읽기와 쓰기를 다른 모델로 분리
: 명령을 통해 데이터를 쓰고 쿼리를 통해 데이터를 읽음
: 명령은 데이터 중심이 아닌 수행할 작업 중심으로 작성해야하고, 비동기적으로 큐에 쌓인 후 수행
: 쿼리는 DB를 결코 수정하지 않는다
CQRS 구현
: 조회에 최적화된 DB 스키마를 가지거나 다른 타입의 데이터 저장소를 사용
> ex) 쓰기는 RDBMS, 읽기는 몽고DB를 사용
: 쓰기 모델 DB에 수정 사항이 발생하면 이벤트를 발행하여 하나의 트랜잭션 내에서 데이터 저장소간 동기화 수행
- 어려움
: 구현이 복잡하다
: 업데이트 이벤트 발행을 위해 메시징 실패나 중복 메시지 등에 대한 처리 필요
: 데이터 일관성을 유지하기 어렵다 (딜레이를 고려해야함)
CQRS의 장점
- 독립적인 스케일링
: 읽기와 쓰기 각각에 대해 독립적인 확장이 가능하게 하며, 훨씬 적인 Lock 경합을 발생시킨다
- 최적화된 데이터 스키마
: 각각 기능에 최적화된 스키마를 사용
- 보안
: 읽기와 쓰기가 분리되어 보안 관리가 용이
- 관심사 분리
: 시스템의 유지 보수를 쉽고 유연하게 함
- 간단한 쿼리
: 읽기 저장소의 materialized view를 통해 복잡한 조인문을 사용하지 않을 수 있다
Reference
https://www.baeldung.com/cqrs-event-sourcing-java
'Development > Development' 카테고리의 다른 글
구글에서 제안하는 오류 메시지 작성 방법 (0) | 2024.01.20 |
---|---|
기획자가 알아야 할 오픈 API 활용 사례 (0) | 2024.01.20 |
코딩 표기법 (0) | 2023.11.07 |
REST API 로깅 가이드 라인 (0) | 2023.11.07 |
의사 코드 (Pseudo-code) 작성법 (0) | 2023.11.07 |