객체가 Json 형태로 바뀔 수 있게 🖐

초코파이·2021년 7월 24일
2
post-thumbnail

@ResponseBody@RequestBody의 동작 원리를 알아 볼 것입니다.

두 어노테이션은 다르지만 비슷한 면이 있습니다. 제가 봤을 때 비슷한 부분은 객체를 Json으로 변환해준다, 입니다.

@ResponseBody를 붙여주면 값은 data로 리턴됩니다. 만약 객체라면 Json 형태로 넘어가게 됩니다. @RequestBody도 비슷합니다. HTTP 요청의 Body 내용인 Json을 자바 객체로 매핑합니다. 요상하지 않나요? 😵😵


위 사진으로 @ResponseBody를 붙여주었을 때 객체가 리턴됐는데 Json 형태로 값이 넘어가는 것을 보실 수 있습니다.

@ResponseBody가 없는데용??
@Controller 대신 @RestController를 사용했습니다. @RestController는 @ResponseBody가 자동으로 붙여집니다.


HttpMessageConverters

HttpMessageConverter라는 친구가 있었습니다. 😁 Spring은 Http request와 response를 변환하기 위해 HttpMessageConverter라는 인터페이스를 사용합니다. @ResponseBody, @RequestBody 애노테이션을 쓰게 되면 스프링은 MessageConverter을 사용해 HTTP 요청이나 응답을 메세지로 변환합니다.
@ReqeustBody를 쓸 경우 파라미터 타입에 맞는 MessageConverter을 선택한 뒤 HTTP 요청 본문을 해석하지 않고 통째로 메세지로 변환하여 파라미터에 넣습니다. @ResponseBody도 마찬가지입니다. @Controller는 보통 View를 응답해주기 위해 사용하죠. 하지만 @ResponseBody를 이용하면 리턴 타입에 맞는 MessageConverter를 선택하고 리턴값을 통째로 메세지로 변환한 후 리턴해줍니다. (View를 리턴해 주는 게 아님.)

🙏 참고한 블로그 🙏

MessageConverter을 선택한다고 했죠? 종류를 알아볼까요? ✨🔍

MessageConverter의 종류

종류가 굉장히 많습니다.

  • ByteArrayHttpMessageConverter
  • StringHttpMessageConverter
  • FormHttpMessageConverter
  • SouceHttpMessageConverter
  • Jaxb2RootElementHttpMessageConverter
  • MarshallingHttpMessageConverter
  • MappginJackson2HttpMessageConverter

이름만 봐도 딱 알 수 있는 것들도 있고... 모르겠는 것들도 있네요. 이 외에 더 많은 MessageConverter들이 있습니다. 그래도 여기까지 왔는데, 이거 하나는 알고 가야죠?

▪ MappingJackson2HttpMessageConverter 🐹

저희가 알게 모르게 가장 많이 쓰는 MessageConverter가 아닐까 생각합니다. 바로바로~ 위의 주제인 객체를 Json 형태로 바꾸어주는 MessageConverter입니다. 근데 그럼 이 친구는 눈치만 보고 있다가 요청이 Json 같으면 쪼르르 달려 나가 요청을 처리할까요? 👽👽 땡땡. 요청이 Json으로 들어오는 경우 header에 컨텐츠 타입을 알려주어야 합니다. 그러면 그 컨텐츠 타입을 보고 이 MessageConverter가 사용되어 json을 자바 객체로 변환해 줄 수 있는 것입니다.

MappingJackson2HttpMessageConverter docs

이를 사용하기 com.fasterxml.jackson.core라는 라이브러리를 추가해 주어야 합니다. com.fasterxml.jackson.core의 의존성으로는 3가지가있는데

  1. jackson-core
  2. jackson-annotations
  3. jackson-databind

마지막 모듈인 jackson-databind모듈이 상위 2가지 모듈의 의존성을 포함해서 마지막 모듈만 추가해주면 된다고 합니다.

저는 의존성을 세팅한 기억이 없는데요?
하지만 SpringBoot에서는 spring-boot-starter-web 의존성을 추가해주면 자동으로 MessageConverter을 설정해준다고 합니다.

🙏 의존성 참고 블로그



읽어 주셔서 감사합니다.
밑에는 그냥 개인적으로 뭐하는 친구들이지 싶어서 찾아보았습니다.

▪ MarshallingHttpMessageConverter

XML 문서와 자바 객체 사이의 변환을 지원해주는 Converter. OXM 기술을 자유롭게 선택해 XML 문서 기반 컨트롤러를 작성한다면 편하게 이용할 수 있다고 한다.

OXM 기술?
XML과 자바 객체를 매핑해 상호 변환해주는 기술입니다.

▪ Jaxb2RootElementHttpMessageConverter

@XmlType, @XmlRootElement가 붙은 클래스를 이용해 XML과 객체 사이의메세지 변환을 지원해주는 Converter. (두 애노테이션 중 하나가 적용됐다면 오브젝트는 어떤 타입이든 사용할 수 있다.)

profile
열심히 흡수하기

1개의 댓글

comment-user-thumbnail
2022년 10월 17일

잘 정리된 글이네요. 감사합니다 :)

답글 달기