본문 바로가기

Spring

[spirng] 웹 요청 처리

스프링을 다시 공부하고 있다..

스프링에서 웹 요청을 처리하기 위해서는 일단 web.xml에 아래와 같은 설정을 해줘야 한다.

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

그리고, 스프링 설정 xml인 dispatcher-servlet.xml에는 아래와 같은 설정을 해줘야 한다.

<bean name="/greeting/hello.htm" class="kame.spring.chap04.controller.HelloController" p:me="yongseok" />

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

그렇게 되면 사용자가

http://xxxxxxx/greeting/hello.htm 을 요청하게 되면

바로 handlerMapping에 의해서 /greeting/hello.htm의 이름을 가진 컨트롤러를 사용하게 된다.

자, 여기서 만약

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

이부분을 삭제한다면? 어떻게될까..

답은 정상적으로 작동한다이다. log4j 로거 레벨을 debug로 해놓고 서버를 올려보면, 자동적으로

위 맵핑 클래스를 가지고 올라간다.

DEBUG DispatcherServlet [2008-08-21 14:24:42,171] - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@5b0668] in DispatcherServlet with name 'dispatcher'

그렇다면, 맵핑 클래스를 바꾸고 싶다면 어떻게 할까?

<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true" />
<property name="mappings">
<props>
<prop key="/content/**/*.htm">helloController</prop>
<prop key="/greeting/hello.htm">helloController</prop>
</props>
</property>
</bean>

이런식으로 설정해주면 디폴트로 SimpleUrlHandlerMapping을 사용하게 된다.

더 정확하게 얘기하자면 dispatcher-servlet.xml에

<bean name="/greeting/hello.htm" class="kame.spring.chap04.controller.HelloController" p:me="yongseok" />

<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true" />
<property name="mappings">
<props>
<prop key="/content/**/*.htm">helloController</prop>
<prop key="/greeting/hello.htm">helloController</prop>
</props>
</property>
</bean>

이렇게 /greeting/hello.htm을 중복되게 해놓고 호출하게 되면 SimpleHandlerMapping을 사용하게 되고 따라서

<bean id="helloController" class="kame.spring.chap04.controller.HelloController" p:me="simple" />

이 설정을 추가해줘야 한다.

BeanNameUrlHandlerMapping는 bean name과 url을 맵핑하여 바로 controller를 찾아갔지만 SimpleUrlHandlerMapping 을 사용 할 경우

helloController를 xml에서 찾기 때문에 추가해줘야 하는 것이다.

위 부분에서 bean id="handlerMapping" 부분의 id 이름을 다른 것으로 줘도 동일하게 작동한다.

만약에,

<bean name="/greeting/hello2.htm" class="kame.spring.chap04.controller.HelloController" p:me="yongseok" />

<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true" />
<property name="mappings">
<props>
<prop key="/content/**/*.htm">helloController</prop>
<prop key="/greeting/hello.htm">helloController</prop>
</props>
</property>
</bean>

이렇게 설정을 해놓고 /greeting/hello2.htm을 호출 할 경우에는 404 에러가 발생하게 된다.
이미 , SimpleUrlHandlerMapping 클래스를 사용하고 있기 때문에, 디폴트로 물고 올라갔던 BeanNameUrlHandlerMapping는 무시되는 듯 하다. 같이 사용하고 싶으면 order를 주는 방법이 있을듯..


아무튼 디폴트로 사용되는 맵핑 클래스가 있다는 것이... 새로 알게된 사실..