ResponseEntity를 공부하게 된 계기
HTTP에 대해서 공부를 하던 중 불연듯 이런 생각이 들었습니다.
'HTTP에대해서 배웠는데, 나는 객체 그러니깐 BODY밖에 전송해본적이 없네
내가 Headers와 Status Line을 따로 만들어야 하는 건가?'
객체를 클라이언트에게 @ResponseBody를 사용해 JSON형식으로 전송할 줄은 알고있었지만, 한번도 Headers나 Status Line의 정보들을 직접 다뤄서 클라이언트에게 전송해본 적은 없었습니다.
그렇다면 이러한 것들을 전송할 수 있는 방법은 어떤 것이 있을까??
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);
}
이상입니다!!
'스터디 > Spring' 카테고리의 다른 글
Spring MVC 패턴 (0) | 2023.03.30 |
---|---|
쓰레드 풀을 이용한 쓰레드 관리 (0) | 2023.03.26 |
@Builder를 이용해 Entity <=> DTO 변환하기! (0) | 2022.12.01 |
[김영한님 스프링 핵심원리] request scope (0) | 2022.11.05 |
[김영한님 스프링 핵심 원리] 빈 스코프 (0) | 2022.11.03 |