본문 바로가기

Spring

Spring ResourceHttpRequestHandler

728x90
반응형

☝ 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는 위임이 불가능하기 때문에 맨 마지막에 추가해야한다.

728x90
반응형