오봉이와 함께하는 개발 블로그

스프링 MVC 1 - 요청 매핑 핸들러 어탭터 구조 본문

BE/Spring

스프링 MVC 1 - 요청 매핑 핸들러 어탭터 구조

오봉봉이 2022. 8. 15. 01:45
728x90

요청 매핑 핸들러 어댑터 구조

HTTP 메시지 컨버터는 스프링 MVC 어디쯤에서 사용되는 것인가?

SpringMVC 구조

이 그림에서는 보이지 않는다.

모든 비밀은 어노테이션 기반 컨트롤러
@RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter(요청 매핑 핸들러 어댑터)에 있다.

RequestMappingHandlerAdapter 동작 방식

  1. RequestMapping 핸들러 어댑터로 요청
  2. RequestMapping 핸들러 어댑터는 ArgumentResolver에 정보를 넘김
  3. ArgumentResolver에 컨트롤러의 파라미터, 어노테이션 정보 기반으로 전달 데이터를 생성
  4. RequestMapping 핸들러 어댑터는 ArgumentResolver가 생성한 데이터를 핸들러를 호출하며 파라미터 전달
  5. 컨트롤러가 동작하여 반환된 값을 ReturnValueHandler가 반환 값을 변환한다.

ArgumentResolver

어노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있다.
HttpServletRequest, Model, @RequestParam, @ModelAttribute,@RequestBody, HttpEntity
이렇게 파라미터를 유연하게 처리할 수 있는 이유가 바로 ArgumentResolver덕분이다.

어노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter는 바로 이 ArgumentResolver를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다.
그리고 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.

스프링은 30개가 넘는 ArgumentResolver를 기본으로 제공한다.
정확히는 HandlerMethodArgumentResolver인데 줄여서 ArgumentResolver라고 부른다.

ArgumentResolver 동작 방식

  1. ArgumentResolversupportsParameter()를 호출해서 해당 파라미터를 지원하는지 체크
  2. 지원하면 resolveArgument()를 호출해서 실제 객체를 생성
  3. 생성된 객체가 컨트롤러 호출시 넘어간다.

원한다면 직접 이 인터페이스를 확장해서 원하는 ArgumentResolver를 만들 수도 있다.

ReturnValueHandler

HandlerMethodReturnValueHandler를 줄여서 ReturnValueHandler라 부른다.
ArgumentResolver와 비슷한데 이것은 응답 값을 변환하고 처리한다.
컨트롤러에서 String으로 뷰 이름을 반환해도, 동작하는 이유가 바로 ReturnValueHandler덕분이다.

스프링은 10여개가 넘는 ReturnValueHandler를 지원한다.
예 : ModelAndView, @ResponseBody, HttpEntity, String

HTTP 메시지 컨버터

HTTP 메시지 컨버터 위치

HTTP 메시지 컨버터는 ArgumentResolver, ReturnValueHandler가 사용한다.

HTTP 메시지 컨버터를 사용하는 @RequestBody도 컨트롤러가 필요로 하는 파라미터(매개변수)의 값에 사용된다. -> 결국 ArgumentResolver가 해결해야 한다.

@ResponseBody의 경우도 컨트롤러의 반환 값을 이용한다. -> ReturnValueHandler가 해결해야 한다.

요청의 경우

@RequestBody를 처리하는 ArgumentResolver가 있고, HttpEntity를 처리하는 ArgumentResolver가 있다.
ArgumentResolver들이 HTTP 메시지 컨버터를 사용해서 컨트롤러가 필요한 파라미터 혹은 어노테이션에 따라 객체를 생성하는 것이다.
(canRead()를 사용한다.)

응답의 경우

@ResponseBodyHttpEntity를 처리하는 ReturnValueHandler가 있다.
그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.
(canWrite()를 사용한다.)

스프링 MVC는@RequestBody, @ResponseBody 가 있으면 RequestResponseBodyMethodProcessor(ArgumentResolver)
HttpEntity가 있으면 HttpEntityMethodProcessor(ArgumentResolver)를 사용한다.

확장

스프링은 다음을 모두 인터페이스로 제공하기 때문에 필요하면 언제든지 기능을 확장할 수 있다.

  • HandlerMethodArgumentResolver
  • HandlerMethodReturnValueHandler
  • HttpMessageConverter

스프링이 필요한 대부분 기능을 제공하기 때문에 실제 기능 확장을 할 일이 많지 않다.
기능 확장은 WebMvcConfigure를 상속 받아서 스프링 빈으로 등록하면 된다.
실제 자주 사용하진 않지만 확장이 필요할 때 해당 클래스를 검색하자.

출처 : 인프런 김영한 지식 공유자님 강의 - 스프링 MVC 1편 백엔드 웹 개발 핵심 기술
728x90
Comments