스프링은 전역적으로 @ExceptionHanlder를 적용할 수 있는 @ControllerAdvice,@ RestControllerAdvice 이 두개의 어노테이션을 제공한다.
@RestControllerAdvice는 응답을 JSON으로 내려주고 @ControllerAdvice는 기존의 Controller 와 같다고 생각하면 된다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
protected ResponseEntity<ResponseDto<?>> handleIllegalException(IllegalArgumentException e) {
return ResponseEntity.badRequest().body(new ResponseDto<>(HttpStatus.BAD_REQUEST, e.getMessage(), null));
}
}
Controller 패키지 안의 클래스 단에서 발생하는 Exception의 예외처리를 GlobalExceptionHandler 클래스에서 모두 다 처리하게 끔 만들어주면 된다.
내가 설정한 예외처리에 대한 내용은 모두 IllegalArgumentException 예외클래스인데, 예외처리를 커스텀마이징하여 더 추가적으로 변경하여 다양한 예외처리를 만들어서 작성하면 될 듯 하다.
이러한 전역적으로 예외처리를 처리하는 어노테이션을 사용하면 좋은점이 있다.
원래라면 모든 메서드마다 try { } catch { } 문을 사용하여 하나하나 예외처리를 잡아주었다.
하지만 그럴 필요가 없다
메서드에서는 그냥 예외처리에 대한 응답 결과를 throw 로 던저주면 GlobalExceptionHandler 클래스에서 모두 다 잡아준다.
또한, 직접 정의한 에러 응답을 클라이언트에게 넘겨줄 수 있다.
위에서 말했듯 try , catch 문이 없어지기 때문에 코드의 가독성이 증가해준다!
다만 이 어노테이션을 사용할 때 주의점이 있다.
하나의 프로젝트 당 하나의 전역적인 예외처리 클래스로 관리하는 것이 좋다.
직접 구현한 예외처리 클래스들은 한 공간에서 관리해야한다.