진짜 개발자
본문 바로가기

FrameWork/Spring MVC

SpringMVC - 핸들러 메소드 - 8 (파일 다운로드 기능 구현, 리턴타입 : ResponseEntity)

728x90
SpringMVC - 핸들러 메소드 - 8 (파일 다운로드 리턴타입 ResponseEntity)

이번시간에는 Handler에서 file download를 제공하는 방법을 알아보도록 하겠습니다.

 

 

1. ResponseEntity

1.1 ResponseEntity 란?

Spring Framwork에서 제공하는 클래스중 HttpEntity 라는 클래스가 존재합니다. 이것은 HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeaderHttpBody 를 포함하는 클래스입니다. 이 HttpEntity 라는 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity입니다.

 

ResponseEntity는 당연히 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스입니다. 따라서 HttpStatus, HttpHeaders, HttpBody를 포함합니다. 따라서 우리는 이 ResponseEntity를 이용하여 FileDownload를 제공하는 응답을 만들어 낼 수 있습니다.

 

 

 

1.2 ResponseEntity 를 이용한 FileDownload 예제


우선 download할 파일을 resources하위에 추가합니다.

 

위와 같이 Handler를 작성합니다. 위의 코드는 우선 크게 2가지로 나뉩니다. 다운로드를 제공할 파일 얻어오기, ResponseEntity 작성하기. 하나하나 설명드리겠습니다.

 

 

1.2.1 Download를 제공할 File 얻기

ResourceLoader


https://galid1.tistory.com/536 포스팅에서 알아보았던 Spring에서 제공하는 Resource추상화 인터페이스 입니다. classpath를 이용하여 원하는 file을 가져올 수 있습니다.

 

@PathVariable을 이용하여 사용자가 원하는 File을 ResourceLoader를 통해 가져옵니다. Resource로부터 File객체를 얻어온 이유는 File의 길이를 알아오기 위해서 입니다. ResponseEntity를 작성할 때 사용됩니다.

 

 

1.2.2 ResponseEntity 작성

위의 코드가 바로 ResponseEntity를 작성하는 코드입니다. 우선 Http응답에 사용될 데이터는 크게 세가지로 나뉩니다. Status, Header, Body 각각에 대한 설명은 Http Protocol에 대한 설명을 드리는 시간이 아니므로 넘어가도록하겠습니다.

 

ResponseEntity를 메소드를 통해 작성하게 되면 Status -> Header -> Body순으로 자동으로 작성되도록 되어있습니다. 차례대로 살펴보며 설명드리겠습니다.

 

 

Status


우선 ResponseEntity의 static 메소드인 ok()는 HttpStatus코드의 OK(200)를 응답데이터에 포함하도록 하고, ResponseEntity의 BodyBuilder를 return합니다.

 

 

Header


header를 작성하기 위해서는 ResponseEntity의 header() 메소드를 이용하면됩니다. header() 메소드는 다시 BodyBuilder를 return 하기 때문에 계속해서 header를 추가할 수 있습니다. header를 작성하는 것인데 BodyBuilder를 리턴하는 것이 조금 이상하지만 header를 모두 추가한 뒤 body를 마지막에 추가하여 ResponseEntity를 생성하기 위해 이런식의 구조를 만든것 같습니다.(실제로 코드를 뜯어봤지만 의도에 대한 해석은 뇌피셜 입니다..)

 

*CONTENT_DISPOSITION

header에는 3가지 데이터를 추가했습니다. CONTENT_DISPOSITION 의 경우 웹페이지에서 HTTP 프로토콜이 응답하는 데이터를 어떻게 표시하는지를 알려주는 Header입니다. 기본값은 inline으로 설정되어 있으며 이는 웹페이지에 표시하라는 의미입니다. attachment를 사용한다면 사용자의 로컬에 다운로드할 수 있도록 하게됩니다. 추가적으로 filename은 이름에서 알 수 있듯 file의 이름을 알려주는 header입니다.

 

*CONTENT_TYPE

contentType은 다들 아시다시피 응답하는 데이터의 type을 알려주는 header입니다. 오타를 줄이기 위해 MediaType의 상수를 사용했습니다.

 

CONTENT_LENGTH

이름에서 알 수 있듯이 응답데이터의 크기를 알려주는 header입니다.

 

 

Body


마지막 body를 작성하는 부분입니다. body() 메소드를 이용하여 body를 작성할 수 있으며, 매개변수로는 응답할 데이터를 담아주면 됩니다. body()메소드를 사용하게되면 ResponseEntity가 생성됩니다.

 

 

 

1.3 테스트

어플리케이션을 실행시키고 작성했던 Handler를 요청하게 되면 다음과같이 성공적으로 file을 download하게 됩니다.