부트 개념과 활용-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); // 초단위
      }
      }
      

m 디렉토리 추가하고 파일추가
localhost:8080/hello.html = resources/static 디렉토리에 있는 hello.html
localhost:8080/m/hello.html = resources/m 디렉토리에 있는 hello.html




© 2019. by jaeuk