Post

Spring ResponseStatus를 사용하여 HTTP 상태 코드 설정

Spring ResponseStatus를 사용하여 HTTP 상태 코드 설정

1. 컨트롤러 메서드

엔드포인트가 성공적으로 반환되면 Spring은 HTTP 200(OK) 응답을 제공한다.

컨트롤러 메서드의 응답 상태를 지정하려면 해당 메서드를 @ResponseStatus로 표시할 수 있다. 원하는 응답 상태에 대한 두 개의 교환 가능한 인수인 코드와 값이 있다.

1
2
@ResponseStatus(HttpStatus.I_AM_A_TEAPOT)
void teaPot() {}

오류를 알리고 싶을 때 reason argument를 통해 오류 메시지를 제공할 수 있다.

1
2
@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid")
void onIllegalArgumentException(IllegalArgumentException exception) {}

reason을 설정할 때 Spring은 HttpServletResponse.sendError()를 호출한다. 따라서 클라이언트에 HTML 오류 페이지를 보내므로 REST endpoints에 적합하지 않다.

또한 Spring은 표시된 메소드가 성공적으로 완료될 때 (Exception을 던지지 않고) @ResponseStatus만 사용한다.

2. 오류 처리기 사용

@ResponseStatus를 사용하여 예외를 HTTP 응답 상태로 변환하는 세 가지 방법이 있다.

  • @ExceptionHandler 사용

  • @ControllerAdvice 사용

  • Exception 클래스 표시

처음 두 방법을 사용하려면 오류 처리기 메서드를 정의해야 한다. 여기에 이 항목에 대한 자세한 내용이 있다.

일반 MVC 메서드와 동일한 방식으로 이러한 오류 처리기 메서드와 함께 @ResponseStatus를 사용할 수 있다.

동적 오류 응답이 필요하지 않은 경우 가장 간단한 솔루션은 세 번째 방법이다. @ResponseStatus로 Exception 클래스를 표시한다.

1
2
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
class CustomException extends RuntimeException {}

Spring이 이 Exception을 포착하면 @ResponseStatus에서 제공한 설정을 사용한다.

Exception 클래스를 @ResponseStatus로 표시하면 Spring은 이유 설정 여부에 관계 없이 항상 HttpServletResponse.sendError()를 호출 한다.

또한 @ResponseStatus로 표시하지 않는 한 Spring은 하위 클래스에 대해 동일한 구성을 사용한다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.