[IT]/MSA

[MSA] CQRS 패턴 이해하기 (명령과 조회의 책임 분리) : 정의, 사용목적, 적용예제

ee2ee2 2022. 4. 4. 22:50
728x90
반응형

CQRS (Command and Query Responsibility Segregation)_명령과 조회의 책임 분리

: 명령 (시스템 데이터 변경-CREATE, UPDATE, DELETE)역할을 수행하는 구성요소와 쿼리(시스템  데이터 조회-READ) 역할을 수행하는 구성요소를 나누는 것.

즉, 시스템 데이터를 변경하는 코드와 시스템 데이터를 조회하는 코드를 따로 만드를 것이다. 구현방식이나 시스템 규모에 따라서 DB를 나누거나, 프로세스를 나누기도 한다.


명령과 조회는 왜 분리할까?

일반적으로 어플리케이션은 데이터를 한 Model로써 관리하며 한 모델에서 생성(CREATE), 조회(READ), 수정(UPDATE), 삭제(DELETE)한다. 이럴 경우, 속성(컬럼) 하나 혹은 여러개가 추가되면 어떨까? 요구사항을 하나씩 반영하다보면 나중에는 Model이 점점 초기 모델보다 거대해지거나 변질될 수 있다.

위와 같이 변질된 모델을 이용하여 데이터를 표현하기 위해서는 변질된 모델을 재가공해야한다. 혹은, 새로운 데이터를 표현하기 위해 Model이 다양하게 변경될 수 있다. 결국 모델이 변화함에 따라 실질적으로 데이터를 저장, 갱신, 삭제에 필요한 Model과 조회하여 사용하는 Model 간 차이가 발생하게 된다. -> 이것이 CQRS가 등장하게 된 배경이다.

<CQRS를 적용하기 전>

<CQRS를 적용 후>

단, CQRS 패턴은 어떠한 문제를 해결하는 다양한 패턴 중 하나의 방법일 뿐이다.

그렇기 때문에 CQRS 패턴은 반드시 적용해야하는 패턴은 아니며 적정한 상황에 따라 적용해야한다.


CQRS 적용 모델링

: MyPage 라는 조회(쿼리)를 위한 마이크로 서비스를 생성했다고 가정해보자. customerCenter의 MyPage는 주문, 배송 서비스에서 나오는 이벤트를 수집하여 조회용 데이터베이스를 생성한다.

CQRS 적용시 우선적으로 명령과 쿼리에 해당 하는 도메인 모델과 리드 모델로 나누며, 도메인 모델이 저장 되었을시 이벤트를 발생 시켜, 읽기 전용 데이터베이스에 저장을 시킨다. UI 에서 명령과 쿼리 API 를 분리 하여 조회를 한다.

MyPage 라는 조회(쿼리)를 위한 마이크로 서비스 소스코드 - 이벤트와 View 영역을 분리

Myservice.java 일부


------참고 영상------

[우아콘2020] 배달의민족 마이크로서비스 여행기 - MSA 내에서 CQRS 사용하기

https://youtu.be/BnS6343GTkY

 

참고