SpringBoot를 이용해 API를 개발하다가 보면 어느덧 ResponseEntity객체를 자연스럽게 반환하고 있는걸 알 수 있다. 누군가의 예제코드만 보고, ResponseEntity
를 사용하고 있지는 않은가? 나도 스스로 돌아보며 ResponseEntity
가 무엇인지 알아보기로 한다.
@PostMapping(value = "")
public ResponseEntity<Subscription> createSubscription(@RequestBody Subscription subscription) {
return new ResponseEntity<>(subscriptionService.createSubscription(subscription), HttpStatus.CREATED);
}
ResponseEntity
를 살펴보면 HttpEntity
를 상속받고 있고, status를 가지고 있다.
그렇다면 HttpEntity는 어떻게 생겼을까?
Httpentity는 HttpHeaders와 Body를 가지고 있다.
Header와 Body가 무엇인지, http구조에 대한 글을 남기고 이 글에서는 자세하게 다루지 않겠다. https://hanamon.kr/네트워크-http-메세지-message-요청과-응답-구조/
위 두가지를 보고 우리는 간단하게 알 수 있는 것이 있다.
ResponseEntity는 HttpEntity(header, body)와 status를 가지고 있다.
즉, 우리가 API를 통해 HttpEntity를 반환한다는 것은 API를 호출하는 클라이언트에게 status를 함께 반환할 수 있다는 것이다.
@PostMapping(value = "")
public ResponseEntity<Subscription> createSubscription(@RequestBody Subscription subscription) {
return new ResponseEntity<>(subscriptionService.createSubscription(subscription), HttpStatus.CREATED);
}
위 코드를 예시로 보면 서비스에서 반환되는 값을 body로, HttpStatus.CREATED를 status로 넣고 만들어서 반환하는 것이다.
여기에서 사용한 HttpStatus.CREATED는 enum객체로 아래와 같이 value값을 가지고 있고, 이것이 우리가 알고 있는 http 상태 코드이다.
클라이언트는 서버가 반환하는 httpstatus를 확인하게 되는 것이다.
크게는 200번대, 400번대, 500번대로 나눠서 사용하기도 하지만 필요한 경우 더 세밀하게 나누어서 분기를 한다.
여기까지 살펴본 후 문득 궁금해진다.
ResponseEntity를 사용하지 않고 객체를 반환하면 HttpStatus, body는 어떻게 되는것일까?
httpStatus는 아래와 같이 설정하여 반환할 수 있다.
@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
@ResponseBody
@ResponseStatus( HttpStatus.OK )
public RestModel create(@RequestBody String data) {
// code ommitted..
// how do i return a correct status code if something fails?
}
ResponseEntity를 사용하지 않은 경우에는 데이터를 어떻게 body에 담아서 전달할까?
궁금증을 해결하기 위해서 자료를 찾아보다가 알게 된 것은 MessageConverter이다.
MessageConverter는 Spring 프레임워크에서 기본으로 제공하는 인터페이스이고 @RequestBody, @ResponseBody가 붙은 곳에서 객체를 HttpMessage로 자동으로 변환해준다.
형태의 따라 여러 종류의 MessageConverter가 존재하고 우리가 흔하게 사용하는 Json 형태로 변환이 필요하다면 MappingJacksonHttpMessageConverter가 자바 오브젝트와 Json문서 사이에서 자동으로 변환해준다.
ResponseEntity는 HttpEntity를 상속받고 있고, HttpEntity의 body, header와 더불어 status를 함께 보내줄 수 있다.
@ResponseStatus를 사용하지 않고 메소드별로 다른 status를 유연하게 전달 할 수 있다.
https://devlog-wjdrbs96.tistory.com/182
https://a1010100z.tistory.com/106
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html