Spring MVC 구조
DispatcherServlet
DispatcherServlet
은 지난 포스팅에서 다룬 Front Controller
패턴의 Front Controller
에 해당한다. DispatcherServlet
은 스프링 MVC의 핵심으로 부모 클래스에서 HttpServlet
을 상속 받아 사용하고, 서블릿으로 동작한다.
요청 흐림
서블릿이 호출되면
HttpServlet
이 제공하는service()
가 호출된다.(스프링 MVC는
DispatcherServlet
의 부모인FrameworkServlet
에서service()
를 오버라이드 해두었다)FrameworkServlet.service()
를 시작으로 여러 메서드가 호출되면서DispatcherServlet.doDispatch()
가 호출된다.
DispatcherServlet.doDispatch()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throw Exception {
HttpServletReqeust 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) throw Exception {
// 뷰 렌더링 호출
render(mv, request, response);
}
protected void render(ModelAndView mv, HttpServletRequest request,
HttpServletResponse response) throw Exception {
View view;
String viewName = mv.getViewName();
// 6. 뷰 리졸버를 통해서 뷰 찾기 -> 7. View 반환
view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
// 뷰 렌더링
view.render(mv.getModelInternal(), request, response);
}
동작 순서
- 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
- 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
- 핸들러 어댑터 실행: 핸들러 어댑터를 실행한다.
- 핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행한다.
- ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를
ModelAndView
로 변환하여 반환한다. - ViewResolver 호출: 뷰 리졸버를 찾고 실행한다.
- View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 변경하고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
- 뷰 렌더링: 뷰를 통해서 뷰를 렌더링 한다.
스프링 MVC의 강점
스프링 MVC의 강점은 DispatcherServlet
코드의 변경 없이, 원하는 기능을 변경하거나 확장 할 수 있다는 점이다. 대부분의 기능을 확장 가능한 인터페이스로 제공하고 이를 구현하고 DispatcherServlet
에 등록하여 변경 또는 확장하여 사용이 가능하다.
주요 인터페이스 목록
- 핸들러 매핑:
org.springframework.web.servlet.HandlerMapping
- 핸들러 어댑터:
org.springframework.web.servlet.HandlerAdapter
- 뷰 리졸버:
org.springframework.web.servlet.ViewResolver
- 뷰:
org.springframework.web.servlet.View
Comments powered by Disqus.