매일 매일, 차곡 차곡 쌓기



완벽하지 않은 것을 두려워 말며,
완성도를 높히는데 집중하자.

Spring/WebClient 13

[WebClient] WebClient Bean 구성

RestTemplate을 Bean으로 등록하여 전역적으로 사용하듯이, WebClient도 Bean으로 등록하여 사용하는것이 일반적으로 생각된다. 마침 인터넷에서 WebClient를 커스터마이징하고 Bean으로 등록하여 사용하는 코드가 있었다. WebClient 사용법을 정리하며 ChatGpt에게 WebClient 커스터마이징 이유를 물어본 적(Reactor Netty를 커스텀하는 이유?)이있다. 간단하게 얘기하면, 커스텀을 통해 다음과 같은 이점을 누릴 수 있다. 네트워크 통신 효율을 높히고, 보안을 강화할 수 있다. 또한 TCP/IP 설정, 프록시 구성 등 다양한 네트워크 요구사항에 대응할 수 있게하여 어플리케이선 요구사항을 충족시킬수 있다. 네트워크 동작 추적 설정을 통해 디버깅 및 모니터링이 용이..

Spring/WebClient 2024.03.28

[WebClient] Synchronous Use

WebClient은 결과를 기다리기 위해 끝에서 Blocking 하는 동기식으로 사용될 수 있습니다. Person person = client.get().uri("/person/{id}", i).retrieve() .bodyToMono(Person.class) .block(); List persons = client.get().uri("/persons").retrieve() .bodyToFlux(Person.class) .collectList() .block(); 그러나 여러 호출이 필요한 경우에는 각 응답마다 Blocking 하는 것을 피하는 것이 더 효율적입니다. 대신 결합된 결과를 기다릴 수 있습니다. Mono personMono = client.get().uri("/person/{id}", per..

Spring/WebClient 2024.03.28

[WebClient] Context

Attributes 는 필터 체인에 정보를 전달하는 편리한 방법을 제공하지만, 이는 현재 요청에만 영향을 줍니다. 만약 flatMap을 통해 중첩된 추가 요청에 영향을 주거나 concatMap을 통해 실행된 후 추가적인 요청에 영향을 주는 정보를 전달하려면 Reactor Context를 사용해야 합니다. Reactor Context는 모든 작업에 적용되도록 반응적인 체인의 끝에 채워져야 합니다. 예를 들어: WebClient client = WebClient.builder() .filter((request, next) -> Mono.deferContextual(contextView -> { String value = contextView.get("foo"); // ... })) .build(); clie..

Spring/WebClient 2024.03.28

[WebClient] Attributes

요청에 속성을 추가할 수 있습니다. 이는 필터 체인을 통해 정보를 전달하고 특정 요청에 대한 필터의 동작을 영향을 주고 싶을 때 편리합니다. 예를 들어: WebClient client = WebClient.builder() .filter((request, next) -> { Optional usr = request.attribute("myAttribute"); // ... }) .build(); client.get().uri("https://example.org/") .attribute("myAttribute", "...") .retrieve() .bodyToMono(Void.class); 참고로, WebClient.Builder 수준에서 defaultRequest 콜백을 전역적으로 구성할 수 있으며, ..

Spring/WebClient 2024.03.28

[WebClient] Filter

WebClient.Builder를 통해 클라이언트 필터(ExchangeFilterFunction)를 등록하여 요청을 가로채고 수정할 수 있습니다. 아래 예제에서 볼 수 있습니다. WebClient client = WebClient.builder() .filter((request, next) -> { ClientRequest filtered = ClientRequest.from(request) .header("foo", "bar") .build(); return next.exchange(filtered); }) .build(); 이는 인증과 같은 cross-cutting concerns? 에 사용할 수 있습니다. 아래 예제는 정적 팩토리 메서드를 통해 기본 인증을 위한 필터를 사용하는 방법을 보여줍니다...

Spring/WebClient 2024.03.28

[WebClient] RequestBody

RequestBody는 다음 예제와 같이 Mono나 Kotlin의 Deferred와 같이 ReactiveAdapterRegistry에서 처리되는 비동기 형식에서 인코딩될 수 있습니다. Mono personMono = ... ; Mono result = client.post() .uri("/persons/{id}", id) .contentType(MediaType.APPLICATION_JSON) .body(personMono, Person.class) .retrieve() .bodyToMono(Void.class); 아래 예제와 같이 객체의 스트림을 인코딩할 수도 있습니다. Flux personFlux = ... ; Mono result = client.post() .uri("/persons/{id}", ..

Spring/WebClient 2024.03.28

[WebClient] Exchange

exchangeToMono() 및 exchangeToFlux() 메서드(또는 Kotlin에서 awaitExchange { } 및 exchangeToFlow { })는 응답 상태에 따라 응답을 다르게 디코딩해야 하는 고급 케이스에 유용합니다. Mono entityMono = client.get() .uri("/persons/1") .accept(MediaType.APPLICATION_JSON) .exchangeToMono(response -> { if (response.statusCode().equals(HttpStatus.OK)) { return response.bodyToMono(Person.class); } else { // 에러로 전환 return response.createError(); } })..

Spring/WebClient 2024.03.28

[WebClient] Retrieve

retrieve() 메서드를 사용하여 응답을 추출하는 방법을 선언할 수 있습니다. 예를 들면 WebClient client = WebClient.create("https://example.org"); Mono result = client.get() .uri("/persons/{id}", id) .accept(MediaType.APPLICATION_JSON) .retrieve() .toEntity(Person.class); 또는 바디(body)만 가져오려면 WebClient client = WebClient.create("https://example.org"); Mono result = client.get() .uri("/persons/{id}", id) .accept(MediaType.APPLICATIO..

Spring/WebClient 2024.03.28

[WebClient] Configuration Timeout

연결 시간 초과를 구성 import io.netty.channel.ChannelOption; HttpClient httpClient = HttpClient.create() .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000); WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build(); 읽기 또는 쓰기 시간 초과 구성 import io.netty.handler.timeout.ReadTimeoutHandler; import io.netty.handler.timeout.WriteTimeoutHandler; HttpClient h..

Spring/WebClient 2024.03.28

[WebClient] Configuration Reactor Netty

Reactor Netty 란? Reactor Netty는 Reactor 프로젝트 일부로서 Reactor Core와 함꼐 사용되는 Non-blocking I/O 네트워크 프레임워크입니다. 이 프레임워크는 SpringFramework와 함께 사용되며, 웹 애플리케이션의 클라이언트 및 서버 사이드의 비동기 HTTP 가능하게 합니다 https://projectreactor.io/docs/netty/1.1.16/reference/index.html#getting-started-introducing-reactor-netty Reactor Netty Reference Guide ./../../reactor-netty-examples/src/main/java/reactor/netty/examples/documentat..

Spring/WebClient 2024.03.28