Kim-Baek 개발자 이야기

Spring webclient란 본문

개발/Spring

Spring webclient란

김백개발자 2024. 11. 25. 13:20

Spring WebClient는 Spring WebFlux에서 제공하는 비동기 및 논블로킹 HTTP 클라이언트로, 다른 서비스나 API와 통신할 때 사용됩니다. 이전에 사용되던 RestTemplate의 대안이며, 리액티브 프로그래밍을 지원하여 더 나은 성능과 유연성을 제공합니다.


---

1. WebClient 특징

비동기/논블로킹: 요청과 응답이 블로킹 없이 처리됩니다.

리액티브 스트림 지원: Mono와 Flux를 반환하여 리액티브 방식으로 데이터를 처리합니다.

RestTemplate의 대안: Spring 5 이상에서는 WebClient를 추천합니다.

동기식 호출 가능: 원한다면 동기식으로도 호출할 수 있습니다.



---

2. WebClient 생성

WebClient는 크게 두 가지 방식으로 생성할 수 있습니다:

1. 빌더 사용


2. 전역 WebClient 생성



(1) WebClient.builder() 사용

WebClient webClient = WebClient.builder()
    .baseUrl("https://api.example.com")
    .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
    .build();

(2) 전역 WebClient 인스턴스

@Configuration 클래스를 사용하여 공통 설정을 제공합니다:

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient(WebClient.Builder builder) {
        return builder
                .baseUrl("https://api.example.com")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .build();
    }
}


---

3. 요청 예제

WebClient를 이용하여 GET, POST, PUT, DELETE 요청을 처리하는 방법입니다.

(1) GET 요청

WebClient webClient = WebClient.create("https://api.example.com");

Mono<String> response = webClient.get()
    .uri("/resource")
    .retrieve()
    .bodyToMono(String.class);

response.subscribe(System.out::println);

(2) POST 요청

Mono<String> response = webClient.post()
    .uri("/create")
    .bodyValue(new MyRequestObject("data"))
    .retrieve()
    .bodyToMono(String.class);

response.subscribe(System.out::println);

(3) 예외 처리

onStatus를 사용하여 응답 상태에 따라 예외를 처리할 수 있습니다:

Mono<String> response = webClient.get()
    .uri("/resource")
    .retrieve()
    .onStatus(HttpStatus::is4xxClientError,
        clientResponse -> Mono.error(new RuntimeException("Client error")))
    .onStatus(HttpStatus::is5xxServerError,
        clientResponse -> Mono.error(new RuntimeException("Server error")))
    .bodyToMono(String.class);


---

4. 동기식 호출

Spring WebClient는 기본적으로 비동기 방식이지만, 필요하면 동기식 호출도 가능합니다:

String result = webClient.get()
    .uri("/resource")
    .retrieve()
    .bodyToMono(String.class)
    .block();  // 동기식으로 변환


---

5. WebClient 장점

1. 효율적 자원 사용: 논블로킹 I/O로 인해 동시 처리 능력이 향상됩니다.


2. 확장성: 리액티브 스트림을 활용해 대규모 트래픽에도 대응 가능합니다.


3. 유연성: 다양한 HTTP 요청/응답을 쉽게 구성할 수 있습니다.




---

6. 실전 예제

import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

public class WebClientExample {
    public static void main(String[] args) {
        WebClient webClient = WebClient.create("https://jsonplaceholder.typicode.com");

        Mono<String> response = webClient.get()
            .uri("/posts/1")
            .retrieve()
            .bodyToMono(String.class);

        response.subscribe(System.out::println);  // 비동기적으로 결과 출력
    }
}


---

Tip: WebClient는 리액티브 프로그래밍의 기본 개념인 Mono(단일값)와 Flux(다중값)를 활용하므로, 리액티브 스트림에 대한 이해가 있으면 더 효과적으로 사용할 수 있습니다.


반응형

'개발 > Spring' 카테고리의 다른 글

프로듀서-컨슈머 아키텍처  (0) 2024.11.22
Write-Behind Caching  (0) 2024.11.21
SLF4J 와 Logback  (1) 2024.11.20
Spring Webflux 란  (0) 2024.11.18
Quartz 란?  (0) 2024.11.15
Comments