DevBoi

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

Develop/[DDD]

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

HiSmith 2023. 6. 13. 00:09
반응형

일단 Query를 사용해봤다. 다음에는 Event를 사용해보자

마지막에 분석 및 기타 기능에 대해서 구현 및 포스팅을 할 것같다.

 

이번에는 생성에 대한 컨트롤러 단, 부터 생성을 해보자.

단순히 한개의 OrderCount를 늘린다. CQRS는 커맨드와 조회를 나눠, 조회와 데이터 변경에 대한 관심사를 나눈다.

 

1) OrderController

@RestController
public class OrderController {

  @Autowired
  private  CommandGateway commandGateway;

  @PostMapping("/order/{order-name}")
  public CompletableFuture<Void> incrementProduct( @PathVariable("order-name") String productId) {
    System.out.println("smith !controller");
    return commandGateway.send(new CreateOrderCommand(productId));
  }
}

 

2) CreateOrderCommand

@Data
public class CreateOrderCommand {

  @TargetAggregateIdentifier
  private Long orderId;

  private String orderName;

  public CreateOrderCommand(String orderName){
    this.orderName = orderName;
  }
}

3) OrderAggregate

@Aggregate
public  class OrderAggregate {

 @AggregateIdentifier
 UUID orderId;

 String orderName;

  public OrderAggregate() {
  }
  @CommandHandler
  public OrderAggregate(CreateOrderCommand command){
    System.out.println("smith commandHandler");
    CreateOrderEvent event = new CreateOrderEvent();
    event.setOrderId(UUID.randomUUID());
    event.setOrderName(command.getOrderName());
    AggregateLifecycle.apply(event);
  }
  @EventSourcingHandler
  public void createOrderEvent(CreateOrderEvent event){
    System.out.println("smith EventSourcingHandler");
    System.out.println("smith event.getOrderId()"+event.getOrderId());
    this.orderId = event.getOrderId();
    this.orderName = event.getOrderName();

  }
}

4) CreateOrderEventHandler

@Component

public class CreateOrderEventHandler {
  @Autowired
  private OrderRepository orderRepository;
  @EventHandler
  public void createOrderEvent(CreateOrderEvent createOrderEvent){
    System.out.println("smith creatOrderEvent");
    Orders order = new Orders(createOrderEvent.getOrderId(),createOrderEvent.getOrderName());
    orderRepository.save(order);
  }
}

 

일단 간단하게 구조는 이렇다.

 

1) 컨트롤러에서, CommandGateway라는 커맨드 라우팅 인스턴스에게 전달한다.

2) CommandGateway는 적절한 CommandHandler처리 구현부를 찾아서, 이를 전달한다.

3) 해당 소스가 있는 Aggregate에서, 해당 소스를 처리하고, 이벤트를 생성해서 Sourcing 한다.

4) EventSourcingHandler가 이벤트 변경을 감지하고, 해당 처리 후 EventHandler에게 위임한다.

5) EventHandler 가 전달 받은 이벤트를 처리한다.

 

Event는 변경 감지와 비슷한 개념으로, 커맨드와 같이 쓰인다.

구조는 아래와 같은데

 

 

일단 이번 포스팅은 구현에 대한 감과 동작 방식에 대한 부분까지만 공부하고,

이벤트 버스나, 외부 모듈을 사용해서 이벤트를 전달 하는 방법에 대해서도 알아보자

 

추가로 jdk17 과 axon 의 문제도 있는것 같다.

오류가 나서 버전을 11로 내리니 정상적으로 동작해서 빡쳤다.

무튼 해당 이슈도.. 어떤건지 정리해서 포스팅 해보자...(잭슨의 라이브러리 이동으로 추가로 설정해야하는 부분이 있는것같다)

반응형