☝ ResourceHttpRequestHandler
정적 리소스를 처리하는 작업을 담당한다.
유연한 캐시설정을 허용해서 브라우저 성증에 최적화된 정적 리소스를 제공한다.
요청에 대한 리소스가 있는지 확인한 후 처음으로 발견한 리소스를 Expires와 헤더와 함께 리턴한다.
Cache-Controll, Last-Modified를 적절하게 평가해서 이미 캐시한 리소스에 대해 불필요한 오버헤드를 방지한다.
/static, /public, /resources, /META-INF/resources
디렉터리에 있는 정적컨텐츠를 사용한다.
☝ Custom Path Patterns
기본적으로 스프링은 모든 정적 컨텐츠를 루트 밑에 제공하고 있다. 기본 구성이 좋은 것 같지만
설정을 변경할 수 있다.
spring.mvc.static-path-pattern
spring.mvc.static-path-pattern=/content/**
http://localhost:8080/content/about.html에 접근하려면 위와 같이 경로를 바꿀 수 있다.
spring.web.resources.static-locations=classpath:/files/,classpath:/static-files
spring.web.resources.static-locations=file:/opt/files
resource 디렉터리를 바꿀 수 있다.
그러나 위 설정으로 변경하게 되면 스프링에서 기본으로 제공하는 네 가지 path(위 글에 빨간색)를 사용하지 않기 때문에 권장하지 않는 방법이다.
☝ Custom Spring boot
정적 리소스를 war나 파일세스템에 제공하기 위해 ResourceHandlerRegistry가 도입되었다.
웹컨텍스트 설정 클래스 내부에서 설정할 수 있다.
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
}
/resources/로 시작하는 요청이 들어오면 /resources/밑에 리소스를 반환한다.
addResourceHandler를 사용하면 기본 리소스핸들러를 유지하면서 새로운 핸들러를 추가할 수 있다.
addResourceLocation()에 전달되는 경로는 반드시 / 로 끝나야 한다.
☝ PathResourceResolver
URL패턴을 가지고 리소스를 찾는다. 기본 Resolver이다.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/","/other-resources/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
- 리소스는 3600초 동안 브라우저에서 캐시된다.
- resourceChain 리턴 타입은 ResourceChainRegistration이다. false로 설정할 경우 default PathResourceResolver만 사용한다. true면 다른 resolver를 추가로 체이닝할 수 있다.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/js/**")
.addResourceLocations("/js/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new GzipResourceResolver())
.addResolver(new PathResourceResolver());
}
GzipResourceResolver는 정적리소스를 압축함으로 네트워크 bandwidth를 최적할 경우 사용한다.
리소스 찾을 때 ResourceResolver는 다른 Resolver에게 처리를 위임할 수 있다.
PathResourceResolver는 위임이 불가능하기 때문에 맨 마지막에 추가해야한다.
'Spring' 카테고리의 다른 글
Spring @Configuration @Bean 스프링 빈 등록 방법 (0) | 2022.01.30 |
---|---|
스프링 빈 라이프 사이클(Spring Bean Life Cycle) (0) | 2022.01.30 |
Spring MVC 동작 방식 (DispatcherServlet) (0) | 2022.01.27 |
Spring boot thymeleaf 로 Error페이지 처리 (0) | 2022.01.27 |
Spring ExceptionHandler & ControllerAdvice (0) | 2022.01.27 |