Spring

[Spring] WebClient

차가운개발 2024. 12. 9. 13:56

WebClient는 Spring 5에서 도입된 HTTP 클라이언트로 REST API와 같은 웹 서비스를 호출하기 위해 사용된다. 기존의 RestTemplate를 대체하며 **비동기와 논블로킹** 방식으로 설계되어 있다. Spring WebFlux의 일부지만, Spring MVC 프로젝트에서도 사용할 수 있다.

 

특징 및 장점

  • 비동기 및 논 블로킹 I/O
    WebClient는 Netty와 같은 비동기 논블로킹 I/O 라이브러리를 활용해 설계되었다.
    이를 통해 대규모 요청을 처리할 때 더 적은 리소스를 사용하며 높은 동시성을 제공한다

  • 반응형 프로그래밍 지원
    MonoFlux와 같은 Reactor 타입을 반환하여 비동기 데이터 스트림을 처리한다.
    이를 통해 데이터의 지연 로드, 병렬 처리, 오류 처리등을 효율적으로 수행할 수 있다.

  • 유연한 설정 및 확장성
    다양한 요청 옵션(헤더, 쿼리 파라미터, 바디)을 설정할 수 있다.
    요청이나 응답을 가공하거나 필터링할 수 있는 ExchangeFilterFunction을 제공한다

  • 다양한 HTTP 메서드 지원
    GET, POST, PUT, DELETE 등 모든 HTTP 메서드를 지원한다
  • 동기식 요청 가능
    필요하다면 동기 방식으로 사용할 수 있다

 

기본 구조

WebClient는 builder()를 통해 설정하고 생성한다

WebClient webClient = WebClient.builder()
                                .baseUrl("https://api.example.com")
                                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                                .build();

 

HTTP 요청 생성

HTTP 요청 메서드를 지정하여 HTTP 요청을 생성한다

webClient.get()
         .uri("/resource")
         .retrieve()
         .bodyToMono(String.class)
         .subscribe(System.out::println);

 

 

사용 시 주의점

  • Rate Limiting
    API 호출이 많은 경우, 요청 속도 제한이 걸리지 않도록 적절한 백오프 전략을 적용한다
  • 에러처리
    HTTP 상태 코드별 예외 처리가 필요하다
  • 메모리 관리
    비동기 논블로킹 방식이므로 메모리 누수가 발생하지 않도록 스트림 종료와 에러 처리를 확실히 해야한