반응형
HttpMessageConverter
SpringFramework에서 제공하는 인터페이스로 HTTP Request Body 정보를 객체로 변환하거나, 객체를 HTTP Response Body 로 변환한다.
HttpMessageConverter 는 XMLHttpRequest 의 응답 메시지를 인코딩한다.
XMLHttpReqeust
화면이 없는 내장 브라우저로 HTML 문서를 받을 필요가 없고, 통신에 필요한 데이터를 XML형식으로 주고 받을 수 있음
따라서 통신하는데 필요한 데이터를 XML 형식으로 주고 받는 역할을 하면서 Ajax 통신이 가능하게 함.
그러나, 이제는 XML로 데이터를 전송하기 보다 더욱 효율적인 JSON으로 데이터를 주고 받는다.
MessageConverter는 이러한 JSON 데이터를 변환해준다.
@RestController
public class UserController {
@ResponseBody
@PostMapping("/api/v1/user")
public UserDTO createUser(@RequestBody CreateUser createUser) {
/**
* create user ....
*/
return userDTO;
}
}
@RequestBody 애노테이션을 지정할 경우, HttpMessageConverter는 request 헤더의 content type에 맞게 body 정보를 변환하고, @ResponseBody 어노테이션을 지정할 경우, 결과를 뷰로 응답하지 않고, request 헤더의 content type에 맞게 return 값을 변환하여 반환한다. (객체 타입일 경우, 기본 JOSN 타입 )
<참고>
@Controller + @RequestBody = @RestController
요청의 content type에 따라 다른 컨버터를 사용한다.
- StringHttpMessageConverter : 받은 응답을 HttpMessageConverter 가 String 타입으로 변환
- MappingJackson2HttpMessageConverter : Json 으로 변환
🙈[Spring] Ajax - JSON 응답하기 ( MessageConverter )🐵
그렇다면, 응답 받은 문자열을 ViewResolver가 받을 지, MessageConverter가 받을 지 어떻게 알 수 있나?
DispatchServlet은 handlerMethod()를 호출하여 응답으로 String , ModelAndView , Object 중 하나를 반환.
이후 실행되는 것이 ViewResolver , MessageConverter 인데, DispatchServlet이 반환 되는 타입을 보고 어떤 처리를 할지 결정.
- String 반환 : 뷰 이름의 JSP 파일을 찾아 렌더링 하고, 뷰가 없으면 404를 반환.
( 만약 메서드 위에 @ResponseBody 어노테이션이 있다면 뷰를 찾지 않고, String을 그대로 반환 ) - ModelAndView를 반환 : ViewResolver가 실행
( 만약 @ResponseBody가 있으면 Object는 MessageConverter가 실행되어 반환 )
@Configuration 어노테이션으로 configuration 파일을 생성하고, HttpMessageConverter를 Bean으로 등록.
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
final MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
final List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add( MediaType.APPLICATION_JSON_UTF8 );
mediaTypes.add( MediaType.APPLICATION_OCTET_STREAM );
mediaTypes.add( MediaType.TEXT_HTML );
mediaTypes.add( MediaType.TEXT_PLAIN );
jacksonConverter.setSupportedMediaTypes( mediaTypes );
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule( new AfterburnerModule() );
objectMapper.setSerializationInclusion( JsonInclude.Include.NON_NULL );
jacksonConverter.setObjectMapper( objectMapper );
return jacksonConverter;
}
반응형
'Spring > Spring Framework' 카테고리의 다른 글
Spring Scheduling (0) | 2019.09.27 |
---|---|
IoC (0) | 2019.09.21 |
batch (0) | 2019.02.25 |
AOP (0) | 2019.02.12 |
Spring Framework (0) | 2018.11.11 |