GitHub

https://github.com/Choidongjun0830

Spring

MVC 프레임워크 / Spring MVC-1

gogi masidda 2023. 12. 21. 12:26

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' 설정 정보를 사용해서 등록한다.

 

728x90

'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