노트

스프링에서 외부 API 호출

Calling External REST APIs in Spring

백엔드#spring#http · 연결된 개념 10개

쉽게 말하면

스프링의 외부 API 호출 도구는 전화기 세대 같아요. 다이얼을 직접 돌리던 RestTemplate, 지금 쓰는 RestClient·WebClient, 연락처에 이름만 저장하면 알아서 걸어 주는 인터페이스 방식까지 고를 수 있죠.

비유가 깨지는 곳 상대가 안 받으면 내 스레드가 하염없이 기다릴 수 있어요. 연결·읽기 타임아웃을 꼭 정하고, 재시도는 멱등한 요청에만 하며, 클라이언트 빈은 하나 만들어 커넥션 풀째 재사용해요.

스프링 앱에서 다른 서버의 REST API를 부르는 도구는 여러 세대가 있다. 지금 새 코드라면 동기 호출은 RestClient, 리액티브·비동기는 WebClient, 인터페이스 선언 방식은 HTTP Interface나 OpenFeign이 흔한 선택이다(2026 기준).

도구방식상태
RestTemplate동기, 템플릿 메서드(template method)퇴장 예정. 7.0에서 폐기 예고, 7.1(2026-11)에서 @Deprecated, 8.0에서 제거 계획(2026 기준). 새 코드는 RestClient
WebClient논블로킹(non-blocking), 리액티브(Mono·Flux)WebFlux 모듈. 동기 코드에서 .block()으로도 쓸 수 있다
RestClient동기, 플루언트(fluent) API스프링 6.1에서 추가. RestTemplate의 현대적 대체
HTTP Interface(HTTP Service Client)인터페이스 선언 → 프록시 생성스프링 6 기본 기능
OpenFeign인터페이스 선언 → 프록시 생성Spring Cloud 프로젝트
RestClient client = RestClient.builder()
    .baseUrl("https://api.example.com")
    .defaultHeaders(h -> h.setBasicAuth(user, password))
    .build();
 
UserDto user = client.get().uri("/users/{id}", id)
    .retrieve()
    .body(UserDto.class);
@FeignClient(name = "users", url = "${users.base-url}")
public interface UserClient {
    @GetMapping("/users/{id}")
    UserDto get(@PathVariable Long id);
}
  • 인터페이스 방식은 리포지터리처럼 선언만 하면 구현을 만들어 준다. 호출부가 HTTP 세부를 몰라도 된다
  • 클라이언트 빈은 하나 만들어 재사용한다. 커넥션 풀(connection pool)이 함께 재사용된다
  • 연결·읽기 타임아웃(connect timeout, read timeout)을 반드시 정한다. 기본값이 무한대에 가까운 경우가 있어, 느린 다운스트림 하나가 내 스레드를 모두 붙잡는다
  • 재시도는 멱등한 요청에만 하고, 상대가 요청 제한을 걸면 Retry-After를 따른다
  • 비밀값(API 키, 기본 인증 정보)은 설정에서 주입받는다(스프링 설정 외부화와 프로파일)

브라우저에서 부르는 경우와 서버 간 호출의 차이(CORS(Cross-Origin Resource Sharing)가 적용되지 않는 등)는 브라우저 요청과 서버 간 요청를 본다. 내부 서비스끼리 고성능 통신이 필요하면 gRPC도 후보다.

출처: The state of HTTP clients in Spring · Spring Framework 문서: RestClient · WebClient · RestTemplate · HTTP Service Client

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Spring MVC 요청 흐름

    Spring MVC는 모든 HTTP 요청을 DispatcherServlet 하나가 받아, 알맞은 컨트롤러 메서드로 보내고 결과를 응답으로 바꾸는 프런트 컨트롤러(Front Controller) 구조다. 스프링 이전에는 URL마다 서블릿을 직접 만들고 매핑했다.

  • 스프링 AOP

    AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 로깅·트랜잭션·보안·실행 시간 측정처럼 여러 클래스에 흩어져 반복되는 횡단 관심사(cross-cutting concern)를 한 곳에 모아, 비즈니스 코드를 건드리지 않고 메서드 호출 앞뒤에 끼워 넣는 방법이다. 스프링 AOP는 이를 프록시로 구현한다.

  • 스프링 전역 예외 처리

    @ExceptionHandler는 컨트롤러에서 던진 예외를 받아 응답으로 바꾸는 메서드이고, @ControllerAdvice는 그 처리기를 모든 컨트롤러에 공통으로 적용하는 클래스다. 예외를 응답 형식으로 바꾸는 코드를 한 곳에 모은다.

  • CORS

    브라우저가 다른 출처(scheme·host·port)로 보낸 요청의 응답을 읽어도 되는지, 서버가 Access-Control-Allow-* 헤더로 허락하는 규칙. 막는 주체가 브라우저라서 curl이나 서버끼리의 호출은 통과한다.

  • 스프링 프록시

    스프링이 빈을 감싼 대리 객체를 대신 주입해서, 메서드 호출 앞뒤에 트랜잭션·보안 같은 부가 기능을 끼우는 방식. aop(Aspect-Oriented Programming)의 기본 구현이다.

보기 옵션