본문 바로가기

spring/MVC

Spring MVC

■ Spring MVC의 주요 구성 요소

  - DispatcherServlet

    클라이언트의 요청을 전달받는다. Controller에게 클라이언트의 요청을 전달하고, Controller가 리턴 한 결과 값을 View에 전달하여 알맞은 응답을 생성하도록 한다.

  - HandlerMapping

    클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정한다.

  - Controller

    클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 스트럿츠의 Action과 동일한 역할을 수행한다.

  - ViewResolver

    Commander의 처리 결과를 보여줄 View를 결정한다.

  - View

    Commander의 처리 결과를 보여줄 응답을 생성한다.


■ HandlerMapping

    클라이언트의 요청을 Spring의 DispatcherServlet이 처리하도록 설정했다면, 다음으로 해야 할 작업은 어떤 HandlerMapping을 사용할지의 여부를 지정하는 것이다. HandlerMapping은 클라이언트의 요청을 어떤 Controller가 수행할 지의 여부를 결정해주는데, 구현 클래스는 다음과 같다.


    - BeanNameUrlHandlerMapping : 요청 URI와 동일한 이름을 가진 Controller 빈을 매핑 한다.

    - SimpleUrlHandlerMapping : 패턴과 컨트롤러의 이름을 비교 URI가 패턴에 매칭될 때 지정한 컨트롤러를 사용 한다.

    - ControllerClassNameHandlerMapping : URI와 매칭 되는 클래스 이름을 갖는 빈을 컨트롤러로 사용

    - DefaultAnnotationHandlerMapping : @RequestMapping 어노테이션을 이용하여 요청을 처리할 컨트롤러를 구한다.


   ο  BeanNameUrlHandlerMapping

       BeanNameUrlHandlerMapping은 요청 URI와 동일한 이름을 갖는 Controller 빈으로 하여금 클라이언트의 요청을 처리하도록 한다. 예를 들어, http://host/hello.action 과 같은 요청 URL에 대해 "/hello.action" 라는 이름을 가진 Controller 빈이 해당 요청을 처리하도록 한다.


       다음과 같이 alwaysUseFullPath를 true로 설정 하고 다음과 같이 빈을 설정 한 경우


      <bean id="beanNameUrlMapping" 

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

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

     </bean>


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

     <bean name="/hello/hello.action" class="..."/>


       이 경우 요청 URL을 처리하는 컨트롤 빈은 다음과 같이 매핑 된다.


     - /content/**/*.action 빈

       /content/1/test.action

       /content/top/exam.action


    -  /hello/hello.action 빈

       /hello/hello.action


     - Ant 경로 패턴

       Ant는 자바 기반의 빌드 도구로서 『?』, 『*』, 『**』를 이용하여 경로 패턴을 명시하고 있으며, BeanNameUrlHandlerMapping과 SimpleUrlHandlerMapping은 Ant의 경로 패턴을 이용하여 요청 URL과 컨트롤의 매핑을 처리 한다.


       ? : 1개의 문자와 매칭

       * : 0개 이상의 문자와 매칭

       ** : 0개 이상의 디렉토리와 매칭



   ο  SimpleUrlHandlerMapping

       SimpleUrlHandlerMapping은 가장 많이 사용되는 HandlerMapping으로 패턴 매칭을 이용해서 다양한 URL 경로를 컨트롤러에 매핑 시켜준다.


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


      <bean

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

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

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

             <prop key="/hello/hello.action">helloController</prop>

         </property>

     </bean>


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

     <bean name="helloController" class="..."/>


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



■ MVC 관련 컨트롤러

   ο  Controller 종류

     - Controller (interface)

     - AbstractController

     - MultiActionController



   ο Controller 인터페이스

      Controller를 구현하는 가장 간단한 방법은 Controller 인터페이스를 implements 하는 것이지만, Controller 인터페이스를 직접적 implements 하기 보다는, Controller 인터페이스를 implements 하고 몇 가지 추가적인 기능을 구현하고 있는 클래스들을 상속받아 Controller를 구현하는 것이 일반적이다.


      org.springframework.web.servlet.mvc.Controller 인터페이스는 다음과 같이 정의되어 있다.

      public interface Controller {

           ModelAndView handleRequest(HttpServletRequest request,   HttpServletResponse response)    throws Exception

      }



   ο AbstractController 추상 클래스

      Controller 인터페이스를 구현한 추상 클래스로 단순히 클라이언트의 요청을 처리한 뒤 ModelAndView 를 리턴할 경우에 AbstractController 클래스를 상속 받아 컨트롤러를 구현 한다.


      AbstractController 클래스는 다음과 같이 handleRequestInternal() 추상 메소드를 선언하고 있으며 AbstractController 클래스를 상속받는 컨트롤러 클래스는 이 메소드를 구현해야 한다.


      protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception 



   ο MultiActionController

     1) 하나의 Controller에서 여러 개의 요청 처리 지원

         - 연관 된 request를 하나의 controller로 묶을 경우 사용


     2) 작성

        - MultiActionController 상속

       - client의 요청을 처리할 메소드 구현

          public[ModelAndView|Map|void] 메소드이름(HttpServletRequest req, HttpServletResponse res[HttpSession|Command])[throws Exception]{

 }


       - return type : ModelAndView, Map, void 중 하나

       - argument : 

        1번 - HttpServletRequest

        2번 - HttpServletResponse

        3번 - 선택적이며  HttpSession 또는 Command 또는 3번 HttpSession

        4번 - Command


    3) MethodNameResolver 등록

       - 역할 : 어떤 메소드가 클라이언트의 요청을 처리할 것인지 결정

       - Spring 설정파일에 <bean>으로 등록

       - controller에서는 property로 주입 받는다.

       - 종류 

         - ParameterMethodNameResolver : parameter로 메소드 이름 전송

         - InternalPathMethodNameResolver : url 마지막 경로 메소드 이름으로 사용

         - PropertiesMethodNameResolver : URL과 메소드 이름 mapping을 property로 설정

'spring > MVC' 카테고리의 다른 글

spring MVC 이해하는 예제1  (0) 2013.07.28