Resource Handler

이미지, 자바스크립트, CSS, HTML 같은 정적인 리소스를 처리하는 핸들러

Default Servlet

  • 서블릿 컨테이너(Tomcat.. etc)가 기본 제공
  • 정적 리소스를 처리시 사용
  • 디렉토리 목록을 보여줄 수 있다.(directory listing이 활성화 되어있을 때)

  • 스프링은 이 서블릿에 정적 리소스에 대한 요청을 위임해 정적인 리소스를 처리한다.

스프링 MVC 리소스 핸들러 매핑

  • 정적 리소스 핸들러가 요청을 먼저 다 가로채면 만든 핸들러보다 정적 리소스가 먼져 찾아진다.(비효율적) 따라서 정적 리소스 핸들러는 가장 낮은 우선순위를 갖는다.
    • 다른 핸들러 매핑이 “/” 이하의 요청을 처리한다면
    • 최종적으로 리소스 핸들러가 처리하도록 한다.
  • DefaultServletHandlerConfigurer
    • 정적리소스를 제공하기 위한 요청 핸들러를 구성한다.
    • 서블릿 컨테이너의 ‘Default Servlet’에 요청을 전달한다.

리소스 핸들러 설정

  • 어떤 요청 패턴을 지원할 것인가
  • 어떤 리소스를 찾을 것인가
  • 캐싱
  • ResourceResolver : 요청에 해당하는 리소스를 찾는 전략1
    • 캐싱, 인코딩(gzip, bortli), WebJar, …
  • ResourceTransformer: 응답으로 보낼 리소스를 수정하는 전략1
    • 캐싱, CSS 링크, HTML5 AppCache, …
  • 스프링 부트가 기본 제공하는 정적 리소스 핸들러를 임의로 추가할 수 있다.
    • /mobile/**에 해당하는 URL 경로 패턴과 resources/mobile이라는ㅌ 파일 위치의 정적리소스를 제공하는 스프링 부트 설정 예제, 스프링 부트 강좌를 참고
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
      @Override
      public void addResourceHandlers(ResourceHandlerRegistry registry) {
          registry.addResourceHandler("/mobile/**")
                  .addResourceLocations("classpath:/mobile/", "file:/Users/User/files")
                  .setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES))
                  .resourceChain(false); // 개발시 false, 운영시 true
      }
    }
    

스프링 부트

  • 기본으로 정적 리소스 핸들러와 캐싱 제공
  • resources/static, resource/public을 기본 정적 리소스 디렉토리로 지정해준다.

참고

  1. https://www.slideshare.net/rstoya05/resource-handling-spring-framework-41  2

댓글남기기