HandlerMapping, HandlerAdapter

YH·2023년 4월 22일
0

✅ HandlerMapping

  • HandlerMapping은 HTTP 요청 정보를 이용하여 이를 처리할 핸들러(컨트롤러)를 찾아주는 기능을 가진 DispatcherServlet의 전략이다.

✔️ 스프링 부트에서 제공하는 HandlerMapping (이 외에도 더 있지만 일부 생략)

(숫자는 우선순위를 의미)
0 = RequestMappingHandlerMapping → @RequestMapping이라는 애노테이션을 이용해 매핑하는 전략
1 = BeanNameUrlHandlerMapping → HTTP 요청 URL과 스프링 빈의 이름을 비교하여 일치하는 빈을 찾는다.

✅ HandlerAdapter

  • HandlerAdapter란 HandlerMapping을 통해 검색된 핸들러 객체를 가지고 이에 맞는 어댑터를 찾는 과정이다.

✔️ 스프링 부트에서 제공하는 HandlerAdapter

0 = RequestMappingHandlerAdapter → 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = HttpRequestHandlerAdapter → HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter → Controller 인터페이스 (어노테이션 X, 과거에 사용 됨) 처리

아래 예시는 Controller 인터페이스를 사용했기 때문에 BeanNameUrlHandlerMappingSimpleControllerHandlerAdapter가 사용됨

@Component("/springmvc/old-controller")
public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("OldController.handleRequest");
        return null;
    }
}

✔️ 위 예제 코드에 대한 동작 순서 정리

  1. HandlerMapping을 순서대로 실행해서 핸들러를 찾는다. 위의 경우에는 BeanNameUrlHandlerMapping가 실행되고 해당 핸들러인 OldController를 반환한다.
  2. HandlerAdapter의 supports()를 순서대로 호출한다. (우선순위 대로)
  3. 위 경우에는 SimpleControllerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상 Adapter가 된다.
  4. DispatcherServlet이 조회한 SimpleControllerHandlerAdapter가 실행하면서 핸들러 정보도 파라미터로 함께 넘겨준다.
  5. SimpleControllerHandlerAdapter는 핸들러인 OldController를 내부에서 실해하고 결과를 반환한다.

✅ HttpRequestHandler에 대한 예제

public interface HttpRequestHandler {
	void handleRequest(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException;
}
@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("MyHttpRequestHandler.handleRequest");
    }
}

✔️ HttpRequestHandler 사용 시 동작 순서 정리

  1. HandlerMapping은 우선 순위대로 핸들러를 찾는다. 위의 MyHttpRequestHandler는 스프링 빈 이름으로 찾아야 하므로 BeanNameUrlHandlerMapping이 사용된다.
  2. HandlerAapter가 조회한 MyHttpRequestHandler를 지원 가능한 어댑터를 찾는다. MyHttpRequestHandler에서는 HttpRequestHandler가 사용되었기 때문에 HttpReqeustHandlerAdapter가 사용된다.
  3. DispatcherServlet이 조회한 HttpReqeustHandlerAdapter를 실행하면서 MyHttpRequestHandler 오브젝트를 파라미터로 넘겨준다.
  4. HttpReqeustHandlerAdapter는 내부에서 MyHttpRequestHandler 핸들러를 실행하고 결과를 반환한다.

✔️ 정리

  • 위 예제에서는 Controller 인터페이스와 HttpRequestHandler를 사용하였지만, 실무에서는 어노테이션 기반의 컨트롤러를 지원하는 @RequestMapping을 거의 대부분 사용한다.

참고 Reference

profile
하루하루 꾸준히 포기하지 말고

0개의 댓글