MVC Pattern은 확장성을 위한 웹 구조이다. 자세한 내용은 해당 링크를 참고하자.
Spring MVC의 구성요소는 아래와 같다.
- DispatcherServlet
모든 클라이언트의 요청을 전달받는다.
Controller에게 Client의 요청을 전달하고, Controller가 리턴한 결과값을 View에게 전달하여 알맞은 응답을 생성한다.
- HandlerMapping
클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정한다.
- Controller
클라이언트의 요청을 처리한 뒤, Model을 호출하고 그 결과를 DispatcherServlet에 알려준다.
- ModelAndView
Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
- ViewResolver
Controller가 리턴한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정한다.
- View
Controller의 처리결과를 보여줄 응답하면을 생성한다.
아래는 Spring MVC 요청 흐름을 보여준다.
2, 3번 과정과 6, 7번 과정은 Spring에서 자동으로 해준다.
5번 과정에서 String을 리턴하기도 한다.
Spring MVC의 동작 원리는 아래와 같다.
해당 과정은 web.xml로 설정할 수 있다. web.xml의 예시는 아래와 같다.
<?xml version="1.0" encoding="UTF-8"?> <!-- 1번 과정 -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value> <!-- 3번 과정 -->
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <!-- 2번 과정 -->
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name> <!-- 7번 과정 -->
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup> <!-- 이 줄 때문에 WAS가 실행될 때 DispatcherServlet가 같이 생성됨. --> <!-- 따라서 6번 과정은 생략됨. -->
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name> <!-- 5번 과정 -->
<url-pattern>/</url-pattern> <!-- / 이하의 모든 걸 받는다는 의미 -->
</servlet-mapping>
</web-app>
<!-- 4번 과정은 개발자가 Service, DAO 등 로직을 만듦. -->
<!-- 8번 과정은 DispatcherServlet이 적절한 Controller가 실행됨. -->