반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- JPA공부
- 스프링부트공부
- 플러터 공부
- 스프링공부
- 프로그래머스
- 코테준비
- 코테공부
- 자료구조공부
- JPA
- 스프링부트
- nestjs공부
- 플러터 개발
- K8S
- 기술면접공부
- nestjs
- JPA스터디
- 자바공부
- Kafka
- 스프링
- nestjs스터디
- 스프링 공부
- Axon framework
- JPA예제
- querydsl
- DDD
- JPA 공부
- 카프카
- 알고리즘공부
- Flutter
- 기술공부
Archives
- Today
- Total
DevBoi
[DDD] Axon framework 를 사용해보자 (2) 본문
반응형
간단하게, 음식과 관련된 애플리케이션을 만들어보자, 일단 구조는 기본적으로 잡아보자.
Command,coreapi,query 단순히 이렇게 3가지 패키지만 만들어보자
기능은 뭐 단순히 신규 주문생성, 주문 확정,주문 배송 이렇게 두면 될 듯하다.
일단 생성한 커맨드는 아래 3개와 같다.
1) Commands
@RequiredArgsConstructor
public class ConfirmOrderCommand {
@TargetAggregateIdentifier
private final String orderId;
}
@RequiredArgsConstructor
@Getter @ToString
public class CreateOrderCommand {
@TargetAggregateIdentifier
private final String orderId;
private final String productId;
}
@RequiredArgsConstructor
public class ShipOrderCommand {
@TargetAggregateIdentifier
private final String orderId;
}
2) Events
@RequiredArgsConstructor
public class OrderConfirmedEvent {
private final String orderId;
}
@RequiredArgsConstructor
public class OrderCreatedEvent {
private final String orderId;
private final String productId;
}
@RequiredArgsConstructor
public class OrderShippedEvent {
private final String orderId;
}
3) Aggregate
package com.smith.PqrsFramework.aggregate;
import com.smith.PqrsFramework.command.CreateOrderCommand;
import com.smith.PqrsFramework.events.OrderCreatedEvent;
import org.axonframework.commandhandling.CommandHandler;
import org.axonframework.eventsourcing.EventSourcingHandler;
import org.axonframework.modelling.command.AggregateIdentifier;
import org.axonframework.modelling.command.AggregateLifecycle;
import org.axonframework.spring.stereotype.Aggregate;
@Aggregate
public class OrderAggregate {
@AggregateIdentifier
private String orderId;
private boolean orderConfirmed;
@CommandHandler
public OrderAggregate(CreateOrderCommand command){
AggregateLifecycle.apply(new OrderCreatedEvent(command.getOrderId(),command.getProductId()));
}
@EventSourcingHandler
public void on(OrderCreatedEvent event){
this.orderId = event.getOrderId();
this.orderConfirmed = false;
}
protected OrderAggregate(){}
}
3-1) Aggregate 핸들러, 이벤트 추가
@Aggregate
public class OrderAggregate {
@AggregateIdentifier
private String orderId;
private boolean orderConfirmed;
@CommandHandler
public OrderAggregate(CreateOrderCommand command){
apply(new OrderCreatedEvent(command.getOrderId(),command.getProductId()));
}
@CommandHandler
public void handle(ConfirmOrderCommand command) {
if (orderConfirmed) {
return;
}
apply(new OrderConfirmedEvent(orderId));
}
@CommandHandler
public void handle(ShipOrderCommand command) throws UnconfirmedOrderException {
if (!orderConfirmed) {
throw new UnconfirmedOrderException();
}
apply(new OrderShippedEvent(orderId));
}
@EventSourcingHandler
public void on(OrderConfirmedEvent event) {
orderConfirmed = true;
}
@EventSourcingHandler
public void on(OrderCreatedEvent event){
this.orderId = event.getOrderId();
this.orderConfirmed = false;
}
protected OrderAggregate(){}
}
4) 주문 생성 핸들러 추가
@Service
public class OrderEventHandler {
private final Map<String, Order> orders = new HashMap<>();
@EventHandler
public void on(OrderCreatedEvent event){
String orderId = event.getOrderId();
orders.put(orderId,new Order(orderId,event.getProductId()));
}
}
일단 이 방식대로 얼추 기초적인 프레임워크의 구조에 대해서는 확인할 수 있다.
이제, 실제적으로 사용하기위한 구조 위주로 코드를 조금 바꿔보자.
반응형
'Develop > [DDD]' 카테고리의 다른 글
[DDD] Axon framework 를 사용해보자 (4) (0) | 2023.06.13 |
---|---|
[DDD] Axon framework 를 사용해보자 (3) (0) | 2023.06.12 |
[DDD] 바운디드 컨텍스트 식별 (0) | 2023.06.08 |
[DDD] 애그리거트 도출 (0) | 2023.06.08 |
[DDD] 정책 및 외부 시스템 도출 (0) | 2023.06.08 |