클라이언트에서 서버로 필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장한다.
서버에서 클라이언트로 응답 데이터를 전송하기 위해 @ResponseBody 어노테이션을 사용하여 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송한다.
쉽게 말해서 B to B 관계에서 서로다른 언어를 사용한다고 가정하면 서로 데이터가 꼬여버릴수가 있으니까 JSON이라는 언어로 서로 데이터를 주거니 받거니 하는 것이다. JSON은 그냥 세계공통 언어라고 생각하면 된다.
이 어노테이션이 붙은 파라미터에는 http요청의 본문(body)이 그대로 전달된다.
일반적인 GET/POST의 요청 파라미터라면 @RequestBody를 사용할 일이 없을 것이다.
반면에 xml이나 json기반의 메시지를 사용하는 요청의 경우에 이 방법이 매우 유용하다.
HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다.
@Controller와는 다르게 @RestController는 리턴값에 자동으로 @ResponseBody가 붙게되어 별도 어노테이션을 명시해주지 않아도 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달 된다.
@Controller인 경우에 바디를 자바객체로 받기 위해서는 @ResponseBody 어노테이션을 반드시 명시해주어야한다.
ajax, API 작업할때 많이 쓰여진다.
@RequestBody로 데이터 받기(무슨 언어든 상관없음) --> 스프링에서 MessageConverter가 알아서 json언어로 변경하기 --> 어찌어찌 데이터 가공하든 멀하든 json언어로 된걸 @ResponseBody를 통해서 내가 사용하는 언어로 변경하기
@RequestBody를 사용했다는것 자체가 MessageConverter를 통한 데이터 변환 과정중이라는것
@RequestBody 없으면 그냥 단순하게 같은 언어끼리 작업한다고 생각하면 됨
그리고 1개의 값이라도 객체로 돌려줘야함 왜냐면 MessageConverter는 String으로 값이 오면 json언어가 아니라 StringConverter가 작동해서 String으로 돌려줘서 그렇다. String으로 돌려주면 받는쪽에서 힘듬
즉, 원래는 보통 컨트롤러에서 메소드를 String으로 만들어서 "restview" 이런식으로 돌려줘서 뷰딴으로 바로 가게 했지만 REST API는 객체로 클래스를 만들어서 객체로 돌려줘야 한다.
Rest API가 아니면 controller에서 String 메소드를 만들어서 스트링으로 돌려준다 그러면 viewResolver가 작동해서 뷰딴으로 찾아가게 해준다. 하지만 Rest Api는
@ResponseBody를 사용하게되면 HttpMessageConverter가 작동해서 String으로 돌려주면 StringConverter가 작동해서 String으로 돌려주고, 객체로 돌려주면 JsonConverter가 작동해서 json 언어로 돌려주게 된다.그래서 Rest Api는 한개의 값을 돌려주더라도 객체로 돌려주어야 한다. 이유는 jsonConverter 작동을 해야하기 때문이다.
(아래 사진 참고)