Spring/MVC

학습 // Spring // MVC // 정적리소스

문스코딩 2018. 8. 21. 18:48
업데이트 :: 2018.08.21



정적리소스

  • maven
  • gradle
    • src/main/webapp

JavaEE를 준수하는 웹 애플리케이션에서 정적리소스

/src
  /main
    /webapp
      /static
        /html
        /css
        /js

기본서블릿과 DispatcherServlet의 공존

  • 서블릿 사양에서 루트 경로(/)에 매핑되는 서블릿을 기본 서블릿
    • 기본 서블릿을 통해 웹 애플리케이션의 문서 루트 이하의 파일에 접근 할 수 있음
    • DispatcherServlet을 루트경로에 매핑하면 웹 애플리케이션의 문서 루트 이하의 파일에 접근 불가
    • DispatcherServlet이 받은 요청을 기본 서블릿에 전송

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
  @Override
   public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
       configurer.enable();
   }
}

스프링 MVC 리소스 취급방법

  • ResourceHttpRequestHandler 클래스
    • 정적리소스를 저장해둔 임의의 디렉터리에 대해 파일접근이나 HTTP 캐시를 손쉽게 처리
    • 요청된 경로와 물리적인 저장 경로를 매핑하는 역할
    • 리소스의 저장 경로에 클래스패스의 디렉터리나 문서 루트 디렉터리 혹은 임의의 디렉터리 지정가능

임의의 디렉터리에 저장된 파일에 접근

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {}
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
          .addResourceLocations("classpath:/static/");
    }
}

캐시제어

HTTP 캐시 제어

  • HTTP 캐시를 제어하는 기능
    • If-Modified-Since 해더값과 리소스의 최종 수정 일시를 비교
      • 만약 리소스가 갱신되지 않았으면 HTTP 304상태 (Not Modified) 반환
    • 기본구현에서는 캐시의 유효기간이 설정되지 않아 캐시에 대한 동작은 브라우저 사양에 의존

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
      .addResourceLocations("classpath:/static/")
      .setCachePeriod(604800); // 유효기간을 초단위로 지정 (604800 = 7일)
}

캐시를 세밀하게 제어할 때 (CacheControl클래스 이용)

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
      .addResourceLocations("classpath:/static/")
      .setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS).cachePublic());
}

ResourceResolver & ResoureceTransformer

  • ResourceHttpRequestHandler
    • 정적리소스에 접근하는 다양한 방법을 제공
    • 버전 정보가 포함된 경로로 정적리소스를 접근하는 방법
    • Gzip으로 압축된 정적 리소스에 접근하는 방법
    • Webjars로 관리되는 정적 리소스에 대해 버전 번호를 은폐시켜 접근하는 방법

종류

  • ResourceResolver 인터페이스
    • 정적리소스에 접근할 수 있도록 URL과 서버 상의 물리적인 정적 리소스를 매핑
    • 구현클래스
      • VersionResourceResolver
        • 버전정보를 포함한 URL 경로와 서버 상의 물리적인 정적 리소스를 매핑
        • 버저닝 방법으로 콘텐츠 데이터의 MD5 해시값을 사용하는 방법과 특정 버전 정보를 명시하는 방법을 지원
      • GzipResourceResolver
        • URL에 대응하는 정적리소스 gzip파일(.gz)을 사용
      • WebJarsResourceResolver
        • WebJars의 URL에서 버전부분을 은폐하는 역할
  • ResoureceTransformer 인터페이스
    • 정적 리소스의 콘텐츠 데이터를 변환하는 역할
    • 구현클래스
      • CssLinkResourceTransformer
        • CSS파일의 경로를 URL로 변환
      • AppCacheManifestTransformer
        • HTML5의 AppCache manifest 파일 경로를 URL로 변환
        • manifest 파일의 주석에 콘텐츠 해시값을 추가

버전정보를 포함한 경로로 정적 리소스 접근

public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
      .addResourceLocations("classpath:/static/")
      .resourceChain(true)
      .addResolver((new VersionResourceResolver()).addContentVersionStrategy("/**"));
}
  • ResourceResolver & ResoureceTransformer의 실행 결과를 캐시할지 결정
    • 캐시하고 싶다면 true 지정
    • 만약 변경이 자주 발생하는 로컬 개발이라면 false로 설정
  • VersionResourceResolver를 추가
    • addContentVersionStrategy()로 버저닝을 적용할 리소스 패턴을 설정
    • 예제는 "/static/" 하위의 모든 리소스에 적용
    • VersionResourceResolver를 추가시에 CssLinkResourceTransformer도 자동추가

정적리소스에 접근하기위한 경로를 JSP 태그 라이브러리나 타임리프 다이얼렉트등에 사용하게 만든 예 (web.xml)

<filter>
  <filter-name>ResourceUrlEncodingFilter</filter-name>
  <filter-class>
    org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
  </filter-class>
</filter>
<filter-mapping>
  <filter-name>ResourceUrlEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
  • 뷰에서 태그 라이브러리를 사용해 정적리소스에 접근할 수 있음

<!-- 뷰(JSP)에서 경로를 설정한 예 -->
<link href="<c:url value='/static/css/app.css' />" type="text/css" rel="stylesheet" />

<!-- 버전정보가 포함된 경로 -->
<link href="/static/css/app-sa67d7cd7d6ddf7c.css" type="text/css" rel="stylesheet" />

Created by MoonsCoding

e-mail :: jm921106@gmail.com

반응형

'Spring > MVC' 카테고리의 다른 글

학습 // Spring // MVC // Test  (2) 2018.08.22
학습 // Spring // MVC // Locale  (0) 2018.08.21
학습 // Spring // MVC // 공통처리  (0) 2018.08.21
학습 // Spring // MVC // Async  (0) 2018.08.21
학습 // Spring // MVC // FileUpload  (0) 2018.08.21