Back-end/Spring

SpringBoot - MVC Static Resource(정적 리소스)

Tigger 2020. 6. 27. 23:42

Static Resource(정적 리소스)

클라이언트가 요청하면 기존에 만들어져있는걸 그냥 응답(보내)주면 되는 경우에 사용합니다.
기본적인 Mapping(매핑) 경로는 /** 입니다.

기본 리소스 위치

  • classpath:/static
  • classpath:/public
  • classpath:/resources/
  • classpath:/META-INF/resources
StaticResource

위치에 html 파일을 생성하게 되면 자동으로 Root(기본) 경로로 매핑됩니다.

정적 리소스의 원리

정적 리소스가 어떻게 구동되는지 원리를 알아봅시다.

StaticResource

최초 클라이언트에서 요청을 보냈을 때 304가 출력됩니다.

StaticResource

이러한 요청에 대해서 응답을 보내면 200이 출력됩니다.

이런 status는 어떻게 나온걸까요?
이를 알기위해선 If-Modyfied-Since, Last-Modified의 관계를 알아야합니다.

status가 304일 때

StaticResource

304는 클라이언트의 요청이 들어오고 그 요청이 가장 최신이라면 나타나는 상태입니다.
If-Modyfied-SinceLast-Modified가 같을 때를 의미하게 됩니다.

If-Modyfied-Since == Last-Modified

status가 200일 때

StaticResource

200은 클라이언트의 요청이 들어온 후 응답을 주게 되면 나타나는 상태입니다.
즉, If-Modyfied-Since가 Last-Modified보다 빠른 시간이라는 것입니다.

If-Modyfied-Since < Last-Modified

만약 여기서 응답을 준 후 페이지를 Reload하게 되면 다시 304 상태로 돌아가게 됩니다.

리소스 위치 변경하기

기본 리소스 위치에서 추가로 등록하는 방법이 있습니다.

spring.mvc.static-path-pattern

기존에 Root로 매핑이 되어있다면 해당 Key를 이용하여 Root를 변경할 수 있습니다.

StaticResource

properties에 spring.mvc.static-path-pattern을 추가하여 내가 매핑하고 싶은 위치를 선언합니다.

StaticResource

서버재시작 후 해당 경로로 가면 동일한 HTML이 출력됩니다.

spring.mvc.static-locations

위 Key도 마찬가지로 Root를 바꾸는 것이지만 기존 경로를 전부 제외하고 새롭게 만드는 것이기 떄문에 권장하진 않습니다.

ResourceHttpRequestHandler를 활용한 커스텀

스프링 부트에서 MVC를 커스텀 할 수 있는 WebMvcConfigureraddRersourceHandlers을 활용하여 커스텀이 가능합니다.

  • 기존의 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초
    }
}
StaticResource

WebConfig 클래스를 생성하고 WebMvcConfigurer를 구현합니다.
그리고 addRersourceHandlers를 오버라이딩 하여 경로를 선언하고 캐싱을 처리합니다.

StaticResource

위에서 경로를 선언한 대로 동일 경로에 HTML을 생성합니다.

StaticResource

서버 Restart 후 경로를 입력하면 커스텀한 경로에 있는 HTML이 출력됩니다.
물론 기존에 있는 HTML도 출력됩니다.