프로젝트 소스를 보는 중 클라이언트가 요청하면 객체를 Object Mapper 로 StringJson으로 변환 후 리턴시켜주고있었다.
내가 알기로는 @ResponseBody 또는 @RestController가 붙은 컨트롤러에서 객체를 리턴하면 HttpMessageConverter 가 객체를 Json 타입으로 변환해서 리턴 시켜준다고 알고 있었는데? 한번 테스트를 해보자!
@RestController
POST 요청으로 들어올시 유저의 이름, 아이디, 패스워드, 이메을 return 시켜주는 API 가 있다고 가정해 보자
Postman으로 해당 URL로 Post 요청을 해보자
Dto 객체를 리턴 해줬을 뿐인데 JSON 타입의 데이터들로 응답을 해줬다.
HttpMessgaeConverter.class 가 무슨역할을 하는지 확인해보니
메시지 컨버터가 해당 클래스 혹은 미디어타입을 지원하는지 체크하는 용도
해당 소스가 100% 이해가 되진않지만 MediaType 이 존재하는지 체크하는 함수인거 같다.
메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능 지원
솔직히 현재 실력으로는 소스가 이해되지 않지만 응답이니 wirte() 의 구현체를 디버그모드로 찍어서 하나씩 따라가봤다.
writeInternal()함수를 따라가보니
해당 구현체에서 ObjectMapper 클래스의 writeValue 메소드를 사용하여 Java 오브젝트를 JSON으로 시리얼라이징 해주고 있었다.
구글링을 통해 부족한 정보들을 정리해 보았다.
@ResponseBody, @RequestBody 어노테이션을 사용하면 HttpMessageConverter가 동작하게 되고
없다면 없으면 View Resolver 가 동작하게 된다
@RequestBody는 Json이나 XML같은 형태의 data를 jackson등의 MessageConverter를 활용하여 Java Object로 변환한다.
java 객체를 HTTP 요청의 body 내용으로 매핑하는 역할. VO 객체를 JSON으로 바꿔서 HTTP body에 담는 스프링 어노테이션 메서드의 return 값을 HTTP Response의 body에 담는 역할을 한다.
MessageConverter의 종류
지원하는 오브젝트 타입 : byte[]
@RequestBody로 전달 받을 때 모든 종류의 HTTP 요청 메시지 본문을 byte 배열로 가져올 수 있음.
@ResponseBody 로 보낼 때는 Content-Type : application/octet-stream으로 설정
지원하는 Object Type : String
HTTP 요청의 본문을 그대로 String으로 가져올 수 있음
HTTP는 기본적으로 text. 가공하지 않은 본문을 직접 받아서 사용하고 싶은 경우라면 유용하게 사용 가능
JAXB2의 @XmlRootElement 와 @XmlType 이 붙은 클래스를 이용해서 XML 과 오브젝트 사이의 메시지 변환을 지원한다.
기본적으로 SourceHttpMessageConverter 와 동일한 XML 미디어 타입을 지원한다.
스프링의 OXM 추상화의 Marshaller 와 Unmarshaller 를 이용해서 XML 문서와 자바 오브젝트 사이의 변환을 지원해주는 컨버터
MarshallingHttpMessageConverter 를 빈으로 등록할 때 프로퍼티에 marshaller 와 unmarshaller 를 설정해줘야 한다.
Jackson ObjectMapper 를 이용해서 자바 오브젝트와 JSON 문서를 자동변환해주는 메시지 컨버터다.
지원 미디어 타입은 application/json 이다.
Jackson 프로젝트의 ObjectMapper 가 대부분의 자바 타입을 무난히 JSON 으로 변환해주지만 날짜나 숫자 등에서 포맷을 적용하는 등의 부가적인 변환 기능이 필요하다면 ObjectMapper 를 확장해서 적용할 수 있다.
위에 테스트 예제는 MappingJacksonHttpMessageConverter 컨버터를 이용해서 Json데이터로 변환해 주었다.
그냥 쓰는 것이 아니고 어떠한 방법으로 동작하는지 알면 더욱 확장해서 사용할 수 있고 객체 지향적인 방법으로 개발을 할 수 있는 능력을 기를 수 있지 않을까 라는 생각을 해본다.
참고자료