[스프링 웹 MVC] 스프링 부트의 스프링 MVC 설정
스프링 부트의 스프링 MVC 설정
handlerMappings
-
SimpleUrlHandlerMapping
- 파비콘 요청을 처리해주는 mapping
-
RequestMappingHandlerMapping
- 애노테이션 기반의 MVC를 mapping
- order : 0
-
BeanNameUrlHandlerMapping
-
SimpleUrlHandlerMapping
-
resourceHandlerMapping
-
src/main/resources/static 디렉토리 안에 들어있는 static한 리소스들에 캐싱 관련된 정보들이 추가된다.
-
Ex. 리소스 변경이 이루어지지 않을 시 not modified라는 응답(304)을 보내, 브라우저가 캐싱하고 있는 리소스를 그대로 사용할 수 있도록 처리해준다.
-
스프링 부트가 설정해놓은 static한 디렉토리 경로들
-
-
-
WelcomePageHandlerMapping
- resourceHandlerMapping
handlerAdpaters
- RequestMappingHandlerAdapter
- 실제 요청을 처리하는, 핸들러를 실행해줄 수 있는 adapter
- 애노테이션 기반의 requestMapping을 처리해줄 수 있는 adapter
- HttpRequestHandlerAdapter
- SimpleControllerHandlerAdapter
viewResolvers
-
ContentNegotiatingViewResolver
-
ContentNegotiatingViewResolver는 직접 view 이름에 해당하는 viewResolver를 찾는 것이 아니라, 밑 네개의 viewResolver들에게 위임하는 것이다.
-
그래서 ContentNegotiatingViewResolver는 네개의 viewResolver를 참조하고 있고, 요청 정보를 분석하여 적절한 viewResolver를 선택하는 것이다.
-
그래서 우선 순위가 가장 높다! 즉, -214...이다.
-
-
ThymleafViewResolver의 경우 우리가 추가해줘서 viewResolver에 추가된 것이다.
스프링 부트의 주관이 적용된 자동 설정이 동작한다.
-
JSP보다 Thymleaf를 선호
-
JSON 지원
-
정적 리소스 지원
-
즉, 스프링 부트를 사용하게 되면, 다른 설정이 지정되어 있지 않아도 자동 설정을 활용하여 어플리케이션을 개발할 수 있다.
-
Ex. autoconfigure에 thymeleaf를 활용한 경우
@GetMapping("/events") public String events(Model model) { model.addAttribute("events", eventService.getEvent()); return "events"; }
- prefix = classpath:/templates
- suffix = .html
- autoconfigure에 prefix와 suffix가 default로 설정되어 있어, resources/templates/events.html에 설정한 view를 찾아갈 수 있는 것이다.
-
스프링 MVC 설정 커스터마이징
-
application.properties(스프링 부트)
#Ex prefix, suffix 커스터마이징 spring.thymeleaf.prefix = "classpath:/static" spring.thymeleaf.suffix = ".html"
-
@Configuration + Implements WebMvcConfigurer : 스프링 부트의 스프링 MVC 자동설정 + 추가 설정
- 가장 합리적인 방법으로서, 스프링 부트가 제공하는 모든 설정을 사용하면서 사용자가 필요로하는 설정만 추가하는 방법이다.
@Configuration public class WebConfig implements WebMvcConfigurer { //dispatcherServlet 재정의 @Override public void addFormatters(FormatterRegistry registry) { } }
- @Configuration + @EnableWebMvc + Implements WebMvcConfigurer : 스프링 부트의 스프링 MVC 자동설정을 사용하지 않은 것.
-
@EnableWebMvc를 사용하게 되면,
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/", ".jsp"); } }
-
@EnableWebMvc가 import하는 @Import({DelegatingWebMvcConfiguration.class})이 들어오면서 configureViewResolvers 메소드 등 구현한 메소드들이 빈으로 등록이 된다.
-
그로 인해, WebConfig 및 DispatcherServlet을 커스텀한 메소드들이 빈으로 등록되어 있기 때문에, 다시 말해 WebMvcConfigurationSupport에 해당하는 빈들이 있기 때문에
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { }
-
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) ... public class WebMvcAutoConfiguration { }
- @ConditionalOnMissingBean({WebMvcConfigurationSupport.class})의 조건에 대해 위배되면서 WebMvcAutoConfiguration 클래스의 설정파일(스프링 부트에서 사용하는 설정파일)을 사용하지 않게 되는 것이다.
- Implements WebMvcConfigurer를 사용하는 이유는 DispatcherServlet을 커스터마이징하기에 편함으로 사용하는 것이다.
- Implements WebMvcConfigurer를 사용하지 않으면, DispatcherServlet을 커스터마이징하기 위해 일일히 Bean으로 설정해줘야 한다.