본문 바로가기

Spring/Spring MVC

(SERVLET) 리소스 핸들러

리소스 핸들러란?

이미지, 자바스크립트, CSS 그리고 HTML 파일과 같은 정적인 리소스를 처리하는 핸들러 등록하는 방법

 

 

서블릿 컨테이너 (톰캣, undertow, jetty)가 기본으로 제공하는 DefaultServlet이 존재

https://tomcat.apache.org/tomcat-9.0-doc/default-servlet.html

 

Apache Tomcat 9 (9.0.30) - Default Servlet Reference

The default servlet is the servlet which serves static resources as well as serves the directory listings (if directory listings are enabled). It is declared globally in $CATALINA_BASE/conf/web.xml. By default here is it's declaration: default org.apache.c

tomcat.apache.org

스프링은 DefaultServlet에 요청을 위임해서 처리한다.

 

이때 정적인 리소스 핸들러가 요청을 다 가로채버린다면 기존에  존재하는 핸들러는 리소스 핸들러 뒤로 우선 선위가 밀리게 된다.

따라서 리소스 핸들러는 우선순위가 가장 낮게 등록된다.

 

스프링 MVC 리소스 핸들러 맵핑 등록

  • 가장 낮은 우선순위로 등록.

    • 다른 핸들러 맵핑이 “/” 이하 요청을 처리하도록 허용하고

    • 최종적으로 리소스 핸들러가 처리하도록.

  • DefaultServletHandlerConfigurer

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

 

Resource Handling in Spring MVC 4.1

As the complexity of web and mobile apps increases, so does the importance of ensuring that your client-side resources load and execute in an optimal and effic…

www.slideshare.net


코드 참조

https://github.com/mike6321/Spring/tree/master/SpringMVC/demo-boot-web

 

mike6321/Spring

Contribute to mike6321/Spring development by creating an account on GitHub.

github.com