DevBoi

[DDD] Axon framework 를 사용해보자 (2) 본문

Develop/[DDD]

[DDD] Axon framework 를 사용해보자 (2)

HiSmith 2023. 6. 12. 01:12
반응형

간단하게, 음식과 관련된 애플리케이션을 만들어보자, 일단 구조는 기본적으로 잡아보자.

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()));
  }
  
}

 

 

일단 이 방식대로 얼추 기초적인 프레임워크의 구조에 대해서는 확인할 수 있다.

이제, 실제적으로 사용하기위한 구조 위주로 코드를 조금 바꿔보자.

 

 

반응형