on
CQRS 란??
CQRS 란??
다음 글은 https://www.youtube.com/watch?v=fg5xbs59Lro 우아콘2021 우태균님의 발표를 보고 정리한 것입니다.
Command and Query Responsibility Segregation
명령과 조회의 책임을 분리한다
내부 관리용 데이터와 정책, 외부 주입으로 조회해오는 데이터가 같은 모델에서 처리하다보면 복잡해진다 → 내부 (명령)과 외부(조회)를 분리한다
조회 모델로 DTO를 만들어서 사용하는 걸 추천
조회 시 성능의 문제가 발생할 수 있다
중간에 캐시를 두어서 해결 데이터를 가공하지 않고 바로 가져다쓸 수 있게 비정규화된 데이터를 저장. 이를 위해 테이블을 따로 만들수도 있고, NoSQL을 사용하는 방법도 있다
조회모델을 생성하는 영역과 조회하는 영역을 분리하는 것이 좋다
명령 모델이 조회 모델을 생성하는 부담을 고스란히 안게 된다 → 둘을 또다시 분리. 이벤트 소싱 패턴을 이용
명령 모델이 조회 모델을 만드는 게 아니라 이벤트를 event store에 저장해두면 조회 모델을 생성하는 애플리케이션에서 해당 event가 발생 시 처리
이벤트 소싱 패턴 어떠한 시스템에서 발생한 이벤트를 event store에 저장하고 여러 시스템이 구독하여 다룰 수 있는 패턴
언제 CQRS? UX와 비지니스 요구 사항이 복잡해질 때. 두 영역이 복잡성이 높아질 때 조회 성능을 보다 높이고 싶을 때 데이터를 관리하는 영역과 이를 뷰로 전달하는 영역의 책임이 나뉘어져야 할 때 시스템 확장성을 높이고 싶을 때 전체 시스템이 아니라 일부 도메인에만 적용 가능
이벤트 발행할 내용 엔티티 변경에 따라 갱신해야할 대상 id 변경 감지할 preperty 지정 - Optional 실행 method 지정 데이터 변경자 이름
변경 감지 방법 (점점 추상화 레벨이 낮아짐) JPA EntityListeners Hibernate - Eventlistener (spring boot stater data jpa를 이용) Hibernate Interceptor Spring AOP
from http://vision99.tistory.com/87 by ccl(A) rewrite - 2021-12-22 01:01:58