Spring

[Spring] 스프링 MVC(17) - 핸들러, HandlerMapping, HandlerAdapter

재담 2022. 4. 7. 23:07

핸들러, HandlerMapping, HandlerAdapter

DispatcherServlet은 웹 요청을 실제로 처리하는 객체의 타입을 @Controller 어노테이션을 구현한 클래스로 제한하지 않는다. 실제로 거의 모든 종류의 객체로 웹 요청을 처리할 수 있다. 그래서 웹 요청을 처리하는 객체를 좀 더 범용적인 의미로 '핸들러(Handler)'라고 부른다.

 

DispatcherServlet은 웹 요청 처리 결과로 ModelAndView만 리턴하면 올바르게 동작한다. 그런데 지금까지 작성한 컨트롤러는 ModelAndView 뿐만 아니라 String을 리턴한 경우도 있었다. 따라서 누군가는 중간에서 String 타입을 ModelAndView로 변경해주어야 하는데, 이때 사용되는 것이 바로 HandlerAdapter이다.

 

 

HandlerMapping의 우선순위

MVC 설정을 이용하면 최소 두 개 이상의 HandlerMapping이 등록된다. 각 HandlerMapping은 우선순위를 갖고 있는데, 가장 높은 우선순위의 HandlerMapping이 null을 리턴하면 그 다음 우선순위를 갖는 HandlerMapping을 이용한다. 이렇게 HandlerMapping이 null을 리턴하지 않을 때까지 반복하고 마지막 HandlerMapping까지 null을 리턴하면, DispatcherServlet은 404 에러 코드를 응답한다.

 

HandlerMapping이 요청을 처리할 핸들러 객체를 리턴하면, 핸들러 객체를 처리할 HandlerAdapter를 찾은 뒤에 HandlerAdapter에 핸들러 객체 실행을 위임한다.

 

 

MVC 설정에서의 HandlerMapping과 HandlerAdapter

<mvc:annotation-driven> 설정이나 @EnableWebMvc 어노테이션을 사용하면 다음과 같은 HandlerMapping과 HandlerAdapter를 등록한다.

  • RequestMappingHandlerMapping : @Controller 적용 빈 객체를 핸들러로 사용, 우선순위 높음.
  • SimpleUrlHandlerMapping : <mvc:default-servlet-handler>, <mvc:view-controller>, <mvc:resources> 태그를 사용할 때 등록되는 HandlerMapping 구현. URL과 핸들러 객체를 매핑하며 우선순위 낮음.
  • RequestMappingHandlerAdapter : @Controller 적용 빈 객체에 대한 어댑터
  • HttpReqeustHandlerAdapter : HttpRequestHandler 타입의 객체에 대한 어댑터
  • SimpleControllerHandlerAdapter : Controller 인터페이스를 구현한 객체에 대한 어댑터

Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)