본문 바로가기
Spring Tutorial

[스프링MVC 기본 기능 11] 요청 매핑 핸들러 어댑터 구조

by 미소5 2023. 8. 27.

SpringMVC 구조

HTTP 메시지 컨버터는 어디에서 사용되는 것일까?

 


  • RequestMappingHandlerAdapter (요청 매핑 핸들러 어댑터)
    • 애노테이션 기반의 컨트롤러, 즉 @RequestMapping을 처리하는 핸들러 어댑터이다. 
    • 애노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있었다.
      • HttpServletRequest , Model 은 물론이고, @RequestParam , @ModelAttribute 같은 애노테이션 뿐 아니라, @RequestBody , HttpEntity 같은 HTTP 메시지를 처리하는 부분까지. 매우 큰 유연함을 보여주었다.

→ 이렇게 유연하게 파라미터를 처리할 수 있는 이유가 바로 ArgumentResolver 덕분이다!

 


RequestMappingHandlerAdapter 동작 방식

 

1. 애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter는  ArgumentResolver를 호출해서컨트롤러(핸들러)가필요로 하는 다양한 파라미터의 값(객체)을 생성한다.

 

2. 이렇게 파라미터의 값이 모두 준비되면, 컨트롤러를 호출하면서 값을 넘겨준다.

  • 스프링은 30개가 넘는 ArgumentResolver 를 기본으로 제공한다. 

 

3. ReturnValueHandler가  응답 값을 변환하고 처리한다.

  • ArgumentResolver와 비슷
  • 컨트롤러에서 String으로 뷰 이름을 반환해도, 동작하는 이유가 바로 ReturnValueHandler 덕분
  • 스프링은 10여개가 넘는 ReturnValueHandler 를 지원한다. 예) ModelAndView , @ResponseBody , HttpEntity , String

 


  • ArgumentResolver의 동작 방식
    • ArgumentResolver의 supportsParameter() 를 호출해서 해당 파라미터를 지원하는지 체크하고, 지원하면 resolveArgument() 를 호출해서 실제 객체를 생성한다. 그리고 이렇게 생성된 객체가 컨트롤러 호출시 넘어가는 것이다.
    • 직접 이 인터페이스를 확장해서 원하는 ArgumentResolver 를 만들 수도 있다. (실제 확장하는 예제는 향후 로그인 처리에서 진행)

 

 


애노테이션 기반의 컨트롤러가 처리할 수 있는 파라미터 목록?

Method Arguments :: Spring Framework

 

Method Arguments :: Spring Framework

JDK 8’s java.util.Optional is supported as a method argument in combination with annotations that have a required attribute (for example, @RequestParam, @RequestHeader, and others) and is equivalent to required=false.

docs.spring.io

 

 


HTTP 메시지 컨버터

 

  • HTTP 메시지 컨버터는 어디쯤 있을까?
    • HTTP 메시지 컨버터를 사용하는 @RequestBody도  컨트롤러가 필요로 하는 파라미터의 값에 사용된다. (→ArgumentResolver 필요)   @ResponseBody의 경우도  컨트롤러의 반환 값을 이용한다. (→ReturnValueHandler 필요)
      • 요청의 경우
        • @RequestBody를 처리하는 ArgumentResolver가 있고, HttpEntity를 처리하는 ArgumentResolver가 있다.
        • ArgumentResolver들이  HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성
      • 응답의 경우
        • @ResponseBodyHttpEntity를 처리하는 ReturnValueHandler 가 있다. 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.
      • 스프링 MVC는 @RequestBody @ResponseBody 가 있으면 RequestResponseBodyMethodProcessor (ArgumentResolver)를,  HttpEntity 가 있으면 HttpEntityMethodProcessor (ArgumentResolver)를 사용

 


  • 스프링은 다음을 모두 인터페이스로 제공한다.  →필요하면 언제든지 기능을 확장할 수 있다.
    • HandlerMethodArgumentResolver
    • HandlerMethodReturnValueHandler
    • HttpMessageConverter
  • 스프링이 필요한 대부분의 기능을 제공하기 때문에 실제 기능을 확장할 일이 많지 않다! 
    • 기능 확장은 WebMvcConfigurer 를 상속 받아서 스프링 빈으로 등록하면 된다. (실제 기능 확장이 필요할 땐 WebMvcConfigurer 를 검색해보자.)

 



[스프링MVC 27] 스프링 MVC 구조 (tistory.com)

 

[스프링MVC 27] 스프링 MVC 구조

[스프링MVC 26] MVC 프레임워크 만들기: 유연한 컨트롤러 (tistory.com) [스프링MVC 26] MVC 프레임워크 만들기: 유연한 컨트롤러 [스프링MVC 25] MVC 프레임워크 만들기: 단순하고 실용적인 컨트롤러 (tistory.c

joly156.tistory.com

 

728x90
반응형