catsridingCATSRIDING|OCEANWAVES
Dev

Spring WebClient DataBufferLimit 오류 해결하기

jynn@catsriding.com
Dec 08, 2023
Published byJynn
999
Spring WebClient DataBufferLimit 오류 해결하기

Resolve DataBufferLimit in Spring WebClient

Spring Webflux의 WebClient로 대량의 데이터를 처리하는 경우 DataBufferLimitException 예외가 발생합니다. 메모리 이슈를 예방하는 차원에서 WebClient Codec의 최대 버퍼 사이즈를 기본적으로 256K로 제한해 두었기 때문입니다.

console
Caused by: org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144

오류를 해결하는 방법은 Codec의 최대 버퍼 사이즈를 늘리는 것입니다.

private static final int MAX_IN_MEMORY_SIZE = 1024 * 1024;
private static final int UNLIMITED_IN_MEMORY_SIZE = -1;

private ExchangeStrategies configureCodec() {  
    return ExchangeStrategies.builder()  
            .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(MAX_IN_MEMORY_SIZE))  
            .build();  
}
  • maxInMemorySize(int byteCount)
    • Codec의 최대 버퍼 사이즈를 설정합니다.
    • bytes 단위이며 현재 1MB로 설정하였습니다.
    • 사이즈를 무제한으로 설정하려면 -1을 입력합니다.

Codec의 최대 버퍼 사이즈 설정을 마친 ExchangeStrategies를 WebClient 인스턴스 구성에 추가합니다.

private WebClient createWebClient() {
    WebClient webClient = WebClient.builder()  
            .baseUrl("https://www.catsriding.dev")  
            .defaultHeader(CONTENT_TYPE, APPLICATION_JSON_VALUE)  
            .exchangeStrategies(configureCodec())  
            .build();
}

이렇게 생성한 WebClient 인스턴스로 DataBufferLimitException 오류가 발생했던 외부 API를 다시 호출해 보면 이번에는 예외 없이 정상적으로 동작하는 것을 확인할 수 있습니다.

  • Spring
  • Reactive