목표

  • Spring 6의 HTTP Client 인터페이스가 무엇인지 이해한다.
  • Spring 6의 HTTP Client 인터페이스의 사용법을 이해한다.

HTTP Client 인터페이스

  • Spring Framework 6와 Spring Boot 3부터 사용 가능한 기능
  • Feign과 같은 클라이언트 라이브러리와 같이 인터페이스를 기반으로 HTTP 요청을 보내고 응답을 받을 수 있는 기능을 제공한다.

사용법

인터페이스 정의

  • 인터페이스 메소드에 어노테이션을 붙이면 된다.
  • 사용 가능한 파라미터
    • URI: 요청에 대한 URL을 동적으로 설정한다.
    • HttpMethod: 요청에 대한 HTTP 메서드를 동적으로 설정한다.
    • @RequestHeader: 요청 헤더
    • @RequestBody: 요청 바디
    • @RequestParam: 요청 매개변수
    • @CookieValue: 쿠키 이름과 값
  • 사용 가능한 반환 타입
    • void, Mono<Void>
    • HttpHeaders, Mono<HttpHeaders>
    • <T>, Mono<T>
    • <T>, Flux<T>
    • ResponseEntity<T>, Mono<ResponseEntity<T>>
    • Mono<ResponseEntity<Flux<T>>
interface BooksService {

    @GetExchange("/books")
    List<Book> getBooks();

    @GetExchange("/books/{id}")
    Book getBook(@PathVariable long id);

    @PostExchange("/books")
    Book saveBook(@RequestBody Book book);

    @DeleteExchange("/books/{id}")
    ResponseEntity<Void> deleteBook(@PathVariable long id);
}

클라이언트 생성

  • HttpServiceProxyFactory 를 통해서 클라이언트를 생성한다.
WebClient webClient = WebClient.builder()
  .baseUrl(serviceUrl)
  .build();
  
HttpServiceProxyFactory httpServiceProxyFactory = HttpServiceProxyFactory
  .builder(WebClientAdapter.forClient(webClient))
  .build();
  
booksService = httpServiceProxyFactory.createClient(BooksService.class);
  • 아래와 같이 상태 코드에 따른 예외처리도 가능하다.
    • 따로 설정하지않으면 4xx 또는 5xx 응답 코드에 대해서 WebClientResponseException을 발생시킨다.
BooksClient booksClient = new BooksClient(WebClient.builder()
  .defaultStatusHandler(HttpStatusCode::isError, resp ->
    Mono.just(new MyServiceException("Custom exception")))
  .baseUrl(serviceUrl)
  .build());

참고 자료