반응형

서블릿과 파일 업로드 1


먼저 서블릿을 통한 파일 업로드를 코드와 함께 알아보자.


ServletUploadControllerV1


request.getParts() : multipart/form-data 전송 방식에서 각각 나누어진 부분을 받아서 확인할 수 있다.


resources/templates/upload-form.html


테스트를 진행하기 전에 먼저 다음 옵션들을 추가하자.

application.properties

이 옵션을 사용하면 HTTP 요청 메시지를 확인할 수 있다.


실행
http://localhost:8080/servlet/v1/upload

실행해보면 logging.level.org.apache.coyote.http11 옵션을 통한 로그에서 multipart/form-data 방식으로 전송된 것을 확인할 수 있다.

 

결과 로그

 


멀티파트 사용 옵션

업로드 사이즈 제한

spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB

큰 파일을 무제한 업로드하게 둘 수 는 없으므로 업로드 사이즈를 제한할 수 있다.
사이즈를 넘으면 예외(SizeLimitExceededException)가 발생한다.
max-file-size : 파일 하나의 최대 사이즈, 기본 1MB

max-request-size : 멀티파트 요청 하나에 여러 파일을 업로드 할 수 있는데, 그 전체 합이다. 기본 10MB

 

spring.servlet.multipart.enabled 끄기

 


결과 로그

request=org.apache.catalina.connector.RequestFacade@xxx
itemName=null
parts=[]

멀티파트는 일반적인 폼 요청인 application/x-www-form-urlencoded 보다 훨씬 복잡하다. 
spring.servlet.multipart.enabled 옵션을 끄면 서블릿 컨테이너는 멀티파트와 관련된 처리를 하지 않는다.
그래서 결과 로그를 보면 request.getParameter("itemName"), request.getParts()의 결과가 비어있다. 


spring.servlet.multipart.enabled 켜기 (기본 true)

이 옵션을 켜면 스프링 부트는 서블릿 컨테이너에게 멀티파트 데이터를 처리하라고 설정한다. 
참고로 기본 값은 true이다.

request=org.springframework.web.multipart.support.StandardMultipartHttpServletR
equest
itemName=Spring
parts=[ApplicationPart1, ApplicationPart2]

request.getParameter("itemName")의 결과도 잘 출력되고, request.getParts()에도 요청한 두가지 멀티파트의 부분 데이터가 포함된 것을 확인할 수 있다. 
이 옵션을 켜면 복잡한 멀티파트 요청을 처리해서 사용할 수 있게 제공한다.

로그를 보면 HttpServletRequest 객체가 RequestFacade → StandardMultipartHttpServletRequest로 변한 것을 확인할 수 있다.

 


참고
spring.servlet.multipart.enabled 옵션을 켜면 스프링의 DispatcherServlet 에서 멀티파트 리졸버(MultipartResovler)를 실행한다.
멀티파트 리졸버는 멀티파트 요청인 경우 서블릿 컨테이너가 전달하는 일반적인 HttpServletRequestMultipartHttpServletRequest로 변환해서 반환한다.
MultipartHttpServletRequestHttpServletRequest의 자식 인터페이스이고, 멀티파트와 관련된 추가 기능을 제공한다.

스프링이 제공하는 기본 멀티파트 리졸버는 MultipartHttpServletRequest 인터페이스를 구현한 StandardMultipartHttpServletRequest를 반환한다.
이제 컨트롤러에서 HttpServletRequest 대신에 MultipartHttpServletRequest를 주입받을 수 있는데,
이것을 사용하면 멀티파트와 관련된 여러가지 처리를 편리하게 할 수 있다.

그런데 이후 강의에서 설명할 MultipartFile 이라는 것을 사용하는 것이 더 편하기 때문에 MultipartHttpServletRequest를 잘 사용하지는 않는다. 
더 자세한 내용은 MultipartResovler를 검색해보자.

 

반응형