11/14

졸용·2025년 11월 14일

TIL

목록 보기
115/144

🔹 Orchestrator 내 프로젝트에 적용한 사례

기존 로직이 구현되어 있는 상황에서 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을 두는 게 맞다고 판단했다.



🔹 orchestrator-service에 /checkout API 추가

POST /v1/orchestrations/checkout
→ 주문 생성
→ 허브 정보 조회
→ AI 마감 시한 계산
→ Slack DM 발송
→ 최종 통합 응답 반환

기존 /v1/orchestrations/orders/with-deadline와 거의 동일하지만,

  • 이름이 더 일반적이고
  • 나중에 “배송 생성 + 라벨 발행 + 문구 자동 추천 + 결제 승인” 등 추가해도
    /checkout 은 그대로 유지 가능
  • UI 관점에서도 “한 번에 끝나는 프로세스”라는 의미가 명확해짐


🔹 Controller: /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);
    }
}

구조가 단순해지고 “하나의 비즈니스 프로세스 실행”이라는 의미도 더 직관적임.



🔹 서비스는 그대로 재사용 (OrchestratorOrderService)

이미 만든:

public OrderWithDeadlineResponseV1 createOrderWithDeadline(...)

이 메서드는 그대로 /checkout에서 호출하면 됨.



🔹 왜 /checkout이 필요한지 (아키텍처적 이유)

🔸 오케스트레이터의 핵심 개념을 명확하게 보여준다

오케스트레이터는 "비즈니스 시나리오 실행 엔진"이다.

  • 주문 생성 Orchestrator
  • 배송 생성 Orchestrator
  • 상품 업로드 Orchestrator

이런 식으로 여러 “시나리오”를 만들 때,

/checkout 같은 이름은 시나리오의 시작점이라는 의미가 명확함.


🔸 나중에 여러 종류의 체크아웃이 생겨도 처리하기 좋음

예를 들어:

  • /checkout/order-only
    (마감 시한 계산 생략)

  • /checkout/order+deadline
    (지금 구조)

  • /checkout/order+payment+deadline+shipment
    (향후 확장)

시나리오를 “옵션”으로 확장해 나가기 쉽다.


🔸 UI/FE와 협업할 때도 API 이름이 더 자연스럽다

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 지우는 게 운영/문서에서 혼동 적음)



🔹 최종 정리

오케스트레이터 마이크로서비스를 도입했다면 /checkout API는 매우 자연스러운 엔드포인트이며, 사실상 필수다.

  • 전체 end-to-end 시나리오 실행
  • UI/FE와 협업 시 가장 직관적
  • 향후 기능 확장 용이
  • /orders/with-deadline는 사실상 /checkout의 하위 기능임
profile
꾸준한 공부만이 답이다

0개의 댓글