@ResponseBody vs ResponseEntity

지환·2024년 1월 25일
0

그룹웨어

목록 보기
16/17

@ResponseBody

  1. @ResponseBody는 HTTP 규격에 맞는 응답을 만들어주기 위한 어노테이션임

  2. HTTP 요청을 객체로 변환하거나, 객체를 -> 응답으로 변환하는 HttpMessageConverter를 사용한다.

    • HTTPMessageConverter는 해당 Annotation이 붙은 대상을 Response body에 직렬화 하는 방식으로 작동한다.
  3. Controller에서 반환할 객체나 Method에 @ResponseBody를 붙히는 것만으로도 HTTP 규격에 맞는 값을 반환 할 수 있다.

    • @RestController가 붙으면 @ResponseBody를 생략하여 더 간결하게 코드 작성이 가능하다.(이미 어노테이션에 명시가 되어 있음)

단점

  1. Header에 대해서는 유연하게 설정하지 못한다.

  2. Status도 메소드 밖에서 어노테이션을 따로 설정해야한다는 단점이 있다.

  1. @ResponseBody만 사용시 -> 별도의 뷰를 제공하지 않고 데이만 전송하는 형식이다.
    • 이러한 부분을 해결하기 위해서 ResponseEntity라는 객체가 생겨남

ResponseEntity

  1. 개발자가 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 개발자는 404나 500 ERROR와 같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송 가능하다. 세밀한 제어가 필요한 경우에 사용한다.
  1. ResponseEntity도 마찬가지로 HTTP 응답을 빠르게 만들어주기 위한 객체이다.

  2. @ResponseBody와 달리 어노테이션이 아닌 객체로 사용된다. --> 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해준다.

  3. 객체의 구성요소에서 HttpMessageConverter는 응답이 되는 본문을 처리해준 뒤에, RESTTemplate에 나머지 구성 요소인 Status(서버에 성공했는지 안했는지 알려주는 상태코드)를 넘겨준다.

ResponseEntity 의 구조를 보게 되면, 다음과 같이 Status 만 필드 값으로 가지고 있음
ResponseEntity 에서 직접적으로 Status Code 를 지정할 수 있다는 것을 의미
ResponseEntity 는 HttpEntity 를 상속하여 구현

  • HttpEntity 에서는 Generic 타입으로 Body가 될 필드 값을 가질 수 있음.

  • Generic 타입으로 인하여 바깥에서 Wrapping 될 타입을 지정할 수 있다.

  • Wrapping 된 객체들은 자동으로 HTTP 규격에서 body에 들어갈 수 있도록 변환이 된다.

  • 또한, 필드 타입으로 HttpHeaders 를 가지고 있는데, 이는 ResponseBody 와 다르게 객체 안에서 Header 를 설정해 줄 수 있음을 암시


RequestBody vs ResponseBody 차이

클라이언트에서 서버로 통신 하는 메세지를 "요청"메세지라고 하며,

서버에서 클라이언트로 통신하는 메세지를 "응답" 메세지라고 한다.

웹에서 화면전환(새로고침) 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어진다.

비동기 통신 시에 클라이언트에서 -> 서버로 보낼 때, 본문에 데이터를 담아서 보내야 한다.

서버에서 클라이언트로 응답을 보낼 때에도 본문에 데이터를 담아서 보낸다.

요청본문 : requestBody

응답본문 : responseBody 를 담아서 보내야한다.

@RequestBody 어노테이션과 @ResponseBody 어노테이션이 각각 Http 요청 바디를 자바 객체로 변환하고

자바 객체를 다시 HTTP 응답 바디로 변환해준다.

요청 본문(request body)에 담긴 값을 자바 객체로 변환한다.

  • @RequestBody를 통해서 자바객체로 conversion하는데, 이 때 HttpMessageConverter를 사용한다.

  • @ResponseBody가 붙은 파라미터에는 HTTP 요청의 본문 body 부분이 그대로 전달된다.

  • RequesyMappingHandlerAdpter 에는 HttpMessageConverter 타입의 메세지 변환기가 여러개 등록되어 있다.

RequestBody

  • http 요청의 본문(body)이 그대로 전달된다.

  • 일반적인 GET/POST 요청 파라미터라면, @RequestBody를 사용할 일이 없다.

  • Http 요청의 바디 내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다.

ResponseBody

  • 자바 객체를 HTTP 요청의 바디내용으로 매핑하여 "클라이언트"로 전송한다.

  • @ResponseBody가 붙은 파라미터가 있으면 HTTP 요청의 미디어타입과 파라미터의 타입을 먼저 확인한다.

profile
아는만큼보인다.

1개의 댓글

comment-user-thumbnail
2024년 2월 8일

ㅇㅎ

답글 달기