본문 바로가기
프로그래밍

spring mvc:resources를 이용한 정적 리소스 캐쉬 문제 해결 방안

by 탁구치는 개발자 2014. 1. 2.

라이브 운영 중인 사이트에 일부 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가 올라가기 때문에 큰 문제가 되지는 않을 듯 싶다.