Spring MVC 의 구조 및 처리 과정

Hwangro Lee
3 min readAug 8, 2019

--

spring boot 로만 개발하다가 spring 으로 개발을 하면서 모르는 부분들이 있어 공부를 처음부터 다시 했습니다.

Spring MVC 설계

Spring은 Front Controller 패턴을 사용하여 Servlet을 기반으로 설계되었습니다.

Front Controller란? 모든 요청을 하나의 컨트롤러에서 처리하는 패턴입니다.

Servlet이란? 클라이언트로부터 요청이 오면 처리하고 결과를 다시 클라이언트에게 전송하는 자바프로그래밍입니다.

Spring에서 Front Controller에 해당하는 것이 DispatcherServlet 클래스 입니다. DispatcherServlet은 단순 Front Controller의 역할 뿐만 아니라 Spring에서 제공하는 많은 기능을 사용할 수 있게 해줍니다.

DispatcherServlet의 동작원리

  1. 최초 Servlet container(tomcat)이 실행된다.
  2. Servlet container는 ServletContainerInitializer를 구현한 SpringServletContainerInitializer를 실행시킨다.
  3. SpringServletContainerInitializer는 WebApplicationInitializer를구현한 클래스를 찾아 onStartup메소드를 실행시킨다.
  4. onStartup 메소드를 실행하면 DispatcherServlet 설정뿐만 아니라 ContextLoaderListener를 설정해야 한다

Spring이 구동되면 2개의 Context가 생성된다.

  1. ContextLoaderListener에 의해서 만들어지는 Root WebApplicationContext로 Service, Repository를 포함한 독립적인 Beans를 담고 있는 Context이다.
  2. DispatcherServlet에 의해서 만들어지는 WebApplicationContext로 Controller를 포함한 웹관련 Beans를 담고 있는 Context이다.

Spring MVC의 Life cycle

  1. 클라이언트가 서버에 요청을 보내면 Servlet container가 DispatcherServlet에 요청을 전달한다.
  2. DispatcherServlet은 HandlerMapping을 사용하여 컨트롤러를 찾는다. HandlerMapping은 @Controller로 선언되었거나 HttpRequestHandler 인터페이스로 구현한 클래스를 찾아 DispatcherServlet에 리턴하며 컨트롤러의 클래스, 메소드, 리턴타입, 파라미터타입 등 모든 정보를 가지고있다. 컨트롤러가 결정되었지만 호출방법은 호출타입별로 다르기 때문에 DispatcherServlet은 실행할 메소드를 찾지 못한다.
  3. DispatcherServlet에서 찾은 컨트롤러의 메소드를 실행하기 위해 HandlerAdapter객체에게 요청을 위임한다. HandlerAdapter는 컨트롤러의 메소드를 실행하고 리턴타입을 ModelAndView 객체로 변환까지 해준다.
  4. 반환된 ModelAndView를 DispatcherServlet에 리턴한다.
  5. ModelAndView를 받은 DispatcherServlet은 ViewResolver객체를 이용하여 결과를 보여줄 View를 찾는다.
  6. DispatcherServlet은 ViewResolver가 리턴한 View객채에게 응답결과를 생성하도록 요청한다.
  7. JSP를 사용하는 경우, View 객체는 JSP를 실행함으로써 브라우저에게 전송할 응답결과를 생성한다.

--

--