728x90
반응형
3편: https://saysimple.tistory.com/201
본론
저번 글에선 Aggregate와 Handler를 마저 리뷰했습니다. 이번 시간에는 제 입맛에 맞게 디렉토리 구조를 리팩토링하고 유저 서비스를 Aggregate에 추가해 보겠습니다.
구조
폴더 구조는 저번 구조에서 아래와 같이 변경하였습니다. 설정 파일, 컨트롤러, service, dto 등을 기존 스프링부트 파일 구조와 같이 가져갔으며 command, query, event를 모델로 분리 하였습니다. 또한 메모리에서 변경이 일어나는 부분을 Aggregate, 실제 저장소에서 읽기, 변경이 일어나는 부분을 Handler로 분리하였습니다.
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─saysimple
│ │ └─axon
│ │ │ OrderApplication.java
│ │ │ OrderApplicationConfiguration.java
│ │ │
│ │ ├─config
│ │ │ MongoConfiguration.java
│ │ │
│ │ ├─controller
│ │ │ OrdersController.java
│ │ │
│ │ ├─dto
│ │ │ Order.java
│ │ │ OrderStatus.java
│ │ │
│ │ ├─entity
│ │ │ OrderEntity.java
│ │ │
│ │ ├─exceptions
│ │ │ DuplicateOrderLineException.java
│ │ │ OrderAlreadyConfirmedException.java
│ │ │ UnconfirmedOrderException.java
│ │ │
│ │ ├─handler
│ │ │ InMemoryOrdersEventHandler.java
│ │ │ MongoOrdersEventHandler.java
│ │ │ OrdersEventHandler.java
│ │ │
│ │ ├─model
│ │ │ ├─command
│ │ │ │ AddProductCommand.java
│ │ │ │ ConfirmOrderCommand.java
│ │ │ │ CreateOrderCommand.java
│ │ │ │ DecrementProductCountCommand.java
│ │ │ │ IncrementProductCountCommand.java
│ │ │ │ ShipOrderCommand.java
│ │ │ │
│ │ │ ├─event
│ │ │ │ OrderConfirmedEvent.java
│ │ │ │ OrderCreatedEvent.java
│ │ │ │ OrderShippedEvent.java
│ │ │ │ ProductAddedEvent.java
│ │ │ │ ProductCountDecrementedEvent.java
│ │ │ │ ProductCountIncrementedEvent.java
│ │ │ │ ProductRemovedEvent.java
│ │ │ │
│ │ │ └─query
│ │ │ FindAllOrderedProductsQuery.java
│ │ │ OrderUpdatesQuery.java
│ │ │ TotalProductsShippedQuery.java
│ │ │
│ │ ├─service
│ │ │ OrderQueryService.java
│ │ │
│ │ ├─uow
│ │ │ OrderAggregate.java
│ │ │ OrderLine.java
│ │ │
│ │ └─vo
│ │ OrderResponse.java
│ │ OrderStatusResponse.java
예전 구조를 조금 더 스프링부트 스럽게 변경 하였습니다. 폴더 구조는 저의 입맛대로 변경한 것이고, 구조에 정답은 없으므로 참고만 하시길 바랍니다.
Order 서비스 비즈니스 로직 추가
제가 원하는 Order 서비스 흐름은 아래와 같습니다.
- Command
- 주문서비스의 Command에서 주문 관련 이벤트를 발행합니다.
- Axon의 이벤트 스토어에 Command와 이벤트가 기록됩니다.
- 이벤트에서 Kafka로 메세지를 발행합니다.
- Kafka의 Source Connector가 Write DB(Command)에 CUD를 합니다.
- Kafka의 Sink Connector가 Read DB(Query)에 CUD를 합니다.
- Query
- 주문서비스의 EventHandler의 Query에서 Read DB(Query)의 데이터를 읽어옵니다.
- Axon의 이벤트 스토어에 Query와 이벤트가 기록됩니다.
유저 서비스 추가
유저 서비스를 추가하기 전에 먼저 Order 서비스와 User 서비스의 Entity를 살펴 보겠습니다.
UserEntity.java
728x90
반응형
'Backend > SpringBoot' 카테고리의 다른 글
[SpringBoot] Axon을 사용해 CQRS와 이벤트 소싱이 적용된 Order 서비스 만들기 - 3 (0) | 2024.04.23 |
---|---|
[SpringBoot] Axon을 사용해 CQRS와 이벤트 소싱이 적용된 Order 서비스 만들기 - 2 (0) | 2024.04.21 |
[SpringBoot] Axon을 사용해 CQRS와 이벤트 소싱이 적용된 Order 서비스 만들기 - 1 (1) | 2024.04.20 |
[SpringBoot] ColumnDefault와 jpa 생명주기 (0) | 2024.04.18 |
[SpringBoot] ModelMapper Matching Strategy 정리 (0) | 2024.04.08 |