Spring MVC and iBatis Example - jPetStore 분석 (2)

자 이제 서블릿의 설정파일인 /war/WEB-INF/web.xml 을 열어 다음 부분의 내용부터 살펴본다.

<!--
- Dispatcher servlet mapping for the main web user interface.
- Either refering to "petstore" for the Spring web MVC dispatcher,
- or to "action" for the Struts dispatcher.
-
- Simply comment out the "petstore" reference in favour of "action"
- to switch from the Spring web tier to the Struts web tier.
-->
<servlet-mapping>
<servlet-name>petstore</servlet-name>
<!--
<servlet-name>action</servlet-name>
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>

servlet-mapping 설정은 특정 url-pattern을 servlet이 처리 하도록 지정한다. *.do 라는 url-pattern은 petstore로 처리가 된다. petstore라는 서블릿은 다음과 같이 정의하고 있으며 이어지는 내용을 보면 petstore서블릿은 SpringMVC를 통해 처리를 한다는 것을 알 수 있다.. 만약 petstore를 주석처리하고 action서블릿으로 처리를 하면 Struts를 통해 처리를 한다.

<!--
- Spring web MVC servlet that dispatches requests to registered handlers.
- Has its own application context, by default defined in "{servlet-name}-servlet.xml",
- i.e. "petstore-servlet.xml" in this case.
-
- A web app can contain any number of such servlets.
- Note that this web app has a shared root application context, serving as parent
- of all DispatcherServlet contexts.
-->
<servlet>
<servlet-name>petstore</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<!--
- Struts servlet that dispatches requests to registered actions.
- Reads its configuration from "struts-config.xml".
-
- A web app can just contain one such servlet.
- If you need multiple namespaces, use Struts' module mechanism.
-->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>

Struts는 뒤로하고 SpringMVC에 연결되는 petstore를 살펴본다. 이름은 petstore이고 클래스는 org.springframework.web.servlet.DispatcherServlet인 서블릿은 자체 Context 파일을 {servlet-name}-servlet.xml 라는 이름으로 갖는다. petstore라고 이름을 짓는다면, petstore-servlet.xml이 되겠다.

DispatcherServlet은 SpringMVC에서 가장 중심이 되는 요소이다Spring Reference, 13.2절 Figure 10.1. 서블릿 컨테이너로부터 받은 요청(HttpRequest)를 SpringMVC의 각 요소 들에 전달하고, 또 결과를 전달받아 서블릿 컨테이너에게 응답(HttpResponse)를 돌려 주는 출입구 역할을 한다. (좀 더 자세히 살펴보자면, DispatcherServlet은 HttpRequest의 내용에 따라 미리 지정된 Controller로 전달하고, Controller는 아마도 Service를 호출하여 뭐 여러가지 작업들을 처리할 것이다. 그리고 그 결과인 Model객체를 돌려주며 DispatcherServlet은 다시 View에 전달한다. View는 전달받은 Model을 이용하여 HTML결과를 생성하고, 이를 DispatcherServlet에 돌려준다.)

petstore라는 DispatcherServlet이 읽어들이는 Context파일 /war/WEB-INF/petstore-servlet.xml 파일을 살펴보면, View, 외부 Controller정의, 내부 Controller정의의 세 부분으로 나눠 볼 수 있다.

우선 요청은 Controller에 전달되는데, 어떤 요청이 어떤 Controller에 전달 될 것인가?를 정의한다. Controller는 처리한 결과에 'Model' 그리고 'Model을 표현할 ViewName'을 지정하여 돌려준다. 서블릿은 ViewName을 가지고 ViewResolver를 통해 View를 찾고, 아까 전달받은 Model을 View에게 넘긴다.

'/shop/index.do' 요청을 처리하는 예를 적용해 보면 petstore 서블릿 컨텍스트에서 다음의 정의에 의해 처리가 된다.

<bean name="/shop/index.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="index"/>
</bean>

Controller는 사용자가 만들어서 처리하는 경우가 대부분이지만, 이 예제는 ParameterizableViewController라는 spring에서 미리 정의된 Controller에게 전달되고, 그 결과가 'index'라는 View로 표현되도록 정의하였다.

index라는 View는 ViewResolver를 통해 '/WEB-INF/jsp/spring/index.jsp'를 가리키게 되고, 해당 View로 위의 Controller가 돌려준 Model이 전달된다.

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/spring/"/>
<property name="suffix" value=".jsp"/>
</bean>

image