Servlet과 Spring MVC 2편 - Spring MVC 패턴 구조

Servlet과 Spring MVC 2편 - Spring MVC 패턴 구조

·

2 min read

1. 전체 구조

  • 1편 마지막에 소개했던 FrontController → DispatcherServlet으로 변경

  • 스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있다. FrontController가 바로 DispatcherServlet이다. DispatcherServlet도 서블릿의 일종으로, HttpServlet을 상속받는다.

DispatcherServlet.doDispatch()

  • (정의) HTTP프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임하는 프론트 컨트롤러
  1. 서블릿이 호출되면,
  • HttpServlet의 service() 메서드 호출. 스프링에서는 이 service() 메서드를 FrameworkServlet에 오버라이드 해둠(FrameworkServlet은 DispatcherServlet과 HttpServlet 사이에 있는 인터페이스)

  • 그러면 이 FrameworkServlet.service()를 시작으로 여러 메서드가 실행되면서 DispactherServlet.doDispatch()가 실행되는데, 이 메서드가 핵심!!

  • 이 메서드가 MVC패턴에서 필요한 모든 명령을 다 수행한다.

    1) 핸들러 조회

    • 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회한다.

2) 핸들러 어댑터 조회

3~5) 핸들러 어댑터 실행 , 핸들러 실행, ModelAndView 반환

6~7) ViewReslover를 통해 View 찾기 , View 반환

8) 뷰 랜더링

1-1. 핸들러 매핑과 핸들러 어댑터

특정 컨트롤러(핸들러)가 호출되려면 아래와 같은 과정을 거친다.

  1. HandlerMapping

    • 핸들러 매핑을 통해 호출하고자하는 컨트롤러를 찾을 수 있어야한다.
  2. HandlerAdaptor

    • 핸들러 매핑을 통해 찾은 컨트롤러를 실행할 수 있는 핸들러 어댑터가 있어야한다.

    • 핸들러의 실제 로직을 수행하는 역할

단순한 과정이지만, 이과정에서 우선순위가 있다. 어떤 핸들러냐, 어떤 어댑터냐에 따라 호출되는 우선순위가 다르다. 0순위에 해당하는게 없으면 1순위, 1순위에 해당하는게 없으면 2순위,,,이런 식으로 순서대로 찾는다.

  • BeanNameUrlHandlerMapping 을 사용하려면, @Component(””)에 작성할 url을 빈에 등록된 클래스 이름과 동일하게 해줘야한다.

1-2.View Reslover

  • (정의) 반환된 View 이름을 실제 View 객체로 변환하는 역할

  • 이렇게 Thymeleaf가 view 파일을 찾아주기 때문에, 타임리프를 의존성추가하지 않은 상태에서 뷰를 반환하려면 에러가 발생하는 것