Spring | @RequestBody & @ResponseBody

3362 단어 SpringSpring

Overview

@RequestBody http body 를 전송 혹은 도메인 개체와 매핑하여서 java 객체에 대한 인바운드 HttpRequest 본문의 자동 역직렬화를 가능하게 한다.

@ResponseBody 반환 된 객체가 자동으로 json 으로 직렬화 되고 HttpResponse 객체로 다시 전달된다.

@RequestBody

request body 의 경우 위의 사진 처럼 인자에서 사용이 가능하다. request body 어노테이션의 경우 Target 의 값이 PARAMETER 값으로 되어 있기 때문에 인자에만 사용이 가능하다.

위 처럼 작성을 했으면 통신으로 테스트를 해보았다.

IDE 에서 디버깅을 걸어서 데이터가 들어 왔나 유무를 체크를 해주었다. 데이터의 직렬화를 할 수 있다. 그렇다면 어떤 식으로 변환을 할까?

HttpMessageConvert 라는 인터페이스가 있는데 Message Convert 를 가지고 변환을 해주는 것이 였다.

HttpMessageConvert의 경우 언제 사용되나?

  1. HTTP API 처럼 Json 데이터를 HTTP Body 직접 읽거나 쓰는 경우
  2. @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

좋은 웹페이지 즐겨찾기