본문 바로가기
스터디/Spring

ResponseEntity에 관하여

by Big Sun 2022. 12. 2.
728x90

ResponseEntity를 공부하게 된 계기

 

HTTP에 대해서 공부를 하던 중 불연듯 이런 생각이 들었습니다.

'HTTP에대해서 배웠는데, 나는 객체 그러니깐 BODY밖에 전송해본적이 없네

내가 Headers와 Status Line을 따로 만들어야 하는 건가?'

 

객체를 클라이언트에게 @ResponseBody를 사용해 JSON형식으로 전송할 줄은 알고있었지만, 한번도 Headers나 Status Line의 정보들을 직접 다뤄서 클라이언트에게 전송해본 적은 없었습니다.

 

HTTP 정리(1) (tistory.com)

 

그렇다면 이러한 것들을 전송할 수 있는 방법은 어떤 것이 있을까??

 

ResponseEntity의 사용 목적

 

ResponseEntity는 HTTP 스펙에 맞춰서 메세지 응답을 하기위해서 만들어진 클래스입니다.

 

그냥 @ResponseBody 어노테이션을 사용해서 객체를 json으로 반환하면 되는 데 이것을 왜 사용해야 하냐면, 앞서 설명들였듯이 ResponseEntity는 HTTP 스펙에 맞춰서 메세지를 보내기 때문에 이를 사용하면, API를 Restful하게 만들 수 있습니다.

 

 

ResponseEtntiy

 

public class ResponseEntity<T> extends HttpEntity<T> {

   private final Object status;

public ResponseEntity(HttpStatus status) {
      this(null, null, status);
   }

public ResponseEntity(@Nullable T body, HttpStatus status) {
      this(body, null, status);
   }

public ResponseEntity(MultiValueMap<String, String> headers, HttpStatus status) {
      this(null, headers, status);
   }

public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
      this(body, headers, (Object) status);
   }
...
}

 

ResponseEntity<T>는 HttpEntity<T>를 상속하는 것을 볼 수 있습니다.

 

ResponseEntity<T>는 status만 필드 값을 가지고 있습니다.

이는 Status Code를 직접 지정할 수 있다는 뜻입니다.

그리고, headers와 body는 HttpEntity<T>에 구현이 되어 있습니다.

 

다음은 HttpEntity<T>입니다.

 

HttpEntity

public class HttpEntity<T> {

public static final HttpEntity<?> EMPTY= new HttpEntity<>();


   private final HttpHeaders headers;

   @Nullable
   private final T body;

protected HttpEntity() {
      this(null, null);
   }

public HttpEntity(T body) {
      this(body, null);
   }

public HttpEntity(MultiValueMap<String, String> headers) {
      this(null, headers);
   }

public HttpEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers) {
      this.body = body;
      this.headers = HttpHeaders.readOnlyHttpHeaders(headers != null ? headers : new HttpHeaders());
   }
...
}

 

HttpEntity<T>는 headers와 body로 구성되어 있습니다.

여기서, body는 Generic 타입으로 선언되어 있으며, 외부에서 body의 타입을 정해줄 수 있다는 뜻입니다.

쉽게 말해서, 응답으로 보내고 싶은 객체의 타입이 Generic타입이 되는 것입니다.

 

실제 사용

 

다음은 제 프로젝트의 소스 코드 일부분입니다.

 

@PostMapping("/users")
public ResponseEntity<UserSignupResponse> signup(UserSignUpRequest userSignUpRequest) {
    User user = userService.join(userSignUpRequest);
    HttpHeaders headers = new HttpHeaders();
    headers.setLocation(URI.create("/users/"+user.getUserPk().toString()));
    UserSignupResponse userSignupResponse = UserSignupResponse.builder()
            .userId(user.getUserId())
            .userNickName(user.getUserNickName())
            .build();
    return new ResponseEntity<>(userSignupResponse,headers,HttpStatus.CREATED);
}

 

이상입니다!!

728x90