Servlet과 Multipart Files 설정 이해하기
Spring Boot에서 Multipart 파일 업로드를 위한 servlet 및 file 설정의 차이점을 심층 분석합니다.
요약
- Spring Boot의 파일 업로드 설정에는
servlet.multipart와file.multipart가 존재합니다. - 두 설정은 서로 다른 적용 범위와 역할을 가지며, 이해가 필요합니다.
- 이 글에서는 각 설정의 차이점 및 내부 동작 원리를 구체적으로 설명합니다.
배경/문제
파일 업로드는 웹 애플리케이션에서 흔히 발생하는 기능 중 하나입니다. 그러나 파일 업로드를 처리할 때는 여러 가지 제약을 고려해야 합니다. 특히 파일 크기 제한과 같은 설정은 성능 및 보안을 관리하는 데 중요한 요소입니다. Spring Boot에서는 기본적인 파일 업로드 과정에서 두 가지 설정을 제공합니다: servlet.multipart와 file.multipart. 이러한 설정들은 각각의 환경에 따라 달리 적용될 수 있으며, 많은 개발자들이 이 두 설정의 차이점에 대해 혼란스러워합니다.
실제 운영 환경에서 종종 관찰되는 문제는 파일 업로드 요청이 특정 크기를 초과했을 때 발생하는 오류입니다. 이러한 오류는 기본 설정을 모른 채 애플리케이션을 개발할 경우 쉽게 발생할 수 있습니다. 예를 들어, 파일 크기 제한을 초과하는 요청이 있을 때 발생하는 HTTP Status 500 오류 메시지는 다음과 같습니다.
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 200MB exceeded
이러한 문제를 예방하기 위해서는 각 설정의 동작 방식을 명확히 이해하는 것이 중요합니다.
증상 재현
servlet.multipart와 file.multipart 설정을 각각 활용하여 업로드 요청을 재현해볼 수 있습니다. 다음은 이 두 설정을 이용하여 각기 다른 조건에서 파일 업로드 요청을 시도하는 방법입니다.
servlet.multipart재현:- 위의 설정을 통해 200MB를 초과하는 파일을 업로드 시도합니다. 이때 오류 발생 여부를 확인합니다.
curl -F "file=@largeFile.jpg" http://example.localdev:8080/upload이때,
largeFile.jpg의 크기가 200MB 이상일 경우 오류가 발생하며, 그 결과로MaxUploadSizeExceededException예외가 출력됩니다.
- 위의 설정을 통해 200MB를 초과하는 파일을 업로드 시도합니다. 이때 오류 발생 여부를 확인합니다.
file.multipart재현:file.multipart설정을 활용하여 내부 로직에서 추가 검사를 시행하는FileUploadService를 통해 500MB를 초과하는 파일을 업로드합니다.file: multipart: maxUploadSize: 500 # MB maxUploadSizePerFile: 200 # MB
이 두 가지를 통해 각 설정에 따른 실제 동작을 재현할 수 있습니다.
원인 분석
servlet.multipart와 file.multipart은 각기 다른 기능과 역할을 수행합니다.
servlet.multipart: Spring Boot의 기본 파일 업로드 설정으로, 주로 서블릿 컨테이너에서 동작합니다. 이 설정은 Tomcat과 같은 웹 서버가 클라이언트의 요청을 받을 때 먼저 적용됩니다.file.multipart: 사용자가 정의한 커스텀 설정으로, 주로 애플리케이션 내부에서 추가적인 파일 업로드 제한을 지정하는 데 사용됩니다. 이 설정은 기본 서블릿 설정과는 별개이며, 비즈니스 로직에 맞추어 자유롭게 구성할 수 있습니다.
혹시나 file.multipart 설정이 servlet.multipart 설정을 덮어쓴다고 오해할 수 있지만, 이는 서로 다른 단계를 검증하는 구조임을 유의해야 합니다.
접근/해결 전략
각 파일 업로드 설정의 목적과 구성을 고려하여 두 가지 설정의 병행 사용을 추천합니다.
- 기본적인 테두리 설정:
servlet.multipart를 통해 파일 업로드의 기본 제한을 설정합니다. 이를 통해 서블릿 컨테이너에서 초기적인 검사를 수행할 수 있습니다. 이 단계에서 운영자가 설정을 통해 초기 데이터 폭증을 방지할 수 있습니다. - 커스텀 로직 적용:
file.multipart설정을 사용하여 애플리케이션 내부에서 필요에 따라 추가적인 파일 검사 로직을 통해 비즈니스 요구사항을 충족할 수 있습니다. 예를 들어, 업로드된 파일 타입이나 크기에 대해 특정 조건을 체크하고 로깅하는 로직을 추가할 수 있습니다.
이 두 가지 설정을 함께 사용하는 것은 성능 데이터 관리 및 보안을 높이는 효과가 있습니다. 기본적인 설정이 예상치 못한 대량의 데이터로 애플리케이션이 영향을 받지 않도록 방어선 역할을 합니다.
구현 포인트
각 설정은 YAML 파일에서 다음과 같이 정의할 수 있습니다:
application.yml:
servlet:
multipart:
max-request-size: 500MB # 요청 당 총 파일 크기 제한
max-file-size: 200MB # 개별 파일 크기 제한
file:
multipart:
maxUploadSize: 500 # MB 단위의 전체 업로드 가능 용량
maxUploadSizePerFile: 200 # MB 단위의 개별 파일 최대 업로드 크기
이 설정을 통해 각각의 크기 제한을 명확히 제어할 수 있습니다. 예를 들어, FileUploadService 클래스 내에서 다음과 같은 코드 조각을 통해 업로드 파일의 크기를 검증할 수 있습니다.
@Service
public class FileUploadService {
public void uploadFile(MultipartFile file) throws MaxUploadSizeExceededException {
if (file.getSize() > 200 * 1024 * 1024) {
throw new MaxUploadSizeExceededException(200 * 1024 * 1024);
}
// 파일 저장 로직
}
}
검증
설정 완료 후에는 다음과 같은 방법으로 파일 업로드를 검증할 수 있습니다.
- 성공 판별 기준: 정해진 크기 이하의 파일이 정상적으로 업로드되는지 확인합니다. 정상 요청에 대해
HTTP Status 200 OK가 반환되어야 합니다. - 회귀 체크: 기준 이상의 파일을 업로드 시도해
MaxUploadSizeExceededException이 발생하는지 점검합니다. 예를 들어, 초과 파일을 업로드하여 예외가 발생하는지를 로그를 통해 확인할 수 있습니다.
curl -F "file=@too_large_file.jpg" http://example.localdev:8080/upload
이 명령어 또한 정상적으로 동작하지 않으면 HTTP Status 500 오류가 반환되며, 오류 메시지가 상태 코드를 확인하는 좋은 방법입니다.
대안 비교/트레이드오프
servlet.multipart와 file.multipart 설정은 각기 다른 강점을 가지며, 개발자가 필요에 따라 상황에 맞게 활용할 수 있습니다.
| 설정 | 지원 범위 | 장점 | 단점 |
|---|---|---|---|
servlet.multipart | Spring Boot 기본 파일 업로드 설정 | 서블릿 컨테이너에서 직접 제어 가능 | 비즈니스 로직 반영이 어려움 |
file.multipart | 커스텀 파일 업로드 서비스 | 비즈니스 요구사항에 맞추어 유연하게 설정 가능 | 서블릿의 기본 설정을 무시할 수 있음 |
두 설정 간의 독립성과 조화를 활용함으로써 보다 탄력적인 파일 업로드 설정을 가져갈 수 있습니다. 예를 들어, servlet.multipart 설정이 파일의 초기 업로드 제한을 담당하고, file.multipart 설정이 비즈니스 로직에 맞는 추가적인 검증을 담당한다면, 각 상황에 맞는 융통성을 제공할 수 있습니다.
운영 적용 팁/주의사항
- 업로드 파일 크기를 모니터링하여 주기적으로 조정하는 것이 좋습니다. 대량의 파일 업로드 시 시스템 부하를 체크해야 합니다.
- 변경 사항이 있을 경우 항상 롤백 계획을 마련해 두는 것이 필요합니다. 개발 환경과 운영 환경이 다를 수 있음을 명심해야 합니다.
- 보안 및 성능 점검을 위해, 업로드 파일의 형식 및 크기를 정기적으로 감시할 필요가 있습니다. 필요시 이에 대한 정책을 수립하는 것도 좋습니다.
마무리
이 문서에서는 servlet.multipart와 file.multipart 설정의 이해도를 높이는 데 초점을 맞추었습니다. 체크리스트는 다음과 같습니다:
- 각 설정의 적용 범위와 원리를 이해하고 구분하기.
- 예외적으로 처리해야 할 파일 업로드 조건에 맞추어 구현하기.
- 운영 환경에서 파일 업로드를 효과적으로 관리할 수 있는 시스템 고려하기.
별도로 각 환경에 맞는 설정을 적용하여 비즈니스 로직에 일관성을 줄 수 있는 방법을 마련하는 것이 중요합니다.