지금까지 @RestController를 이용해 Data를 응답했다. 이제부터는 @Controller를 이용하여 File을 응답하려고 한다.
File응답에는 기본적으로 아래 세가지가 있다.
1) .txt 파일 응답
2) .mustache 파일 응답
3) .jsp 파일 응답
.txt
파일은 정적 파일이다.
.jsp
, .mustache
파일은 템플릿 엔진을 가지고 있다.
템플릿 엔진(Template Engine)이란 html 파일에 java코드를 쓸 수 있는 아이들을 말한다.
그렇기때문에 클라이언트(웹 브라우저)가 웹 서버에 index.html파일을 요청하는 방법은 사용할 수 없다.
그렇다면, .jsp파일로 요청해보자.
이렇게 .jsp
, .mustache
와 같이 java코드를 넣을수 있는 것을 템플릿 엔진이라고 한다.
현재 회사들은 jsp를 대부분 사용하고있다. 하지만 mustache도 알아야한다. 이유는 스프링부트에서 더이상 jsp를 업데이트 해주지 않고 있기 때문이다.(mustache가 스프링부트가 공식 지원하는 템플릿 엔진이다.)
HttpRespController라는 이름의 Class파일 생성 후 아래와 같이 작성한다. 파일을 응답할 것이기 때문에 @Controller 어노테이션을 사용했다.
@Controller//파일리턴
public class HttpRespController {
@GetMapping("/txt")
public String txt() {
return "a.txt";
}
}
응답해줄 파일을 src/main/resources
-static
안에 a.txt파일을 생성해주고 아래와같이 This is a.txt라는 데이터를 body에 넣어준다.
src/main/resources
-static
안에 넣은 이유는 개발자 마다 경로가 다 다르면 문제가 생기기 때문에 프레임워크에서 틀을 만들어 놓았기 때문이다.
따라서 스프링부트는 일반 정적파일의 경우 resource/static을 기본 경로로 설정했다.(.mustache
와 같은 파일들은 resouces/templates를 기본 경로로 지정했다.)
저장 후 브라우저를 열어 해당 경로를 입력한다.
파일이 리턴 되어 파일 안에 있는 내용을 읽어온 모습을 볼 수 있다. 파일 안에 내용은 웹 브라우저가 읽은 것이다.
mustache 파일을 응답하려면 템플릿 엔진 라이브러리가 필요하다.
https://mvnrepository.com/
mvnrepository에서 mustache를 검색하여 'Spring Boot Starter Mustache'를 찾아 최신버전을 복사해 pom.xml
파일 안 dependencies에 붙여넣어준다.(버전은 지워주기)
HttpRespController 클래스 파일은 아래 내용을 작성해주고
@GetMapping("/mus")
public String mus() {
return "b.mustache";
}
응답 파일을 만들어주자.
src/main/resources
-static
안에 새로운 html파일을 만들어 주면 된다.
New
- Others
에서 html을 검색후 파일명을 b.html로 해준다. (mustache는 검색해도 나오지 않는다.)
그리고나서 확장자명을 아래와 같이 mustache로 변경해준다.
브라우저를 통해 불러오면 아래 사진처럼 파일이 다운로드 된다.
다운로드가 되는 이유는 브라우저가 확장자가 mustache인 파일을 이해하지 못해 다운로드를 시켜버린 것이다.(톰캣으로 보내서 코드해석하는 과정을 생략한 것)
그렇다면 이 파일을 src/main/resources
-templates
로 옮겨보자.
그리고 HttpRespController 클래스 파일에서 확장자를 지워준다.
@GetMapping("/mus")
public String mus() {
return "b";
}
브라우저에서 경로를 불러오면 이와같이 mustache파일 내용을 볼 수 있다.
이렇게 mustache 템플릿 엔진 라이브러리를 등록하고 나서 templates 폴더 안에 .mustache을 넣을 경우, 확장자 없이 파일명만 적으면 자동으로 찾아가게 된다. (만약 확장자를 적게되면 static으로 찾아간다.)
jsp도 마찬가지로 mvnrepository에서 'jasper'를 검색해 버전에 맞게 복사하여 pom.xml에 붙여넣는다. 이때 템플릿 엔진은 두개를 둘 수 없기 때문에 이전에 사용했던 템플릿 엔진은 주석처리를 해준다.(command + control + /)
저장을 해주고, 응답 파일을 만들어보자. jsp 는 스프링부트에서 지원을 하지 않기 때문에 폴더를 직접 만들어야 한다.
src
-main
에서 아래와 같이 폴더를 만들어준다.
그리고나서 HttpRespController 클래스 파일 안에 아래 내용을 작성한다.
@GetMapping("/jsp")
public String jsp() {
return "c";
}
하지만 이때 브라우저를 열어보면 에러가 뜬다. 왜 못찾는 것일까? jsp는 말했다시피 스프링부트가 지원하지 않기 때문에 설정이 필요하다.
src/main/resources
- application.properties
에서 application.properties
의 파일명을 application.yml
로 바꿔준다. 그리고나서 내용을 아래와 같이 작성한다.
다시 브라우저를 실행하면 파일 내용이 보인다.
jsp 엔진 라이브러리를 설치하면 src
- main
- webapp
가 자동으로 디폴드 경로가 되어 webapp폴더 안에서 c파일을 찾는다.
하지만 현재 c 파일은 src
- main
- webapp
- WEB-INF
- views
안에 존재하고 WEB-INF
- views
는 커스텀 폴더이기 때문에 이를 yml에서 설정해주어야한다.
/WEB-INF/views/(prefix)c.jsp(prefix) -> yml설정을 이렇게 해주면, ViewResolver클래스가 실행한다.(@RestController에서는 json으로 리턴될 때 Message Converter 클래스가 실행했다.)
ViewResolver클래스가 실행하게되면, 내가 리턴하는 파일명 앞에 prefix를, 파일명 뒤에 prefix붙여서 해당 파일을 찾아준다.
jsp는 이 ViewResolver 클래스의 별도 설정이 필요한 것이다.
mustache는 스프링부트에서 지원하고 있기 때문에 ViewResolver 설정이 자동으로 되어있다.