Java/Spring

[SpringBoot] WebClient

HJ0216 2023. 8. 23. 21:17

👉 기본 환경

- Language: Java

- DB: MySQL

- IDE: IntelliJ

 

 

WebClient

    - HTTP 클라이언트(서버에 API 요청을 보내는 주체) 라이브러리

    - 비동기적으로 요청하는 non-blocking 처리 방식

    ▶ 요청을 보내고 응답을 받을 때까지 대기하지 않기 때문에 처리 속도가 빠름

 

 

1. Dependency 추가

1
2
3
4
5
6
dependencies {
    ...
 
    implementation 'org.springframework.boot:spring-boot-starter-webflux' // HTTP 클라이언트 라이브러리
}
 
 
 

 

2. WebClient 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import com.example.demo.dto.srt.RqstParams;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
 
@Service
public class SrtFcstInfoServiceImpl implements SrtFcstInfoService {
 
    // UltraSrtNcst
    @Override
    public void getUltraSrtNcst(RqstParams rqstParams) {
        WebClient webClient = WebClient.builder()
                .baseUrl("https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst")
                .build();
 
        String url = "?serviceKey=" + rqstParams.getServiceKey() +
                "&numOfRows=" + rqstParams.getNumOfRows() +
                "&pageNo=" + rqstParams.getPageNo() +
                "&dataType=" + rqstParams.getDataType() +
                "&base_date=" + rqstParams.getBase_date() +
                "&base_time=" + rqstParams.getBase_time() +
                "&nx=" + rqstParams.getNx() +
                "&ny=" + rqstParams.getNy();
 
        Mono<String> result = webClient.get().uri(url)
                .retrieve()
                .bodyToMono(String.class);
 
        String response = result.block();
 
        System.out.println(response);
 
    }
 
}
 
 
 

- WebClient webClient

    - Spring에서 제공하는 비동기적인 웹 요청을 처리하는 클래스

    - 웹 리소스에 대한 요청을 보내고 응답을 받아올 수 있음

    - WebClient.builder()

        - WebClient 인스턴스 생성을 위한 빌더 패턴 사용

        - 요청 보낼 대상의 URL 설정

    - build()

        - 이전 단계에서 설정한 정보를 기반으로 실제 WebClient 인스턴스를 생성하고 반환

 

- Mono<String>

    - 웹 요청의 결과인 Response Body 저장

    - 비동기적으로 값을 처리하고 반환하는데 사용

    - webClient.get().uri(url)

        - webClient.get(): 생성한 WebClient 인스턴스를 이용하여 HTTP GET 요청 생성

        - uri(url): baseUrl 메서드로 이미 설정한 기본 URL에 상대 경로를 추가

    - retrieve()

        - 실제로 HTTP 요청을 보내고, 응답을 받아오는 역할

    - bodyToMono(String.class)

        - HTTP Response Body를 Mono로 변환

        - String.class: Response Body를 문자열 형태로 받아옴

 

+ retrieve return

    - toEntity: response 자체를 얻기 위해 사용

    - bodyToMono: response body 데이터를 얻기 위해 사용

    - bodyToFlux: response body 데이터를 stream*으로 처리하기 위해 사용

* Steam: 데이터를 한 번에 모두 받아오는 것이 아니라, 조금씩 조각 조각 나누어 비동기적으로 처리하는 방식

 

- result.block()

    - 비동기적인 작업을 동기적으로 블로킹

    - Mono 작업이 끝날 때까지(=웹 요청의 응답을 받을 때까지) 현재 스레드를 블로킹하고, 응답을 받으면 해당 응답을 문자열 형태로 반환

 

 

 

📚 참고 자료

 

[SpringBoot] WebClient를 이용하여 외부 API 호출하기

안녕하세요. J4J입니다. 이번 포스팅은 webClient를 이용하여 외부 api 호출하는 방법에 대해 적어보는 시간을 가져보려고 합니다. WebClient란? webClient는 spring 5에서 부터 등장한 HTTP 클라이언트 라이

jforj.tistory.com