개요
최근 프로젝트에서 이미지나 대용량 파일을 업로드하는 기능을 구현하면서 예상치 못한 오류를 마주했다. 파일 크기가 커질 때마다 업로드가 실패하고, 서버에서 파일 크기 제한 오류가 발생하는 것을 알게 되었다.
Spring Boot에서 기본적으로 설정된 파일 크기 제한이 존재한다는 것을 몰랐고, 이를 해결하는 과정을 통해 중요한 설정을 놓치고 있었다는 것을 깨달았다. 이번 글에서는 Spring Boot에서 파일 크기 제한 오류를 해결하는 방법을 다루고자 한다.
Spring Boot의 기본 파일 업로드 설정
Spring Boot는 Multipart 파일 업로드를 기본적으로 지원한다. 하지만 대용량 파일을 업로드할 때는 기본 설정에 의해 크기 제한 오류가 발생할 수 있다. Spring Boot에서 Multipart 파일의 최대 업로드 크기는 기본적으로 1MB로 설정되어 있다. 이를 초과하는 파일을 업로드하려고 하면 MaxUploadSizeExceededException이 발생한다.
파일 크기 제한 설정 방법
Spring Boot에서 파일 크기 제한을 설정하기 위해서는 application.properties 파일에 다음과 같은 설정을 추가하면 된다.
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
위 설정은 각각 파일 하나의 최대 크기와 요청 전체의 최대 크기를 나타낸다. 10MB로 설정한 경우, 10MB 이상의 파일을 업로드하면 오류가 발생한다. 이 외에도 application.yml 파일을 사용하여 다음과 같이 설정할 수 있다.
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
이제 서버는 10MB 이하의 파일에 대해서만 업로드를 허용하게 된다.
파일 크기 오류 해결 코드 예시
파일 크기 제한 오류가 발생할 경우, 이를 사용자에게 명확하게 알려주기 위해 예외 처리를 구현할 수 있다. Spring Boot에서 이를 처리하려면 @ControllerAdvice를 사용해 전역 예외 처리를 설정하면 된다.
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
@ControllerAdvice
public class FileUploadExceptionAdvice {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ResponseEntity<String> handleMaxSizeException(MaxUploadSizeExceededException exc) {
return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body("파일 크기가 너무 큽니다!");
}
}
이 코드는 파일 크기 제한 오류가 발생할 경우, HTTP 417 상태 코드와 함께 "파일 크기가 너무 큽니다!"라는 메시지를 사용자에게 반환한다. 이를 통해 사용자는 파일 크기가 제한에 걸렸다는 사실을 명확히 알 수 있다.
정리
Spring Boot에서 Multipart 파일 업로드 시 파일 크기 제한을 설정하는 것은 간단하지만, 이를 놓치면 예상치 못한 오류가 발생할 수 있다. 프로젝트에서 대용량 파일을 다룰 때는 꼭 파일 크기 제한을 명확히 설정하고, 예외 처리를 통해 사용자에게 오류를 알리는 방식으로 구현하는 것이 중요하다.
'TIL' 카테고리의 다른 글
@RequestBodyAdvice로 Spring API 데이터 전처리와 후처리 완벽히 관리하기 (1) | 2024.11.05 |
---|---|
스프링부트 @ConfigurationProperties 매핑 오류(null) (2) | 2024.10.15 |
[Redis] SET 값 조회 및 삭제하기 (0) | 2024.09.27 |
[Java] Stream API의 효율적인 사용법과 주의할 점 (0) | 2024.09.25 |
[Java] BigDecimal을 이용한 정확한 소수 계산 (4) | 2024.09.22 |
댓글