지금까지 API를 구현을 했다. 이제 어느정도 기능은 전부 작동은 하는 상태이지만, 예외가 발생하면 500번 에러를 반환하는 상태이다. 500번 에러는 서버에 심각한 오류가 발생했음을 알리는 응답이기 때문에 예외별로 적절한 응답을 반환해야 한다.
ControllerAdvice
예외처리를 각 컨트롤러에서 ExceptionHnadler
를 구현해도 되지만 도메인별로 발생할 수 있는 예외들을 한곳에 모아서 관리를 하면 훨씬 편하다. 이럴 때 @ControllerAdvice
를 사용하면 된다.
@RestControllerAdvice
public class PostExceptionHandler {
@ExceptionHandler(Throwable.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse unknownError(Throwable throwable){
return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, "0000", throwable.getMessage());
}
@ExceptionHandler(PostNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse reportError(PostNotFoundException exception) {
return new ErrorResponse(HttpStatus.NOT_FOUND, "0001", exception.getMessage());
}
}
위와같이 @ExceptionHandler
에 처리하고싶은 예외를 지정한 뒤 @ResponseStatus
를 설정한 후, 에러 응답객체에 상태코드와 메시지를 지정해서 반환하면 된다. 우선은 전역적으로 등록되지 않은 예외에도 에러 응답을 보내야하기 때문에 Throwable도 등록해준다. 이후에 프로젝트 규모가 커지면 공통적으로 발생되는 에러들과 함깨 common으로 빼면 된다.
Response
@Getter
public class ErrorResponse {
private final LocalDateTime timestamp;
private final int status;
private final String error;
private final String message;
public ErrorResponse(HttpStatus httpStatus, String errCode, String message) {
this.timestamp = LocalDateTime.now();
this.status = httpStatus.value();
this.error = errCode;
this.message = message;
}
}
에러를 반환할 때는 위와같이 발생시각, httpstatus, 에러코드, 에러메시지를 보내주면 좋다.
현재까지의 패키지 구조
마무리
이제 우리의 코드는 크지 않은 문제가 생겼을때 아주 무서운 500코드를 반환하지 않게 되었다. 다음에는 API구현만큼이나 중요한 테스트에 대해 알아보자.
'springboot로 API만들어보기' 카테고리의 다른 글
[스프링부트로 API 만들기] Spring Rest Docs를 사용해서 API Docs 자동으로 생성하기 (0) | 2021.01.05 |
---|---|
[스프링부트로 API 만들기] Junit 으로 API 테스트 코드 작성하기 (2) | 2021.01.05 |
[스프링부트로 API 만들기] Api 구현해보기 (0) | 2021.01.03 |
[스프링부트로 API 만들기] 데이터를 관리해주는 모델 (0) | 2021.01.03 |
[스프링부트로 API 만들기]기능을 수행해주는 서비스 (0) | 2021.01.03 |
댓글