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
다음번에 한번 다시 심화 내용으로 가져와보겠습니다!
긴 글 읽어주셔서 감사합니다~~
'Spring' 카테고리의 다른 글
| Spring Boot 실행 시 포트 충돌 오류 해결 (Address already in use) (0) | 2026.04.16 |
|---|---|
| [Spring] Spring Security 필터 순서 이해 안 될 때 (로그인 안 되는 원인 찾는 방법) (0) | 2026.02.06 |