기존 로직이 구현되어 있는 상황에서 Orchestration을 적용하는 방향으로 리팩터링을 해보았다.
오케스트레이터(service)로 분리했다면, /checkout 같은 “프로세스 완결 API”를 따로 만드는 게 거의 필수라고 생각되었다.
지금 내가 만든 구조는 “주문 생성 + 마감 시한 계산 + Slack 발송” = 하나의 비즈니스 시나리오인데,
이건 사실상 전형적인 checkout / run-orchestration / workflow 실행 API이기 때문이다.
즉,
/checkout = "이 시나리오 전체를 실행해라”/orders = “그냥 주문만 생성”/ai/deadline = “AI로 계산만 해라”/slack/post-deadline = “메시지만 보내라”이런 식으로 역할을 분리해 두고,
Orchestrator는 이 각 API를 호출해서 하나의 end-to-end 프로세스를 완성하는 역할을 함.
그래서 orchestrator-service 안에 /checkout을 두는 게 맞다고 판단했다.
/checkout API 추가POST /v1/orchestrations/checkout
→ 주문 생성
→ 허브 정보 조회
→ AI 마감 시한 계산
→ Slack DM 발송
→ 최종 통합 응답 반환
기존 /v1/orchestrations/orders/with-deadline와 거의 동일하지만,
/checkout 은 그대로 유지 가능/checkout 추가 버전@RestController
@RequestMapping("/v1/orchestrations")
@RequiredArgsConstructor
@Slf4j
public class CheckoutController {
private final OrchestratorOrderService orchestratorOrderService;
@PostMapping("/checkout")
public ResponseEntity<OrderWithDeadlineResponseV1> checkout(
@Valid @RequestBody CreateOrderWithDeadlineRequestV1 request
) {
log.info("Checkout started. request={}", request);
OrderWithDeadlineResponseV1 response =
orchestratorOrderService.createOrderWithDeadline(request);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}
}
구조가 단순해지고 “하나의 비즈니스 프로세스 실행”이라는 의미도 더 직관적임.
이미 만든:
public OrderWithDeadlineResponseV1 createOrderWithDeadline(...)
이 메서드는 그대로 /checkout에서 호출하면 됨.
/checkout이 필요한지 (아키텍처적 이유)오케스트레이터는 "비즈니스 시나리오 실행 엔진"이다.
이런 식으로 여러 “시나리오”를 만들 때,
/checkout 같은 이름은 시나리오의 시작점이라는 의미가 명확함.
예를 들어:
/checkout/order-only
(마감 시한 계산 생략)
/checkout/order+deadline
(지금 구조)
/checkout/order+payment+deadline+shipment
(향후 확장)
시나리오를 “옵션”으로 확장해 나가기 쉽다.
UI 개발자가 봐도:
/orders = CRUD/checkout = 도메인 프로세스 실행차이가 명확해짐.
특히 사장님/허브/담당자가 UI에서 "주문하기" 버튼을 눌렀을 때
딱 한 번 호출하면 모든 프로세스가 끝나는 API가 필요한데,
그게 바로 orchestrator의 /checkout.
/orders/with-deadline은 지우는 게 좋을까?두 가지 중 하나 선택 가능:
1) 유지 → 내부/테스트용 API로 사용**
예:
/orders/with-deadline = QA/개발 중 Order 흐름만 테스트/checkout = 실제 UI/실서비스용2) /checkout만 남기고 완전히 대체**
어차피 orchestrator 목적이면 /checkout 단일 트랙이 가장 좋음.
=> 지금은 마감 임박이라 B안 적용
(불필요한 API 지우는 게 운영/문서에서 혼동 적음)
오케스트레이터 마이크로서비스를 도입했다면
/checkoutAPI는 매우 자연스러운 엔드포인트이며, 사실상 필수다.
/orders/with-deadline는 사실상 /checkout의 하위 기능임