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를 호출하여 주문을 업데이트합니다. 사가에 참여한 다른 서비스도 이런 커맨드 핸들러 클래스를 두고 자신의 도메인 객체를 업데이트합니다.