헤르메스 LIFE

[Spring MVC] cache-period 설정 본문

Spring Framework

[Spring MVC] cache-period 설정

헤르메스의날개 2016. 3. 15. 01:30
728x90


출처 : http://cizel.kr/bbs/board.php?bo_table=10_16&wr_id=982&sfl=mb_id%2C1&stx=api

CSS, JS, 이미지 등의 자원은 거의 변하지 않기 때문에, 웹 브라우저에 캐시를 하면 네트워크 사용량, 서버 사용량, 웹 브라우저의 반응 속도 등을 개선할 수 있다. 이런 정적 자원은 보통 별도 웹 서버에서 제공하기 때문에 웹 서버의 캐시 옵션 설정을 통해 웹 브라우저 캐시를 활성화시킬 수 있다. 하지만, 스프링 MVC를 이용하는 웹 어플리케이션에 정적 자원 파일이 함께 포함되어 있다면 웹 서버 설정을 사용하지 않고 <mvc:resources> 설정을 이용해서 웹 브라우저 캐시를 사용하도록 지정 할 수 있다.


<mvc:resources> 태그의 각 속성은 다음과 같다.

  • mapping: 요청 경로 패턴을 설정한다. 컨텍스트 경로를 제외한 나머지 부분의 경로와 매핑된다.
  • location: 웹 어플리케이션 내에서 요청 경로 패턴에 해당하는 자원의 위치를 지정한다. 위치가 여러 곳일 경우 각 위치를 콤마로 구분한다.
  • cache-period: 웹 브라우저에 캐시 시간 관련 응답 헤더를 전송한다. 초 단위로 캐시 시간을 지정하며, 이 값이 0일 경우 웹 브라우저가 캐시하지 않도록 한다. 이 값을 설정하지 않으면 캐시 관련된 응답 헤더를 전송하지 않는다.

출처 : http://kdarkdev.tistory.com/285


Spring MVC 브라우저 캐쉬 제어 설정


기본적인 browser cache 설정 방안

1. static resource에 대해서는 <mvc:resources> element의 cache-period 값 설정

2. dynamic resource에 대해서는 Spring에서 제공하는 WebContentInterceptor의 cacheSeconds 값 설정


* <mvc:resources> 설정

Spring Servlet Context 파일에 설정


설정 예

<mvc:resources mapping="/js/**" location="/js/" cache-period="86400"/>
<mvc:resources mapping="/style/**" location="/style/" cache-period="86400"/>
<mvc:resources mapping="/image/**" location="/image/" cache-period="31556926"/>


cache-period

  • Specifies the cache period for the resources served by this resource handler, in seconds.
  • The default is to not send any cache headers but rather to rely on last-modified timestamps only.
  • Set this to 0 in order to send cache headers that prevent caching, or to a positive number of seconds in order to send cache headers with the given max-age value.


* WebContentInterceptor 설정

Spring Servlet Context 파일에 설정


설정 예 1) /api 아래에 대해서 웹 브라우저 cache 방지

<mvc:interceptors>
     <mvc:interceptor>
          <mvc:mapping path="/api/**/*"/>
          <bean class="org.springframework.web.servlet.mvc.WebContentInterceptor">
               <property name="cacheSeconds" value="0"/>
          </bean>
     </mvc:interceptor>
</mvc-interceptors>


설정 예 2) /api 아래에 대해서 웹 브라우저 cache 방지, 예외적으로 사진은 하루 동안 cache

<mvc:interceptors>
     <mvc:interceptor>
          <mvc:mapping path="/api/**/*"/>
          <bean class="org.springframework.web.servlet.mvc.WebContentInterceptor">
               <property name="cacheSeconds" value="0"/>
               <property name="cacheMappings">
                   <props>
                      <prop key="/api/photo/**">86400</prop>
                   </props>
               </property>
           </bean>
     </mvc:interceptor>
</mvc-interceptors>


WebContentInterceptor Cache 관련 속성

1) cacheSeconds

  • Cache 기간, 초단위 (기본값: -1)
    cacheSeconds < 0cache 관련 헤더를 설정하지 않음
    cacheSeconds == 0
    cache 방지

    Pragma: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Cache-Control: max-age=0, no-cache, no-store
    cacheSeconds > 0
    cache

    Expires: Wed, 03 Jul 2013 05:58:02 GMT
    Cache-Control: max-age=31536000
2) useExpiresHeader
  • Expires 헤더 사용 여부 (기본값: true)
3) useCacheControlHeader
  • Cache-Control 헤더 사용 여부 (기본값: true)
4) useCacheControlNoStore
  • Cache 방지 시(cacheSeconds=0)에 Cache-Control 헤더를 사용할 경우 no-store를 함께 설정할지 여부 (기본값: true)

(*) Annotation을 사용해서 개별 Controller의 메소드에서 Cache 설정을 하고자 할 경우에는 https://github.com/foo4u/spring-mvc-cache-control을 참고하면 된다.







728x90