🚀 프로젝트/🌞 내친소

[Spring/Nginx] MultipartFile 최대 용량 설정하기 (MaxUploadSizeExceededException / Request Entity Too Large)

gengminy 2022. 11. 1. 13:28

❌ 에러 상황

org.springframework.web.multipart.MaxUploadSizeExceededException:
Maximum upload size exceeded;
nested exception is java.lang.IllegalStateException:
org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException:
The field multipartFiles exceeds its maximum permitted size of 1048576 bytes.

 

AWS S3 파일 업로드 중 발생한 문제

MaxUploadSizeExceededException

 

AWS S3 와 연동해서 파일을 업로드 할 때

http 413 이 뜨면서 허용된 파일 용량을 초과했다고 하는 에러이다

 

스프링의 내장 톰캣 서버에서 초기 설정 값은

1048576 bytes => 1MB 이다

 

 

🔍 Trouble Shooting 1

Spring Boot 설정 파일에서 최대 허용 용량을 설정해주면 된다

 

📝 application.yml

spring:
  servlet:
    multipart:
      #file upload size
      max-file-size: 3MB

spring.servlet.multipart.max-file-size: {원하는 크기} 로 설정해준다

우리 서버에서는 3MB 를 최대 크기로 하도록 설정했다

 

 

📝 GlobalExceptionHandler.java

    /**
     * 업로드 최대 용량을 초과했을 경우
     */
    @ExceptionHandler({MaxUploadSizeExceededException.class})
    protected ResponseEntity<ErrorResponse> handleMultipartException(MaxUploadSizeExceededException e) {
        log.error("handleMaxUploadSizeExceededException", e);
        final ErrorResponse response = ErrorResponse.of(ErrorCode.MAX_FILE_SIZE_EXCEEDED);
        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
    }

보너스로 글로벌 에러 핸들러에서

관련 예외를 처리해주는 코드도 작성했다

이제 413 에러가 아닌 400 에러로 처리된다

 

 

❌ 또 다른 에러

이번에는 json 예외 메세지가 아니라 html 응답이 뜨면서

여전히 http 413 에러가 발생한다

이는 우리 서버에서 사용하고 있는 Nginx 에서

또한 최대 body size 를 제한하고 있기 때문이다

 

그렇기 때문에 Nginx 설정 파일도 바꿔줘야 한다

 

🔍 Trouble Shooting 2

📝 nginx.conf

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  client_max_body_size  4M;
  ...

Nginx 설정 파일에서

client_max_body_size {원하는 크기};

설정해주면 된다

 

spring 내장 tomcat 에서 3MB 를 최대로 하기로 했으니까

Nginx 에서는 넉넉하게 4MB 로 설정해주었다

 

역시 Nginx 에서도 초기 값은 1MB 이다

 

너무 큰 값을 주면 공격 위험이 있을 거 같아서

용량을 많이는 안주었다

 

 

이제 응답이 잘 된다

로컬이랑 AWS 개발 서버에서 모두 동작하는 것을 확인했따