쌓고 쌓다

핸들러 매핑과 핸들러 어댑터 이해하기 본문

프로그래밍/spring

핸들러 매핑과 핸들러 어댑터 이해하기

승민아 2023. 8. 6. 14:58

지금은 사용하지 않는 과거 컨트롤러로 핸들러 매핑과 어댑터를 이해하자.

 

과거 Controller 인터페이스

public interface Controller {
	@Nullable
	ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

이 인터페이스를 컨트롤러에서 받아 구현할 예정이다.

*Controller 인터페이스와 @Controller 어노테이션은 전혀 다르다.

 

OldController

import org.springframework.web.servlet.mvc.Controller;
@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;
    }
}

 @Component 값으로 스프링 빈의 이름을 /springmvc/old-controller로 등록했다.

이 스프링 빈 이름으로 URL 매핑을 할 예정이다.

 

이 컨트롤러가 호출되려면 아래의 과정을 거친다.

1. 핸들러 매핑 : 핸들러 매핑에서 이 컨트롤러를 찾을 방법이 필요하다. (스프링 빈의 이름으로 핸들러를 찾아야함)

1.1 스프링 부트가 자동 등록하는 핸들러 매핑

0순위. RequestMappingHandlerMapping : 어노테이션 기반 컨트롤러 @RequestMapping를 찾는다.
1순위. BeanNameUrlHandlerMapping : 스프링 빈 이름으로 핸들러를 찾는다.

위의 순위 순서대로 핸들러를 찾는다.

OldController는 스프링 빈 이름으로 핸들러를 찾아주는 1순위에서 실행되어 OldController를 반환하게 된다.

 

2. 핸들러 어댑터 조회 : 핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터를 찾아야한다.

2.1 스프링 부트가 자동 등록하는 핸들러 어댑터

0순위. RequestMappingHandlerAdapter : 어노테이션 기반 컨트롤러 @RequestMapping인걸 처리한다.
1순위. HttpRequestHandlerAdapter : HttpRequestHandler 처리
2순위. SimpleControllerHandlerAdapter : Controller 인터페이스 (어노테이션 Controller 아님)

핸들러 어댑터의 순위에 따라 순서대로 호출하는데

2순위인 SimpleControllerHandleAdapter의 supports 메서드로 일치하여 이 어댑터가 대상이되어 핸들러어댑터가 반환이된다.

 

이제 DispatcherServlet에서 이 어댑터의 handle을 호출한다.

DispatcherServlet에서 핸들러 어댑터의 handle 호출

 

핸들러 어댑터의 handle은 핸들러의 handleRequest를 호출

이 어댑터의 handle은 핸들러의 handleRequest를 호출한다.

 

우리의 Controller에서 로직 수행

핸들러(컨트롤러)가 수행된다. 그 결과로 반환되는 모델뷰가 이제 DispatcherServlet에 가는것이다.

 

인프런- 김영한

여기까지가 5번까지의 과정인 모델뷰를 반환받는 과정이다.

간단히 과정을 요약하자면

DispatcherServlet이 핸들러 매핑을 통해 핸들러 OldController를 찾고

이 핸들러를 실행할 핸들러 어댑터를 조회하여 찾은

SimpleControllerHandlerAdapter가 핸들러인 OldController를 실행하고 그 결과인 모델뷰를 반환받는다.

 

5번 과정의 이후는 다음 포스팅에서 알아보자.

 

+ HttpRequestHandler 핸들러 사용

@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");
 }
}

1. 핸들러 매핑 과정에서

BeanNameUrlHandlerMapping에 빈 이름으로 이 핸들러를 찾고

 

2. 핸들러 어댑터 과정에서

HttpRequestHandlerAdapter에 걸려 어댑터를 찾는다.

 

3. DispatcherServlet에서

찾은 어댑터를 통해 핸들러를 실행하고 그 결과를 반환 받는다.

Comments