스프링 MVC 전체 구조

hangs·2022년 9월 27일
0

스프링 MVC 구조

DispatcherServlet

스프링MVC도 프론트 컨트롤러 패턴으로 구현되어있다. 그리고 **DispathcerServlet이 스프링 MVC의 프론트 컨트롤러이며 핵심이다.**

여기서 말하는 프론트 컨트롤러 패턴은 서블릿 하나로 클라이언트의 모든 HTTP 요청을 받는다는 의미이다. 입구가 하나라는 것이다. 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출한다.

DispatcherServlet 서블릿 등록

DispathcerServlet도 부모클래에서 HttpServlet을 상속 받아서 사용하고, 서블릿으로 동작한다. 스프링부트는 DispathcerServlet을 자동으로 빈으로 등록하며 모든경로를 urlPatterns="/"에 대해서 매핑한다.(여기서 우리가 만든 서블릿이 있다면 자세한 경로가 우선순위가 높다.

DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet




요청 흐름

DispatcherServlet이 호출되면 HttpServlet이 제공하는 service() 가 호출된다. 스프링MVC는 이때 DispathcerServlet의 부모인 FrameworkServlet에서 service()를 오버라이드 했으며

FrameworkServlet의 service()

FrameworkServletservice() 를 시작으로 여러 메소드가 호출되면서 DispathcerServlet.doDispatch() 가 호출된다.

DispatcherServlet.doDispatch()

핵심은 다음과 같은 순으로 실행된다.
1. mappedHandler = getHandler(processedRequest); 에서 핸들러(컨트롤러) 조회
2.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 핸들러를 처리할 수 있는 어뎁터를 조회
3.mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 핸들러 어뎁터를 통해 핸들러를 실행하고 ModelandView를 반환한다.
4.최종적으로 processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); 가 실행된다.

5.processDispatchRequest에 있는 render()가 호출된다.
6.view = resolveViewName(viewName, mv.getModelInternal(), locale, request); 뷰의 논리이름을 가지고 뷰를 찾고 View를 반환한다.
7.view.render 뷰를 렌더링한다.




동작 순서
1. 핸들러 조회 : 핸들러 매핑을 통해 요청된 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
2 핸들러 어뎁터 조회 : 핸들러를 실행할 수 있는 어뎁터를 조회
3.핸들러 어뎁터 실행: 핸들러 어뎁터를 실행
4.핸들러 실행: 핸들러 어뎁터가 실제 핸들러를 호출한다.
5.ModelAndView 반환: 핸들러 어뎁터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
6.viewResolver 호출: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고,랜더링 역할을 하는 View객체를 반환한다.
7.View 반환
8.View.render : 뷰를 통해서 뷰를 랜더링한다.

Reference

0개의 댓글