Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

RequestMapping Handler Adapter 구조 본문

인프런/[인프런] 스프링 MVC 1

RequestMapping Handler Adapter 구조

Seung__ 2021. 9. 16. 10:33

HTTP 메시지 컨버터는 SpringMVC 어디 쯤? 에서 사용됨....?

 

1. SpringMVC 구조


  • @RequestMapping을 처리하는 핸들러 Adapter인 RequestMappingHandlerAdapter에서 처리함.

 

 

 

2. RequestMappingHandlerAdapter 동작 방식


 

 

2.1 Argument Resolver


  • annotation 기반 controller는 다양한 파라미터 사용 가능
  • HttpServletRequest, Model,  @RequestParam, @ModelAttribute, @RequsetBody, HttpEnttiy 등등
  • 이렇게 유연한 처리가 가능한 이유는 ArgumentResolver 때문임.
  • annotaion기반 Controller를 처리하는 RequestMappingHandlerAdapter는 ArgumentResolver를 호출하여
  • controller(=handler)가 필요한 다양한 파라미터 값(or 객체)를 생성하여 controller 호출 및 값 전달.
  • HandlerMethodArgumentResolver를 줄여서  ArgumentResolver

 

2.2 ArgumentResolver 동작 방식


  • ArgumentResolver 의 supportsParameter() 를 호출해서 해당 파라미터를 지원여부 확인
  • 지원하면 resolveArgument() 를 호출해서 실제 객체를 생성한다. 
  • 그리고 이렇게 생성된 객체가 컨트롤러 호출시 넘어감.

 

 

 

3. ReturnValueHandler


  • ArgumentResolver와 비슷
  • Controller에서 반환한 값을 변환해줌.
  • String으로 view이름 반환해도 동작하고 ModelAndView를 반환해도 동작하고 @ReponseBody 등등 유연하게 지원

 

 

4. HTTP Message Converter 위치


  • Message Converter는 ArgumentResoler, ReturnValueHandler에서 사용함.
  • 요청하는 경우
    • @RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity 를 처리하는ArgumentResolver 가 있다.
    • ArgumentResolver 들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성하는 것.
  • 응답하는 경우
    • @ResponseBody 와 HttpEntity 를 처리하는 ReturnValueHandler 가 있다. 
    • 그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.(write() 호출)
  • SpringMVC는
    • @RequestBody @ResponseBody 가 있으면  RequestResponseBodyMethodProcessor (ArgumentResolver)
    • HttpEntity 가 있으면 HttpEntityMethodProcessor (ArgumentResolver)를 사용한다.

 

 

5. 확장


  • 스프링은 다음을 모두 인터페이스로 제공한다. 따라서 필요하면 언제든지 기능을 확장할 수 있다.
    • HandlerMethodArgumentResolver
    • HandlerMethodReturnValueHandler
    • HttpMessageConverter
  • 스프링이 필요한 대부분의 기능을 제공하기 때문에 실제 기능을 확장할 일이 많지는 않다. 
  • 기능 확장은  WebMvcConfigurer 를 상속 받아서 스프링 빈으로 등록하면 됨.
  • 실제 자주 사용하지는 않으니 실제 기능  확장이 필요할 때 WebMvcConfigurer 확인.
Comments