최근 아래와 같은 오류가 발생했다.

org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes per JSON object: 262144 
    at org.springframework.http.codec.json.Jackson2Tokenizer.raiseLimitException(Jackson2Tokenizer.java:222) 
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:  

이전에 포스팅한
[Spring] DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144 에러에 대한 해결 책
와 비슷하지만 또 다른 Component에서의 에러이다.

사용중인 Spring 버전

  • Spring boot : 2.2.6.RELEASE
  • Spring framework : 5.2.5.RELEASE

이전 오류와 차이?

이전 포스팅에 작성한 이슈는 Spring에서 외부 Api호출을 하기 위한 WebClient에서의 이슈였다. 그래서 WebClient를 build할때 maxInMemorySize 옵션에 대해서 -1 (unlimited) 또는 원하는 사이즈로 넣는 방식이었다. 위에 발생한 에러는 약간 다른 포인트이다. Spring이 Server로서 Request를 받을 때(Controller가 받을 때) 요청 Body데이터가 262144를 넘으면 발생한다.

해결

  • Spring이 서버로 구동될때 설정되는 Codec들에 maxInMemorySize옵션을 조정해 줘야 한다.
  • WebFlux를 사용할 때 아래와 같이 Codec을 customize하여 해결이 가능하다.
  • WebFluxConfigurer를 implements하여 아래의 메소드에서 Codec을 Customizing한다.
@Configuration
public class WebFluxConfig implements WebFluxConfigurer {

    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        configurer.defaultCodecs().maxInMemorySize(-1);
    }

    @Bean
    public CodecCustomizer maxInMemorySizeCodecCustomizer() {
        return (configurer) -> configurer.defaultCodecs().maxInMemorySize(-1);
    }
}

두 함수의 차이점

  • public void configureHttpMessageCodecs
    • 이 함수는 Spring의 Controller가 HTTP Request를 받을 때 Body를 해석하는 Codec을 Customizing하는 방식이다.
    • 일반적인 경우 이 함수만으로도 해결 가능.
  • public CodecCustomizer maxInMemorySizeCodecCustomizer
    • 이 함수는 Spring에서 Initialize되는 모든 Server/Client Codec에 대해 Customizer를 선언 하는 방식이다.
    • 이 방식은 위 configureHttpMessageCodecs 방식보다 좀더 넓은 범위의 Codec에 대해서 Customize를 할 수 있다.
    • 예를 들어서 spring-cloud-gateway의 ProxyExchange같은 객체를 사용할 때, ProxyExchange는 내부적으로 WebClient를 가지고 있는데 그 Client는 일반적인 방법으로 Customizing이 불가능 하다.
    • CodecCostomizer를 선언 해 놓으면 spring-cloud-gateway의 Component가 Initialize될 때 Customizer를 활용하도록 되어 있으므로 내부의 WebClient를 Customize할수 있다.

BELATED ARTICLES

more