제가 API 호출 하는 방법이요 ? WebClient 입니다. (4)(이관 완료)

김민준·2024년 12월 9일

REST API

목록 보기
4/4

티스토리로 이관 중이며 해당글을 좀더 다듬어진 글로 https://mjkim1201.tistory.com/ 로 이관 하였습니다.


비동기/반응형 지원: WebClient는 비동기식 API 호출을 MonoFlux를 통해 처리할 수 있는 클라이언트로, 성능 최적화가 필요한 경우 비동기 처리를 매우 효율적으로 처리할 수 있습니다.

  • RestTemplate: WebClient는 RestTemplate의 대체로 많이 사용됩니다. RestTemplate도 동기식 HTTP 요청을 처리하는데 사용되지만, WebClient는 비동기 처리에 더 적합하고 성능이 우수한 방식입니다. 그럼에도 불구하고, WebClient를 동기적으로 사용하는 것도 가능합니다.

즉, WebClient를 이용해서 반응형 프로그래밍을 구현 하여 비동이 처리를 진행 할 수 있다.
Mono는 반응형 프로그래밍에서 데이터를 비동기적으로 처리하는 "컨테이너" 역할을 합니다.

Mono

Mono는 0개 또는 1개의 값을 비동기적으로 처리하는 반응형 타입입니다. 즉, Mono는 하나의 값을 비동기적으로 처리할 수 있도록 감싸는 컨테이너입니다.

Mono는 0개 또는 1개의 요소를 비동기적으로 처리하고 반환할 수 있는 컨테이너 역할을 합니다.

Mono vs Flux 의 차이

  • Mono: 0개 또는 1개의 값을 다룬다.
    예: HTTP 요청의 단일 응답, 데이터베이스에서 하나의 레코드를 조회하는 경우 등.
  • Flux: 0개 이상의 값을 다룬다.
    예: 여러 개의 데이터를 스트리밍하거나, 대량의 데이터를 처리하는 경우.
    Mono는 주로 하나의 결과나 응답을 비동기적으로 처리할 때 사용되고, Flux는 여러 개의 값을 처리할 때 사용됩니다.

Mono 사용법

  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를 끝내기 위해서 였습니다.

WebClient 코드

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);
       }

정리

WebClient로 비동기 처리를 하는 이유와 흐름

  • WebClient를 사용한 비동기 처리 방식에서 핵심은 "비동기 요청을 보내고, 그 요청이 완료될 때까지 기다리지 않고 작업을 계속한다"입니다.
    WebClient의 retrieve()로 API를 호출하고 그 응답을 Mono로 감싸서 비동기적으로 처리하는 방식이죠.

비동기 처리를 사용하면, 요청을 보낸 후 결과를 기다리는 동안 애플리케이션의 다른 작업을 계속할 수 있기 때문에 성능 최적화가 가능합니다.

0개의 댓글