트러블슈팅

외부 API 호출 비동기 처리 적용 (@Async)

sudaruuu 2026. 3. 31. 16:15

2026.03.31 - [트러블슈팅] - 외부 플랫폼 주문 전송 기능 - Mock API 구현

 

외부 플랫폼 주문 전송 기능 - Mock API 구현

2026.03.27 - [Spring 2기 과제] - 포인트 기반 커피 주문 결제 시스템 (도메인 설계) 포인트 기반 커피 주문 결제 시스템 (도메인 설계)☕ Coffee Order System 📋 기확 관련 메모포인트 기반으로 커피 메뉴

sudaruuu.tistory.com

 

문제 상황

주문 생성 기능을 구현하면서

결제 완료 이후 외부 플랫폼으로 주문 데이터를 전송하는 로직을 추가했다.

externalOrderClient.sendOrder(...)

 

해당 로직은 주문 서비스 내부에서 동기 방식으로 실행되고 있었고,

다음과 같은 문제가 발생할 수 있었다.

  • 외부 API 응답이 느릴 경우 주문 API 전체 응답이 지연됨
  • 외부 시스템 장애가 주문 기능에 직접적인 영향을 줄 수 있음
  • 핵심 로직(주문/결제)과 부가 로직(외부 전송)이 하나의 흐름에 섞임

원인 분석

현재 구조에서는 외부 API 호출이 createOrder() 내부에서 실행되기 때문에

주문 생성 → 결제 → 외부 API 호출까지 하나의 흐름으로 묶여 있었다.

 

즉, 외부 시스템의 상태에 따라
주문 API의 응답 시간과 안정성이 영향을 받는 구조였다.


해결 방향

외부 플랫폼 전송은 주문 처리의 핵심 로직이 아니라

결제 완료 이후 수행되는 후처리 작업이기 때문에

 

비동기 처리로 분리하여

주문 API 응답과 외부 호출을 독립적으로 수행하도록 개선하였다.


적용 방법

1. 비동기 설정 활성화

@EnableAsync

2. 비동기 처리 전용 서비스 분리

@Service
@RequiredArgsConstructor
@Slf4j
public class ExternalOrderAsyncService {

    private final ExternalOrderClient externalOrderClient;

    @Async
    public void sendOrderAsync(ExternalOrderRequest request) {
        try {
            log.info("비동기 외부 플랫폼 전송 시작");

            externalOrderClient.sendOrder(request);

            log.info("비동기 외부 플랫폼 전송 완료");
        } catch (Exception e) {
            log.error("비동기 외부 플랫폼 전송 실패", e);
        }
    }
}

3. 주문 서비스에서 비동기 호출

externalOrderAsyncService.sendOrderAsync(
    new ExternalOrderRequest(
        user.getId(),
        savedOrderItem.getMenu().getId(),
        savedOrder.getTotalPrice()
    )
);

적용 결과

  • 주문 API는 외부 API 응답을 기다리지 않고 즉시 응답
  • 외부 플랫폼 전송이 느려도 주문 처리에는 영향 없음
  • 핵심 로직과 후처리가 분리되어 코드 가독성 개선

테스트 결과

  • 주문 API 호출 시 외부 API 응답과 관계없이 빠르게 응답되는 것을 확인
  • 로그를 통해 외부 플랫폼 전송이 별도의 스레드에서 비동기로 실행됨을 확인


한계점

@Async 방식은 간단하게 비동기를 적용할 수 있지만
다음과 같은 한계가 존재한다.

  • 주문 로직과 완전히 분리된 구조는 아님
  • 트랜잭션 커밋 이전에 실행될 수 있음
  • 외부 전송 실패 시 재처리 구조가 없음

다음 개선 방향

이러한 한계를 해결하기 위해

다음 단계에서는

 

이벤트 기반 비동기 처리 (@TransactionalEventListener)를 적용하여
트랜잭션 이후 안전하게 외부 전송을 수행하는 구조로 개선할 예정이다 !!


외부 API 호출을 @Async로 비동기 처리하여 주문 API 응답 속도를 개선하고,

핵심 로직과 후처리를 분리하였다.