부트 개념과 활용-16.정적 리소스 지원(웹 MVC)
스프링 웹 MVC 4부: 정적 리소스 지원
정적 리소스란? 동적으로 생성하지 않는 것
예를 들면 웹브라우저/클라이언트에서 요청이 들어왔을 때,
그 리소스가 이미 만들어져 있고, 만들어져 있는 걸 그대로 보내주면 되는 경우
우리가 서버에서 작업을 처리하고 요청이 들어왔을 때 뷰를 만드는게 아니라 이미 만들어진 리소스를 제공하는 것.
정적 리소스 맵핑 “/**”
- 기본 리소스 위치
- classpath:/static
- classpath:/public
- classpath:/resources/
- classpath:/META-INF/resources
- spring.mvc.static-path-pattern: 맵핑 설정 변경 가능
spring.mvc.static-path-pattern=\static/**
localhost:8080/static/hello.html 이렇게 받음.
예) “/hello.html” => /static/hello.html spring.mvc.static-locations: 리소스 찾을 위치 변경 가능
(classpath 전부 오버라이딩후 여기 선언한 값들만 사용. 하지만 기본 리소스 위치를 안쓰게되니까 추천하지않음)- Last-Modified 헤더를 보고 304 응답을 보냄.
내가 파일을 변경했을 때, 요청 해더에 보면 if-modified-since 이 시각 이후에 바뀌었으면 새로 받음.
그러나 변경이 없으면, 304로 리턴. -> 해당 리소스를 다시 보내지 않음.
변경이 있으면 200으로 리턴 -> 리소스 다시 받아옴(파일이 변경된 경우)
이런 방식으로 캐싱이 구현됨. - ResourceHttpRequestHandler가 처리함.
- WebMvcConfigurer의 addRersourceHandlers로 커스터마이징 할 수 있음
@Configuration public class WebConfig implements WebMvcConfigurer { // 기존에 제공하는 리소스 핸들러는 유지하면서, 내가 원하는 리소스 핸들러만 추가 가능 // 리소스 핸들러 추가 가능 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/m/**") // m으로 시작하는 요청이 오면 .addResourceLocations("classpath:/m/") // 클래스 패스 기준으로 m디렉토리 밑에서 제공한다. .setCachePeriod(20); // 초단위 } }
- WebMvcConfigurer의 addRersourceHandlers로 커스터마이징 할 수 있음
m 디렉토리 추가하고 파일추가
localhost:8080/hello.html = resources/static 디렉토리에 있는 hello.html
localhost:8080/m/hello.html = resources/m 디렉토리에 있는 hello.html