Spring 프레임워크에서 정적인 자원에 대한 versioning

2018-07-26 09:41

웹 애플리케이션에서 정적인 자원의 경우 캐싱을 활용해 성능을 개선할 수 있다. 그런데 캐싱을 사용할 경우 정적 자원이 변경되는 경우 이를 클라이언트에 알려주려면 versioning을 통해 해결이 가능하다.

Spring에서는 이 같은 문제를 해결하기 위해 다음과 같은 방법으로 versioning을 지원한다.

@Configuration
public class MvcApplication extends WebMvcConfigurerAdapter {
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    VersionResourceResolver versionResourceResolver = new VersionResourceResolver()
        .addVersionStrategy(new ContentVersionStrategy(), "/**");
    registry.addResourceHandler("/javascript/*.js")
        .addResourceLocations("classpath:/static/")
        .setCachePeriod(60 * 60 * 24 * 365) /* one year */
        .resourceChain(true)
        .addResolver(versionResourceResolver);
  }
  ...
}

VersionResourceResolver를 활용해 정적 자원에 대해 응답하도록 설정한다.

@ControllerAdvice
public class ResourceUrlAdvice {
  @Inject
  ResourceUrlProvider resourceUrlProvider;
  @ModelAttribute("urls")
  public ResourceUrlProvider urls() {
    return this.resourceUrlProvider;
  }
}

위와 같이 정적 자원을 접근할 수 있도록 처리하고 template engine에서 다음과 같이 사용하면 된다.

<script type="application/javascript" 
        th:src="${urls.getForLookupPath('/javascript/test.js')}">
</script>

위와 같이 구현하면 다음과 같은 version을 가지는 url을 볼 수 있다.

/javascript/test-69ea0cf3b5941340f06ea65583193168.js

이 내용은 2-Step Resource Versioning With Spring MVC에 있는 코드를 인용해 작성했다.

0개의 의견 from SLiPP

의견 추가하기