스프링 부트 활용

정적 리소스 지원

   정적 리소스는 동적으로 생성하지 않은 것, 즉 웹 브라우저나 클라이언트 쪽에서 요청이 들어왔을 때 해당하는 리소스가 이미 만들어져 있어서 그것을 그대로 보내주면 되는 경우를 말한다. 서버에서 어떤 작업을 처리해서 요청이 들어왔을 때 뷰를 만들어 내는 것이 아니라 이미 만들어져 있는 리소스가 있고, 그것을 제공하는 방법이다.

다음 네 가지 위치에 있는 리소스들은 기본적으로 /** 요청에 mapping이 되어서 제공된다.

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

예를 들어 /hello.html이라는 요청이 들어왔을 때 /static/hello.html이 있으면 그대로 전달하는 것이다. 직접 확인해 보자.

resource의 static 디렉토리 안에 hello.html 파일을 만들어준다.


그리고 애플리케이션을 실행한 후 localhost:8080/hello.html로 들어가보면 응답이 제대로 된 것을 확인할 수 있다.


   기본적으로 이런 리소스들, url 패턴은 root부터 mapping이 되어있다. 만약 이 mapping을 변경하고 싶다면 properties를 사용하면 된다.
application.properties 안에 spring.mvc.static-path-pattern = 으로 값을 변경해주면 된다.

spring.mvc.static-path-pattern=/static/**

위와 같이 선언을 하게 되면, 전부 static루트부터 값을 요청해야 한다.



커스터마이징

   정적 리소스 요청은 ResourceHttpRequestHandler가 처리하는 것이다. 기본적으로 제공되는 resource handler는 유지하면서 새로운 resource handler를 추가해서 커스터마이징 할 수 있다.

WebMvcConfigureraddResourceHandlers를 사용하는 방법을 살펴보자.

package me.gracenam.demospringmvc.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/m/**")
                .addResourceLocations("classpath:/m/")
                .setCachePeriod(20);
    }
}

src/main/java 디렉토리 아래에 config 패키지를 추가하고 WebConfig 클래스를 만든다. 그리고 addResourceHandlers 메서드를 사용하여 새로운 resource handler를 추가해주었다.
m이라는 요청이 오는 경우를 resource handler로 추가해주었는데 이제 classpath 아래에 m 디렉토리를 만들고 hello.html을 만들어준다.



기본적으로 스프링이 제공해주는 Resource handler는 캐싱 전략이 필요없지만 커스터마이징 한 경우에는 캐싱 전략을 별도로 해주어야 한다.


Reference