728x90
반응형
SMALL
CQRS란?
Command and Query Responsibility Segregation 약자로서,
데이터 저장소로부터 읽기와 업데이트 작업을 분리하는 패턴이다.
전통적인 아키텍처에서는 DB 데이터를 조회/업데이트를 할 때 같은 데이터 모델이 사용되었다.
그러나 애플리케이션이 복잡해진다면 이는 여러 문제를 야기한다.
1.표현 데이터의 불일치 및 가시성 저하
- 조회에 사용되는 모델이 업데이트에 사용된다면 자칫 모든 데이터를 업데이트를 할 수 있는 건가? 라고 잘못된 판단을 할 수 있다.
2.단일 책임원칙 위배
- 조회성 모델은 대게 자주 변경되기 쉽다. 만약 특정 데이터를 보여주면 안되지만 업데이트시 꼭 필요한 데이터라면? 관리가 힘들어진다. 책임을 분리하자.
이를 해결하기 위해? CQRS 두두등장!!
CQRS는 읽기와 쓰기를 각각 다른 모델로 분리한다. 명령(Command)을 통해 데이터를 쓰고 쿼리(Query)를 통해 데이터를 읽는다.
CQRS 원칙
- 명령(Command)은 데이터 중심적이 아니라 수행할 작업 중심이 되어야 한다.ex)
숙소의 상태를 예약됨으로 변경한다
를숙소 예약
과 같이 생성한다. - 명령은 비동기적으로 큐에 적재하여 처리한다.(이벤트기반)
- 쿼리는 DB를 결코 수정하지 않고, 어떤 도메인 로직도 캡슐화 하지 않은 DTO만을 반환한다.
기존 아키텍처 -> CQRS 전환 과정
위와 같이 별도의 읽기/쓰기 데이터 저장소가 분리되어 사용되며 반드시 동기화가 필요하다.
DB 업데이트와 이벤트 발행은 반드시 하나의 트랜잭션에서 이뤄져야 한다.
장점
- 읽기/쓰기에 대해 독립적으로 스케일링이 가능하며 Lock 경합이 훨씬 적다.
- 읽기는 쿼리에 최적화 된 스키마를, 쓰기는 명령에 최적화된 스키마를 사용한다.
- 서로 다른 보안정책을 관리하기 용이하다.
- 관심사 분리를 통해 유지보수가 간단해진다.
단점
- 보통 이벤트 소싱 패턴과 함꼐 사용되어 복잡성이 높아진다.
- 메세징에서의 명령(Command)시 메시지 실패/중복에 대한 후처리를 해야한다.
- 읽기/쓰기 저장소 에 대한 데이터 일관성을 고려해야한다.(동기화 딜레이 고려)
어떨때 CQRS를 적용하는가?
- 많은 사용자가 동일한 데이터에 병렬로 접근하는 도메인
- 데이터의 읽기/쓰기 성능을 별도로 조절해야할 때
- 한 팀은 쓰기 모델에 대한 복잡한 도메인 모델에 집중을, 다른 한팀은 사용자 인터페이스에 대한 읽기 모델에 집중을 해야할 때
그러나 도메인, 비즈니스 로직이 간단하거나 단순 CRUD일 경우 권장되지 않는다.
참고:
728x90
반응형
LIST
'나의 주니어 개발 일기 > 헷갈렸던 개념들' 카테고리의 다른 글
스핀락, 뮤텍스, 세마포어 (0) | 2024.05.28 |
---|---|
인터넷에 구글을 검색하면 벌어지는일 (0) | 2023.03.13 |
세션관리 방법 (0) | 2023.03.11 |
[JWT]JWT 동작원리 정리 (0) | 2022.02.21 |
[JAVA 디자인 패턴 정리]4. 데코레이터 패턴 (0) | 2021.12.12 |