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에 있는 코드를 인용해 작성했다.

1개의 의견 from SLiPP

2018-09-30 11:37

위 방식으로 처리하려고 하다 번거로운 점이 생겨 다음과 같이 파일을 versining하기 보다 폴더를 versioning하는 방법으로 문제를 해결했다.

폴더에 대한 versioning은 웹의 정적 리소스의 버전 명시를 통한 캐시 전략에서 아이디어를 얻었으며, 동적으로 version을 구하는 방법은 Automagically generate version of a Spring Boot Application 문서를 참고해 적용했다.

의견 추가하기