들어가며

  • 이전까지 우리가 프론트 컨트롤러 및 여러 개선점을 적용한 프레임워크를 만들고 그 구조를 알아보았다.
  • 이번 파트부터는 실제 스프링 MVC의 전체적인 구조를 알아본다.

 

 

 

Spring MVC 구조

  • 우선 우리가 만들었던 프레임워크 구조를 보면 다음과 같다.

  • 다음은 실제 스프링 MVC에서 사용하고 있는 구조이다.

  • 매우 유사하지 않은가? 이는 스프링 MVC 프레임워크의 구조가 갑자기 어디선가 등장한 것이 아닌, 이전에 있던 수 많은 문제점과 편의성을 제공하기 위해 개선이 적용된 결과임을 의미한다.
  • 직접 만든 프레임워크와 스프링 MVC 구조를 한번 비교해보자.
    • Front Controller -> Dispatcher Servlet
    • HandlerMappingStore -> HandlerMapping
    • MyHandlerAdapter -> HandlerAdapter
    • ModelView -> ModelAndView
    • viewResolver -> ViewResolver
    • MyView -> View

 

 

Dispatcher Servlet

  • Dispatcher Servlet은 우리가 이전에 만들었던 Front Controller의 역할을 하고 있다. 가장 핵심적인 컴포넌트이다.
  • Dispatcher Servlet은 HttpServlet을 상속받아 사용하며 서블릿으로 동작한다.
    • 스프링 부트는 해당 Dispatcher Servlet을 서블릿으로 자동으로 등록하면서 모든 경로에 대해 매핑한다. 즉 어떠한 요청이 들어와도 Dispatcher Servlet으로 먼저 들어가게 된다.
    • 참고로 더 자세한 경로가 우선순위가 더 높다. 기존에 서블릿들을 등록한 것이 있다면 해당 서블릿들도 요청이 들어올 시 함께 동작하게 된다.
  • Dispatcher Servlet은 다음의 순서로 동작한다.
    • 클라이언트에서 요청을 받으면 HandlerMapping을 통하여 요청된 URL에 대해 매핑된 핸들러를 조회한다.
    • 조회가 끝나면 해당 핸들러를 실행시킬 수 있는 HandlerAdapter를 조회한다.
    • 이후에 HandlerAdapter를 찾으면 해당 HandlerAdapter를 실행한다.
    • HandlerAdapter는 자신이 실행되면서 받은 Handler를 호출한다. 이후 핸들러가 반환한 정보를 ModelAndView로 변환하여 Dispatcher Servlet에 반환한다.
    • Dispatcher Servlet은 뷰 리졸버를 찾아 실행한다. 우리가 구현했던 프레임워크에서 뷰 리졸버는 단순한 함수였지만 스프링 프레임워크에서 뷰 리졸버는 인터페이스이고 각각의 뷰 템플릿에 따른 구현체를 가지고 있다.
    • 뷰 리졸버는 해당 뷰의 논리 이름을 물리적 이름으로 변환하고 뷰 객체를 반환한다.
    • 이후 뷰를 통하여 뷰를 렌더링 한다.
  • Dispatcher Servlet은 요청을 받은 뒤 공통 로직을 수행하고, 여러가지 동작을 통해 요청을 처리할 수 있도록 한다.
복사했습니다!