MSA·Spring 기반
복잡한 서브시스템(여러 클래스, 여러 모듈)의 동작을 감춰주고,
“단순한 하나의 인터페이스”로 제공하는 구조적 디자인 패턴을 말한다.
즉, “얘한테만 요청하면 내부에서 복잡한 처리 다 해줄게.”
라는 역할을 하는 대표 창구(Facade) 를 만드는 것.
서브 서비스가 여러 개일 때, 클라이언트 코드가 많은 서비스에 직접 의존하면 지저분함
→ Facade 하나만 바라보게 하면 API를 단순화할 수 있음.
여러 서비스 호출 순서를 일정하게 유지해야 할 때 강력함
(예: A → B → C 호출해야 하는 시나리오)
내부 구현이 바뀌더라도 Facade 인터페이스는 유지된다면
상위 레이어에서 영향을 최소화할 수 있음.
구조
Client → Facade → Subsystem A
→ Subsystem B
→ Subsystem C
결과적으로 클라이언트는 “복잡성 없는 간단한 API”로 이용할 수 있게 됨.
문제 상황
Order 생성 시 다음 흐름을 자동 처리해야 한다고 해보자:
각각을 Controller에서 직접 호출하면 지저분해짐.
@Service
@RequiredArgsConstructor
public class OrderCreationFacade {
private final ProductService productService;
private final FirmService firmService;
private final OrderService orderService;
private final KafkaProducer kafkaProducer;
private final DeliveryService deliveryService;
@Transactional
public Order createOrder(CreateOrderRequest request) {
// 1. 상품 재고 확인
productService.checkStock(request.productId(), request.qty());
// 2. 업체 정보 조회
firmService.validateFirms(request.requesterFirmId(), request.receiverFirmId());
// 3. 주문 생성
Order order = orderService.create(request);
// 4. Kafka 이벤트 발행
kafkaProducer.publishOrderCreated(order);
// 5. 배송 생성
deliveryService.createDelivery(order);
return order;
}
}
@PostMapping("/orders")
public BaseResponse<OrderResponse> create(@RequestBody CreateOrderRequest request) {
Order order = orderCreationFacade.createOrder(request);
return BaseResponse.ok(OrderResponse.from(order));
}
장점:
| 항목 | 내용 |
|---|---|
| 목적 | 복잡한 서브시스템을 감추고 단일 인터페이스 제공 |
| 장점 | 단순화, 의존성 감소, 흐름 중앙화, 변경 영향 최소화 |
| 단점 | 과하게 사용하면 God Class 위험 |
| 활용 추천 | MSA, 오케스트레이션, 복잡한 업무 흐름 묶기 |