일반적인 API는 반환하는 리소스에 Value 값만 있지 않습니다. 상태코드, 상태 메시지 등등 데이터들이 있는데 이러한 Data를 return 하는 것을 주 용도로 사용하는 것이 ResponseEntity
입니다. ResponseEntity란, httpentity를 상속받는, 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스이다. ResponseEntity에는 사용자의 HttpRequest에 대한 응답 데이터가 포함된다. 또한, HTTP 아케텍쳐 형태에 맞게 Response를 보내주는 것에도 의미가 있습니다. RestController는 별도의 View를 제공하지 않는 형태로 서비스를 실행합니다. 때문에 결과 데이터가 예외적인 상황에서 문제가 발생할 수 있습니다.
Web을 다루다 보면 HTTP 프로토콜의 헤더를 다루는 경우도 종종 있습니다. 스프링 MVC의 사상은 HttpServletRequest
나 HttpServletResponse
를 직접 핸들링하지 않아도 이런 작업이 가능하도록 작성되었기 이러한 처리를 위해 ResponseEntity
를 통해 원하는 헤더 정보나 데이터를 전달할 수 있습니다.
ResponseEntity
란, httpentity를 상속받는, 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스이다. ResponseEntity에는 사용자의 HttpRequest에 대한 응답 데이터가 포함된다.
✨ 또한, HTTP 아케텍쳐 형태에 맞게 Response를 보내주는 것에도 의미가 있습니다.
에러 코드와 같은 HTTP상태 코드를 전송하고 싶은 데이터와 함께 전송할 수 있기 때문에 좀 더 세밀한 제어가 필요한 경우 사용한다고 합니다.
ResponseEntity는 개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 개발자는 404나 500 ERROR와 같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송할 수 있기 때문에 좀 더 세밀한 제어가 필요한 경우 사용합니다.
ResponseEntity도 마찬가지로 HTTP 응답을 빠르게 만들어주기 위한 객체입니다. @ResponseBody와 달리 Annotation이 아닌 객체로 사용이 됩니다. 즉, 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해줍니다. 객체의 구성요소에서 응답이 되는 본문을 HttpMessageConverter가 변환해준 뒤에, 나머지 구성 요소를 넘겨주게 됩니다.
HTTP Status code, 상태 코드는 HTTP 요청이 성공했는지 실패했는지를 서버에서 알려주는 코드다.
4XX의 상태 코드들은 클라이언트의 요청이 유효하지 않아 서버가 해당 요청을 수행하지 않았다는 의미다.
5XX 상태 코드들은 서버 오류로 인해 요청을 수행할 수 없다는 의미다.
클라이언트의 요청은 유효하여 작업을 진행했는데 도중에 오류가 발생한 경우다. 404 오류와 마찬가지로 인터넷을 하다 보면 500, 502, 503 등의 오류를 만나봤을 거다. API 서버의 응답에서 5XX오류가 발생해서는 안된다. 보통 개발 과정에서 유효하지 않은 요청을 사전에 처리하지 않은 경우(400)에 많이 발생한다.
ResponseEntity는 HttpEntity를 상속받고 사용자의 응답 데이터가 포함된 클래스이기 때문에 밑에거를 포함한다.
@GetMapping("/ex16")
public ResponseEntity<String> ex16() {
log.info("/ex16---------------------");
// {"name" : "홍길동"}
String msg = "{\"name\": \"홍길동\"}";
// HTTP POST를 요청할때 보내는 데이터(Body)를 설명해주는 헤더(Header)도 만들어서 같이 보내줘야 한다.
HttpHeaders header = new HttpHeaders();
// add()를 사용해 Header에 들어갈 내용을 추가해주자.
header.add("Content-Type", "appplication/json;charset=UTF-8");
return new ResponseEntity<>(msg, header, HttpStatus.OK);
}
ResponseEntity는 HttpHeaders 객체를 같이 전달할 수 있고, 이를 통해서 원하는 HTTP 헤더 메시지를 가공하는 것이 가능합니다. ex16()의 경우 브라우저에는 JSON 타입이라는 헤더 메시지와 200 OK라는 상태 코드를 전송합니다.
@RequestBody가 붙은 곳에서 객체를 HttpMessage로 자동 변환 해준다. 또한, JSON형태로 변환이 필요하다면 MappingJacksonHttpMessageConverter가 자바 Object와 JSON문서 사이에서 자동으로 변화해준다.
@ResponseBody를 붙이면 알맞은 HttpMessageConter가 동작해서 header, body, status를 만들어준다. @ResponseStatus(HttpStatus.OK)를 사용해서 직접 상태를 만들어 줄수 있다.
ResponseEntity를 사용하면, 객체와 status를 함께 보내줄 수 있다. 때문에 @ResponseStatus를 사용하지 않아도 되고 메서드 별로 다른 status를 리턴할 수 있기 때문에 좀 더 세밀하게 상태 전송이 가능하다.