Spring-boot 업로드 기능 구현에 MultipartResolver가 필요할까?

Byung Seon Kang·2022년 7월 15일
0

why

목록 보기
1/1
post-thumbnail
post-custom-banner

서론

  • 스프링부트 스터디도중 이미지 업로드 기능을 구현하는 파트가 있어 MultipartFile 인터페이스와 multipartresolver에 대해 공부했다.
    서칭결과 구글에서 대부분의 블로그가 MultipartResolver의 구현체인 CommonsMultipartResolver를 사용하라고 명시하고 있었다. 코드는 다음과 같다.
  • 그런데 CommonsMultipartResolver사용하지 않아도 문제없이 업로드가 되는 것을 코드 적당히 짜보고 확인했다.
    그럼 도대체 이걸 왜쓰는걸까?

결론

  • 결론부터 말하면, 스프링부트에서는 Multipart에 대한 configuration을 이미 지원해주고 있어 따로 CommonsMultipartResolver를 사용할 필요가 없다. Springboot를 사용하지 않는경우에만 본인이 세팅해주는 것.
    소스코드는 아래에 있다.
    MultipartAutoConfiguration 소스코드

각각에 대해 조금 알아봅시다.

MultipartFile

  • multipart request로부터 전달받은 uploaded file의 representation이다.
    이 업로드된 파일 컨텐츠는 메모리에 있을수도 있고 디스크에 있을수도 있다.
    각각의 경우 파일 컨텐츠를 session-level 또는 persistent store에 저장할 필요가 있다.

MultipartResolver

  • RFC 1867에 따른 Multipart file upload를 위한 strategy interface이다.
  • 주로 아래 두가지 implementation 사용
  1. CommonMultipartResolver - Apache Commons FileUpload
    서블릿 컨테이너에서 쓰임.
  2. StandardServletMultipartResolver - servlet 3.0+ part API
    Spring DispatcherServlet context의 multipartResolver에 더해져서 사용됨.

MultipartResolver의 동작 방식

  1. DispatcherServlet이 빈으로 등록된 MultipartResolver의 인스턴스를 체크한다.(DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME을 통해). 이때 스프링의 경우 default bean이 등록되어있지 않으므로 MultipartResolver의 구현체를 직접 등록해줘야 함.
  2. DispatcherServlet.doDispatch()는 요청이 파일 업로드에 관한것인지 MultipartResolver.isMultipart() 함수를 호출해서 확인한다.
    만약 return true를 하면 이 요청은 주로 "multipart/form-data"의 content-type을 가진 POST 요청임.
  3. true값을 리턴하면, MultipartResolver.resolveMultipart() 호출해서 HTTP 요청을 파싱하고, MultipartHttpSErvletRequest object로 감싸서 반환한다. 이 시점에서 Lazy option을 걸지 않는이상 이미 파일 컨텐츠는 메모리 또는 임시 폴더에 저장되어 있음. -> Lazy 옵션 거는거 공식문서에 나와있습니당.
    4.DispatcherServlet.doDispatch()의 마지막 차례에 MultipartResolver.cleanupMultipart()가 호출되어 업로드된 파일의 저장소와 같은 multipart 처리를 위해 사용된 리소스들을 정리한다.

참고

https://stackoverflow.com/questions/31178160/spring-boot-doesnt-use-commonsmultipartresolver
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/multipart-resolver.html
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html

profile
왜 필요한지 질문하기
post-custom-banner

0개의 댓글