• HandlerMapping 은 핸들러를 찾아주는 Interface ( strategy pattern )

  • HandlerAdapter 은 핸들러를 실행하는 Interface

  • 요청 분석 후 멀티 파트 타입 요청 ( 파일 업로드 ) 인지 로케일은 어떤건지 테마는 어떤 테마인지 정보를 판단 후 이 요청을 처리 할수 있는 핸들러를 찾는다. ( handlerMapping)

  • 아무런 설정을 하지 않아도 디스패쳐서블릿이 기본으로 BeanNamerUrlHandler 와 RequestMappingHandler 를 갖고 있다.

  • RequestMappingHandler는 GetMapping, PostMapping 등이 핸들러를 지정한것을 찾아주는 핸들러 매핑

  • for문을 돌면서 핸들러를 찾고 찾으면 핸들러를 return 한다 ( handlerMapping)

  • 그 다음 실행 할 수 있는 핸들러 어댑터를 찾는다. ( HandlerAdapter )

    • 기본으로 HttpRequestHandlerAdapter , SimpleControllerHandlerAdapter , RequestMappingHandlerAdapter 이 존재한다.
  • 이 중 실행할수 있는 핸들러를 return 한다.( HandlerAdapter )

  • 핸들러를 실행하기 전에 http GET Method 라면 캐싱 기능을 지원.

  • 핸들러 어댑터가 요청을 처리하는데

  • 핸들러를 가져와서 handerIntener로 들어가서 reflection (InvokeHandlerMethod 메소드) 을 사용해서 요청에 등록된 controller을 실행

  • InvokeHandlerMethod는 인자로 request, response, handlerMethod를 주입받음.

    • HandlerMethod 객체 안에는 이미 method에 대한 정보가 주입되어 있음.
  • 이 주입된 정보를 reflection을 이용하여 호출

    • @RestController은 일반적인 @Controller 에 @ResponseBody를 사용한것과 동일함
  • 호출후 return값을 받아서 이 값을 처리 할수 있는 returnValueHandler를 찾는다.

    • @ResponseBody가 있으면 returnValueHandler 는 Converter를 사용해서 return 값은 HTTP 본문에 넣어주는 처리를 함. ( view에 rendering 을 하지 않음 )
    • @ReponseBody가 없으면 view의 이름을 찾아 model의 data를 rendering 시킴
    • 이때 view의 이름은 Controller의 return 값
  • 예외 발생시 등록된 HandlerExceptionResolver 중 가장 적절한 Resolver를 찾아서 예외를 처리.

  • 최종적으로 응답을 보냄.

+ Recent posts