April
22nd,
2021
이번 시간에는 스프링 부트가 제공하는 스프링 MVC에 대해 알아본다.
디버깅 과정
HandlerMapping
앞서 진행했던 방식과 동일하게 스프링 부트에서 doService에 디버거를 찍어놓고, 어떤 인터페이스 구현체를 가지고 있는지 확인해보자.
총 5개의 HandlerMapping이 등록되어 있다. 여기서 이전에는 보지 않았던 SimpleUrlHandlerMapping에 대해 자세히 알아보자.
이 구현체는 resourceHandlerMapping을 빈으로 등록하고 있다. 스프링부트가 지원하는 정적 리소스 지원 기능은 이 핸들러를 통해서 구현되었다. resources/static등 디렉토리 안에 들어 있는 static 리소스들에다가 resourceHandlerMapping을 적용하면 캐싱 관련 정보들이 응답 헤더에 추가된다.
HandlerAdapter
위와 같이 스프링 부트에서는 총 4개의 핸들러 어댑터를 등록한다.(기존엔 HandlerFunctionAdapter가 없었는데, 버전이 업되면서 추가된 것 같다.)
RequestMappingHandlerAdapterHandlerFunctionAdapterHttpRequestHandlerAdapterSimpleControllerHandlerAdapter
ViewResolver
ViewResolver는 총 5개를 등록한다.ContentNegotiatingViewResolver는 자기가 직접 어떤 뷰 이름에 해당하는 뷰를 찾아주는 것이 아니라, 다른 ViewResolver에게 요청을 위임한다.(내부적으로 보면 다른 4개의 ViewResolver를 참조하는 것을 볼 수 있다.) 즉, 나머지 4개의 ViewResolver는 ContentNegotiatingViewResolver에게 요청을 받아 처리하게 된다.
ContentNegotiatingViewResolverBeanNameViewResolverThymeleafViewResolverViewResolverCompositeInternalSourceViewResolver
스프링 MVC 커스터마이징 방법
application.properties: 가장 간단하고 확실하게 구현하는 방법@Configuration+ implements WebMvcConfigurer: 스프링 부트의 스프링 MVC 자동 설정 + 추가 설정 (더 합리적)@Configuration+@EnableWebMvc+ implements WebMvcConfigurer : 스프링 부트의 스프링 MVC 자동설정을 사용하지 않음
참고자료