minOS

스프링 MVC 기본 기능 - 요청 매핑 핸들러 어댑터 구조 본문

TIL/김영한의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

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

minOE 2024. 8. 10. 16:01
728x90

요청 매핑 핸들러 어댑터 

 

  • 요청 맵핑 핸들러 어댑터란?: 스프링 프레임워크에서 클라이언트의 HTTP 요청을 적절한 핸들러 메서드로 연결해주는 중요한 구성 요소.
  • 핸들러 어댑터의 역할과 중요성: 다양한 핸들러를 유연하게 지원하고, 요청 처리 로직의 확장성을 보장.



ArgumentResolver

애노테이션 기반 컨트롤러는 `HttpServletRequest`, `Model`뿐만 아니라 `@RequestParam`, `@ModelAttribute` 같은 애노테이션, 그리고 `@RequestBody`, `HttpEntity`와 같은 HTTP 메시지 처리 방식 등 매우 다양한 파라미터를 활용할 수 있다. 이러한 유연한 파라미터 처리가 가능한 이유는 바로 `ArgumentResolver` 덕분이다.
애노테이션 기반 컨트롤러를 처리하는 `RequestMappingHandlerAdapter` 는 바로 이 `ArgumentResolver` 를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다. 그리고 이렇게 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다. 스프링은 30개가 넘는 ArgumentResolver를 기본으로 제공한다.

가능한 파라미터 목록은 다음 공식 메뉴얼에서 확인할 수 있다. https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments

 



ReturnValueHandler
HandlerMethodReturnValueHandler`는 줄여서 `ReturnValueHandler`라고 부른다. 이 핸들러는 `ArgumentResolver`와 비슷하게 작동하지만, 주요 역할은 컨트롤러의 응답 값을 변환하고 처리하는 것이다. 예를 들어, 컨트롤러에서 뷰 이름을 `String`으로 반환해도 해당 뷰가 정상적으로 동작할 수 있는 이유는 바로 `ReturnValueHandler`가 이를 적절히 처리해주기 때문이다. 이러한 처리가 가능해지면서 컨트롤러 메서드에서 다양한 타입의 반환값을 유연하게 사용할 수 있게 된다.
스프링은 10여개가 넘는 `ReturnValueHandler` 를 지원한다.

) `ModelAndView` , `@ResponseBody` , `HttpEntity` , `String`

가능한 응답 값 목록은 다음 공식 메뉴얼에서 확인할 수 있다
. https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann- return-types

 

 

 

HTTP 메시지 컨버터

 

 

  • HTTP 메시지 컨버터란?: 웹 애플리케이션에서 HTTP 요청과 응답의 본문을 객체로 변환하거나, 객체를 HTTP 메시지로 변환하는 역할을 하는 컴포넌트HTTP 메시지 컨버터를 사용하는 `@RequestBody` 도 컨트롤러가 필요로 하는 파라미터의 값에 사용된다.`@ResponseBody` 의 경우도 컨트롤러의 반환 값을 이용한다.
  • 중요성: 클라이언트와 서버 간 데이터 전송을 유연하고 효율적으로 처리할 수 있게 해주는 핵심 요소.



요청의 경우, `@RequestBody`를 처리하는 `ArgumentResolver`와 `HttpEntity`를 처리하는 `ArgumentResolver`가 있다. 이 `ArgumentResolver`들은 내부적으로 HTTP 메시지 컨버터를 사용하여, 요청 본문을 적절한 Java 객체로 변환하고 생성한다. 예를 들어, `@RequestBody`는 요청 본문을 특정 타입의 객체로 변환하는 데 사용되며, `HttpEntity`는 요청의 전체 HTTP 메시지를 객체로 래핑하여 처리한다. 이러한 과정에서 HTTP 메시지 컨버터가 핵심적인 역할을 하며, 데이터 형식에 맞는 변환을 수행하여 컨트롤러 메서드에서 사용할 수 있는 형태로 객체를 반환해준다.


응답의 경우, `@ResponseBody`와 `HttpEntity`를 처리하는 `ReturnValueHandler`가 존재한다. 이 `ReturnValueHandler`는 컨트롤러 메서드에서 반환된 객체를 클라이언트로 전송할 적절한 HTTP 응답으로 변환하는 역할을 한다. 구체적으로, `@ResponseBody`는 메서드의 반환값을 HTTP 응답 본문으로 직렬화하고, `HttpEntity`는 응답 메시지 전체를 구성할 수 있는 객체를 반환한다. 이 과정에서 HTTP 메시지 컨버터가 중요한 역할을 담당하며, 반환된 객체를 JSON, XML, 텍스트 등 클라이언트가 이해할 수 있는 형식으로 변환한다. 결국, `ReturnValueHandler`는 HTTP 메시지 컨버터를 호출하여 최종적인 응답 결과를 생성하고, 이를 클라이언트에게 전달하는 역할을 한다.




참고) 스프링이 필요한 대부분의 기능을 제공하기 때문에 실제 기능을 확장할 일이 많지는 않다. 기능 확장은 `WebMvcConfigurer` 를 상속 받아서 스프링 빈으로 등록하면 된다. 실제 자주 사용하지는 않으니 실제 기능 확장이 필요할 때 `WebMvcConfigurer` 를 검색해보자.


 

 

728x90