Chapter 3에서 RestController와 GetMapping 어노테이션을 이용해 데이터를 응답해 주었었다.
이번엔 데이터를 응답해 주지 않고 '데이터가 담긴 파일'을 응답하여 줘보자.
이 때 주의해야 할 점은, url 요청이든 uri 요청이든 결국 '데이터를 ByteStream으로 전송'한다는 점이다. 파일을 응답할 경우 결국 파일의 데이터를 BR로 읽어서 데이터를 전송한다.
데이터를 받기 위해서는 어떤 형태로든 전달을 해야 한다. 이 형태를 View라고 한다.
그런데 '데이터가 담긴 파일'을 줄 때에는 return에 파일 경로를 정확히 설정해 주어야 한다. 이 때, 파일이름으로 파일 위치를 찾을 수 있어야 하는데 이것을 가능하게 해주는 것이 View Resolver이다.
그런데 파일 위치를 찾기란 쉽지 않다!
그래서 경로를 잡아주는 라이브러리(tomcat-embed-jasper)를 설치해주자.
또한 jsp 문법이 내장된 jstl 라이브러리도 설치하자.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.0'
// https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper
implementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.65'
// https://mvnrepository.com/artifact/javax.servlet/jstl
implementation group: 'javax.servlet', name: 'jstl', version: '1.2'
}
✔️ 이 때 꼭 자신의 Java 버전과 tomcat jasper 라이브러리의 호환 버전을 맞춰줘야 한다. 꼭 확인하고 호환이 되는 버전의 라이브러리를 다운받자. (본인은 Java 11과 tomcat jasper 9.0.65 사용)
라이브러리를 다운 받고 나면 뷰를 찾기 위한 루트 폴더가 생긴다.
/demo/src/main/webapp/ (root folder)
이 뒤로 규약에 맞춰 이러한 경로로 폴더를 생성해야 한다.
/WEB-INF/views/return할 파일이름.jsp
뷰를 찾기 위한 폴더 경로 : /demo/src/main/webapp/WEB-INF/views/return할 폴더이름.jsp
우리는 /WEB-INF/views/ 또한 라이브러리로 경로를 자동 지정해주어 return할 파일 이름만 적을 거다.
application.properties에서 prefix와 suffix에 경로를 지정해주자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>home</h1>
</body>
</html>
package site.metacoding.demo.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class FileController {
@GetMapping("/file/home")
public String home() {
return "home";
}
}
💻 결과 :