Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다. 이것은 HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다.
public class ResponseEntity<T> extends HttpEntity<T> {
private final Object status;
...
<T> ResponseEntity<T> body(@Nullable T body);
HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity 클래스이다. ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 따라서 HttpStatus
, HttpHeaders
, HttpBody
를 포함한다.
일반적으로 Controller에서 아래와 같이 객체를 Return 하면 HTTP 응답을 제어할 수가 없다.
@GetMapping("/")
public User getUser() {
User user = userService.getUser();
return user;
}
하지만 REST API
로 만든다면 클라이언트와 서버 간의 통신에 필요한 정보를 제공해야 한다.
그럴 때 ResponseEntity를 사용한다면 적절한 상태 코드와 응답 헤더 및 응답 본문을 생성해 반환 값을 커스텀하여 클라이언트에 전달할 수 있다.
return new ResponseEntity(body, headers, HttpStatus.valueOf(200));
return ResponseEntity.ok()
.headers(headers)
.body(body);
ResponseEntity.ok()
는 정적 팩토리 메서드이다.
그리고 뒷부분을 메소드 체이닝으로 연결한 빌더 패턴을 사용하는 것이 의미가 더 직관적이고 유지보수에 좋다.
ResponseEntity를 생성하는 기본 방법은 status와 body를 이용해서 상태코드와 JSON으로 변환할 객체를 지정하는 것이다.
ResponseEntity.status(상태코드).body(객체)
200(OK) 응답 코드와 몸체 데이터를 생성할 경우 다음과 같이 ok() 메서드를 이용해서 생성할 수 있다.
ResponseEntity.ok(member)
만약 몸체 내용이 없다면 다음과 같이 body를 지정하지 않고 build()로 바로 생성한다.
ResponseEntity.status(HttpStatus.NOT_FOUND).build()
아래와 같이 ResponseEntity.created() 메서드에 Location 헤더로 전달한 URI를 전달할 수도 있다.
URI uri = URI.created("/api/members/", newMemberId);
return ResponseEntity.created(uri).build();