스프링 MVC의 기본 구조를 표현한 그림이다
1. 사용자의 Request은 Front-Controller인 DispatcherServlet을 통해서 처리한다. 생성된 프로젝트의 web.xml을 보면 아래와 같이 모든 Request를 DispatcherServlet이 받도록 처리하고 있다.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2. HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해서 존재한다. 이 인터페이스를 구현한 여러 객체들 중 RequestMappingHandlerMapping 같은 경우는 @RequestMapping 어노테이션이 적용된 것을 기준으로 판단하게 된다.
3. 적절한 컨트롤러를 찾았다면
HandlerAdapter을 이용해서 동작시킨다.
4. Controller는 우리가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성하게 된다. 이때 View에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아서 전달하게 된다. Controller는 다양한 타입의 결과를 반환하게 되는데, 이에 대한 처리는 ViewResolver를 이용하게 된다.
5. ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋은지 해석하는 역할을 한다. 가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 InternalResourceViewResolver이다.
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
6. View는 실제로 응답 보내야 하는 데이터를 Jsp등을 이용해서 생성하는 역할을 하게되고, 만들어진 응답은 DispatcherServlet을 통해서 전송된다.