TIL

7장 마이크로서비스 쿼리 구현

7.1 API 조합 패턴 응용 쿼리

7.1.1 findOrder() 쿼리

7.1.2 API 조합 패턴 개요

7.1.3 API를 조합 패턴으로 findOrder() 쿼리 구현

7.1.4 API 조합 설계 이슈

누가 API 조합기 역할을 맡을 것인가?

API 조합기는 리액티브 프로그래밍 모델을 사용해야 한다

7.1.5 API 조합 패턴의 장단점

7.2 CQRS 패턴

7.2.1 CQRS의 필요성

findOrderHistory() 쿼리 구현

어려운 단일 서비스 쿼리: findAvaliableRestaurants()

관심사를 분리할 필요성

7.2.2 CQRS 개요

CQRS는 커맨드와 쿼리를 서로 분리한다.

CQRS와 쿼리 전용 서비스

7.2.3 CQRS의 장점

7.2.4 CQRS의 단점

7.3 CQRS 뷰 설계

7.3.1 뷰 DB 선택

SQL vs NoSQL

업데이트 작업 지원

7.3.2 데이터 접근 모듈 설계

동시성 처리

멱등한 이벤트 핸들러

클라이언트 애플리케이션이 최종 일관된 뷰를 사용할 수 있다

7.3.3 CQRS 뷰 추가 및 업데이트

아카이빙된 이벤트를 이용하여 CQRS 뷰 구축

CQRS 뷰를 단계적으로 구축

7.4 CQRS 뷰 구현: AWS DynamoDB 응용

7.4.1 OrderHistoryEventHandlers 모듈

public class OrderHistoryEventHandlers {
    private OrderHistoryDao orderHistoryDao;
    // ...
    public void handleOrderCreated(DomainEventEnvelop<OrderCreated> dee) {
        orderHistoryDao.addOrder(makeOrder(dee.getAggregateId(), dee.getEvent()),
            makeSourceEvent(dee));
    }
    // ...
    public void handleDeliveryPickedUp(DomainEventEnvelop<DeliveryPickedIp> dee) {
        orderHistoryDao.notePickedUp(dee.getEvent().getOrderId(), 
            makeSourceEvent(dee));
    }
    // ...
}

7.2.4 DynamoDB 데이터 모델링 및 쿼리 설계

orderId consumerId orderCreatedTime status lineItems
xyz-abc 229392823232 CREATED [{…}, {…}, …]
attribute_not_exists(<애그리거트 타입><애그리거트 ID>
    또는 <애그리거트 타입><애그리거트 ID> < :이벤트 ID

7.4.3 OrderHistoryDaoDynamoDb 클래스