쌓고 쌓다
핸들러 매핑과 핸들러 어댑터 이해하기 본문
지금은 사용하지 않는 과거 컨트롤러로 핸들러 매핑과 어댑터를 이해하자.
과거 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을 호출한다.
이 어댑터의 handle은 핸들러의 handleRequest를 호출한다.
핸들러(컨트롤러)가 수행된다. 그 결과로 반환되는 모델뷰가 이제 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에서
찾은 어댑터를 통해 핸들러를 실행하고 그 결과를 반환 받는다.
'프로그래밍 > spring' 카테고리의 다른 글
뷰 리졸버 동작 (0) | 2023.08.07 |
---|---|
[스프링 부트] 게시글 삭제시 첨부파일 삭제 - 20 (0) | 2023.08.07 |
[스프링 부트] 파일 응답 및 이미지 출력, MIME 타입 확인 - 19 (0) | 2023.08.05 |
Spring MVC 구조 (0) | 2023.08.05 |
[스프링 부트] 파일 다운로드 - 18 (0) | 2023.08.04 |