FrontController 패턴 특징
ㆍ프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
ㆍ 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
ㆍ 입구를 하나로!
ㆍ 공통 처리 가능
ㆍ 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨
=> 불필요한 반복이 줄어듦
Spring MVC에서는 Front Controller가 Dispatcher Servlet임
요청 흐름
ㆍ 서블릿이 호출되면 HttpServlet 이 제공하는 serivce() 가 호출된다.
ㆍ 스프링 MVC는 DispatcherServlet 의 부모인 FrameworkServlet 에서 service() 를 오버라이드 해두었다.
ㆍ FrameworkServlet.service() 를 시작으로 여러 메서드가 호출되면서
ㆍ DispacherServlet.doDispatch() 가 호출된다.
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);
}
HandlerMapping(핸들러 매핑)
ㆍ 핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야 한다.
ㆍ 예) 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.
HandlerAdapter(핸들러 어댑터)
ㆍ 핸들러 매핑을 통해서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다.
ㆍ 예) Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 한다.
ㆍ 스프링은 이미 필요한 핸들러 매핑과 핸들러 어댑터를 대부분 구현해두었다. 개발자가 직접 핸들러 매핑과 핸들러 어댑터를 만드는 일은 거의 없다.
뷰 리졸버 - InternalResourceViewResolver
스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties 에 등록한 'spring.mvc.view.prefix' , 'spring.mvc.view.suffix' 설정 정보를 사용해서 등록한다.
'Spring' 카테고리의 다른 글
로깅 (0) | 2023.12.24 |
---|---|
Spring MVC-2 (0) | 2023.12.24 |
[Spring] 빈 생명주기 콜백 (0) | 2023.09.08 |
[Spring] Component Scan (0) | 2023.09.02 |
[Spring] Singleton Pattern (0) | 2023.08.31 |