[SpringBoot] 파일 업로드를 위한 MultipartFile의 처리/동작 방식

2025. 4. 9. 15:20·Programming/Spring
목차
  1. 1. Multipart Upload란?
  2. ☑️ Spring에서의 Multipart 처리 방식
  3. 2. 업로드된 파일의 임시 저장 처리
  4. ☑️ Spring의 파일 임시 저장소
  5. ☑️ MultipartFile의 동작 원리
  6. 마무리
  7. 🔗 Reference

Spring에서는 MultipartFile 인터페이스를 통해 파일 업로드 기능을 간편하게 구현할 수 있다.

1. Multipart Upload란?

이미지, 영상, 문서 등의 바이너리 데이터를 업로드하기 위한 HTTP 요청 방식이다.

요청의 Content-Type은 multipart/form-data로 지정되며,

데이터는 요청 본문(Body)에 다음과 같이 구성된다.

  • Header : Content-Type, 필드 이름 등 메타데이터
  • Body: 실제 데이터 (파일, 폼 필드 값 등)

Multipart Upload 요청 예시

POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="username"
Alex_Obregon
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain
This is the content of the file.
------WebKitFormBoundary--

☑️ Spring에서의 Multipart 처리 방식

Spring Boot에서는 MultipartResolver를 통해 multipart/form-data 요청을 자동으로 감지하고 처리한다.

  • multipart/form-data 타입으로 들어오는 HTTP Request들을 감지한다.
  • 요청 본문을 파싱하고 각 파트를 분리한다.
  • 파일은 MultipartFile 객체로, 텍스트 필드는 @RequestParam 등을 통해 주입한다.

예시

예를 들어 다음과 같은 요청이 들어오면,

POST /upload HTTP/1.1
Host: yourserver.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain
This is the content of the file.
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="description"
This is a test description.
------WebKitFormBoundary7MA4YWxkTrZu0gW--

아래 컨트롤러에서 각 파트들을 파싱해서 받아올 수 있게 한다.

@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file,
@RequestParam("description") String description) {
String fileName = file.getOriginalFilename();
long fileSize = file.getSize();
return ResponseEntity.ok("Received file: " + fileName + " (" + fileSize + " bytes) with description: " + description);
}

2. 업로드된 파일의 임시 저장 처리

파일 업로드 시 서버는 해당 파일 데이터를 임시로 저장해야 한다.

이 장소는 설정에 따라 메모리 혹은 디스크 중 하나를 사용한다.

Memory (RAM)

  • 말 그대로 RAM에 임시적으로 저장한다.
  • 파일 크기가 작을 때에는 빠르고 효율적이다.
  • 너무 많은 파일이나 큰 파일이 한꺼번에 들어온다면 작고 소중한 메모리가 터질 수 있다 .. 🥶

Disk-backed Buffers

  • 디스크에 임시 저장해놓는 방식이다. (하드디스크, SSD)
  • 처리 속도는 메모리에 비해 느리지만 안정적이다.

☑️ Spring의 파일 임시 저장소

Spring은 기본적으로 서블릿 컨테이너(Tomcat)가 실행 중인 서버의 디스크 공간을 임시 저장소로 사용한다.

spring.servlet.multipart.file-size-threshold 설정을 통해 파일이 특정 크기 미만일 경우 메모리에, 이상일 경우 디스크에 저장되도록 할 수 있다. (default는 0B로, 모두 디스크에 임시 저장된다.)

  • 이 디스크는 서버가 돌아가고 있는 운영체제의 파일 시스템 내 특정 경로를 의미한다.
  • 요청이 들어오면 디스크에 임시 파일을 만들어 저장하고, 요청이 정상 종료된다면 자동으로 삭제한다.
  • 이 때, 배포 중단, 서버 장애 발생 시 삭제 처리가 되지 않는 경우가 발생할 수 있다.
    • 따라서 임시 경로를 명시하고 주기적으로 정리하는 것이 바람직하다.

☑️ MultipartFile의 동작 원리

Spring은 디스크에 저장된 파일을 MultipartFile 객체에 매핑한다.

  • 전체 파일 데이터를 Heap 메모리에 올리지 않는다.
  • 파일 이름, 크기, 타입 등 메타데이터만 저장한다.
  • 실제 파일 데이터는 InputStream 등을 통해 접근한다.

마무리

MultipartFile에 대해 처리 방식, 동작 원리까지 정리해봤다. 

막연했던 개념이 정리되니까 속이 시원하다.


🔗 Reference

  • Spring Boot에서 S3에 파일을 업로드하는 세 가지 방법
  • Breaking Down the Multipart Upload Process within Spring Boot
저작자표시 비영리 변경금지 (새창열림)

'Programming > Spring' 카테고리의 다른 글

[Spring] DI와 IoC 이해하기  (0) 2025.04.11
[Spring] JPA Cascade에 대해 정리해보자 💭  (0) 2025.03.11
[Spring] 영속성 컨텍스트에 대해 정리해보자  (0) 2025.02.27
[Spring] Interceptor에 대해 알아보자  (0) 2025.02.26
[Spring] LoginCheckFilter 구현 : 로그인/아웃 로직 구현하기  (0) 2025.02.10
  1. 1. Multipart Upload란?
  2. ☑️ Spring에서의 Multipart 처리 방식
  3. 2. 업로드된 파일의 임시 저장 처리
  4. ☑️ Spring의 파일 임시 저장소
  5. ☑️ MultipartFile의 동작 원리
  6. 마무리
  7. 🔗 Reference
'Programming/Spring' 카테고리의 다른 글
  • [Spring] DI와 IoC 이해하기
  • [Spring] JPA Cascade에 대해 정리해보자 💭
  • [Spring] 영속성 컨텍스트에 대해 정리해보자
  • [Spring] Interceptor에 대해 알아보자
다섯자두
다섯자두
All I need is 💻 , ☕️ and a dash of luck
  • 다섯자두
    subbni
    다섯자두
  • 전체
    오늘
    어제
    • 분류 전체보기 (91)
      • Programming (54)
        • CS (0)
        • Network (3)
        • Database (5)
        • Java (13)
        • Javascript (0)
        • React (18)
        • Spring (8)
        • Cloud (1)
        • ETC (6)
        • 파고들기 (0)
      • Project (13)
        • FromBookToBook (5)
        • Spring (5)
        • Node.js & React (3)
      • Algorithm (20)
        • Study (7)
        • 자료구조 (7)
        • 문제 풀이 (5)
      • TroubleShooting (4)
      • 회고 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • velog
  • 인기 글

  • 태그

    SSE
    자료구조
    springboot
    aws
    HTTP
    Spring
    outbox
    로그인
    outbox 패턴
    Database
    JPA
    SQS
    재시도 로직
    pdf 자동 다운로드
    실시간 데이터 전송 기술
    티스토리챌린지
    Til
    오블완
    mysql
    pdf 프리뷰 실패
    network
    redis
    최단거리
    알림 기능
    코딩테스트
    java
    Express
    SQL
    프로젝트
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
다섯자두
[SpringBoot] 파일 업로드를 위한 MultipartFile의 처리/동작 방식

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.