Spring MVC 구조

Soso K·2022년 10월 5일
0

(그림 출처 - (인프런) 스프링 MVC 1편 - 김영한)

요청 흐름

  1. 핸들러 조회
  2. 핸들러를 처리할 수 있는 핸들러 어댑터 조회
  3. handle(handler)
  4. 핸들러어댑터에서 handler 호출
  5. 핸들러(컨트롤러)가 ModelAndView 반환
  6. ViewResolver 호출
  7. ViewResolver가 View 반환
  8. render(model) 호출

DispatcherServlet 등록하는 법

  • Spring : web.xml을 통해 등록
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/classes/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  • Spring Boot
    • Spring Boot에서는 DispatcherServlet을 자동으로 등록해주기 때문에 수동으로 등록해주지 않아도 됨

- `DispatcherServletConfiguration` 에서 `DispatcherServlet`을 bean으로 등록
    
    → dependency에서 해당 configuration을 갖고 있는 것으로 확인
    

코드를 통해 알아보는 DispatcherServlet 요청 Flow

  1. 핸들러 조회 (1036 Line) → 요청을 처리할 Controller 조회

  1. 핸들러 어댑터 조회 (1043 Line)

- HandlerAdapter 리스트를 순회하며 파라미터로 넘어온 handler를 지원하는지 확인
    - RequestMappingHandlerAdapter가 조회됨

  1. handle(handler)
  2. 핸들러 어댑터를 통해 핸들러 호출
  3. 핸들러(컨트롤러)가 ModelAndView 반환

  1. viewResolver 호출
  2. View 반환




  1. render(model) 호출



→ 여기까지 DispatcherServlet의 요청흐름에 대해서 알아보았다.

이제부터 HandlerMapping과 HandlerAdapter에 대해서 더 알아보자.

DispatcherServlet.properties를 확인하면 스프링에서 디폴트로 사용하는 HandlerMapping, HandlerAdapter 종류를 확인할 수 있다.

HandlerMapping

HTTP 요청정보를 이용해서 컨트롤러를 찾아주는 역할

  • interface

  • 스프링에서 사용하는 default HandlerMapping

  • BeanNameUrlHandlerMapping : URL과 일치하는 이름을 갖는 빈과 매핑시켜주는 HandlerMapping 구현체
  • RequestMappingHandlerMapping : @RequestMapping 애노테이션을 토대로 - RequestMappingInfo 인스턴스를 만드는 HandlerMapping 구현체
  • RouterFunctionMapping : RouterFunction을 지원하는 HandlerMapping 구현체

HandlerAdapter

handler를 실행시켜주는 역할

  • HandlerAdapter 인터페이스

- `supports` : 파라미터로 넘어온 Handler를 지원하는 지 여부를 판단하는 메서드
- `handle` : handler 호출하는 메서드
  • 스프링에서 사용하는 default HandlerAdapter

  • HttpRequestHandlerAdapter : HttpRequestHandler를 구현한 컨트롤러를 처리하는 HandlerAdapter 구현체
  • SimpleControllerHandlerAdapter : Controller 인터페이스를 구현하여 만든 컨트롤러에 요청을 보낼 때 사용하는 HandlerAdapter 구현체
  • RequestMappingHandlerAdapter : @Controller 클래스 내 @RequestMapping 어노테이션 핸들러 매핑을 처리하는 HandlerAdapter 구현체
  • HandlerFunctionAdapter : RouterFunctionMapping를 처리하기 위한 - HandlerFunctions를 지원하는 HandlerAdapter 구현체
profile
새싹 개발자

0개의 댓글