리소스 핸들러란?
이미지, 자바스크립트, CSS 그리고 HTML 파일과 같은 정적인 리소스를 처리하는 핸들러 등록하는 방법
서블릿 컨테이너 (톰캣, undertow, jetty)가 기본으로 제공하는 DefaultServlet이 존재
https://tomcat.apache.org/tomcat-9.0-doc/default-servlet.html
스프링은 DefaultServlet에 요청을 위임해서 처리한다.
이때 정적인 리소스 핸들러가 요청을 다 가로채버린다면 기존에 존재하는 핸들러는 리소스 핸들러 뒤로 우선 선위가 밀리게 된다.
따라서 리소스 핸들러는 우선순위가 가장 낮게 등록된다.
스프링 MVC 리소스 핸들러 맵핑 등록
-
가장 낮은 우선순위로 등록.
-
다른 핸들러 맵핑이 “/” 이하 요청을 처리하도록 허용하고
-
최종적으로 리소스 핸들러가 처리하도록.
resources > static에 html 파일 생성
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello index</h1>
</body>
</html>
테스트 코드 작성
@Test
public void helloStatic() throws Exception {
this.mockMvc.perform(get("/index.html"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(Matchers.containsString("hello index")));
}
스프링 부트가 제공하는 것 이외에 임의의 resource를 추가하고 싶다면
WebMvcConfigurer 구현하는 클래스에 addResourceHandlers 재정의
// TODO: junwoochoi 10/02/2020 9:36 오후
// 리소스 핸들러 추가 @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mobile/**")
.addResourceLocations("classpath:/mobile/")
.setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES));
}
mobile > index.html 생성
테스트 코드 작성
@Test
public void mobileStatic() throws Exception {
this.mockMvc.perform(get("/mobile/index.html"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(Matchers.containsString("hello mobile")))
.andExpect(header().exists(HttpHeaders.CACHE_CONTROL));
}
리소스 핸들러 설정
-
어떤 요청 패턴을 지원할 것인가
-
어디서 리소스를 찾을 것인가
-
캐싱
-
ResourceResolver: 요청에 해당하는 리소스를 찾는 전략
-
캐싱, 인코딩(gzip, brotli), WebJar,...
-
ResourceTransformer: 응답으로 보낼 리소스를 수정하는 전략
-
캐싱, CSS 링크, HTML5 AppCache,...
https://www.slideshare.net/rstoya05/resource-handling-spring-framework-41
코드 참조
https://github.com/mike6321/Spring/tree/master/SpringMVC/demo-boot-web
'Spring > Spring MVC' 카테고리의 다른 글
(SERVLET) HTTP 메세지 컨버터 (2) - Json (0) | 2020.02.11 |
---|---|
(SERVLET) HTTP 메세지 컨버터 (1) (0) | 2020.02.10 |
(SERVLET) 핸들러 인터셉터(2) (0) | 2020.02.05 |
(SERVLET) 핸들러 인터셉터(1) (0) | 2020.02.05 |
(SERVLET) 스프링 부트의 스프링 MVC 설정 (0) | 2020.02.02 |