Static Resource(정적 리소스)
클라이언트가 요청하면 기존에 만들어져있는걸 그냥 응답(보내)주면 되는 경우에 사용합니다.
기본적인 Mapping(매핑) 경로는 /** 입니다.
기본 리소스 위치
- classpath:/static
- classpath:/public
- classpath:/resources/
- classpath:/META-INF/resources
위치에 html 파일을 생성하게 되면 자동으로 Root(기본) 경로로 매핑됩니다.
정적 리소스의 원리
정적 리소스가 어떻게 구동되는지 원리를 알아봅시다.
최초 클라이언트에서 요청을 보냈을 때 304가 출력됩니다.
이러한 요청에 대해서 응답을 보내면 200이 출력됩니다.
이런 status는 어떻게 나온걸까요?
이를 알기위해선 If-Modyfied-Since, Last-Modified의 관계를 알아야합니다.
status가 304일 때
304는 클라이언트의 요청이 들어오고 그 요청이 가장 최신이라면 나타나는 상태입니다.
즉 If-Modyfied-Since와 Last-Modified가 같을 때를 의미하게 됩니다.
If-Modyfied-Since == Last-Modified
status가 200일 때
200은 클라이언트의 요청이 들어온 후 응답을 주게 되면 나타나는 상태입니다.
즉, If-Modyfied-Since가 Last-Modified보다 빠른 시간이라는 것입니다.
If-Modyfied-Since < Last-Modified
만약 여기서 응답을 준 후 페이지를 Reload하게 되면 다시 304 상태로 돌아가게 됩니다.
리소스 위치 변경하기
기본 리소스 위치에서 추가로 등록하는 방법이 있습니다.
spring.mvc.static-path-pattern
기존에 Root로 매핑이 되어있다면 해당 Key를 이용하여 Root를 변경할 수 있습니다.
properties에 spring.mvc.static-path-pattern을 추가하여 내가 매핑하고 싶은 위치를 선언합니다.
서버재시작 후 해당 경로로 가면 동일한 HTML이 출력됩니다.
spring.mvc.static-locations
위 Key도 마찬가지로 Root를 바꾸는 것이지만 기존 경로를 전부 제외하고 새롭게 만드는 것이기 떄문에 권장하진 않습니다.
ResourceHttpRequestHandler를 활용한 커스텀
스프링 부트에서 MVC를 커스텀 할 수 있는 WebMvcConfigurer의 addRersourceHandlers을 활용하여 커스텀이 가능합니다.
- 기존의 Resource Handler는 건드리지 않고 추가하는 개념입니다.
- 기존의 Resource Handler는 다르게 캐싱전략이 다르므로 따로 캐싱처리를 해주어야 합니다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/m/**") // /m 으로 시작하는 요청이 오면
.addResourceLocations("classpath:/m/") // classpath 기준으로 m 디렉토리 밑에서 제공
.setCachePeriod(20); // 20초
}
}
WebConfig 클래스를 생성하고 WebMvcConfigurer를 구현합니다.
그리고 addRersourceHandlers를 오버라이딩 하여 경로를 선언하고 캐싱을 처리합니다.
위에서 경로를 선언한 대로 동일 경로에 HTML을 생성합니다.
서버 Restart 후 경로를 입력하면 커스텀한 경로에 있는 HTML이 출력됩니다.
물론 기존에 있는 HTML도 출력됩니다.