본문으로 바로가기

CQRS란?

category 나의 주니어 개발 일기/헷갈렸던 개념들 2024. 5. 29. 10:02
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일 경우 권장되지 않는다.

참고:

https://mslim8803.tistory.com/73

https://always-kimkim.tistory.com/entry/cqrs-pattern

728x90
반응형
LIST