spring mvc:resources를 이용한 정적 리소스 캐쉬 문제 해결 방안
라이브 운영 중인 사이트에 일부 javascript를 수정할 일이 발생하였다.
기존에 만들어져 있는 purchase() 함수의 기능 중 일부를 주석 처리하는 간단한 일이었다.
바로 주석 처리 후 테스트를 진행하였고 아무 문제가 없어 라이브에 배포하였다.
헌데, 주석 처리했던 소스의 기능이 동작을 한다는 것이다.
그 순간 떠오른 것이 캐쉬 문제였다.
긴급한 건이기에 아래와 같이 파라미터에 버전을 추가하여 사용자 브라우저에서 javascript를 재 다운로드 받도록 처리하여 재 배포하였다.
<link href="/bootstrap/css/bootstrap.css?v=20140102" rel="stylesheet">
배포가 완료된 후 고민을 하게 되었다.
매번 기존에 있는 css, js 변경 시 파라미터 뒤에 버전을 붙여준 후 배포를 해야 하는 걸까?
나의 이 고민을 이미 다른 분이 했었고, 그 분이 작성한 글을 읽은 후 해결 방법을 찾게 되었다.
해결 방법에 대한 소스 코드는 스프링 프레임워크를 기반으로 작성하게 되었다.
다음과 같이 설정을 추가하여 /static-1.0/css/common.css 와 같은 URI 패턴으로 서버에 요청이 들어오면 /resource/css/common.css 의 파일을 response 보내게 된다.
여기서 핵심은 static-1.0 의 문자열이 변경 될 때마다 사용자 브라우저에서는 정적 리소스를 재 다운로드 받을 수 있다는 것이다.
spring EL을 이용하여 properties의 app.version을 읽어 들여 static- 문자열 뒤에 버전을 붙여준다.
<mvc:resources mapping="/static-#{baseConfig['app.version']}/**" location="/resources/" />
<properties>
<comment>base config</comment>
<entry key="app.version">1.1</entry>
</properties>
jsp는 다음과 같이 코드를 작성한다.
<spring:eval expression="@baseConfig['app.version']" var="applicationVersion" />
<spring:url value="/static-{applicationVersion}" var="resourceUrl">
<spring:param name="applicationVersion" value="${applicationVersion}" />
</spring:url>
<link href="${resourceUrl}/bootstrap/css/bootstrap.css" rel="stylesheet">
앞으로 배포를 할 때에는 app.version을 변경한 후 재배포를 하면 된다.
이와 같은 방법으로 캐쉬를 회피하기 위해서는 매번 properties도 배포해야 하고, 서버 재시작도 필요하다. jsp만 배포해서 문제를 해결하면 안 될까라는 생각이 들었지만 어짜피 새로 개발된 소스를 배포할 때 war가 올라가기 때문에 큰 문제가 되지는 않을 듯 싶다.
'프로그래밍' 카테고리의 다른 글
JUnit 테스트 실행 시 src/test/resource 패키지의 설정 파일만 읽어 들일까? (3) | 2014.02.25 |
---|---|
jackson JSON 사용 중 UnrecognizedPropertyException 발생 시 (2) | 2014.02.15 |
spring security ajax session timeout 체크 방법 (1) | 2014.01.08 |
Ant style pattern 정리 (399) | 2014.01.06 |
logback if condition 사용 시 주의 사항 (0) | 2013.12.23 |
jquery는 JSON.parse()를 사용한다. (0) | 2013.10.18 |
숫자섞기 알고리즘 (0) | 2013.10.17 |
자바스크립트 inline? external? (0) | 2013.10.17 |