프로필사진
RESTful(8) - @RequestBody & @ResponseBody란?

2019. 11. 26. 14:36🔴 Spring

300x250

@RequestBody & @ResponseBody
-> 각각 HTTP 요청 몸체를 자바 객체로 변환하고 자바 객체를 HTTP 응답 몸체로 변환하는데 사용

@RequestBody
- HTTP 요청 몸체를 자바 객체로 전달받음
- HTTP 요청의 body내용을 자바 객체로 매핑하는 역할

@ResponseBody
- 자바 객체를 HTTP 응답 몸체로 전송함
- 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할


@RequestBody : HttpRequest body → (deserialization) → Java Object
ex. JSON → Java type

  • HTTP요청의 본문 body부분이 그대로 전달됨
  • HttpMessageConverter타입의 메시지 변환기 → HTTP요청의 미디어 타입 & 파라미터 타입을 먼저 확인 (servlet-context.xml 에서 <annotation-drvien> 태그 내에 선언하는 <message-converter> 에서 확인)한 다음, HTTP요청의 본문 부분을 통째로 변환해서 지정된 메소드 파라미터로 전달해줌
  • 즉, HTTP요청 Body를 자바객체로 전달받을 수 있음
  • 'GET'메소드 요청 → HTTP Body에 요청이 전달되는 것이 아니라 URL의 파라미터로 전달되는 형식 ⇒ @RequestBody로 받을 수 없음!

@ResponseBody : object → (serialization) → JSON → pass back into HttpResponse Object
ex. Java → JSON type

  • 메소드 레벨에 부여되면 리턴되는 object는 view를 통해 결과를 만들어 내는 모델로 사용하는 대신, 메시지 변환기를 통해 바로 HTTP 응답의 메세지 본문으로 변환됨
  • 요청한 형태에 맞춰서 메세지 변환기를 통해 결과값을 반환 (@ResponseBody는 @RequestBody가 선택한 형식으로 결과값을 변환하여 반환)
  • 자바 객체를 HTTP 응답 body로 전송할 수 있음
  • ContentNegotiatingViewResolver는 등록되어 있는 ViewResolver중에서 controller 메소드의 리턴값을 통해 등록된 ViewResolver 중에서 적합한 형태로 처리해서 반환하는 반면, @ResponseBody는 @RequestBody가 선택한 형식으로 결과값을 변환하여 반환한다고 보면 된다.

최근 개발 : 대부분 프론트엔드 & 백엔드 분리하여 개발

프론트엔드의 AJAX요청 → 대부분 JSON으로 되어 있음
⇒ 백엔드에서도 JSON형태로 응답해주는 방식을 취하게 됨!!

스프링은 이와 관련된 @MVC관련 annotation과 설정을 통해 기능을 제공하고 있음


참고 : https://www.baeldung.com/spring-request-response-body

300x250