반응형

🎯 1. Spring HTTP 응답 메시지 바디에 메시지를 설정하는 방법

HTTP 응답 메시지 바디에 메시지를 설정하는 방법은 다음과 같이 2가지가 존재한다.

  • 반환 시 ResponseEntity<T> 사용
  • @ResponseBody + 반환 객체 사용

 

1. ResponseEntity<T> 예제


      
@PostMapping("/plays")
public ResponseEntity<RaceResultResponse> registerRaceResult(@RequestBody final GameInfoRequest gameInfoRequest) {
...
}

 

2. @ResponseBody + 반환 객체 사용 예제


      
@PostMapping("/plays")
@ResponseBody
public RaceResultResponse registerRaceResult(@RequestBody final GameInfoRequest gameInfoRequest) {
...
}

🎯 2. ResponseEntity<T> VS @ResponseBody의 차이

두 가지 방법의 차이는 무엇일까?

바로 ResponseEntity<T>를 사용하면 DTO 객체 반환 시보다 설정할 수 있는 부분이 더 추가된다는 점이다.

 

자세히 살펴보기 위해 ResponseEntity<T> 클래스를 살펴보자.

 

✅  2-1. ResponseEntity<T> 클래스 (feat. HttpEntity<T>)


      
* ResponseEntity<T>
public class ResponseEntity<T> extends HttpEntity<T> {
private final Object status;
...
}
---
* HttpEntity<T>
public class HttpEntity<T> {
private final HttpHeaders headers;
@Nullable
private final T body;
}

ReponseEntity<T>HttpEntity<T>를 상속하기 때문에,

HttpStatus 와 HttpHeader , HttpBody 를 설정하여 HTTP 응답을 보낼 수 있다.

 

이와 달리, @ResponseBody와 객체를 사용해서는 위의 옵션을 설정하기 힘들다.

HTTP 상태 코드는 @ResponseStatus를 통해 설정해줄 수 있지만,

헤더 부분은 설정하기가 힘들다.

 

 

🎯 2-2. ResponseEntity<T> VS @ResponseBody의 차이 요약

 

@ResponseBody

  • 장점
    • 어노테이션 추가만으로 간단하게 HTTP 응답을 만들 수 있다.
  • 단점
    • HTTP 헤더, 상태 코드 같은 옵션에 대한 유연성이 떨어진다.
      • HTTP 헤더는 설정하기가 어렵다.
      • 상태 코드는 @ResponseStatus 를 추가로 붙여야 설정이 가능하다.

ResponseEntity<T>

  • 장점
    • HTTP 옵션에 대해 유연하다. (HTTP 규약을 지킨다.)
      • HttpEntity를 상속 받고 있기 때문에 여러 HTTP 옵션을 설정할 수 있다.
      • ResponseEntity 빌더를 통해서 여러 HTTP 옵션을 설정할 수 있다.
  • 단점
    • @ResponseBody 보다는 작성할 코드가 많다.

🎯 3. 그렇다면, 둘 중 무엇을 사용할까?

ResponseEntity<T>의 단점은 @ResponseBody 보다 작성할 코드가 많다는 것이었다.

하지만 ResponseEntity<T> 대신 @ResponseBody 를 사용해도

눈에 띌만큼 생산성이 개선되지는 않는다고 느꼈다.

 

또, HTTP 옵션을 사용하지 않아도 되는 곳이라서 @ResponseBody 를 사용했을 때도

추후에 HTTP 옵션을 설정해야하도록 요구사항이 변경된다면 결국 해당 메소드도 변경된다는 단점이 있었다.

 

그래서, HTTP 옵션을 지정해서 사용할 수 있는 ResponseEntity<T> 를 사용하는 것이

훨씬 좋을 것 같다고 결론을 냈다.

 

 

※ ResponseEntity를 사용할 때는 생성자 대신 빌더를 사용하자

ResponseEntity 사용 시 생성자를 사용하면 HTTP 상태 코드를 하드 코딩으로 지정할 수 있기 때문에

잘못된 상태 코드를 넣을 수 있다.

물론 HttpStatus에 없는 코드를 넣게 되면 에러가 발생하긴 하지만 컴파일 타임이 아닌

런타임에 발생하기 때문에 좋지 않다.

따라서, ResponseEntity 에 있는 빌더를 사용하면 이를 방지하고 가독성도 좋은 코드를 얻을 수 있다.


      
* 생성자 사용
// OK인 200을 2000으로 오타 -> 런타임 에러
return new ResponseEntity<GameResponse>(gameResponse, headers, HttpStatus.valueOf(2000));
* 빌더 사용
return ResponseEntity.ok()
.headers(headers)
.body(gameResponse);

Reference

Spring : ResponseEntity를 사용해야 하는 이유

 

Spring : ResponseEntity를 사용해야 하는 이유

ResponseEntity를 사용해야 하는 이유 우리는 왜 Restful API를 만드는 것일까요? Restful API를 만드는 가장 큰 이유는 Client Side를 정형화된 플랫폼이 아닌 모바일, PC, 어플리케이션 등 플랫폼에 제약을 두

dev-splin.github.io

[Spring] ResponseEntity vs DTO

 

[Spring] ResponseEntity vs DTO

🤔 서론 🤔 `줍줍` 프로젝트를 진행하며 반환값을 ResponseEntity로 반환하느냐, DTO를 반환하느냐 무엇이 더 좋을까? 에 대한 이야기가 나왔습니다. 이에 대해 다양한 사람들에게 조언을 구했고 많

yeonyeon.tistory.com

ResponseEntity - Spring Boot에서 Response를 만들자

 

ResponseEntity - Spring Boot에서 Response를 만들자

웹 서비스에서는 많은 정보를 송수신하게 됩니다. 각각의 다른 웹 서비스들이 대화하려면, 서로 정해진 약속에 맞게 데이터를 가공해서 보내야합니다. 보내는 요청 및 데이터의 형식을 우리는 H

tecoble.techcourse.co.kr

 

반응형
BE_성하