Spring/mvc

[Spring MVC 1] - 핸들러 매핑과 핸들러 어댑터

dev_rosieposie 2022. 9. 28. 01:59

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

 

이 컨트롤러가 호출될 수 있는 이유

이 컨트롤러가 호출되려면 두가지가 필요하다.

  1. HandlerMapping 핸들러 매핑
    • 핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야한다.
    • ex) 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.
  2. HandlerAdapter 핸들러 어댑터
    • 핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다
    • ex) Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야한다

HandlerMapping

RequestMappingHandlerMapping 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
BeanNameUrlHandlerMapping 스프링 빈의 이름으로 핸들러를 찾는다.

HandlerAdapter

RequestMappingHandlerAdapter 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
BeanNameUrlHandlerAdapter HttpRequestHandler 처리
SimpleControllerHandlerAdapter Controller 인터페이스(어노테이션 x, 과거에 사용) 처리

** 핸들러 매핑도, 핸들러 어댑터도 모두 순서대로 찾고 만약 없다면 다음 순서로 넘어간다

 

호출 프로세스

1. 핸들러 매핑으로 핸들러 조회

  1. HandlerMapping을 순서대로 실행해서 핸들러를 찾는다.
  2. 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 BeanNameUrlHandlerMapping가 실행에 성공하고 핸들러인 OldController를 반환한다.

2. 핸들러 어댑터 조회

  1. HandlerAdapter의 supports()를 순서대로 호출한다.
  2. SimpleControllerHandlerAdapter가 Controller인터페이스를 지원하므로 대상이 된다.

3. 핸들러 어댑터 실행

  1. 디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.
  2. 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이다.

 

 

 

 

 


머리채 잡고 다시 공부 시작... 야근을 매일하고 집에서 바로 뻗고 싶은 마음, 놀고픈 마음 굴뚝이지만 하나하나 허용해주면 결국 또 미룰 것이기에. 막상하면 할 수 있는데, 거기까지 가는 스텝이 고난스럽다. 어떻게 해야 뇌구조를 바꿀 수 있쥐.

그렇지만서도 난 해낼 수 있다. 끝까지 완주 화이팅 !-!