초웹개_스프링5_SpringMVC(2)

네코·2022년 5월 16일
0

초웹개

목록 보기
9/10
post-thumbnail

스프링 mvc 핵심 구성 요소

DispatcherServlet
HandlerMapping
HandlerAdapter
ViewResolver
View

컨트롤러와 핸들러

  • 컨트롤러 : 클라이언트의 요청을 실제로 처리한다.

  • HandlerMapping : DispatcherServlet이 요청을 처리할 컨트롤러의 검색을 위임한다.
    스프링 MVC는 웹 요청을 처리하는 객체를 핸들러라고 표현하고 @Controller 적용 객체나 Controller 인터페이스를 구현한 객체 모두는 스프링 MVc입장에서 핸들러 객체가 된다.
    따라서 특정 요청 경로를 처리해주는 핸들러를 찾아주는 객체를 HandlerMapping 이라고 부른다.

  • HandlerApater : DispatcherServlet은 핸들러 객체의 타입과는 상관없이 결과를 ModelAndView타입으로 받기만 하면된다. 핸들러에 따라 리턴타입은 다를 수가 있다. 이 때 HandlerAdapter가 핸들러의 결과를 ModelAndView타입으로 변환 처리해준다.
    DispatcherServlet은 HandlerAdapter 빈에게 요청 처리를 위임하면, HandlerAdapter가 알맞은 메서드를 호출해서 요청을 처리하고 결과를 DispatcherServlet에 반환한다.

DispatcherServlet

web.xml 파일에서
DispatcherServlet는 contextConfiguration 초기화 파라미터에 전달받은 스프링 설정 클래스 목록으로 스프링 컨테이너를 생성한다.
이 컨테이너 내부에 HandlerMapping, HandlerAdapter,컨트롤러 빈, ViewResolver의 빈에 대한 정의가 포함되어야한다.

HandlerMapping,HandlerAdapter 설정

EnableWebMvc 애노테이션을 설정파일에 추가함

위 설정은 다양한 스프링 빈을 추가한다.
그 중

  • org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
  • org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
    가 포함되어 있다.

두번째 RequestMappingHandlerAdapter 클래스가 Model 객체를 생성해서 인자로 전달해주는 것이다.
만약 컨트롤러 메서드 반환 값이 String이면 해당 값을 뷰 이름으로 갖는 ModelAndView객체를 생성해서 전달한다. 이 때 Model 객체 내의 값도 ModelAndView에 함께 전달된다.

WebMvcConfigurer 인터페이스와 설정

@EnableWebMvc 사용하면 WebMvcConfigurer 타입의 빈을 이용해서 MVC 설정을 추가 생성한다.

디폴트 핸들러와 HandlerMapping의 우선순위

매핑 경로가 '/'인 경우, .jsp로 끝나느 요청을 제외한 모든 요청을 DispatcherServlet이 처리한다.

이때 @EnableWebMvc애노테이션이 등록하는 HandlerMapping은 @Controller 애노테이션을 적용한 빈 객체가 처리할 수 있는 요청 경로만 대응할 수 있다.

따라서 @Controller에 대응하지 않는 요청에 대응하기 위한 컨트롤러 객체를 직접 구현할 수도 있지만 WebMvcConfigurer 인터페이스의 configureDefaultServletHandling() 메서드를 이용하면 편리하다

DefaultServletHandlerConfigurer.enable()메서드는 두가지 빈 객체를 구체한다.

  • DefaultServletHttpRequestHandler
  • SimpleUrlHandlerMapping

DefaultServletHttpRequestHandler:
클라이언트의 모든 요청을 WAS가 제공하는 디폴트 서블릿에 전달
SimpleUrlHandlerMapping:
모든 경로를 DefaultServletHttp RequestHandler를 이용해서 처리하도록 한다.

클라이언트 요청 시 처리 순서

  1. RequestMappingHandlerMapping을 통해 처리할 핸들러를 검색한다.
    존재하면 처리
  2. 존재하지 않으면 SimpleUrlHandlerMapping을 사용해서 요청을 처리할 핸들러를 검색한다.
    2-1. DefaultServletHttpRequestHandler을 리턴.
    2-2. DispatcherServlet은 DefaultServletHttpRequestHandler에 처리를 요청
    2-3. DefaultServletHttpRequestHandler는 디폴트 서블릿에 처리를 위임.

0개의 댓글