Spring/스프링 이론

Http Interface 사용하기

블로그 주인장 2024. 1. 8.

Spring 6.0에서 도입된 HttpInterface에 대해 알아보겠습니다.

 

Http Interface는 HTTP 요청을 위한 서비스를 자바 인터페이스와 어노테이션으로 정의할 수 있도록 도와준다. 그리고 해당 서비스를 구현하는 프록시 객체를 생성하면 이를 통해 손쉽게 HTTP 요청을 보낼 수 있다.

 

공식문서 링크 : https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#rest-http-interface

 

REST Clients :: Spring Framework

WebClient is a non-blocking, reactive client to perform HTTP requests. It was introduced in 5.0 and offers an alternative to the RestTemplate, with support for synchronous, asynchronous, and streaming scenarios. WebClient supports the following: Non-blocki

docs.spring.io

이 기능을 사용하여 토이프로젝트에 적용해보겠습니다.

 

 

Http Interface 기능을 사용하면 해당 인터페이스를 구현하는 프록시를 생성하여 요청을 수행할 수 있습니다.

이는 HTTP 원격 엑세스를 간편하게 할 수 있으며 종종 기본 HTTP 클라이언트를 사용하는 세부 정보를 감사는 퍼사드(facade)가 필요한 경우에도 도움이 됩니다.

 

Football API 링크 : https://apifootball.com/documentation/

 

In-Depth Documentation for Football Data Integration - APIfootball

Countries Method GET apiv3.apifootball.com/?action=get_countries Returns list of supported countries included in your current subscription plan Parameters Parameter Description action API method name APIkey Authorization code generated from your apifootba

apifootball.com

 

 

HTTP Interface 구현

 

인터페이스 구현체

HttpInterface를 사용하는 방법은 다음과 같습니다. 먼저 다음과 같이 인터페이스를 구현한 예제입니다.

현재 apifootball api를 이용해서 Http 요청한 인터페이스 예제입니다.

@HttpExchange
public interface SoccerApi {
  @GetExchange("/")
  List<Map<String, Object>> getApiInfo(@RequestParam("action") String action,
      @RequestParam("league_id") int No,
      @RequestParam("APIkey") String key);
}

 

해당 인터페이스에 대한 프록시 구현체를 만들어줘야합니다.

 

여기서 사용된 Http Interface의 주요 어노테이션은 다음과 같습니다.

  • @GetExchange: HTTP GET 메서드
  • @PatchExchange: HTTP PATCH 메서드
  • @PostExchange: HTTP POST 메서드
  • @PutExchange: HTTP PUT 메서드
  • @DeleteExchange: HTTP DELETE 메서드
  • @HttpExchange: 모든 HTTP 메서드

 

Configuration 구현

위에서 만든 인터페이스에 대한 프록시 구현체를 만들어줘야 사용이 가능하다.

 

프록시를 생성할 때는 WebClient 를 필요로합니다.

WebClient는 Spring-Web이 아닌 spring-webflux 에 의존성이 존재하므로 spring-webflux 의존성을 추가해줘야합니다.

 

SpringBoot 3.2부터는 RestClient라는 서블릿 환경 기반의 WebClient가 추가되었다. RestClient 역시 HttpInterface의 기반 기술로 활용할 수 있으므로, 이제는 굳이 spring-webflux 의존성을 추가해서 WebClient를 사용해주지 않아도 된다.

 

* 현재 프로젝트는 3.1.7 version 이다 *

 

WebClient는 기본적으로 4XX,5XX 응답 상태인 코드의 경우 WebClientResponseException을 던진다.

이를 커스터마이징하기 위해서 defaultStatusHandler를 이용해서 예외 처리를 진행했다.

 

 

Request Data를 버퍼링하기 위한 메모리의 기본값은 256KB 이다.

기본 값으로 인해 256KB보다 큰 HTTP 메시지를 처리하려고 하면 DataBufferLimitException 에러가 발생하게 된다.

org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer

 

해당 값을 늘려주기 위해서 ExchangeStrategies.builder() 를 통해 값을 늘려줘야한다.

.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(MAX_IN_MEMORY_SIZE))

 

마치며

기존 WebClient 방식은 WebFlux 기능을 이용하고 빌더 패턴으로 인해 코드가 복잡해보였지만, Http Interface는 어노테이션을 이용해서 하는 방식이 Spring 구조를 갖춘 것으로 보여집니다. 기존에 다른 Client와 어느 부분이 다른지 어떤 점이 나은 점인지 공부해봐야겠다.

 

 

Reference

https://www.youtube.com/watch?v=Kb37Q5GCyZs&pp=ygUXaHR0cCBpbnRlcmZhY2Ugc3ByaW5nIDY%3D

 

 

 

본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다.

반응형

'Spring > 스프링 이론' 카테고리의 다른 글

Message Broker STOMP 개념  (1) 2024.01.24
@RequestBody vs @RequestParam vs @RequestPart  (0) 2024.01.05
SpringBoot Swagger 3.x.x 적용하기  (0) 2023.12.31

댓글