Http 메시지 컨버터

wangjh789·2022년 8월 7일
0

[Spring] 스프링-mvc-1

목록 보기
15/15

@ResposeBody 나 @RequestBody를 사용하면 Http메시지 컨버터가 동작한다.
(@ResponseBody가 없으면 viewResolver가 동작)
기본 문자 처리: StringHttpMessageConverter
기본 객체 처리: MappingJackson2HttpMessageConverter

스프링은 다음 경우에 Http메시지 컨버터를 적용한다
요청 : @RequestBody, HttpEntity
응답 : @ResponseBody, HttpEntity

HttpMessageConverter

public interface HttpMessageConverter<T> {

	boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
	boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
    
	T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
			throws IOException, HttpMessageNotReadableException;
	void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException;

Http메시지 컨버터는 Http요청, 응답 둘 다 사용한다.

  • canRead(), canWrite() : 메시지 컨버터가 해당 클래스, 미디어타입을 지원하는지 확인
  • read(), write(): 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능

@RequestBody HelloData data 인 경우 클래스 타입이 HashMap 또는 객체이고 요청 메시지의 content-type이 application/json일 때 MappingJsokson2HttpMessageConverter 가 선택이 된다.

ArgumentResolver

스프링의 컨트롤러는 다양한 종류의 파라미터를 사용할 수 이유는 ArgumentResolver 덕분이다.
애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdaptor(핸들러어뎁터)는 ArgumentResolver를 호출해 필요한 파라미터를 생성하고 컨트롤러로 넘긴다.

public interface HandlerMethodArgumentResolver {

	boolean supportsParameter(MethodParameter parameter);

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

}


여러가지 구현체가 있다. (@RequeestParam, @RequestBody, HttpServletRequest 등등)

ReturnValueHanlder

ArgumentResolver와 비슷하지만 이것은 응답 값(return)을 변환하고 처리한다.

public interface HandlerMethodReturnValueHandler {

	boolean supportsReturnType(MethodParameter returnType);

	void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;

}


ex) HttpEntity, HttpResponse, ModelAndView
String만으로 viewTemplate찾아서 렌더링 할 수 있는 이유

ArgumentResolver와 HttpMessageConverter와의 관계

핸들러어뎁터가 controller에 필요한 파리미터들을 ArgumentResolver에게 요청한다.
ArgumentResolver는 기본형 등 처리할 수 있는 건 처리하지만 객체 같은 처리할 수 없는 것은 HttpMessageConverter를 이용해 얻어온다.

ArgumentResolver는 Http메시지 컨버터의 Read(),
ReturnValueHandler는 Http메시지 컨버터의 Write()를 사용한다.

ArgumentResolver와 HttpMessageConverter 관계

profile
기록

0개의 댓글