본문 바로가기
Java/Spring

[SpringBoot] WebClient

by HJ0216 2023. 8. 23.

👉 기본 환경

- 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

 

'Java > Spring' 카테고리의 다른 글

[SpringBoot] 스프링 부트 프로젝트 생성  (0) 2023.08.23
[SpringBoot_JPA_1] resources/static and templates  (0) 2023.05.20