Spring | @RequestBody & @ResponseBody
Overview
@RequestBody
http body 를 전송 혹은 도메인 개체와 매핑하여서 java 객체에 대한 인바운드 HttpRequest 본문의 자동 역직렬화를 가능하게 한다.
@ResponseBody
반환 된 객체가 자동으로 json 으로 직렬화 되고 HttpResponse 객체로 다시 전달된다.
@RequestBody
request body 의 경우 위의 사진 처럼 인자에서 사용이 가능하다. request body 어노테이션의 경우 Target 의 값이 PARAMETER 값으로 되어 있기 때문에 인자에만 사용이 가능하다.
위 처럼 작성을 했으면 통신으로 테스트를 해보았다.
IDE 에서 디버깅을 걸어서 데이터가 들어 왔나 유무를 체크를 해주었다. 데이터의 직렬화를 할 수 있다. 그렇다면 어떤 식으로 변환을 할까?
HttpMessageConvert 라는 인터페이스가 있는데 Message Convert 를 가지고 변환을 해주는 것이 였다.
HttpMessageConvert의 경우 언제 사용되나?
- HTTP API 처럼 Json 데이터를 HTTP Body 직접 읽거나 쓰는 경우
- @RequestBody 어노테이션을 사용할 때 HTTP Body 내 문자 내용을 직접 반환하므로 HttpMessageConvert가 동작한다.
HttpMessageConvert 인터페이스의 경우 canRead, canWrite, getSupportedMediaTypes 등 있는다.
- canRead: 읽을 수 있는지 유무 메소드
- canWrite: 쓰는 것이 가능한지 유무 메소드
- getSupportedMediaTypes: MediaTypes를 가지고 오는 메소드
- read: 읽는 메소드
- write: 쓰는 메소드
HTTP 요청 데이터를 읽는 과정
- 컨트롤러에서 @RequesetBody를 사용하는 상황
- MessageConvert가 메세지를 읽을 수 있는지 확인학이 위해 canRead에서 체크 한 뒤
- read 메소드를 호출
HTTP 요청 데이터를 쓰는 과정
- 컨트롤러에서 @RequestBody를 사용하고 반환 되는 상황
- MessageConvert가 메시지를 쓰기 지원유무를 canWrite를 통해서 체크를 한 뒤
- canWrite 조건에 부합하면 wirte 메소드를 호출 해서 HTTP 바디 내에 데이터를 생성을 하게 된다.
@ResponseBody
ResponseBody 어노테이션의 경우 Target의 값이 Type & Method 로 되어 있기 때문에 메소드 레벨에서 사용이 가능하다.
그렇기 때문에 기본적으로 사용을 하면 아래와 같이 @Controller + @ResponseBody 를 통해서 Json으로 직렬화 되어 HtttpResponse 객체로 전달을 해준다.
아래와 같이 통신을 해보면
curl -i -X POST \
-d '{"name":"test","content":"test...."}' \
-H "Content-Type: application/json" \
http://localhost:28000/api/test
위와 같이 데이터를 뽑을 수 있다. 위 처럼 @Controller + @ResponseBody 형식으로 작성을 해서 Json API 를 만들 수 도 있다. 하지만 @RestController 를 가지고 위와 같은 효과를 가질 수 있다. 그 이유의 경우 @RestController = @Controller + @ResponseBody 이기 때문이다. 그리고 ResponseEntity 를 이용해서 HttpResponse 객체를 어노테이션이 아니라 객체로 만들 수 있다.
정리
@RequestBody
- 파라미터에서만 선언이 가능하다.
- HttpBody를 자동으로 역직렬화 한다. (내부적으로 HttpMessageConvert가 작동 한다.)
@ResponseBody
- json으로 직렬화를 시켜준다.
- HttpResponse 객체로 넘겨준다.
참조
Spring’s RequestBody and ResponseBody Annotations
Author And Source
이 문제에 관하여(Spring | @RequestBody & @ResponseBody), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ewan/Spring-RequestBody-ResponseBody저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)