Command and Query Responsibility Segregation : Command(명령)과 Query(쿼리) 책임 분리
직역하여 명령이라는 것과 쿼리라는 것의 책임을 분리한다는 것으로, 가장 핵심이 되는 말이다.
CQRS가 등장하기 이전에 많은 아키텍처에서 다음과 같은 문제점을 볼 수 있었다.
- DB에서 데이터 조회 및 업데이트에 같은 데이터 모델을 사용 : 복잡한 어플리케이션에서는 유지보수가 어렵다.
- 읽기와 쓰기의 부하가 다름 : 쓰기 작업이 복잡할 경우 응답이 느려짐, 같은 데이터 동시 작업 시 데이터 일관성 문제
- 정보 조회 시 복잡한 쿼리들이 성능에 부정적 영향을 준다.
>> 이에 '읽기'와 '쓰기'를 각기 다른 모델로 분석하는 CQRS를 도입하게 되었다. 명령을 통해 데이터를 쓰고, 쿼리를 통해 데이터를 읽어내는 형식이라고 생각하면 된다.
- 명령(Command) : Task 중심이어야 한다.
- 쿼리(Query) : DB를 수정하지 않는다. 어떠한 도메인 로직도 캡슐화하지 않는다. 오로지 DTO만을 반환한다.
CQRS의 장점은?
- 명확한 역할 분리: CQRS는 명령(Command)과 조회(Query)의 책임을 명확하게 분리한다. 이는 시스템을 이해하고 유지보수하기 쉽도록 만들어줍니다.
- 성능 최적화: 자체적 최적화. 쓰기 작업에 중점을 둔 명령 모델은 데이터의 일관성과 안정성을 유지하면서 복잡한 비즈니스 논리를 수행할 수 있다. 반면 읽기 작업에 중점을 둔 조회 모델은 빠른 조회를 위해 최적화될 수 있다.
- 확장성: 각 모델이 독립적으로 확장될 수 있다. 쓰기 작업이 더 많은 경우에는 명령 모델을 확장하고, 읽기 작업이 더 많은 경우에는 조회 모델을 확장할 수 있다.
- 유연성: CQRS는 다양한 데이터 저장소와 기술을 사용할 수 있도록 한다. 명령과 조회에 대해 서로 다른 데이터베이스나 저장소를 사용할 수 있으며, 각 모델에 가장 적합한 기술을 선택할 수 있다.
- 비즈니스 논리 분리: 명령 모델에서 비즈니스 논리를 처리하고, 조회 모델에서는 단순히 데이터를 조회하는 역할을 수행한다. 이는 코드의 유지보수성을 향상시키고, 비즈니스 논리의 재사용성을 높여준다.
- 확장 가능한 아키텍처: CQRS는 더 크고 복잡한 시스템에서 확장 가능한 아키텍처를 설계하는 데 도움이 된다. 다양한 서비스 및 마이크로서비스 아키텍처와의 통합에 유리하다.
그러나 아키텍처 및 프로젝트가 단순할 경우에는 CQRS를 굳이 구현할 필요가 없다. 말 그대로 읽기와 쓰기의 분리가 필요할만큼 복잡할 경우에만 도입하기 때문이다. 많은 사용자가 동일한 데이터에 병렬적으로 접근하여 데이터가 시시각각 바뀔 때 이러한 작업이 필요하기 때문이다. 그렇다면 이 읽기와 쓰기의 분리는 어떻게 이루어지는 것인지 공부를 했는데, 이를 이해하기 위해서는 간단하게 개념 하나를 익혀놔야 한다. 바로 이벤트 소싱 패턴이다. 이것은 어플리케이션의 모든 상태를 일으키는 이벤트를 순서에 맞게 지정하여 Status를 생성하는 패턴이다. 데이터보다는 이벤트에 초점을 둔 패턴이다.
이벤트 소싱 패턴에서 우선적으로 알아둬야 하는 것은, 데이터의 상태를 변경시키는 모든 데이터를 저장한다는 것이다. 이는 최종 데이터와 일정 시작 시점을 기준으로 모든 변경 사항을 기록하게 된다.
그 외 이벤트 소싱 패턴 내용은 따로 공부해야 하고, 어찌되었든 이러한 특성을 이용해서 동기화를 진행한다는 것이다. 핵심적인 내용은 다음과 같다.
'커맨드 모델의 저장에 의한 이벤트를 이용해서 쿼리 모델에 데이터 동기화'
이벤트 소싱의 특징에 근거하여 커맨드 모델에서 일어난 변경 내역을 '이벤트 스토어'라는 저장공간에 저장하게 된다. 그럼 쿼리 모델에 그 저장된 내역을 실시간으로 반영시키는 흐름이다. 아래 그림을 보면서 같이 이해해보자.
출처
https://velog.io/@everyhannn/CQRS-Event-Sourcing
'Computer Science > 데이터베이스' 카테고리의 다른 글
리더-팔로워 구조 (0) | 2024.04.22 |
---|---|
Primary Key, Foreign Key 차이 (0) | 2023.10.08 |
데이터베이스란? (0) | 2023.07.27 |