BackEnd/Spring WebFlux

Spring WebFlux 심화 시리즈 (4) - WebClient를 활용한 대용량 데이터 처리

Raconer 2025. 4. 28. 23:28
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 문제 해결) 에 대해 다룰 예정이다.

 

참고

https://github.com/Raconer/SpringWebFlux

728x90