○ 스프링 MVC 가 지원하는 컨트롤러의 종류는 4가지 이다.

   각 건트롤러를 DispatcherServlet 에 연결해 주는 어댑터가 하나씩 있어야 하므로, 핸들러 어댑터도 4개다.

○ 이 중에서 SimpleServletHandlerAdapter 를 제외한 3개의 핸들러 어댑터는 DispatcherServlet 에 디폴트 전략으로 설정되어 있다.

 

Servlet 과 SimpleServletHandlerAdapter

○ 표준 Servlet Interface 인 javax.servlet.Servlet 을 구현한 Servlet Class 를 Spring MVC 의 Controller 로 사용할 수 있다.

○ 기존에 Servlet 으로 개발된 코드를 Spring Application 에 가져와 사용하려면 일단 Servlet 을 web.xml 에 별도로 등록하지 말고 Spring MVC Controller 로 등록해서 사용하는게 좋다.

○ Servlet 을 Controller 로 사용했을 때의 장점은 Servlet Class 코드를 그대로 유지하면서 Spring Bean 으로 등록된다는 점이다. 따라서 Servlet 코드를 점진적으로 Spring Application 에 맞게 포팅할 때 유용하다.

○ Servlet 이 Controller Bean 으로 등록된 경우에는 자동으로 init(), destroy() 와 같은 생명주기 method 가 호출되지 않는 다는 점에 주의하자. Servlet 초기화 작업을 하는 코드가 있다면, 이때는 빈을 등록할 때 <bean> 태그의 init-method attribute 나 @PostConstruct annotation 등을 이용해 Bean 생성 후에 초기화 메소드가 실행되게 해야 한다.

○ DispatcherServlet 이 Servlet Type 의 Controller 를  호출할 때 필요한 SimpleServletHandlerAdapter 는 DispatcherServlet 의 기본 전략이 아니므로 다음과 같이 별도로 등록해 줘야 한다.

<bean class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter"/>
○ 이렇게 HandlerAdapter 가 Bean 으로 등록되어 있으면 DispatcherServlet 은 이를 자동으로 감지해 Default Handler Adapter 를 대신해서 사용한다.
○ DispatcherServlet 은 Controller 가 ModelAndView 타입의 object 대신 null 을 리턴하면 View 를 호출하는 과정을 생략하고 작업 마치게 되어 있다. Servlet Controller 처럼 직접 HttpServletResponse 에 결과를 넣는 Controller 도 있기 때문이다.

HttpRequestHandler 와 HttpRequestHandlerAdapter
 
○ HttpRequestHandler 는 아래의 Interface 로 정의되어 있는 Controller Type 이다.
public interface HttpRequestHandler {
    void handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException;

}
○ Servlet Interface 와 비슷하며 실제로 HttpRequestHandler 는 Servlet 처럼 동작하는 Controller 를 만들기 위해 사용한다.
○ Model 과 View 를 사용하지 않는 HTTP 기반의 RMI 와 같은 low level 서비스를 개발할 때 사용한다.
 
Controller 와 SimpleControllerHandlerAdapter
 
○ SimpleControllerHandlerAdapter 에 의해 실행되는 Controller Type Controller 는 아래의 Interface 를 구현해서 만든다.
public interface Controller {

    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
○ Default HandlerAdapter 이다.
○ Controller Type 의 Controller 는 DispatcherServlet 이 Controller 와 주고 받는 정보를 그대로 메소드의 파라메터와 리턴값으로 가지고 있다. 따라서 스프링 MVC의 가장 대표적인 컨트롤러 타입이라고 볼 수 있다. Spring 3.0의 Annotation 과 관례를 이용한 Controller 가 본격적으로 등장하기 전까지, Spring MVC Controller 라고 하면 바로 이 Controller 를 들 수 있을 만큼 많이 사용되는 컨트롤러 였다.
○ 하지만 실제로는 이 Controller Interface 를 직접 구현해 Controller 를 만드는 것은 권장되지 않는다. 적어도 웹 브라우저를 클라이언트로 갖는 Controller 의 필수 기능이 구현되어 있는 AbstractController 를 상속해서 Controller 를 만는 것이 편리하기 때문이다. 물론 AbstractController 는 Controller Interface 를 구현한 Controller Type 의 Controller 이다.
 
AnnotationMethodHandlerAdapter
 
○ 여타 핸들러와는 다른 독특한 특징이 있다. 가장 큰 특징은 지원하는 Controller 의 type 이 정해져 있지 않다는 점이다. 다른 핸들러 어뎁터는 특정 인터페이스를 구현한 컨트롤러만을 지원한다. 반면에 AnnotationMethodHandlerAdapter 는 컨트롤러 타입에는 제한이 없다. 대신 클래스와 메소드에 붙은 몇 가지 애노테이션의 정보와 메소드 이름, 파라메터, 리턴 타입에 대한 규칙 등을 종합적으로 분석해서 컨트롤러를 선별하고 호출하는 방식을 결정한다.
○ AnnotationMethodHandlerAdapter 의 또 다른 특징은 컨트롤러 하나가 하나 이상의 URL에 매핑될 수 있다는 점이다. 여타 컨트롤러는 특정 인터페이스를 구현하면 그 인터페이스의 대표 메소드를 통해 컨트롤러가 호출되기 때문에, 특별한 확장 기능을 사용하는 경우를 제외하면 URL 당 하나의 컨트롤러가 매핑되는 구조이다.
○ AnnotationMethodHandlerAdapter 는 여타 핸들러 어댑터와는 다르게 DefaultAnnotationHandlerMapping 핸들러 매핑과 함께 사용해다 한다. 두 가지 모두 동일한 애노테이션을 사용하기 때문이다.
○ AnnotationMethodHandlerAdapter 와 DefaultAnnotationHandlerMapping 은 Spring MVC 에서 가장 인기 있는 컨트롤러 작성 방법이다.
○ 반면에 제법 많은 애노테이션을 사용해야 하고 메소드와 파라미터의 이름, 타입, 순서 등에 따라 기능이 달라지기 때문에 규칙과 관례를 잘 기억하고 있어야 한다. 따라서 제대로 활용하려면 다른 많은 학습과 연구가 필요하다.

 

반응형

'Spring framework > Spring3' 카테고리의 다른 글

[Spring 3 - MVC] 핸들러 예외 리졸버  (0) 2013.04.24
[Spring 3 - MVC] 뷰  (0) 2013.04.24
[Spring 3 - MVC] 핸들러 인터셉터  (0) 2013.04.24
[Spring 3 - MVC] 핸들러 매핑  (0) 2013.04.24
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기