본문 바로가기

스프링/스프링 MVC

핸들러 메서드: MultipartFile, ResponseEntity

MultipartFile

- 파일 업로드 시 사용하는 메서드 아규먼트

- MultipartResolver 빈이 설정되어 있어야 사용할 수 있다. (스프링 부트 자동 설정이 해 줌)

MultipartAutoConfiguration을 확인해보면 스프링 부트가 빈으로 등록해준 것을 알 수 있다.

추가 설정을 원한다면 applicaiton.properties에서 spring.servlet.mutipart.~~으로 할 수 있다.

예제

resource -> template -> files에 index.html을 생성한다. 주황 박스 부분은 타임리프 if 문을 이용해 message가 존재하면 message를 보여주는 것이고 빨간 박스 부분이 실제로 파일을 전송하기 위한 form이다. enctype을 multipart/form-data로 한 것을 알 수 있다. input의 name = "file"이 Controller에서 RequestParam(file)으로 받을 수 있게 된다.

MultipartFile로 파일을 받고 그 파일 이름을 message로 flashAttribute에 넣으면 redirect로 그 값을 전송할 수 있다.

테스트에서 MockMultipartFile로 가상의 파일로 만들어 테스트를 진행할 수 있으며 정상적으로 테스트가 작동하는 것을 확인할 수 있다.

 


ResponseEntity

- 응답 상태 코드, 응답 헤더, 응답 본문 등을 알맞게 설정하여 함께 전송할 수 있게 해 준다.

이 ResponseEntity를 이용하여 Client가 파일 다운로드를 요청하면 파일 리소스와 함께 알맞은 헤더 정보와 상태 코드를 설정하여 전송할 수 있다.

 

우선 resources 폴더에 test.png 파일을 저장하였다.

요청 시 이 파일을 전송하여 다운로드가 가능하게 할 것이다.

 

리턴 값이 ResponseEintity <T> Generics타입 T에 전송하고 싶은 본문의 값을 넣으면 된다. 현재는 파일 다운로드를 구현하므로 파일 resource를 넣은 것이다.

resourceLoader로 classpath의 파일 이름에 맞는 Resource를 얻을 수 있다.

그 Resource를 통해 File을 얻을 수 있고 Tika 라이브러리를 이용하면 파일의 mediaType을 알아낼 수 있다.

이 라이브러리를 사용하기 위해서는 아래의 의존성을 추가해 주어야 한다.

그리고 return을 보면 ResponseEntity.ok()로 응답 상태 코드 200(OK)이라고 설정할 수 있고 header들을 설정하고 body에 resource을 넣으면 된다.

파일 다운로드 응답 헤더에 설정할 내용

- Content-Disposition: 사용자가 해당 파일을 받을 때 사용할 파일 이름

- Content-Type: 파일의 타입

- Content-Length: 파일의 크기

서버를 띄우고 http://localhost:8080/file/test.png에 접속을 하게 되면 정상적으로 파일이 다운로드되는 것을 알 수 있다. 그리고 아래의 테스트 코드를 통해 헤더 값들도 정상적으로 들어가 있는 것을 알 수 있다.


https://www.inflearn.com/course/%EC%9B%B9-mvc#