Architecture

메모) CQRS 적용하기

팅리엔 2024. 6. 5. 21:53

 

  • 적은 update & 많은 read인 경우, ux가 자주 변하는 경우, 데이터 관리와 뷰의 책임을 나눠야 할 때, 시스템의 확장성을 높이고 싶을 때
  • 모델 분리하기 - 명령 모델 / 조회 모델
  • DTO 사용, 엔티티 일부만 사용
  • 정규화된 디비 스키마를 비정규화
  • 중간에 캐시
  • 명령 모델 데이터 변경 => 명령 모델 & 조회 모델 생성 및 저장 (비정규화된 데이터)
  • 조회 모델을 가져올 때는 join 등의 연산 작업을 자제, 가능한 디비값 그대로 표출
  • NoSQL, 도메인 별 적절한 디비 선택
  • 두 저장소간의 일관성 유지 필요
  • 조회 모델 생성시 부담된다면, 역할 분리 by 이벤트 소싱
    • 명령 모델 데이터 변경 => publish event => consume event, 조회 모델 생성 및 저장
    • 이벤트 내용: 변경 대상 id, 변경 감지할 property (optional), 실행 method 지정, 데이터 변경자 이름(누가, 언제)
    • 변경 모델 데이터를 모두 전송하면 오히려 복잡해질 수 있어 엔티티 id만 전송해서 변경 모델 조회 후 조회 모델 생성
    • 이벤트가 수백개일 경우 중복으로 처리하면 비효율적: 이벤트 로깅(elasticsearch) => 변경 대상 버퍼에 저장(redis) => 스케쥴러(spring) => 조회 모델 생성 및 저장
    • Amazon SNS, SQS: 계정당 TPS 제한 있음, 어플리케이션 코드 기반 이벤트 퍼블리싱, 기본적인 queue 기능
    • CDC (Change Data Capture): Kafka Connect
  • 변경 감지 방법: JPA EntityListeners, Hibernate EventListener, Hibernate Interceptor, Spring AOP
  • 엔티티 변경 감지의 단점: Hibernate 의존적, 쿼리 직접 실행시키는 로직에는 예외 처리 필요, 기존 엔티티에 추가 작업 필요
  • 필요한 특정 도메인에만 적용 (e.g. 카탈로그)
  • 데이터가 단방향으로 흐를 수 있도록 로직 정리