아무나개발하자

HTTP 메시지 컨버터2 본문

Spring

HTTP 메시지 컨버터2

개발천재나천재 2022. 7. 16. 09:52

Spring MVC 구조

위 그림은 Spring-MVC의 전체적인 구조를 보여주고 있는 그림이다. 그러면 HTTP 메시지 컨버터는 SpringMVC에서 어느곳에 위치할지 궁금할 것이다. 살짝만 이야기 하자면 어노테이션 기반으로 컨트롤러를 처리하기 때문에, 핸들러 어댑터쪽에 위치한다.

 

RequestMappingHandlerAdapter의 동작 방식

 

ArgumentResolver

우리가 어노테이션 기반의 컨트롤러를 사용할때, 우리는 다양한 파라미터를 사용할 수 있었다. 예를들어 HttpServletRequest , Model 은 물론이고, @RequestParam , @ModelAttribute같은 어노테이션
그리고 @RequestBody , HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 수 많은 파라미터를 사용할 수 있었다.

이렇게 파라미터를 유연하게 처리 할 수 있었던 비밀은 바로 ArgumentResolver때문이다. RequestMappingHandlerAdapter는 ArgumentResolver를 호출해서 필요로하는 다양한 파라미터값을 생성할 수 있었던 것이다.

그러면 줄여서 ArgumentResolver라고 부르지만 실제 인터페이스 이름인 HandlerMethodArgumentResolver에 대해 알아보자

 

HandlerMethodArgumentResolver

public interface HandlerMethodArgumentResolver {

	boolean supportsParameter(MethodParameter parameter);

	@Nullable
	Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;

}

동작 방식

동작방식에 대해 간단하게 소개하겠다. 핸들러가 매핑되면 해당 핸들러를 동작시킬 수 있는 어댑터가 필요하다. 그러면 해당 어댑터를 RequestMappingHandlerAdapter를 통해 찾게되고, 파라미터를 체크하게 되는데 ArgumentResolver 의 supportsParameter() 를 호출해서 해당 파라미터를 지원하는지 확인한다. 지원을 하면 resolveArgument() 를 호출해서 실제 파라미터(객체)를 생성하고 이렇게 생성된 파라미터(객체)는 컨트롤러 호출시 넘어가게 된다.

 

ReturnValueHandler

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

 

HTTP 메시지 컨버터 위치

 

 

요청의 경우

@RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity 를 처리하는 ArgumentResolver가 있어서 각각의 ArgumentResolver들이 HTTP 메시지 컨버터를 사용해서 byte, string, 객체를 생성해서 컨트롤러 파라미터로 전달하는 것이다.

 

 

응답의 경우

@ResponseBody 와 HttpEntity 를 처리하는 ReturnValueHandler 가 있다. 그리고 여기에서 HTTP 메시지 컨버터를 호출해byte, string, 객체를 생성해서 응답 결과를 만든다.

 

 

참고자료 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

'Spring' 카테고리의 다른 글

스프링 MVC - 웹 페이지 만들기2  (0) 2022.07.22
스프링 MVC - 웹 페이지 만들기1  (0) 2022.07.21
HTTP 메시지 컨버터  (0) 2022.07.14
프론트 컨트롤러 패턴 소개4  (0) 2022.07.10
프론트 컨트롤러 패턴 소개3  (0) 2022.07.09