- Spring MVC 마스터하기 12022년 04월 17일
- starryeye
- 작성자
- 2022.04.17.:47
Spring MVC의 구조를 하나씩 뜯어보자
0. DispatcherServlet 초기화
- DispatcherServlet은 Client에서 요청이 오면 가장 먼저 대응하는 Front Controller이다.
- 어떤 요청이 와도 무조건 적용되는 controller이다.(Front Controller)
- 기존에 DispatcherServlet이 없던.. 서블릿 방식에서
개발자들이 공통적으로 많이 코딩 해야했던 부분들을 상당수 공통화 하였다.
- HttpServlet을 상속 받았다.
DispatcherServlet의 initStrategies 메서드 initStrategies는 서블릿 컨테이너가 시작되며 실행된다.
- 여기서 눈여겨 볼 것은 initHandlerMappings와 initHandlerAdapters, initViewResolvers 이다.
DispatcherServlet의 initHandlerMappings 메서드 initHandlerMappings는 HandlerMapping.class타입의 빈으로 등록되어있는 모든 빈을 추가한다.
- HandlerMapping의 구체클래스 RequestMappingHandlerMapping, BeanNameUrlHandlerMapping 등이 존재
initHandlerAdapters는 HandlerAdpater.class타입으로 추가
initViewResolvers는ViewResolver.class타입으로 추가
1~2. DispatcherServlet의 Handler 및 Adapter 조회
DispatcherServlet의 doDispatch 메서드 DispatcherServlet의 doDispatch의 일부이다.
(doService에서 호출되는 메서드로 HttpServlet의 Service 메서드에서 출발하여 호출 됨)
<getHandler>
getHandler메서드를 통해 요청에 매칭되는 Handler를 찾는다.
DispatcherServlet의 getHandler 메서드 초기화때 등록해 놓은 HandlerMapping 구현체 객체들을 순회하면서 각 객체의 getHandler를 호출하여 Handler찾기
- 1순위 : RequestMappingHandlerMapping
--> @Contoller, @RequestMapping을 가지고있는 class의 메서드 들에서 찾음
//RequestMappingHandlerMapping는 메서드를 어떻게 가질까?
//-> 빈 생성 단계인 afterPropertiesSet 메서드에서 호출되는 initHandlerMethods 부터 보면 된다.
//RequestMappingHandlerMapping 추상객체인 AbstractHandlerMethodMapping 에서 일어남
- 2순위 : BeanNameUrlHandlerMapping
--> 스프링 빈의 이름으로 Handler(Controller)를 찾는다. (@Component(이름))
- 3순위 : 더 많음.. (직접 찾아봐야함)
<getHandlerAdapter>
getHandlerAdapter 역시 동일하다. (HandlerAdpater 구현체 객체 순회)
- surports 라는 메서드로 해당 파라미터로 넘겨준 Handler를 지원하는지 여부를 보고 Adapter를 찾는다.
- 1순위 : RequestMappingHandlerAdapter
--> HandlerMapping과 동일하게 에노테이션 기반의 컨트롤러인 @RequestMapping 에서 사용됨.
- 2순위 : HttpRequestHandlerAdapter
--> HttpRequestHandler "인터페이스"를 구현한 구현객체일 경우
- 3순위 : SimpleControllerHandlerAdapter
--> Controller "인터페이스"를 구현한 controller일 경우 사용됨
3~5. 얻은 Handler Adapter 에서 handle 메서드를 호출
어댑터 패턴을 사용하여, 다양한 형식의 컨트롤러를 Handler Adapter에서 실행 해준다.
호출을 하면 DispatcherServlet에서는 ModelAndView 객체를 리턴 받는다.
(자세한 내용은 2022.04.24 - [Spring] - Spring MVC 마스터하기 4 참조)
6~8. viewResolver 호출, View 반환, Render(Model) 호출
DispatcherServlet의 doDispatch 메서드 applyDefaultViewName 메서드를 통하여 논리 뷰 이름을 ModelAndView 객체에 set 해준다.
processDispatchResult 메서드에서 render 메서드 호출
DispatcherServlet의 render 메서드 resolveViewName 메서드 내부에서 초기화때 등록해 놓은 ViewResolver 구현체 객체들을 이용하여 View를 반환 받는다.
반환받은 view에서 render 메서드를 호출하여 HTML 응답을 하도록 한다.
<스프링 부트가 자동 등록하는 뷰 리졸버>
BeanNameViewResolver
-> 빈 이름으로 뷰를 찾아서 반환
InternalResourceViewResolver
-> JSP를 처리할 수 있는 뷰를 반환
(thymeleaf 뷰 템플릿 사용시, ThymeleafViewResolver가 자동 등록됨)
<@RequestMapping 참고>
@RequestMapping 에노테이션 사용 시, 아래가 사용된다.
HandlerMapping : RequestMappingHandlerMapping
HandlerAdapter : RequestMappingHandlerAdapter
'Spring > MVC' 카테고리의 다른 글
Spring MVC Redirect, PRG (0) 2022.05.06 Spring MVC 마스터하기 4 (0) 2022.04.24 Spring MVC 마스터하기 3 (응답 부분) (0) 2022.04.22 Spring MVC 마스터하기 2 (요청 부분) (0) 2022.04.19 Servlet + JSP의 MVC 패턴에서 Spring MVC 로 발전하는 모습 (0) 2022.04.05 다음글이전글이전 글이 없습니다.댓글