티스토리로 이관 중이며 해당글을 좀더 다듬어진 글로 https://mjkim1201.tistory.com/ 로 이관 하였습니다.
비동기/반응형 지원: WebClient는 비동기식 API 호출을 Mono와 Flux를 통해 처리할 수 있는 클라이언트로, 성능 최적화가 필요한 경우 비동기 처리를 매우 효율적으로 처리할 수 있습니다.
RestTemplate: WebClient는 RestTemplate의 대체로 많이 사용됩니다. RestTemplate도 동기식 HTTP 요청을 처리하는데 사용되지만, WebClient는 비동기 처리에 더 적합하고 성능이 우수한 방식입니다. 그럼에도 불구하고, WebClient를 동기적으로 사용하는 것도 가능합니다.즉, WebClient를 이용해서 반응형 프로그래밍을 구현 하여 비동이 처리를 진행 할 수 있다.
Mono는 반응형 프로그래밍에서 데이터를 비동기적으로 처리하는 "컨테이너" 역할을 합니다.
Mono는 0개 또는 1개의 값을 비동기적으로 처리하는 반응형 타입입니다. 즉, Mono는 하나의 값을 비동기적으로 처리할 수 있도록 감싸는 컨테이너입니다.
Mono는 0개 또는 1개의 요소를 비동기적으로 처리하고 반환할 수 있는 컨테이너 역할을 합니다.
Mono: 0개 또는 1개의 값을 다룬다.Flux: 0개 이상의 값을 다룬다. Mono<ApiResponseDto> apiResponseDtoMono =
communicate.asyncCommunicate(url2, HttpMethod.POST,MultipleRequestDto);
apiResponseDtoMono.subscribe(result->{
log.info("{}",result);
}
,error->{
log.info("{}",error);
});
subscribe 안에서 데이터를 기다렸다가 처리 하게 된다.
제가 WebClient로 비동기 처리를 했던 이유는, 특정 api를 적용 후에 동시에 다른 api 를 적용시 해당 api와 상관 없이 처음 api를 끝내기 위해서 였습니다.
package com.kbInsure.healthReport.global.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Value("${datahub.url}")
private String datahubUrl;
@Value("${datahub.token}")
private String datahubToken;
@Bean
public WebClient datahubWebClient(){
return WebClient.builder().baseUrl(datahubUrl)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultHeader(HttpHeaders.AUTHORIZATION, String.format("Token %s",datahubToken))
.build();
}
}
webConfig를 우선 설정하고
communicate 에 Mono response를 반환할 함수를 구현한다.
public Mono<ApiResponseDto> asyncCommunicate(String url, HttpMethod method, Object param){
Mono<ApiResponseDto> apiResponseDtoMono = webClientConfig.datahubWebClient().method(method).uri(url).bodyValue(param)
.retrieve()
.bodyToMono(ApiResponseDto.class);
return apiResponseDtoMono;
}
그 후 controller 에서 해당 communite 의 서비스를 불러다 사용하면 됩니다.
Mono<ApiResponseDto> apiResponseDtoMono =
communicate.asyncCommunicate(url2, HttpMethod.POST,MultipleRequestDto);
apiResponseDtoMono.subscribe(result->{
log.info("{}",result);
}
"비동기 요청을 보내고, 그 요청이 완료될 때까지 기다리지 않고 작업을 계속한다"입니다.비동기 처리를 사용하면, 요청을 보낸 후 결과를 기다리는 동안 애플리케이션의 다른 작업을 계속할 수 있기 때문에 성능 최적화가 가능합니다.