스프링 웹 MVC-09.리소스 핸들러
리소스 핸들러
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html#addResourceHandlers-org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry-
이미지, 자바스크립트, CSS 그리고 HTML 파일과 같은 정적인 리소스를 처리하는 핸들러 등록하는 방법
디폴트(Default) 서블릿
- 서블릿 컨테이너가 기본으로 제공하는 서블릿으로 정적인 리소스를 처리할 때 사용한다.
- https://tomcat.apache.org/tomcat-9.0-doc/default-servlet.html
스프링 MVC 리소스 핸들러 맵핑 등록
- 가장 낮은 우선 순위로 등록.
- 다른 핸들러 맵핑이 “/” 이하 요청을 처리하도록 허용하고
- 최종적으로 리소스 핸들러가 처리하도록.
- DefaultServletHandlerConfigurer
리소스 핸들러 설정
- 어떤 요청 패턴을 지원할 것인가
- 어디서 리소스를 찾을 것인가
- 캐싱
- ResourceResolver: 요청에 해당하는 리소스를 찾는 전략
- 캐싱, 인코딩(gzip, brotli), WebJar, …
- ResourceTransformer: 응답으로 보낼 리소스를 수정하는 전략
- 캐싱, CSS 링크, HTML5 AppCache, …
스프링 부트
- 기본 정적 리소스 핸들러와 캐싱 제공
참고
- https://www.slideshare.net/rstoya05/resource-handling-spring-framework-41
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mobile/**") // 해당 경로로 들어오는 요청
.addResourceLocations("classpath://mobile/", "file:/Users/jaeuk/files/") // 해당 위치, 경로 없으면 app/아래
.setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES)) // 10분동안 캐싱(리소스가 변경되지 않았다면, 10분 안되었더라도 변경됬다면 다시 캐싱)
.resourceChain(true); // 캐시 쓸지 말지
}
}
@Test
public void mobile() throws Exception {
this.mockMvc.perform(get("/mobile/mobile.html"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(Matchers.containsString("mobile hello")))
.andExpect(header().exists(HttpHeaders.CACHE_CONTROL));
}
요청시 응답이 200
한번 더 요청하면 304(캐시 적용-not modified)
리퀘스트 해더(요청 헤더)에 if-modified-since 에 날짜를 준다
이 시간 이후거나, 파일이 바뀐 경우만 다시 리소스를 로딩한다.