스프링 MVC는 어떤 구조로 이루어져 있을까요?
안녕하세요!
오늘은 스프링 MVC의 구조를 알아보겠습니다.
앞서 MVC 프레임워크를 점진적으로 만들어보았습니다.
관심 있으신 분들은 아래 링크를 참고 해주세요.
MVC 프레임워크 만들기 1 - 프론트 컨트롤러
MVC 프레임워크 만들기 2 - 모델 추가, 실용적인 컨트롤러
MVC 프레임워크 만들기 3 - 유연한 컨트롤러
스프링 MVC 구조
최종적으로 만든 MVC 프레임워크의 구조는 아래 사진과 같습니다.
직접 만든 MVC 프레임워크는 스프링 MVC와 매우 유사합니다.
스프링 MVC 구조를 봅시다.
객체의 이름만 다르고 작동 과정은 거의 유사합니다.
1. 요청이 들어오면 DispatcherServlet으로 들어가고, 핸들러 매핑 객체를 불러서 핸들러를 조회합니다.
2. 핸들러 어댑터 목록에서 핸들러를 처리할 수 있는 핸들러 어댑터를 찾습니다.
3. 핸들러 어댑터를 실행합니다.
4. 핸들러 어댑터가 실제 핸들러(컨트롤러)를 실행합니다.
5. 핸들러 어댑터가 ModelAndView를 반환합니다.
6. viewResolver를 찾아서 실행합니다.
7. viewResolver는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환합니다.
8. View 객체를 통해서 뷰를 렌더링합니다.
doDispatch 호출 흐름
스프링 MVC 동작 과정의 중심에 DispatcherServlet이 있습니다.
DispatcherServlet 중에서도 doDispatch 메소드가 핵심 역할을 합니다.
사용하시는 IDE의 디버깅 기능을 사용하면 웹 사이트에 접속할 때, doDispatch 메소드가 호출됨을 확인할 수 있습니다.
인텔리제이에서는 Ctrl N으로 DispatcherServlet 클래스를 찾고, doDispatch 메소드에 중단점을 설정하고 디버깅을 하면 됩니다.
아래 사진과 같은 순서를 거쳐서(밑에서 위로 호출) doDispatch 함수가 불립니다.
처음에 필터를 쭉 거치고, HttpServlet의 service가 불리고 FrameworkServlet의 service가 불립니다.
FrameworkServlet의 service 호출을 시작으로 여러 메소드가 호출되면서 doDispatch 메소드가 호출됩니다.
HttpServlet과 FrameworkServlet은 무엇인지 궁금하실 수 있는데, 이들은 DispatcherServlet의 조상입니다.
상속 관계는 아래 사진과 같습니다[1].
doDispatch 메소드 분석
DispatcherServlet의 doDispatch 메소드를 살펴봅시다.
package hello.servlet.domain.member;
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
ModelAndView mv = null;
// 1. 핸들러 조회
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
// 2. 핸들러 어댑터 조회 - 핸들러를 처리할 수 있는 어댑터
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 핸들러 어댑터 실행 -> 4. 핸들러 어댑터를 통해 핸들러 실행 -> 5. ModelAndView 반환
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
private void processDispatchResult(HttpServletRequest request,HttpServletResponse response,
HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception {
// 뷰 렌더링 호출
render(mv, request, response);
}
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
View view;
String viewName = mv.getViewName();
// 6. 뷰 리졸버를 통해서 뷰 찾기, 7. View 반환
view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
// 8. 뷰 렌더링
view.render(mv.getModelInternal(), request, response);
}
스프링 MVC 구조의 작업 수행 과정을 메소드에서 확인할 수 있습니다.
이번 게시글에서는 스프링 MVC의 구조를 알아보았습니다.
다음 게시글에서는 핸들러 매핑과 핸들러 어댑터, 뷰 리졸버를 자세히 알아보겠습니다.
인프런 '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 강의를 듣고 공부하며 정리한 자료입니다.
잘못된 부분은 피드백 주시면 감사하겠습니다.
글 읽어주셔서 감사합니다 :-)
참고 자료
[0] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술, 섹션 5. 스프링 MVC - 구조 이해 https://www.inflearn.com/course/스프링-mvc-1
[1] https://www.fatalerrors.org/a/source-code-analysis-of-spring-mvc-dispatcher-servlet.html
'Spring > 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
스프링 MVC를 이용해서 회원 관리 웹 만들기 (0) | 2022.01.28 |
---|---|
핸들러 매핑, 핸들러 어댑터, 뷰 리졸버 (0) | 2022.01.27 |
MVC 프레임워크 만들기 3 - 유연한 컨트롤러 (0) | 2022.01.24 |
MVC 프레임워크 만들기 2 - 모델 추가, 실용적인 컨트롤러 (0) | 2022.01.23 |
MVC 프레임워크 만들기 1 - 프론트 컨트롤러 (0) | 2022.01.22 |
댓글