[Spring MVC 1] - 핸들러 매핑과 핸들러 어댑터
Goal : 핸들러 매핑과 핸들러 어댑터가 어떻게 사용되는지 알아본다.
핸들러 매핑과 핸들러 어댑터
OldController
hello/servlet/web/springmvc/old/OldController.java
@Component("/springmvc/old-controller")
public class OldController implements Controller {
// @Component("/springmvc/old-controller")를 해주면 스프링빈의 이름이 /springmvc/old-controller가 된다
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handleRequest");
return null;
}
}
- @Component : 이 컨트롤러는 /springmvc/old-controller라는 이름의 스프링 빈으로 등록되었다.
- 빈의 이름으로 url을 매핑할 것이다.
- ** 주의 @Controller 와 Controller는 다르다.
http://localhost:8080/springmvc/old-controller 실행 결과
콘솔 출력
OldController.handleRequest
이 컨트롤러가 호출될 수 있는 이유
이 컨트롤러가 호출되려면 두가지가 필요하다.
- HandlerMapping 핸들러 매핑
- 핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야한다.
- ex) 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.
- HandlerAdapter 핸들러 어댑터
- 핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다
- ex) Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야한다
HandlerMapping
RequestMappingHandlerMapping | 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용 |
BeanNameUrlHandlerMapping | 스프링 빈의 이름으로 핸들러를 찾는다. |
HandlerAdapter
RequestMappingHandlerAdapter | 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용 |
BeanNameUrlHandlerAdapter | HttpRequestHandler 처리 |
SimpleControllerHandlerAdapter | Controller 인터페이스(어노테이션 x, 과거에 사용) 처리 |
** 핸들러 매핑도, 핸들러 어댑터도 모두 순서대로 찾고 만약 없다면 다음 순서로 넘어간다
호출 프로세스
1. 핸들러 매핑으로 핸들러 조회
- HandlerMapping을 순서대로 실행해서 핸들러를 찾는다.
- 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 BeanNameUrlHandlerMapping가 실행에 성공하고 핸들러인 OldController를 반환한다.
2. 핸들러 어댑터 조회
- HandlerAdapter의 supports()를 순서대로 호출한다.
- SimpleControllerHandlerAdapter가 Controller인터페이스를 지원하므로 대상이 된다.
3. 핸들러 어댑터 실행
- 디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.
- SimpleControllerHandlerAdapter는 핸들러인 OldController를 내부에서 실행하고 그 결과를 반환한다
정리 - OldController 핸들러매핑, 어댑터
- OldController를 실행하면서 사용된 객체는 다음과 같다.
- HandlerMapping = BeanNameUrlHandlerMapping
- HandlerAdapter = SimpleControllerHandlerAdapter
MyHpptRequestHandler
hello/servlet/web/springmvc/old/MyHttpRequestHandler.java
@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");
}
}
http://localhost:8080/springmvc/request-handler 실행 결과
콘솔 출력
MyHttpRequestHandler.handleRequest
@RequestMapping
가장 우선순위가 높은 핸들러 매핑과 핸들러 어댑터는 RequestMappingHandlerMapping, RequestMappingHandlerAdapter이다.
머리채 잡고 다시 공부 시작... 야근을 매일하고 집에서 바로 뻗고 싶은 마음, 놀고픈 마음 굴뚝이지만 하나하나 허용해주면 결국 또 미룰 것이기에. 막상하면 할 수 있는데, 거기까지 가는 스텝이 고난스럽다. 어떻게 해야 뇌구조를 바꿀 수 있쥐.
그렇지만서도 난 해낼 수 있다. 끝까지 완주 화이팅 !-!