TIL

1. Rest Clients

스프링 프레임워크는 REST 엔드포인트로 다음 세 가지를 제공한다.

1.1 WebClient

1.2 RestTemplate

RestTemplate은 유지 관리 모드에 있으며, 사소한 변경 및 버그에 대한 요청만 수행된다. WebClient의 사용을 권장한다.

1.3 HTTP Interface

  1. @HttpExchange 메서드를 가지는 인터페이스를 선언
    1. @GetExchange 뿐만 아니라 다른 HTTP 메서드 어노테이션도 지원한다.
interface RepositoryService {

    @GetExchange("/repos/{owner}/{repo}")
    Repository getRepository(@PathVariable String owner, @PathVariable String repo);

    // more HTTP exchange methods...

}
  1. HTTP 요청을 수행하는 프록시 생성
WebClient client = WebClient.builder()
    .baseUrl("https://api.github.com/")
    .build();
HttpServiceProxyFactory factory = HttpServiceProxyFactory
    .builder(WebClientAdapter.forClient(client))
    .build();

RepositoryService service = factory.createClient(RepositoryService.class);

1.3.1 Method Parameters

어노테이션 기반 HTTP 메서드는 다음과 같은 매개변수 사용을 지원한다.

Method argument Description
URI 어노테이션의 URL 속성을 재정의하여 요청에 대한 URL을 동적으로 설정한다.
HttpMethod 어노테이션의 메서드 속성을 재정의하여 요청에 대한 HTTP 메서드를 동적으로 설정
@RequestHeader 요청 헤더 또는 여러 헤더를 추가한다. 인수는 여러 헤더가 있는 Map<String, ?> 또는 MultiValueMap<String, ?>, Collection<?>, 또는 개별 값일 수 있다. 타입 변환은 String이 아닌 값에 대해 지원된다.
@PathVariable 요청 URL에 플레이스홀더 확장을 위한 변수를 추가한다. 인수는 여러 변수가 포함된 Map<String, ?>이거나 개별 값일 수 있다. String이 아닌 값에 대해서는 유형 변환이 지원된다.
@RequestBody 요청의 body를 직렬화할 객체 또는 Mono, Flux와 같은 반응형 스트림 Publisher, 또는 구성된 ReactiveAdapterRegistry를 통해 지원되는 기타 비동기 유형으로 제공하면 된다.
@RequestParam 요청 매개변수 또는 여러 매개변수를 추가한다. 인수는 여러 매개변수가 포함된 Map<String, ?> 또는 MultiValueMap<String, ?>, Collection<?>, 또는 개별 값일 수 있습니다. String이 아닌 값에 대해 유형 변환이 지원된다. content-type이 application/x-www-form-urlencoded로 설정된 경우 요청 매개변수는 요청 본문에서 인코딩된다. 그렇지 않으면 URL 쿼리 매개변수로 추가된다.
@RequestPart 요청 파트는 문자열(양식 필드), Resource(파일 파트), 오브젝트(인코딩할 엔티티, 예: JSON), HttpEntity(파트 콘텐츠 및 헤더), 스프링 파트 또는 위의 모든 것의 리액티브 스트림 Publisher중 하나 일 수 있다.
@CookieValue 쿠키 하나 또는 여러 개의 쿠키를 추가한다. 인수는 여러 쿠키가 포함된 Map<String, ?> 또는 MultiValueMap<String, ?>, 값의 Collection<?> 또는 개별 값일 수 있다. String이 아닌 값에 대해서는 유형 변환이 지원된다.

1.3.2. Return Values

Method return value Description
void,Mono<Void> 주어진 요청을 수행하고 응답 콘텐츠가 있으면 보여준다.
HttpHeaders,Mono<HttpHeaders> 주어진 요청을 수행하고 응답 콘텐츠(있는 경우)를 릴리스한 다음 응답 헤더를 반환한다.
<T>, Mono<T> 주어진 요청을 수행하고 응답 내용을 선언된 반환 유형으로 디코딩한다.
<T>, Flux<T> 주어진 요청을 수행하고 응답 콘텐츠를 선언된 요소 유형의 스트림으로 디코딩한다.
ResponseEntity<Void>, Mono<ResponseEntity<Void>> 주어진 요청을 수행하고 응답 콘텐츠(있는 경우)를 릴리스하고 상태 및 헤더가 포함된 ResponseEntity를 반환한다.
ResponseEntity<T>, Mono<ResponseEntity<T>> 주어진 요청을 수행하고, 응답 콘텐츠를 선언된 반환 유형으로 디코딩한 다음, 상태, 헤더, 디코딩된 본문이 포함된 ResponseEntity를 반환한다.
Mono<ResponseEntity<Flux<T>> 주어진 요청을 수행하고, 응답 콘텐츠를 선언된 엘리먼트 유형의 스트림으로 디코딩한 다음, 상태, 헤더, 디코딩된 응답 본문 스트림이 포함된 ResponseEntity를 반환한다.

1.3.3 Exception Handling

WebClient webClient = WebClient.builder()
        .defaultStatusHandler(HttpStatusCode::isError, resp -> ...)
        .build();

WebClientAdapter clientAdapter = WebClientAdapter.forClient(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory
        .builder(clientAdapter).build();