스프링 파일 업로드
스프링은
MultipartFile이라는 인터페이스로 멀티파트 파일을 매우 편리하게 지원한다.
주요 클래스
MultipartAutoConfiguration
스프링 부트에서
multipart/form-data요청 처리를 자동으로 구성해주는 설정 클래스추가적인 설정 없이도
@RequestParam("file") MultipartFile file과 같이 사용하면 자동으로 멀티파트 요청을 처리하도록 구성된다.
MultipartHttpServletRequest
HttpServletRequest를 상속하여 멀티파트 폼 데이터를 처리할 수 있는 추가 메서드를 제공하는 인터페이스기본 구현체로
StandardMultipartHttpServletRequest클래스가 제공된다.
MultipartResolver
multipart/form-data요청을 해석하여MultipartHttpServletRequest를 만들어주는 인터페이스기본 구현체로
StandardServletMultipartResolver클래스가 제공된다.
MultipartFile
업로드된 파일을 다루기 위한 인터페이스
기본 구현체로
StandardMultipartFile클래스가 제공된다.
MultipartProperties
스프링 부트에서 멀티파트 설정을 위한 구성 설정 클래스

@RequestPart
multipart/form-data요청의 특정 파트를 직접 바인딩하기 위한 어노테이션@RequestParama보다 좀 더 확장된 기능을 제공한다.
MultipartFile 사용 예 - 컨트롤러
업로드 하는 HTML Form의 name에 맞춰 @RequestParam을 적용하면 된다. @ModelAttribute에서도 MultipartFile을 동일하게 사용할 수 있다.
file.getOriginalFilename(): 업로드 파일 명file.transferTo(): 파일 저장
파일 업로드, 다운로드 예제
Item 상품 도메인
UploadFile - 업로드 파일 정보 보관
고객이 업로드한 파일명 그대로 서버 내부에 파일을 저장하면 안 된다. 왜냐하면 서로 다른 고객이 같은 파일이름을 업로드 한 경우 기존 파일 이름과 충돌이 날 수 있다. 서버에서는 저장할 파일명이 겹치지 않도록 내부에서 관리하는 별도의 파일명이 필요하다.
ItemRepository
FileStore - 파일 저장과 관련된 로직
ItemForm
이미지를 다중 업로드 하기 위해
MultipartFile을List로 사용한다.멀티파트(
attachFile)는@ModelAttribute에서 사용할 수 있다.
컨트롤러
Item-form.html
다중 파일 업로드를 하려면 multiple="multiple" 옵션을 주면 된다.
Item-view.html
첨부 파일은 링크를 걸어두고 이미지는 <img>태그를 반복해서 출력한다.
Multipart 처리 과정

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

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



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

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


컨트롤러에서 MultipartFile 접근


@RequestPart
@RequestPart어노테이션은 멀티파트 요청에서 특정 파트를 매핑하여 컨트롤러의 파라미터로 바인딩하는 어노테이션으로, JSON 요청 처리 및 파일 업로드를 동시에 처리 가능하다.@RequestParam과 다르게 파일 뿐만 아니라 JSON 객체로 받을 수 있다.

구현 예제
도메인
컨트롤러
HTML
👆 참고 - 요청 방식에 따른 사용 가능한 어노테이션
application/json
@RequestBody, @RequestPart
application/x-www-form-urlencoded
@RequestParam, @ModelAttribute
multipart/form-data
@RequestParam, @ModelAttribute, @RequestPart
👆 참고
@RequestPart는 RequestPartMethodArgumentResolver 클래스가 처리한다.
Last updated