본문 바로가기
Spring

[Spring] WebClient

by 요료료룡 2026. 2. 7.

Spring 5부터 도입된 WebClient는 단순히 "비동기가 가능하다"는 점을 넘어, 적은 자원으로도 대규모 트래픽을 효율적으로 처리할 수 있는 강력한 무기입니다.

 

1. WebClient의 핵심 특징

  • Non-blocking I/O: 서버의 응답을 기다리는 동안 스레드가 쉬지 않고 다른 일을 할 수 있습니다. (자원 효율성 극대화)
  • Reactive Stream 지원: Mono(0~1개 데이터)와 Flux(0~N개 데이터)를 통해 스트림 데이터를 우아하게 처리합니다.
  • 불변성(Immutable): 설정이 한 번 정해지면 변하지 않아 스레드 안전(Thread-safe)합니다.

2. 주요 메서드 및 사용법

1. WebClient 생성 (Configuration)

매번 생성하기보다 Bean으로 등록해서 사용

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

2. GET 요청 (데이터 한 개 받기 - Mono)

public Mono<UserDto> getUser(Long id) {
    return webClient.get()
            .uri("/users/{id}", id)
            .retrieve() // 응답 추출 시작
            .bodyToMono(UserDto.class); // 결과를 Mono 객체로 변환
}

3. POST 요청 (데이터 전송)

public Mono<Void> createUser(UserDto user) {
    return webClient.post()
            .uri("/users")
            .bodyValue(user) // 요청 본문에 객체 전달
            .retrieve()
            .bodyToMono(Void.class);
}

3. 동기 vs 비동기

동기와 비동기를 그냥 기본 개념으로 이해하려면 너무 어려운 것 같아, 일상생활에 쉽게 접할 수 있는 소재로 다루어봤는데요

  • RestTemplate (동기): * 카페에서 커피를 주문하고 진동벨 없이 카운터 앞에 서서 커피가 나올 때까지 기다리는 것. 내가 서 있는 동안은 다른 손님을 받을 수 있어도 나는 아무것도 못 함.
  • WebClient (비동기): * 커피를 주문하고 진동벨을 받아 자리로 돌아와 내 할 일을 하는 것. 커피가 다 되면 진동벨이 울릴 때(이벤트 발생) 가지러 가면 됨. 기다리는 시간 동안 나는 책도 읽고 코딩도 할 수 있음!

4. 실무에서 자주 쓰이는 것들

  • Timeout 설정: 무한정 기다리는 것을 방지합니다.
    .timeout(Duration.ofSeconds(3))
    
  • Retry 로직: 일시적인 네트워크 오류 시 재시도합니다.
    .retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(1)))
    
  • Error Handling: 특정 에러 코드에 따른 예외 처리.
    .onStatus(HttpStatusCode::is4xxClientError, response -> Mono.error(new RuntimeExceptio

 

다음번에 한번 다시 심화 내용으로 가져와보겠습니다!

긴 글 읽어주셔서 감사합니다~~