스프링 파일 업로드

스프링은 MultipartFile이라는 인터페이스로 멀티파트 파일을 매우 편리하게 지원한다.

주요 클래스

  • MultipartAutoConfiguration

    • 스프링 부트에서 multipart/form-data 요청 처리를 자동으로 구성해주는 설정 클래스

    • 추가적인 설정 없이도 @RequestParam("file") MultipartFile file과 같이 사용하면 자동으로 멀티파트 요청을 처리하도록 구성된다.

  • MultipartHttpServletRequest

    • HttpServletRequest를 상속하여 멀티파트 폼 데이터를 처리할 수 있는 추가 메서드를 제공하는 인터페이스

    • 기본 구현체로 StandardMultipartHttpServletRequest 클래스가 제공된다.

  • MultipartResolver

    • multipart/form-data 요청을 해석하여 MultipartHttpServletRequest를 만들어주는 인터페이스

    • 기본 구현체로 StandardServletMultipartResolver 클래스가 제공된다.

  • MultipartFile

    • 업로드된 파일을 다루기 위한 인터페이스

    • 기본 구현체로 StandardMultipartFile 클래스가 제공된다. img.png

  • MultipartProperties

    • 스프링 부트에서 멀티파트 설정을 위한 구성 설정 클래스 img_1.png

  • @RequestPart

    • multipart/form-data 요청의 특정 파트를 직접 바인딩하기 위한 어노테이션

    • @RequestParama보다 좀 더 확장된 기능을 제공한다.

MultipartFile 사용 예 - 컨트롤러

업로드 하는 HTML Form의 name에 맞춰 @RequestParam을 적용하면 된다. @ModelAttribute에서도 MultipartFile을 동일하게 사용할 수 있다.

  • file.getOriginalFilename() : 업로드 파일 명

  • file.transferTo() : 파일 저장

파일 업로드, 다운로드 예제

Item 상품 도메인

UploadFile - 업로드 파일 정보 보관

고객이 업로드한 파일명 그대로 서버 내부에 파일을 저장하면 안 된다. 왜냐하면 서로 다른 고객이 같은 파일이름을 업로드 한 경우 기존 파일 이름과 충돌이 날 수 있다. 서버에서는 저장할 파일명이 겹치지 않도록 내부에서 관리하는 별도의 파일명이 필요하다.

ItemRepository

FileStore - 파일 저장과 관련된 로직

ItemForm

  • 이미지를 다중 업로드 하기 위해 MultipartFileList로 사용한다.

  • 멀티파트(attachFile)는 @ModelAttribute에서 사용할 수 있다.

컨트롤러

Item-form.html

다중 파일 업로드를 하려면 multiple="multiple" 옵션을 주면 된다.

Item-view.html

첨부 파일은 링크를 걸어두고 이미지는 <img>태그를 반복해서 출력한다.


Multipart 처리 과정

img_2.png
  1. 멀티파트 요청 체크 - 사용자가 multipart/form-data 형식으로 파일을 업로드하면 MultipartResolver를 통해 멀티파트 형태인지 판단한다.

img_3.png

일반 요청이면 HttpServletRequest를 그대로 다시 반환하고, 멀티파트 요청이면 StandardMultipartHttpServletRequest 객체로 감싸서 반환한다.

img_4.png
img_5.png
img_6.png
  1. MultipartResolver 파싱 - MultipartResolverMultipartHttpServletRequest를 생성하고 이 클래스는 요청 바디를 분석하여 각 파일 파트(바이너리 데이터)와 일반 폼 필드를 분리하고 파일 파트는 MultipartFile 맵에 저장한다.

img_7.png
  1. ArgumentResolver 요청 처리 - 각 ArgumentResolver 클래스는 MultipartHttpServletRequestMultipartFile 맵으로부터 MultipartFile 객체를 가져와서 반환한다.

img_9.png
img_8.png
  1. 컨트롤러에서 MultipartFile 접근

img_11.png
img_10.png

@RequestPart

  • @RequestPart 어노테이션은 멀티파트 요청에서 특정 파트를 매핑하여 컨트롤러의 파라미터로 바인딩하는 어노테이션으로, JSON 요청 처리 및 파일 업로드를 동시에 처리 가능하다.

  • @RequestParam과 다르게 파일 뿐만 아니라 JSON 객체로 받을 수 있다.

img_12.png

구현 예제

도메인

컨트롤러

HTML

👆 참고 - 요청 방식에 따른 사용 가능한 어노테이션

요청 방식
사용 가능 애노테이션

application/json

@RequestBody, @RequestPart

application/x-www-form-urlencoded

@RequestParam, @ModelAttribute

multipart/form-data

@RequestParam, @ModelAttribute, @RequestPart

👆 참고

@RequestPartRequestPartMethodArgumentResolver 클래스가 처리한다.

Last updated