@ResponseBody vs ResponseEntity

최승아·2021년 11월 19일
0

Http란 ?

  • Http는 HyperText Transfer Protocol의 약자로, Client와 Server 사이에 요청과 응답을 처리하기 위한 규약이다. HTTP는 요청과 응답 모두 크게 세가지 요소로 구성 됨

HTTP 요청

  1. Start Line : method, URL, 그리고 version으로 이루어져있으며, 서버에서 요청을 받아들이는 첫 줄
  2. Headers : 요청에 대한 접속 OS, 브라우저, 인증 정보와 같은 부가적인 정보를 담고 있음
  3. Body : 요청에 관련된 json, html과 같은 구체적인 내용을 포함

HTTP 응답

  • Spring에서는 HTTP Response를 만드는 것이 주요한 관심사이다.
  • 200, 404등 각각의 응답의 상태 코드뿐만이 아니라, Body에 들어갈 내용도 넣어주어야 함.
  • 3가지 요소를 채운 객체를 만드는것은 까다롭기 때문에 데이터를 받아서 자동으로 구성해주는 것이 바로 @ResponseBody와 ResponseEntity이다.

@ResponseBody

  • @ResponseBody는 HTTP 규격에 맞는 응답을 만들어주기 위한 어노테이션 이다.
  • HTTP 요청을 객체로 변환하거나, 객체를 응답으로 변환하는 HttpMessageConverter를 사용 👉 HTTPMessageConverter 는 해당 Annotation 이 붙은 대상을 response body 에 직렬화를 하는 방식으로 작동
  • 따라서, Controller에서 반환할 객체나 Method에 @ResponseBody를 붙히는 것만으로 HTTP 규격에 맞는 값을 반환 가능
  • 또한, 만약 해당 메서드를 가진 Controller에 @RestController가 붙으면 @ResponseBody를 생략하여 더 간결하게 코드 작성 가능 👉 이미 해당 어노테이션에 명시가 되어있기 때문에 생략해도 됨

단점

  • But!!!!! 단점으로는 HTTP 규격 구성 요소 중 하나인 Header에 대해서 유연하게 설정 못함
  • 또한 Status도 메서드 밖에서 어노테이션을 사용하여 따로 설정을 해주어야한다는 점도 있다.

  • 이는, @ResponseBody만 사용시에 별도의 뷰를 제공하지 않고, 데이터만 전송하는 형식이기 때문
    👉 이와 같은 점들을 해결해 줄 수 있는 것이 ResponseEntity라는 객체임

ResponseEntity

  • 개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 개발자는 404나 500 ERROR와 같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송 가능 👉 좀 더 세밀한 제어가 필요한 경우 사용
  • ResponseEntity도 마찬가지로 HTTP 응답을 빠르게 만들어주기 위한 객체
  • @ResponseBody와 달리 어노테이션이 아닌 객체로 사용됨 👉 즉, 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해줌
  • 객체의 구성요소에서 HttpMessageConverter 는 응답이 되는 본문을 처리해준 뒤에, RESTTemplate 에 나머지 구성 요소인 Status(서버에서 성공했는지 안했는지 알려주는 상태코드) 를 넘겨주게 됨

  • ResponseEntity 의 구조를 보게 되면, 다음과 같이 Status 만 필드 값으로 가지고 있음
  • ResponseEntity 에서 직접적으로 Status Code 를 지정할 수 있다는 것을 의미
  • ResponseEntity 는 HttpEntity 를 상속하여 구현
  • HttpEntity 에서는 Generic 타입으로 Body 가 될 필드 값을 가질 수가 있습니다. Generic 타입으로 인하여 바깥에서 Wrapping 될 타입을 지정할 수가 있습니다. Wrapping 된 객체들은 자동으로 HTTP 규격에서 Body 에 들어갈 수 있도록 변환이 됩니다. 또한, 필드 타입으로 HttpHeaders 를 가지고 있는데, 이는 ResponseBody 와 다르게 객체 안에서 Header 를 설정해 줄 수 있음을 암시

참조 : 1.https://tecoble.techcourse.co.kr/post/2021-05-10-response-entity/ | ResponseEntity - Spring Boot에서 Response를 만들자

profile
⭐ 개발 정리 공간 ⭐

0개의 댓글