티스토리 뷰

반응형

스프링 부트의 스프링 MVC 설정

handlerMappings

image

  • SimpleUrlHandlerMapping

    • 파비콘 요청을 처리해주는 mapping
  • RequestMappingHandlerMapping

    • 애노테이션 기반의 MVC를 mapping
    • order : 0
  • BeanNameUrlHandlerMapping

  • SimpleUrlHandlerMapping

    • resourceHandlerMapping

      • src/main/resources/static 디렉토리 안에 들어있는 static한 리소스들에 캐싱 관련된 정보들이 추가된다.

      • Ex. 리소스 변경이 이루어지지 않을 시 not modified라는 응답(304)을 보내, 브라우저가 캐싱하고 있는 리소스를 그대로 사용할 수 있도록 처리해준다.

      • 스프링 부트가 설정해놓은 static한 디렉토리 경로들

        image
  • WelcomePageHandlerMapping

    • resourceHandlerMapping

 

 

handlerAdpaters

image

  • RequestMappingHandlerAdapter
    • 실제 요청을 처리하는, 핸들러를 실행해줄 수 있는 adapter
    • 애노테이션 기반의 requestMapping을 처리해줄 수 있는 adapter
  • HttpRequestHandlerAdapter
  • SimpleControllerHandlerAdapter

 

 

viewResolvers

image

  • ContentNegotiatingViewResolver

    • ContentNegotiatingViewResolver는 직접 view 이름에 해당하는 viewResolver를 찾는 것이 아니라, 밑 네개의 viewResolver들에게 위임하는 것이다.

      image
    • 그래서 ContentNegotiatingViewResolver는 네개의 viewResolver를 참조하고 있고, 요청 정보를 분석하여 적절한 viewResolver를 선택하는 것이다.

    • 그래서 우선 순위가 가장 높다! 즉, -214...이다.

  • ThymleafViewResolver의 경우 우리가 추가해줘서 viewResolver에 추가된 것이다.

    image

 

 

스프링 부트의 주관이 적용된 자동 설정이 동작한다.

  • 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 자동설정을 사용하지 않은 것.
  1. @EnableWebMvc를 사용하게 되면,

    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
    
      @Override
      public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/", ".jsp");
      }
    }
  2. @EnableWebMvc가 import하는 @Import({DelegatingWebMvcConfiguration.class})이 들어오면서 configureViewResolvers 메소드 등 구현한 메소드들이 빈으로 등록이 된다.

  3. 그로 인해, WebConfig 및 DispatcherServlet을 커스텀한 메소드들이 빈으로 등록되어 있기 때문에, 다시 말해 WebMvcConfigurationSupport에 해당하는 빈들이 있기 때문에

    public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    }
  4. @ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
    ...
    public class WebMvcAutoConfiguration {
    }
    • @ConditionalOnMissingBean({WebMvcConfigurationSupport.class})의 조건에 대해 위배되면서 WebMvcAutoConfiguration 클래스의 설정파일(스프링 부트에서 사용하는 설정파일)을 사용하지 않게 되는 것이다.

 

 

  • Implements WebMvcConfigurer를 사용하는 이유는 DispatcherServlet을 커스터마이징하기에 편함으로 사용하는 것이다.
  • Implements WebMvcConfigurer를 사용하지 않으면, DispatcherServlet을 커스터마이징하기 위해 일일히 Bean으로 설정해줘야 한다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함