Post

Spring Controllers Returning Custom Status Codes

1. 사용자 지정 상태 코드 반환

Spring은 컨트롤러 클래스에서 사용자 정의 상태 코드를 반환하는 몇 가지 기본 방법을 제공한다.

  • ResponseEntity 사용

  • 예외 클래스에서 @ResponseStatus 주석 사용

  • @ControllerAdvice@ExceptionHandler 주석 사용

이러한 옵션은 상호 배타적이지 않고 서로를 보완할 수 있다.

상세한 내용은 여기를 참고한다.

1) ResponseEntity를 통해 상태 코드 반환

표준 Spring MVC 컨트롤러에서 간단한 매핑을 정의한다.

1
2
3
4
5
@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
    return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}

/controller에 대한 GET 요청을 수신하면 Spring은 406 코드(허용되지 않음)로 응답을 반환한다. 이 예제에 대한 특정 응답 코드를 임의로 선택했다. 모든 HTTP 상태 코드를 반환할 수 있다(전체 목록은 여기에서 찾을 수 있음).

2) 예외를 통해 상태 코드 반환

Exception을 사용하여 상태 코드를 반환하는 방법을 보여주기 위해 컨트롤러에 두 번째 메서드를 추가한다.

1
2
3
4
5
@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
    throw new ForbiddenException();
}

/exception에 대한 GET 요청을 수신하면 Spring은 ForbiddenException을 발생킨다. 이것은 별도의 클래스에서 정의할 사용자 지정 예외이다.

1
2
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}

이 예외에는 코드가 필요하지 않다. 모든 작업은 @ResponseStatus 주석에 의해 수행된다.

이 경우 예외가 발생하면 예외를 발생시킨 컨트롤러는 응답 코드 403(Forbidden)과 함께 응답을 반환한다. 필요한 경우 응답과 함께 반환될 메시지를 주석에 추가할 수도 있다.

이 경우 클래스는 다음과 같다.

1
2
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message")
public class ForbiddenException extends RuntimeException {}

예외가 상태 코드를 반환하도록 하는 것이 기술적으로 가능하지만 대부분의 경우 오류 코드(4XX 및 5XX)에 대한 예외를 사용하는 것이 논리적으로 타당하다.

[출처 및 참고]

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