
"Http Status Code 규약에 맞는 응답 코드 설정"이 있어,ResponseEntity<T>로 변경하고status()를 통해 Http Status를 지정했다.ResponseEntity<T>를 사용하는 경우와 사용하지 않는 경우를 살펴봤었는데,ReponseEntity<T>를 사용하는 이유 중 하나는 응답 상태 코드를 단순히 200 OK로 주지 않고ReponseEntity<T>를 굳이 사용하지 않아도 @ResponseStatus로 대체 가능하지 않나..?ReponseEntity<T>ResponseEntity<T>는 HttpEntity를 확장(상속)해 HTTP 응답 상태코드를 포함하는 클래스로,ResponseEntity<T>는 HTTP 응답 상태코드 뿐만 아니라 헤더와 본문을 명시적으로 설정해ReponseEntity<T>는 조건에 따라 상태 코드, 본문을 변경해 동적으로 응답을 조작할 수 있다.
@ResponsStatus@ResponseStatus는 HTTP 응답 상태 코드와 이유(reason)를 지정하는데 사용된다.@ResponseStatus는 ResponseEntity처럼 응답 본문 제어가 유연하지 않다.500 Internal Server Error를 반환@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를 사용하면 오직 상태 코드만 변경가능하고, 응답 본문 추가❌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
2. @ResponseStatus
💡 예외 처리를 하는 경우에도 ReponseEntity를 사용할 수 있다면
ResponseEntity를 사용하는게 더 좋을 것 같다 ..!