728x90
WebClient는 WebFlux의 비동기 HTTP 클라이언트로, 외부 API 호출 시 Non-Blocking 통신을 가능하게 한다. 대용량 데이터를 받아야 하는 경우, 효율적인 WebClient 사용법이 중요하다.
1. 기본 개념
- WebClient는 응답을 받으면서 스트리밍 처리가 가능하다.
- 응답 전체를 기다리지 않고 데이터 조각(chunk)을 받을 수 있다.
- 특히 대량 데이터(API 응답이 수 MB 이상)일 때 유리하다.
2. 실전 예제
2.1 WebClient 설정
@Bean
fun webClient(builder: WebClient.Builder): WebClient {
return builder.baseUrl("https://external.api.com").build()
}
2.2 대량 데이터 호출 예시
@Service
class LargeDataService(private val webClient: WebClient) {
fun fetchLargeData(): Flux<DataItem> {
return webClient.get()
.uri("/large-dataset")
.accept(MediaType.APPLICATION_NDJSON)
.retrieve()
.bodyToFlux(DataItem::class.java)
}
}
MediaType.APPLICATION_NDJSON
(Newline Delimited JSON) 사용으로 데이터 스트림을 효율적으로 처리..bodyToFlux()
로 조각 데이터 하나하나를 스트리밍으로 받을 수 있다.
3. 추가 최적화 방법
방법 | 설명 |
---|---|
connection timeout 설정 | 너무 오래 걸리는 요청 차단 |
read timeout 설정 | 비정상적으로 느린 응답 차단 |
backpressure 적용 | Flux의 소비 속도에 맞춰 데이터 흐름 조절 |
webClient.mutate()
.clientConnector(ReactorClientHttpConnector(
HttpClient.create()
.responseTimeout(Duration.ofSeconds(10))
))
.build()
4. 정리
WebClient는 대용량 데이터를 비동기적으로 받아올 때 매우 강력한 도구다. 다만, 스트리밍 처리와 timeout 설정을 반드시 고려하여야 서버 자원 고갈이나 OOM(Out Of Memory) 문제를 예방할 수 있다.
다음 글에서는 WebFlux 실전 트러블슈팅 (Timeout, Backpressure 문제 해결) 에 대해 다룰 예정이다.
참고
728x90
'BackEnd > Spring WebFlux' 카테고리의 다른 글
Spring WebFlux에서 MySQL을 사용하는 방법: JDBC vs R2DBC 완전 정리 (0) | 2025.04.28 |
---|---|
부록 - Spring Boot MVC vs Spring WebFlux 비교 (0) | 2025.04.28 |
Spring WebFlux 심화 시리즈 (3) - Flux로 페이징 처리하는 방법 (0) | 2025.04.28 |
Spring MVC vs Spring WebFlux 시리즈 (2) - 콘텐츠 리스트를 WebFlux로 반환하는 방법 (0) | 2025.04.28 |
Spring MVC vs Spring WebFlux 시리즈 (1) - 왜 WebFlux를 선택하는가? (0) | 2025.04.28 |