1. Command는 어떻게 쓰는거지?


데이터 흐름과 객체 간 관계

  1. 컨트롤러에서 DTO 수신 및 Command 변환:

    @PostMapping("/create-order")
    public ResponseEntity<Void> createOrder(@RequestBody OrderDTO orderDTO) {
        // DTO에서 Command 객체로 변환
        CreateOrderCommand command = new CreateOrderCommand(orderDTO.getProductId(), orderDTO.getQuantity());
        // 유스케이스 호출
        createOrderUseCase.execute(command);
        return ResponseEntity.ok().build();
    }
    
    
  2. 유스케이스에서 Command 처리 및 도메인 객체 생성:

    public class CreateOrderService implements CreateOrderUseCase {
        private final OrderPort orderPort;
    
        @Override
        public void execute(CreateOrderCommand command) {
            // Command에서 도메인 객체 생성
            Order order = new Order(command.getProductId(), command.getQuantity());
            // 도메인 객체를 사용하여 비즈니스 로직 수행
            orderPort.save(order);
        }
    }
    
    
  3. 도메인 객체의 역할:

  4. 포트와 어댑터 사용:

결론

이러한 구조는 애플리케이션의 모듈화를 촉진하며, 비즈니스 로직과 데이터 전송 로직을 명확하게 분리합니다. Command와 도메인 객체를 적절히 사용하여 비즈니스 로직을 수행하는 것이 헥사고날 아키텍처의 핵심입니다.

2. 무조건 쓰지는 않나?


서비스 레이어에서 Command 객체를 받아 도메인 객체로 변환하는 것은 일반적인 패턴이지만, "무조건" 변환해야 한다고 할 수는 없습니다. 상황에 따라 다르게 처리될 수 있습니다. 하지만 대부분의 경우, Command 객체는 도메인 객체로 변환되어 비즈니스 로직을 수행합니다. 아래에 그 이유와 상황에 따른 예를 들어 설명드리겠습니다.