@ResposeBody 나 @RequestBody를 사용하면 Http메시지 컨버터가 동작한다.
(@ResponseBody가 없으면 viewResolver가 동작)
기본 문자 처리: StringHttpMessageConverter
기본 객체 처리: MappingJackson2HttpMessageConverter
스프링은 다음 경우에 Http메시지 컨버터를 적용한다
요청 : @RequestBody, HttpEntity
응답 : @ResponseBody, HttpEntity
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
덕분이다.
애노테이션 기반 컨트롤러를 처리하는 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 등등)
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찾아서 렌더링 할 수 있는 이유
핸들러어뎁터가 controller에 필요한 파리미터들을 ArgumentResolver에게 요청한다.
ArgumentResolver는 기본형 등 처리할 수 있는 건 처리하지만 객체 같은 처리할 수 없는 것은 HttpMessageConverter를 이용해 얻어온다.
ArgumentResolver는 Http메시지 컨버터의 Read(),
ReturnValueHandler는 Http메시지 컨버터의 Write()를 사용한다.