@ResponseBody
와 @RequestBody
의 동작 원리를 알아 볼 것입니다.
두 어노테이션은 다르지만 비슷한 면이 있습니다. 제가 봤을 때 비슷한 부분은 객체를 Json으로 변환해준다, 입니다.
@ResponseBody
를 붙여주면 값은 data로 리턴됩니다. 만약 객체라면 Json 형태로 넘어가게 됩니다. @RequestBody
도 비슷합니다. HTTP 요청의 Body 내용인 Json을 자바 객체로 매핑합니다. 요상하지 않나요? 😵😵
위 사진으로 @ResponseBody
를 붙여주었을 때 객체가 리턴됐는데 Json 형태로 값이 넘어가는 것을 보실 수 있습니다.
@ResponseBody가 없는데용??
@Controller 대신 @RestController를 사용했습니다. @RestController는 @ResponseBody가 자동으로 붙여집니다.
HttpMessageConverter라는 친구가 있었습니다. 😁 Spring은 Http request와 response를 변환하기 위해 HttpMessageConverter라는 인터페이스를 사용합니다. @ResponseBody
, @RequestBody
애노테이션을 쓰게 되면 스프링은 MessageConverter을 사용해 HTTP 요청이나 응답을 메세지로 변환합니다.
@ReqeustBody
를 쓸 경우 파라미터 타입에 맞는 MessageConverter을 선택한 뒤 HTTP 요청 본문을 해석하지 않고 통째로 메세지로 변환하여 파라미터에 넣습니다. @ResponseBody
도 마찬가지입니다. @Controller
는 보통 View를 응답해주기 위해 사용하죠. 하지만 @ResponseBody
를 이용하면 리턴 타입에 맞는 MessageConverter를 선택하고 리턴값을 통째로 메세지로 변환한 후 리턴해줍니다. (View를 리턴해 주는 게 아님.)
MessageConverter을 선택한다고 했죠? 종류를 알아볼까요? ✨🔍
종류가 굉장히 많습니다.
이름만 봐도 딱 알 수 있는 것들도 있고... 모르겠는 것들도 있네요. 이 외에 더 많은 MessageConverter들이 있습니다. 그래도 여기까지 왔는데, 이거 하나는 알고 가야죠?
저희가 알게 모르게 가장 많이 쓰는 MessageConverter가 아닐까 생각합니다. 바로바로~ 위의 주제인 객체를 Json 형태로 바꾸어주는 MessageConverter입니다. 근데 그럼 이 친구는 눈치만 보고 있다가 요청이 Json 같으면 쪼르르 달려 나가 요청을 처리할까요? 👽👽 땡땡. 요청이 Json으로 들어오는 경우 header에 컨텐츠 타입을 알려주어야 합니다. 그러면 그 컨텐츠 타입을 보고 이 MessageConverter가 사용되어 json을 자바 객체로 변환해 줄 수 있는 것입니다.
MappingJackson2HttpMessageConverter docs
이를 사용하기 com.fasterxml.jackson.core
라는 라이브러리를 추가해 주어야 합니다. com.fasterxml.jackson.core
의 의존성으로는 3가지가있는데
마지막 모듈인 jackson-databind모듈이 상위 2가지 모듈의 의존성을 포함해서 마지막 모듈만 추가해주면 된다고 합니다.
저는 의존성을 세팅한 기억이 없는데요?
하지만 SpringBoot에서는 spring-boot-starter-web 의존성을 추가해주면 자동으로 MessageConverter을 설정해준다고 합니다.
읽어 주셔서 감사합니다.
밑에는 그냥 개인적으로 뭐하는 친구들이지 싶어서 찾아보았습니다.
XML 문서와 자바 객체 사이의 변환을 지원해주는 Converter. OXM 기술을 자유롭게 선택해 XML 문서 기반 컨트롤러를 작성한다면 편하게 이용할 수 있다고 한다.
OXM 기술?
XML과 자바 객체를 매핑해 상호 변환해주는 기술입니다.
@XmlType
, @XmlRootElement
가 붙은 클래스를 이용해 XML과 객체 사이의메세지 변환을 지원해주는 Converter. (두 애노테이션 중 하나가 적용됐다면 오브젝트는 어떤 타입이든 사용할 수 있다.)
잘 정리된 글이네요. 감사합니다 :)