[SpringBoot] ResposneEntity와 @ResponseStatus에 대한 고찰[4]

Euiyeon Park·2025년 2월 9일
post-thumbnail

✨ ResposneEntity와 @ResponseStatus에 대한 고찰

  • 이전에 게시판 기본 CRUD 기능을 구현하는 포스트에서
    구현 제약 조건 중 "Http Status Code 규약에 맞는 응답 코드 설정"이 있어,
    컨트롤러와 서비스 레이어의 반환타입을 모두 ResponseEntity<T>로 변경하고
    status()를 통해 Http Status를 지정했다.
  • 그리고 ResponseEntity<T>를 사용하는 경우와 사용하지 않는 경우를 살펴봤었는데,
    ReponseEntity<T>를 사용하는 이유 중 하나는 응답 상태 코드를 단순히 200 OK로 주지 않고
    개발자가 직접 설정해 보다 명확한 상태 코드를 제공할 수 있다는 점이었다.
  • 그런데 ReponseEntity<T>를 굳이 사용하지 않아도 @ResponseStatus로 대체 가능하지 않나..?
    라는 생각에서 포스팅을 하게 되었다.

💫 ReponseEntity<T>

  • ResponseEntity<T>HttpEntity를 확장(상속)해 HTTP 응답 상태코드를 포함하는 클래스로,
    HTTP 응답을 직접 구성할 수 있는 Spring의 대표적인 클래스다.
  • 주로 Spring의 RestTemplate과 Spring MVC의 @Controller에서 사용된다.
  • ResponseEntity<T>는 HTTP 응답 상태코드 뿐만 아니라 헤더와 본문을 명시적으로 설정해
    유연하게 응답을 제어
    할 수 있다.
  • ReponseEntity<T>는 조건에 따라 상태 코드, 본문을 변경해 동적으로 응답을 조작할 수 있다.

💫 @ResponsStatus

  • @ResponseStatusHTTP 응답 상태 코드와 이유(reason)를 지정하는데 사용된다.
  • 메서드 또는 예외 클래스에 적용할 수 있으며,
    예외가 발생했을 때 클라이언트에게 반환되는 상태코드를 지정할 수 있다.
  • @ResponseStatusResponseEntity처럼 응답 본문 제어가 유연하지 않다.
    • 고정된 HTTP 상태 코드만 설정⭕
    • 헤더 추가❌
    • 응답 본문에 추가 작업❌

✨Exception과 @ResponseStatus

  • Spring에서는 컨트롤러에서 예외가 발생하면 기본적으로 500 Internal Server Error를 반환
  • 특정 예외에 대해 적절한 HTTP 상태코드를 반환하려면 예외 클래스에 @ResponseStatus를 적용하는 것이 유용
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
    return userService.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException("User not found"));
}
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

💫 @ResponseStatus의 한계

  • @ResponseStatus를 사용하면 오직 상태 코드만 변경가능하고, 응답 본문 추가❌
  • 예외에 대한 응답을 JSON 형식으로 반환하려면,
    ResponseEntity@ExceptionHandler를 사용하는 것이 바람직
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<Map<String, Object>> handleResourceNotFound(ResourceNotFoundException ex) {
    Map<String, Object> errorDetails = new HashMap<>();
    errorDetails.put("error", ex.getMessage());
    errorDetails.put("timestamp", LocalDateTime.now());
    
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorDetails);
}
{	
  	"error": "User Not Found", 
 	"timestamp": "2025-02-09T12:34:56" 
}

💫 결론 - 그래서 뭘 쓰라고?

1. ResponseEntity

  • REST API 환경
  • JSON 응답이 가능하고, 상태 코드와 함께 추가 정보를 포함 가능

2. @ResponseStatus

  • 단순한 컨트롤러나 예외 처리를 하는 경우
  • 고정된 응답 상태코드를 간단한게 설정하는 경우

💡 예외 처리를 하는 경우에도 ReponseEntity를 사용할 수 있다면
ResponseEntity를 사용하는게 더 좋을 것 같다 ..!

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글