sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | http://1 |
extra_vars6 | ko |
BeanNameUrlHandlerMapping
지금 살펴보고 있는 부분은 HandlerMapping에 대한 이해이다. Spring 프레임워크에서는 이러한 HandlerMapping을 처리하기 위해서 XML을 기반으로 처리하고 있다. 전에 이야기한 것 처럼 web.xml 에서 서블릿명으로 주어진 petstore 라는 이름으로 정해져 있음으로 우리가 살펴보고 있는 XML 파일은 petstore-servlet.xml 인 것이다. 즉 petstore-servlet.xml 에서 HandlerMapping에 대한 정보를 포함하고 있다.
HandlerMapping을 설정하고 해당 Controller를 찾는 설정을 담당하고 있는 XML 파일은 bean 엘리먼트를 사용한다. 우리가 먼저 살펴볼 HandlerMapping은 BeanNameUrlHandlerMapping인데 jpetstore의 petstore-servlet.xml 에서는 다음과 같이 셋팅되어 있다.
<bean id="defaultHandlerMapping" class="org.ingframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
BeanNameUrlHandlerMapping은 HTTP 요청을 웹 애플리케이션 컨텍스트내 명시된 빈즈의 이름으로 매핑하는 것이다. Spring MVC에서는 HandlerMapping을 특별히 셋팅하지 않으면 디폴트로 BeanNameUrlHandlerMapping으로 설정되어진다.
BeanNameUrlHandlerMapping은 HTTP Request의 주소를 빈 이름(bean name)과 매핑시켜주는 역할을 한다. 즉, HTTP 요청의 URL을 이용하여 해당 URL을 처리해야 하는 Controller와 매핑해 준다.
jpetstore에서는 디폴트 HandlerMapping으로 BeanNameUrlHandlerMapping을 사용하는 것을 알 수 있다. 즉, 다음에 언급할 SimpleUrlHandlerMapping에 해당하는 HTTP 요청 외에는 기본적으로 BeanNameUrlHandlerMapping을 사용한다.
SimpleUrlHandlerMapping
SimpleUrlHandlerMapping을 jpetstore에서 사용하는 것을 살펴보자. 다음은 petstore-servlet.xml 에 SimpleUrlHandlerMapping을 사용하는 부분이다.
<bean id="secureHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="signonInterceptor"/> </list> </property> <property name="urlMap"> <map> <entry key="/shop/editAccount.do" value-ref="secure_editAccount"/> <entry key="/shop/listOrders.do" value-ref="secure_listOrders"/> <entry key="/shop/newOrder.do" value-ref="secure_newOrder"/> <entry key="/shop/viewOrder.do" value-ref="secure_viewOrder"/> </map> </property> </bean> <bean id="signonInterceptor" class="org.springframework.samples.jpetstore.web.spring.SignonInterceptor"/> <bean id="secure_editAccount" class="org.springframework.samples.jpetstore.web.spring.AccountFormController"> <property name="petStore" ref="petStore"/> <property name="validator" ref="accountValidator"/> <property name="successView" value="index"/> </bean> <bean id="secure_listOrders" class="org.springframework.samples.jpetstore.web.spring.ListOrdersController"> <property name="petStore" ref="petStore"/> </bean> <bean id="secure_newOrder" class="org.springframework.samples.jpetstore.web.spring.OrderFormController"> <property name="petStore" ref="petStore"/> <property name="validator" ref="orderValidator"/> </bean> <bean id="secure_viewOrder" class="org.springframework.samples.jpetstore.web.spring.ViewOrderController"> <property name="petStore" ref="petStore"/> </bean>
SimpleUrlHandlerMapping은 BeanNameUrlHandlerMapping 보다 좀 더 강력한 핸들러 매핑을 제공한다. SimpleUrlHandlerMapping은 Controller와 URL을 매핑하기 위해서 별도의 빈을 통해서 관리하고 있다(<property> 엘리먼트). 또한 Ant 스타일의 경로 매치 능력도 가진다.
jpetstore에서 SimpleUrlHandlerMapping을 어떻게 사용하고 있는지 위의 예제를 통해서 살펴보자.
<bean> 엘리먼트의 id 속성 값이 “secureHandlerMapping”이 SimpleUrlHandlerMapping을 사용하는 것을 알 수 있다. 여기에 <property> 에리먼트에 두 개의 name 속성 값이 존재한다. 하나는 “interceptors”이고, 다른 하나는 “urlMap”이다. “interceptors”를 name 속성 값으로 사용하고 있는 <property> 에리먼트에서는 “signonInterceptor”를 참조하고 있다. 이를 따라가보면 “org.springframework.samples.jpetstore.web.spring.SignonInterceptor”클래스를 사용하고 있다. 여기서 HandlerInterceptors 인터페이스에 대한 이해가 필요한데 이는 Spring 프레임워크의 레퍼런스 문서를 참조하기 바란다. 13.4.3 HandlerInterceptors 인터페이스
다음으로 “urlMap” 이라는 name 속성 값을 가지는 <property> 엘리먼트를 살펴보자. <map> 엘리먼트에 속한 <entry> 엘리먼트의 속성들로 정의되어 있다. 중요한 건 최종 속성들의 값에 해당하는 각각의 값들이다. “key” 속성에 해당하는 값들이 HTTP Request의 URL에 해당하고, “value-ref”의 값들이 이를 처리하는 Controller를 지정하는 참조 이름(즉, <bean> 엘리먼트의 id 값)이 된다. 따라서 위의 petstore-servlet.xml의 예제를 살펴보면 각 “key” 속성에 해당하는 “value-ref” 값을 <bean> 엘리먼트로 정의하고 각각의 Controller를 정의하고 있는 것을 볼 수 있다.
HandlerMapping 까지의 Spring MVC 처리 과정 정리
이러한 것을 통해 현재까지의 Spring MVC의 전체적인 처리과정을 다시금 되짚어보면 HTTP Request를 DispatcherServlet이 받아 HandlerMapping에게 처리하고자 하는 Controller를 요청한다. 그러면 HandlerMapping는(여기서는 petstore-servlet.xml에 정의) 요청 URL을 BeanNameUrlHandlerMapping과 SimpleUrlHandlerMapping을 요청에 맞게 Controller를 얻어 반환하게 되는 것이다. 이전에 보았던 그림을 생각해 보면 두 번째에 처리에 해당하는 것까지의 설명이 된다.