더북(TheBook)

OrderCommandHandlers 클래스 코드를 보면, 커맨드 메시지 타입별 핸들러 메서드를 commandHandlers()에서 매핑하고 있습니다(예제 4-6). 각 핸들러 메서드는 커맨드 메시지를 매개변수로 받아 OrderService를 호출한 후, 응답 메시지를 반환합니다.

예제 4-6 OrderCommandHandlers 클래스

public class OrderCommandHandlers {

  @Autowired
  private OrderService orderService;

  public CommandHandlers commandHandlers() { ← 커맨드 메시지를 각각 적절한 핸들러 메서드로 라우팅
    return SagaCommandHandlersBuilder
      .fromChannel("orderService")
      .onMessage(ApproveOrderCommand.class, this::approveOrder)
      .onMessage(RejectOrderCommand.class, this::rejectOrder)
      ...
      .build();
  }

  public Message approveOrder(CommandMessage<ApproveOrderCommand> cm) {
    long orderId = cm.getCommand().getOrderId(); 
    OrderService.approveOrder(orderId);  ← Order를 승인 상태로 변경
    return withSuccess();  ← 제네릭 성공 메시지 반환
  }

  public Message rejectOrder(CommandMessage<RejectOrderCommand> cm) {
    long orderId = cm.getCommand().getOrderId();
    OrderService.rejectOrder(orderId); ← Order를 거부 상태로 변경
    return withSuccess();
  }

approveOrder(), rejectOrder()OrderService를 호출하여 주문을 업데이트합니다. 사가에 참여한 다른 서비스도 이런 커맨드 핸들러 클래스를 두고 자신의 도메인 객체를 업데이트합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.