이 옵션은 Resource
기반 위치 목록에서 정적 리소스를 제공하는 편리한 방법을 제공합니다.
다음 예에서는 /resources
로 시작하는 요청이 있을 경우 상대 경로를 사용하여 웹 애플리케이션 루트 아래 또는 /static
아래의 classpath에서 /public
을 기준으로 하는 정적 리소스를 찾고 제공합니다. 브라우저 캐시를 최대한 활용하고 브라우저의 HTTP 요청을 줄이기 위해 리소스는 1년의 향후 만료 기간으로 제공됩니다. Last-Modified
정보는 Resource#lastModified
에서 추론되므로 HTTP 조건부 요청은 "Last-Modified"
헤더로 지원됩니다.
다음 목록은 Java 구성을 사용하여 이를 수행하는 방법을 보여줍니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
}
}
다음 예에서는 XML에서 동일한 구성을 달성하는 방법을 보여줍니다.
<mvc:resources mapping="/resources/**"
location="/public, classpath:/static/"
cache-period="31556926" />
정적 리소스에 대한 HTTP 캐싱 지원도 참조하세요.
리소스 핸들러는 또한 최적화된 리소스 작업을 위한 도구 체인을 생성하는 데 사용할 수 있는 ResourceResolver
구현 및 ResourceTransformer
구현 체인을 지원합니다.
콘텐츠, 고정된 애플리케이션 버전 등에서 계산된 MD5 해시를 기반으로 버전이 지정된 리소스 URL에 VersionResourceResolver
를 사용할 수 있습니다. ContentVersionStrategy
(MD5 해시)는 모듈 로더와 함께 사용되는 JavaScript 리소스와 같은 몇 가지 주목할만한 예외를 제외하고는 좋은 선택입니다.
다음 예에서는 Java 구성에서 VersionResourceResolver
를 사용하는 방법을 보여줍니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
다음 예에서는 XML에서 동일한 구성을 달성하는 방법을 보여줍니다.
<mvc:resources mapping="/resources/**" location="/public/">
<mvc:resource-chain resource-cache="true">
<mvc:resolvers>
<mvc:version-resolver>
<mvc:content-version-strategy patterns="/**"/>
</mvc:version-resolver>
</mvc:resolvers>
</mvc:resource-chain>
</mvc:resources>
그런 다음 ResourceUrlProvider
를 사용하여 URL을 다시 작성하고 resolver 및 transformer의 전체 체인을 적용할 수 있습니다. 예를 들어 버전을 삽입할 수 있습니다. MVC 구성은 다른 항목에 주입될 수 있도록 ResourceUrlProvider
Bean을 제공합니다. 또한 Thymeleaf, JSP, FreeMarker 및 HttpServletResponse#encodeURL
에 의존하는 URL 태그가 있는 기타 항목에 대한 ResourceUrlEncodingFilter
를 사용하여 재작성을 투명하게 만들 수 있습니다.
EncodedResourceResolver
(예: gzipped 또는 brotli로 인코딩된 리소스 제공용)와 VersionResourceResolver
를 모두 사용하는 경우 이 순서대로 등록해야 합니다. 이는 인코딩되지 않은 파일을 기반으로 콘텐츠 기반 버전이 항상 안정적으로 계산되도록 보장합니다.
WebJars의 경우 /webjars/jquery/1.2.0/jquery.min.js
와 같은 버전이 있는 URL이 권장되며 이를 사용하는 가장 효율적인 방법입니다. 관련 리소스 위치는 Spring Boot를 사용하여 즉시 구성되며(또는 ResourceHandlerRegistry
를 통해 수동으로 구성할 수 있음) org.webjars:webjars-locator-core
종속성을 추가할 필요가 없습니다.
/webjars/jquery/jquery.min.js
와 같은 버전 없는 URL은 org.webjars:webjars-locator-core
라이브러리가 classpath에 있을 때 자동으로 등록되는 WebJarsResourceResolver
를 통해 지원됩니다. 자동으로 등록 되는 대신 애플리케이션 시작 속도가 느려질 수 있습니다. resolver는 jar 버전을 포함하도록 URL을 다시 작성할 수 있으며 버전 없이 들어오는 URL과 일치시킬 수도 있습니다. 예를 들어 /webjars/jquery/jquery.min.js
에서 /webjars/jquery/1.2.0/jquery.min.js.
로.
[Tip]
ResourceHandlerRegistry
를 기반으로 하는 Java 구성은 세밀한 제어를 위한 추가 옵션을 제공합니다. 예를 들어, 마지막으로 수정된(last-modified) 동작 및 최적화된 리소스 resolution.