스프링 MVC 설정(8) : WebMvcConfigure - 리소스 핸들러

de_sj_awa·2021년 6월 27일
0

11. 리소스 핸들러

이미지, 자바스크립트, CSS 그리고 HTML 파일과 같은 정적인 리소스를 처리하는 핸들러 등록하는 방법

디폴트(Default) 서블릿

스프링 MVC 리소스 핸들러 맵핑 등록

  • 가장 낮은 우선 순위로 등록.
    - 다른 핸들러 맵핑이 “/” 이하 요청을 처리하도록 허용하고
    - 최종적으로 리소스 핸들러가 처리하도록.
  • DefaultServletHandlerConfigurer
  1. resources/static 폴더 아래에 index.html 작성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello index</h1>
</body>
</html>
  1. 테스트 코드 작성
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void helloStatic() throws Exception {
        this.mockMvc.perform(get("/index.html"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string(Matchers.containsString("Hello index")));
    }
}

리소스 핸들러 설정

  • 어떤 요청 패턴을 지원할 것인가
  • 어디서 리소스를 찾을 것인가
  • 캐싱
  • ResourceResolver: 요청에 해당하는 리소스를 찾는 전략
    - 캐싱, 인코딩(gzip, brotli), WebJar, ...
  • ResourceTransformer: 응답으로 보낼 리소스를 수정하는 전략
    - 캐싱, CSS 링크, HTML5 AppCache, ...
  1. resources/mobile 폴더 아래에 index.html 생성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello Mobile</h1>
</body>
</html>
  1. WebMvcConfigurer에 리소스 핸들러 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/mobile/**")
                .addResourceLocations("classpath:/mobile/")
                .setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES));
    }
}

java도 classpath 루트가 되고 resources도 classpath 루트가 된다. classpath 접두어를 붙이지 않으면 src/main/webapp에서 리소스를 찾게 된다.

  1. 테스트 코드
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void helloStatic() throws Exception {
        this.mockMvc.perform(get("/index.html"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string(Matchers.containsString("Hello index")));
    }

    @Test
    public void mobilehelloStatic() throws Exception {
        this.mockMvc.perform(get("/mobile/index.html"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string(Matchers.containsString("Hello Mobile")))
                .andExpect(header().exists(HttpHeaders.CACHE_CONTROL));
    }

참고

profile
이것저것 관심많은 개발자.

0개의 댓글