본문 바로가기

ADD

[Spring]요청과 컨트롤러 매핑(HandlerMapping)

단계2,설장 파일에 HandlerMapping 설정 추가

-웹요청과 컨트롤러 매핑:HandlerMapping

HandlerMaing은 클라이언트의 요청을 어떤 컨트롤러가 처리할지에 대한 정보를 제공한다. 스프링은 기본적으로 몇 가지 HandlerMapping을 제공하고 있다.

 HandlerMapping 클래스 설명 
 SimpleUrlHandlerMapping  패턴과 컨트롤러 이름을 비교하여,URL이 패턴에 매칭될 경우 지정한 컨트롤러를 사용한다.
 BeanNameUrlHandlerMapping  URL과 일치하는 이름을 갖는 빈을 컨트롤러로 사용한다.
 ControllerClassNameHandlermaping  URL과 매칭되는 클래스 이름을 갖는 빈을 컨트롤러로 사용한다.
 DefaultAnnotationHandlerMapping  @RequestMapping 어노테이션을 이용하여 요청을 처리할 컨트롤러를 구한다.

 

DefaultAnnotationHandlerMapping 클래스는 스프링 2.5 버전에 새롭게 추가된 HandlerMapping 구현 클래스이며, 나머지는 스프링 2.5 버전에 새롭게 추가된 HandlerMaping 구현클래스이며, 나머지는 2.0과2.5 버전에서 사용 가능한 클래스 들이다.

 

1)AbstractUrlHandlerMapping 클래스와 서블릿 URL

스프링이 제공하는 주요 HandlerMapping 구현 클래스들은 AbsractUrlHandlerMapping 추상 클래스를 직 간접적으로 상속받고 있다.

AbsractUrlHandlerMapping 추상 클래스는 클라이언트의 요청 URL로부터 알맞은 턴트롤러를 매핑하는 HandlerMapping을 위한 기본적인 기능을 구현하고 있다. AbsractUrlHandlerMapping클래스는 천체 ㅇ청 URL을 이용하기보다는 웹 어플리케이션 경로(서블릿 컨텍스트 경로)를 기준으로 컨트롤러를 매핑 하게 된다.

http://host/bbs1/board/list

위에서 "/bbs1"은 서블릿 컨텍스트 경로 "/board/list" HandlerMapping이 사용하는 경로

위와같이 AbstractUrlHandlerMapping 은 서블릿 컨텍스트 경로를 제외한 나머지 경로를 사용하여 매핑되는 컨트롤러를 찾는다. 컨트롤러를 매핑할 때는 alwaysUseFullPath프로퍼티의 값에 따라서 최종적으로 사용되는 경로가 결정된다.  alwaysUseFullPath프로퍼티의 값이 true 일 경우 서블릿 컨텍스트 경로를 제외한 너머지 경로를 사용하여 매핑 되는 컨트롤러를 검색하게 된다. false인 경우에는 서블릿 매핑 설정에 따라서 사용하는 경로가 달라진다.

 

 

<servlet>

             <servlet-name>dispatcher</servlet-name>

              <servlet-class>

                      org.springframework.web.servlet.DispatcherServlet

               </servlet-class>

</servlet>

 

<servlet-mapping>

                <servlet-name>dispatche</servlet-name>

                 <url-pattern>*.htm</url-pattern>

</servlet-mapping>

 

<servlet-mapping>

                <servlet-name>dispatche</servlet-name>

                 <url-pattern>/content/*</url-pattern>

</servlet-mapping>

 

 확장자가 .html인 요청이나 /content/로 들어오는 모든 요청이 'dispatcher' 서블릿에 전달된다.

스프링 설정 파일에서는 다음과 같이 AbstractUrlHandlerMapping 을 상속받고 있는 BeanNameUrlHandlerMapping을 HandlerMapping으로 설정 했다고하자.

 

 

 <bean id="handlerMapping"

         class="org.springframework.web.servlet.handler.BeanNameUrlHandlermapping"/>

 <bean name="/greeting/hello.htm"

         class="kame.spring.chap04.controller.HelloController"/>

<bean name='/read/hello.htm"

         class="kame.spring.chap04.controller.HelloController"/>

 

 이 상태에서 클라이언트가 다음의 두 URL을 요청했다고 하자. 이때, /chap04는 서블리 컨텍스트 경로라고 가정한다.

 ->http://localhost/chap04/greetng/hello.htm

 ->http://localhost/chap04/content/read//hello2.htm

AbstractUrlHandlerMapping  은 *.htm과 같이 확장자를 이용한 서블릿 매핑을 통해서 요청이 들어오는 경우(서블릿 컨텍스트 경로를 제외한,즉,/chap04를 제외한)전체 경로를 이용하여 매핑 되는 컨트롤러를 검색한다.

 

 

 

1->http://localhost/chap04/greetng/hello.htm

 

2-><servlet-mapping>

                <servlet-name>dispatche</servlet-name>

                 <url-pattern>*.htm</url-pattern>

      </servlet-mapping>

 

3-> /greeting/hello.htm

확장자 매핑의 경우 전체 경로를 사용

 

 

1->http://localhost/chap04/content/read//hello2.htm

 

2-><servlet-mapping>

                <servlet-name>dispatche</servlet-name>

                 <url-pattern>/content/*</url-pattern>

      </servlet-mapping>

 

3-> /read/hello.htm

서블릿 경로를 이용한 서블릿 매핑의 경우,서블릿 경로

확장자 매핑이나 서블릿 경로 매핑에 상관없이 항상 전체 경로를 사용하고 싶다면,다음과 같이 alwaysUseFullPath 프로퍼티의 값을 true로 지정해 주어야 한다. 기본적으로 false이다

 

 

 <bean id="handlerMapping"

       class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

       <property name="alwaysUseFullPath" value="true"/>

</bean>

 

2) BeanNameUrlHandlerMapping을 이용한 컨트롤러 매핑

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping 은 URL과 매칭되는 이름을 갖는 빈을 컨트롤러로 사용하는 HandlerMapping이다.AbstractUrlHandlerMapping 클래스를 상속받고 있기 때문에,alwaysUseFulPath프로퍼티의 값을 true로 지정하면 전체 경로를 이용하여 매핑되는 컨트롤러를 검색할 수있다.

 

BeanNameUrlHandlerMapping은 빈의 이름을 Ant 경로 패턴으로 사용하여, 요청URL이 패턴에 매칭되는지의 여부를 검사한다. 그런뒤, 매치된다면 해당 빈을 컨트롤러로 사용하게 된다. 예를 들어, 다음과 같이 BeanNameUrlHandlerMapping의 alwaysUseFullpath프로퍼티 값을 true로 지정했고, 두 개의 컨트롤러를 빈으로 설정 했다고 하자.

 

 

 <bean id="handlerMapping"

         class="org.springframework.web.servlet.handler.BeanNameUrlHandlermapping">

           <property name="alwaysUseFullPath" value="true"/>

</bean>

<bean name="/content/**/*.htm" class="..."/>

 

<bean name='/read/hello.htm"

         class="kame.spring.chap04.controller.HelloController"/>

이경우 "/content/10/orm.htm" 과 "/content/1/topic/list.htm" 로 URL 요청이 들어오면 처리하는 빈은 "/content/**/*.htm" 빈으로 처리가 되고..."/greeting/hello.htm" 은 "/greeting/hello.htm" 빈으로 처리가 된다.

BeanNameUrlHandlerMapping은 빈의 이름을 Ant 경로 패턴으로 사용하여 요청 URL 과 컨트롤러 사이의 매핑을 처리한다.

 

3)SimpleUrlHandlerMapping을 이용한 컨트롤러 매핑

 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping 은 가장 많이 사용되는 HandlerMapping으로서 , 패턴 매칭을 이용하여 다양한 URL 경로를 컨트롤러에 매핑시켜 준다.

 SimpleUrlHandlerMapping은 다음 코드처럼 mapping 프로퍼티를 이용하여 패턴과 컨트롤러 사이의 매핑을 지정한다.

 

 

<bean id="handlerMapping"

         class="org.springframework.web.servlet.handler.SimpleUrlHandlermapping">

           <property name="alwaysUseFullPath" value="true"/>

           <property name="mapping">

                <props>

                     <prop key="/content/**/*.htm">contentController</prop>

                     <prop key="/greeting/hello.htm">helloController</prop>

                </prop>

            </property>

</bean>

<bean name="contentController" .../>

 

<bean name="helloController"

         class="kame.spring.chap04.controller.HelloController"/>

 SimpleUrlHandlerMapping의 mappings 프로퍼티는  java.util.Properties 타입이다.mapping 프로퍼티의 값에 전달되는 각<prop>의 key 는 요청 URL 과 매칭될 Ant 경로 패턴을 입력하며,<prop>의 값에는 매핑될 컨트롤러의 이름을 입력한다.

 

이방법은 다양한 경로 패턴을 손쉽게 설정할 수 있기 때문에, 대부분의 웹 쵸청 매핑을 SimpleUrlHandlerMapping을 사용해서 설정함으로써 매핑 처리를 위한 설정을 간결하게 유지할 수있다.

 

4) 다수의 HandlerMapping 동시 설정

스프링 MVC는 다수의 HandlerMapping을 설정할 수 있도록 하고 있다. 한 개 이상의 HandlerMaping이 등록되어 있을 경우, order 프로퍼티를 이용하여 사용 순서를 결정한다.

 

<bean id="handlerMapping2

         class="org.springframework.web.servlet.handler.beanNameUrlHandlerMappng">

           <property name="order" value="2"/>

           <property name="alwaysUseFullPath" value="true"/>

</bean>

 

<bean id="handlerMapping"

         class="org.springframework.web.servlet.handler.SimpleUrlHandlermapping">

           <property name="order" value="1"/>

           <property name="alwaysUseFullPath" value="true"/>

           <property name="mapping">

                <props>

                     <prop key="/content/**/*.htm">contentController</prop>

                     <prop key="/greeting/hello.htm">helloController</prop>

                </prop>

            </property>

</bean>

DispatcherServlet은 order 프로퍼티의 값이 낮은 HandlerMapping에 먼저 매핑 되는 컨트롤러가 있는지 의뢰한다. order 프로퍼티를 입력하지 않은 경우, 설정 파일에 입력한 순서에 따라 매핑되는 컨트롤러를 검색하게 된다.

 

 

출처 - 웹 개발자를 위한 스프링 2.5 프로그래밍  (최범균 지음)

'ADD' 카테고리의 다른 글

[Spring]컨트롤러 구현  (0) 2018.08.30
[Spring]Ant 경로 패턴  (0) 2018.08.30
[Spring]DispatcherServlet 설정 및 ApplicationContext의 관계  (0) 2018.08.30
[Spring]MVC 처리흐름  (0) 2018.08.30
[Spring]DI - 컬렉션 타입 Prop Set  (0) 2018.08.30