Gidhub BE Developer

Spring의 Resource Handler 알아보기

2020-01-24
goodGid

이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.

Resource Handler

  • Resource Handler란

  • 정적인 Resource를 처리하기 위해 사용되는 Handler이다.


  • 기본적으로

  • Servlet Container(톰캣, 제티, 언더토우 등등)에는

  • 정적인 자원을 처리할 수 있는

  • Default Servlet이 등록되어 있다.


  • 그렇기 때문에

  • 프로젝트를 생성하고

  • 아무 설정을 하지 않더라도

  • Resource 요청을 하면

  • 동작이 된다.


  • 만약 특정 요청에 대한

  • Resource를 Control할 필요가 있다면

  • Resource Handler를 정의해서

  • Config에 등록해줘야한다.

Code

Project Directory

  • 스프링 부트 환경에서

  • 프로젝트를 생성하면

  • Resource의 Directory는 다음과 같다.


  • static Directory는

  • 프로젝트를 생성하면

  • 자동으로 생기는 Directory이다.


  • 그리고 mobile Directory는

  • 테스트를 위해 생성한 Directory이다.

mobile/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<h1>hello mobile</h1>
</body>
</html>

static/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<h1>hello index</h1>
</body>
</html>

Config

WebConfig

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/mobile/**")
                .addResourceLocations("classpath:/mobile/")
                .setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES));
    }
}
  • WebConfi에

  • 원하는 옵션과 설정으로

  • ResourceHandler를 등록한다.

Test Code

SimpleControllerTest

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
class SimpleControllerTest {

    @Autowired
    MockMvc mockMvc;

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

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

}
  • defaultStatic 메소드는

  • Servlet Container의

  • Default Servlet을 사용한다.


  • customStatic 메소드는

  • 등록한 Resource Handler를 사용한다.

customStatic()의 Response

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [
              Vary:"Origin", 
              "Access-Control-Request-Method", 
              "Access-Control-Request-Headers", 
              Last-Modified:"Thu, 16 Jan 2020 23:44:38 GMT", 

              <!--  설정했던 Cache 값이 나온다. -->
              Cache-Control:"max-age=600", 

              Content-Length:"142", 
              Content-Type:"text/html",
              Accept-Ranges:"bytes"
              ]
     Content type = text/html
             Body = <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<h1>hello mobile</h1>

</body>
</html>
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
  • Resource Handler를 등록할 때

  • 설정했던 Cache값이

  • Response의 Headers에 담겨온다.

Summary

  • Resource Handler의 개념에 대해 알아봤다.

  • Resource Handler 개념을 작 숙지하고 이해하여

  • 정적인 Resource를 Control 해야하는 상황에서

  • Resource Handler 개념을 활용하도록 하자.


Reference


Comments

Index