Home Spring MVC 구조
Post
Cancel

Spring MVC 구조

Spring MVC 구조

DispatcherServlet

DispatcherServlet은 지난 포스팅에서 다룬 Front Controller 패턴의 Front Controller에 해당한다. DispatcherServlet은 스프링 MVC의 핵심으로 부모 클래스에서 HttpServlet을 상속 받아 사용하고, 서블릿으로 동작한다.

요청 흐림

  1. 서블릿이 호출되면 HttpServlet이 제공하는 service()가 호출된다.

    (스프링 MVC는 DispatcherServlet의 부모인 FrameworkServlet에서 service()를 오버라이드 해두었다)

  2. 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);
}

동작 순서

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

스프링 MVC의 강점

스프링 MVC의 강점은 DispatcherServlet 코드의 변경 없이, 원하는 기능을 변경하거나 확장 할 수 있다는 점이다. 대부분의 기능을 확장 가능한 인터페이스로 제공하고 이를 구현하고 DispatcherServlet에 등록하여 변경 또는 확장하여 사용이 가능하다.

주요 인터페이스 목록

  • 핸들러 매핑: org.springframework.web.servlet.HandlerMapping
  • 핸들러 어댑터: org.springframework.web.servlet.HandlerAdapter
  • 뷰 리졸버: org.springframework.web.servlet.ViewResolver
  • 뷰: org.springframework.web.servlet.View

참고

This post is licensed under CC BY 4.0 by the author.

Front Controller 패턴

스프링 핸들러 매핑과 핸들러 어댑터

Comments powered by Disqus.