Java2EE Framework/Spring 2.0

스프링 MVC - 요청URL과 컨트롤러를 매핑시키는 방법(기타)

본클라쓰 2010. 6. 5. 09:04

 스프링 MVC의 요청URL과 컨트롤러를 매핑시키는 가장 기본적인 방법은 SimpleUrlHandlerMapping과 BeanNameUrlHandlerMapping이 있다. 이 두 방법은 하나의 요청과 컨트롤러를 매핑시키는 방법이다. 그전에 뷰페이지와 컨트롤러의 의존성을 줄이는 설정을 알아보자.

 

 

■ 뷰페이지와 컨트롤러 사이의 의존성을 줄이는 InternalResourceViewResolver

 

 컨트롤러는 뷰페이지를 지정할 때 웹 어플리케이션 루트부터 절대 경로값을 포함한 페이지를 경로를 지정해야 한다. 이 때 전체 경로를 매개 변수로 지정하면 뷰와 컨트롤러 사이에 필요없는 의존성이 생성된다. 이에 매핑 설정을 통해 뷰와 컨트롤러의 의존성을 줄여 줄 수 있다. 이 때 사용하는 클래스가 InternalResourceViewResolver 클래스이다. 사용방법은 컨트롤러 설정 파일에 다음의 내용을 추가하는 것이다.

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">


<beans>


    <bean id="controller" class="net.guru.test.action.MainController" />


    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/index.do">controller</prop>
            </props>
        </property>
    </bean>


    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">

            <value>org.springframework.web.servlet.view.JstlView</value>

        </property>
        <property name="prefix"><value>/WEB-INF/jsp/</value></property>
        <property name="suffix"><value>.jsp</value></property>
    </bean>


</beans>

 

위와 같이 설정을 통해 접두사와 접미사를 등록하면 다음과 같이 페이지 경로를 지정할 수 있다.

  • 설정 적용 전 : return new ModelAndView("/WEB-INF/jsp/index.jsp");
  • 설정 적용 후 : return new ModelAndView("index"); 

 위의 org.springframework.web.servlet.view.JstlView 클래스는 JSP페이지에 JSTL를 사용함을 뜻하며 위의 클래스를 사용하기 위해서는 standard.jar, jstl.jar 라이브러리가 필요하다. 이 두 라이브러리를 /WEB-INF/lib 디렉토리에 복사한다.

 

 만약에 해당 컨트롤러를 정확하게 수행한 후 결과를 출력할 JSP 페이지가 없는 경우 404 에러를 출력한다. 또한, 스프링 프레임워크에러가 발생한다면 필요한 라이브러리가 없거나, 선언이 잘못되어 있는 경우이다.

 

 

PropertiesMethodNameResolver 클래스를 이용한 매핑

 

 PropertiesMehodNameResolver 클래스를 이용하면 다수의 URL 값을 하나의 컨트롤러 클래스에 정의하는 것이 가능하다. 즉, URL 값과 컨트롤러의 메소드 이름을 매핑시켜 해당 동작을 수행시킬 때 사용한다. PropertiesMehodNameResolver 클래스를 사용하기 위해서는 MultiActionController 클래스를 상속받아 작성해야 한다. PropertiesMethodNameResolver 클래스를 사용한 매핑을 위한 컨트롤러는 다음과 같이 작성한다.

 

package net.guru.test.action;

 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

 

public class MultiController extends MultiActionController {
    public ModelAndView list(HttpServletRequest request, HttpServletResponse response) {
        String now = (new java.util.Date()).toString();
 
        return new ModelAndView("hello", "now", now);
    }
    public ModelAndView view(HttpServletRequest request, HttpServletResponse response) {
 
        return new ModelAndView("test");
    }
    public ModelAndView test(HttpServletRequest request, HttpServletResponse response) {
        String now = (new java.util.Date()).toString();
 
        return new ModelAndView("hello", "now", now);
    }
}

 

해당 컨트롤러와 URL 매핑을 하는 설정은 다음과 같다.

 

<bean name="/index.do /view.do /test.do" class="net.guru.test.action.MultiController" >
    <property name="methodNameResolver">
        <ref local="userMethodNameResolver" />
    </property>
</bean>
 
<bean id="userMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
    <property name="mappings">           
        <props>               
            <prop key="/index.do">list</prop>           
            <prop key="/view.do">view</prop>           
            <prop key="/test.do">test</prop>           
        </props>       
    </property>   
 </bean>


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

 

이렇게 사용하면 여러 개의 URL을 하나의 컨트롤러에서 정의하는 것이 가능하다.

 

 

ParameterMethodNameResolver 클래스를 사용한 매핑

 

 ParameterMehodNameResolver 클래스를 사용하면 파라미터의 값으로 해당 MultiActionController의 메소드를 매핑하여 수행한다. 즉, 하나의 URL를 통해 전달받은 파라미터를 이용하여 컨트롤러 역할을 수행하게 만드는 매핑 방법이다. 위에서 정의한 MultiController 클래스를 ParameterMethodNameResolver 클래스를 사용하여 매핑하는 설정은 다음과 같다.

 

<bean name="/index.do" class="net.guru.test.action.MultiController" >
    <property name="methodNameResolver">
        <ref local="userMethodNameResolver" />
    </property>
</bean>


<bean id="userMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver" >
    <property name="paramName"><value>method</value></property>
    <property name="defaultMethodName"><value>list</value></property>
</bean>


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

 

 위의 설정은 index.do로 들어오는 요청에 파라미터의 변수명은 method가 되고 파라미터가 없다면 list() 메소드를 호출하게 하는 방법이다. 여러개의 요청을 하나의 컨트롤러에 작성할 때는 MultiActionController 클래스를 상속받아 구현한다.

 

 URL과 빈 이름을 매핑시키는 방법은 struts 프레임워크와 비슷한 방법이다. URL 매핑을 통한 빈즈 호출이다. 즉, 컨트롤러를 개발하는 개발자들은 빈을 정의하기만 하고 Controller가 어떻게 매핑되어 사용되는지는 설정을 통해 결정한다.