스프링 웹 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 에 날짜를 준다
이 시간 이후거나, 파일이 바뀐 경우만 다시 리소스를 로딩한다.




© 2019. by jaeuk