Servlet과 Multipart Files 설정 이해하기

Spring Boot에서 Multipart 파일 업로드를 위한 servlet 및 file 설정의 차이점을 심층 분석합니다.

요약

  • Spring Boot의 파일 업로드 설정에는 servlet.multipartfile.multipart가 존재합니다.
  • 두 설정은 서로 다른 적용 범위와 역할을 가지며, 이해가 필요합니다.
  • 이 글에서는 각 설정의 차이점 및 내부 동작 원리를 구체적으로 설명합니다.

배경/문제

파일 업로드는 웹 애플리케이션에서 흔히 발생하는 기능 중 하나입니다. 그러나 파일 업로드를 처리할 때는 여러 가지 제약을 고려해야 합니다. 특히 파일 크기 제한과 같은 설정은 성능 및 보안을 관리하는 데 중요한 요소입니다. Spring Boot에서는 기본적인 파일 업로드 과정에서 두 가지 설정을 제공합니다: servlet.multipartfile.multipart. 이러한 설정들은 각각의 환경에 따라 달리 적용될 수 있으며, 많은 개발자들이 이 두 설정의 차이점에 대해 혼란스러워합니다.

실제 운영 환경에서 종종 관찰되는 문제는 파일 업로드 요청이 특정 크기를 초과했을 때 발생하는 오류입니다. 이러한 오류는 기본 설정을 모른 채 애플리케이션을 개발할 경우 쉽게 발생할 수 있습니다. 예를 들어, 파일 크기 제한을 초과하는 요청이 있을 때 발생하는 HTTP Status 500 오류 메시지는 다음과 같습니다.

org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 200MB exceeded

이러한 문제를 예방하기 위해서는 각 설정의 동작 방식을 명확히 이해하는 것이 중요합니다.

증상 재현

servlet.multipartfile.multipart 설정을 각각 활용하여 업로드 요청을 재현해볼 수 있습니다. 다음은 이 두 설정을 이용하여 각기 다른 조건에서 파일 업로드 요청을 시도하는 방법입니다.

  1. servlet.multipart 재현:
    • 위의 설정을 통해 200MB를 초과하는 파일을 업로드 시도합니다. 이때 오류 발생 여부를 확인합니다.
       curl -F "file=@largeFile.jpg" http://example.localdev:8080/upload
      

      이때, largeFile.jpg의 크기가 200MB 이상일 경우 오류가 발생하며, 그 결과로 MaxUploadSizeExceededException 예외가 출력됩니다.

  2. file.multipart 재현:
    • file.multipart 설정을 활용하여 내부 로직에서 추가 검사를 시행하는 FileUploadService를 통해 500MB를 초과하는 파일을 업로드합니다.
       file:
       multipart:
       maxUploadSize: 500 # MB
       maxUploadSizePerFile: 200 # MB
      

이 두 가지를 통해 각 설정에 따른 실제 동작을 재현할 수 있습니다.

원인 분석

servlet.multipartfile.multipart은 각기 다른 기능과 역할을 수행합니다.

  • servlet.multipart: Spring Boot의 기본 파일 업로드 설정으로, 주로 서블릿 컨테이너에서 동작합니다. 이 설정은 Tomcat과 같은 웹 서버가 클라이언트의 요청을 받을 때 먼저 적용됩니다.
  • file.multipart: 사용자가 정의한 커스텀 설정으로, 주로 애플리케이션 내부에서 추가적인 파일 업로드 제한을 지정하는 데 사용됩니다. 이 설정은 기본 서블릿 설정과는 별개이며, 비즈니스 로직에 맞추어 자유롭게 구성할 수 있습니다.

혹시나 file.multipart 설정이 servlet.multipart 설정을 덮어쓴다고 오해할 수 있지만, 이는 서로 다른 단계를 검증하는 구조임을 유의해야 합니다.

접근/해결 전략

각 파일 업로드 설정의 목적과 구성을 고려하여 두 가지 설정의 병행 사용을 추천합니다.

  1. 기본적인 테두리 설정: servlet.multipart를 통해 파일 업로드의 기본 제한을 설정합니다. 이를 통해 서블릿 컨테이너에서 초기적인 검사를 수행할 수 있습니다. 이 단계에서 운영자가 설정을 통해 초기 데이터 폭증을 방지할 수 있습니다.
  2. 커스텀 로직 적용: 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.multipartfile.multipart 설정은 각기 다른 강점을 가지며, 개발자가 필요에 따라 상황에 맞게 활용할 수 있습니다.

설정지원 범위장점단점
servlet.multipartSpring Boot 기본 파일 업로드 설정서블릿 컨테이너에서 직접 제어 가능비즈니스 로직 반영이 어려움
file.multipart커스텀 파일 업로드 서비스비즈니스 요구사항에 맞추어 유연하게 설정 가능서블릿의 기본 설정을 무시할 수 있음

두 설정 간의 독립성과 조화를 활용함으로써 보다 탄력적인 파일 업로드 설정을 가져갈 수 있습니다. 예를 들어, servlet.multipart 설정이 파일의 초기 업로드 제한을 담당하고, file.multipart 설정이 비즈니스 로직에 맞는 추가적인 검증을 담당한다면, 각 상황에 맞는 융통성을 제공할 수 있습니다.

운영 적용 팁/주의사항

  • 업로드 파일 크기를 모니터링하여 주기적으로 조정하는 것이 좋습니다. 대량의 파일 업로드 시 시스템 부하를 체크해야 합니다.
  • 변경 사항이 있을 경우 항상 롤백 계획을 마련해 두는 것이 필요합니다. 개발 환경과 운영 환경이 다를 수 있음을 명심해야 합니다.
  • 보안 및 성능 점검을 위해, 업로드 파일의 형식 및 크기를 정기적으로 감시할 필요가 있습니다. 필요시 이에 대한 정책을 수립하는 것도 좋습니다.

마무리

이 문서에서는 servlet.multipartfile.multipart 설정의 이해도를 높이는 데 초점을 맞추었습니다. 체크리스트는 다음과 같습니다:

  • 각 설정의 적용 범위와 원리를 이해하고 구분하기.
  • 예외적으로 처리해야 할 파일 업로드 조건에 맞추어 구현하기.
  • 운영 환경에서 파일 업로드를 효과적으로 관리할 수 있는 시스템 고려하기.

별도로 각 환경에 맞는 설정을 적용하여 비즈니스 로직에 일관성을 줄 수 있는 방법을 마련하는 것이 중요합니다.


© 2024. Chiptune93 All rights reserved.