문제 상황
아래 2개의 서버가 있다.
A server : 다량의 데이터를 Body에 심어 B 서버로 요청을 보낸다.
B server: A 서버가 보낸 요청을 받아 처리 한다.
난 B server의 입장이었고, 아래와 같은 에러 메시지를 받게 되었다.
org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
참고로, 상단의 메시지는 Webflux 기본으로 설정된 코덱의 메모리 사이즈 256KB를 초과했다는 내용이다.
해결 방법
구글링을 해보면 대부분의 사이트들에서 아래 코드처럼 WebClient 빌드 시 maxInMemorySize를 늘려 주라고 한다.
@Bean
@LoadBalanced
public Webclient webClient(){
return WebClient.builder()
.filter(this.lbFunction)
.clientConnector(new ReactorClientHttpConnector(httpClient))
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(30*1024*1024)) //10MB
//...
.build()
}
하지만, 나의 경우 제대로 작동하지 않았고, 아래 처럼 WebfluxConfig를 따로 만들어 빈 등록을 해주니, 정상적으로 작동하였다.
@Configuration
public class WebFluxConfig implements WebFluxConfigurer{
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().maxInMemorySize(30*1024*1024); //10MB
}
}
왜 WebClient 빌더를 이용한 방식은 제대로 작동하지 않고, WebFluxConfig는 정상적으로 버퍼 크기가 조절 되었을까?
그 이유는 WebClient의 defaultCodecs()는 Client 사이드의 버퍼 사이즈를 설정하고, WebFluxConfig는 서버 사이드의 버퍼 사이즈를 설정하기 때문이다. 아래 코드를 보면 보다 쉽게 이해가 된다.
//WebClient Config
public interface ClientCodecConfigurer extends CodecConfigurer {
//...
/**
* {@inheritDoc}
* <p>On the client side, built-in default also include customizations related
* to multipart readers and writers, as well as the decoder for SSE.
*/
@Override
ClientDefaultCodecs defaultCodecs();
//...
}
//WebFlux Config
public interface ServerCodecConfigurer extends CodecConfigurer {
/**
* {@inheritDoc}
* <p>On the server side, built-in default also include customizations
* related to the encoder for SSE.
*/
@Override
ServerDefaultCodecs defaultCodecs();
//...
}