스프링 부트의 예외 처리 방식
크게 2가지가 존재
-@ControllerAdvice를 통한 모든 Controller에서 발생할 수 있는 예외 처리
-@ExceptionHandler를 통한 특정 Controller의 예외 처리
@ControllerAdvice로 발생할 모든 예외를 정의 후 @ExceptionHandler를 통해 발생하는 예외 마다 처리할 메소드를 정의
- 예외 클래스
모든 에외 클래스는 Throwable 클래스를 상속 받고 있음
Exception은 수많은 자식 클래스가 있음
RuntimeException은 Unchecked Exception 이며 그 외는 Checked Exception
| Checked Exception | Unchecked Exception |
|---|
| 처리여부 | 반드시 예외 처리 필요 | 명시적 처리 강제하지 않음 |
| 확인시점 | 컴파일 단계 | 실행 중 단계 |
| 예외발생시 트랜잭션 | 롤백하지 않음 | 록백함 |
| 대표 예외 | IOExcept / SQLException | NullPorinterException/ IllegealArgumentException |
- Spring 예외 처리
@ControllerAdvice, @RestControllerAdvice
- @ControllerAdvice는 Spring에서 제공하는 어노테이션
- Controller나 RestController에서 발생하는 예외를 한 곳에서 관리,처리할 수 있게 해주는 어노테이션
- 설정을 통해 범위 지정 가능, Default 값으로 모든 Controller에 대해 예외 처리를 관리함
->패키지 범위를 설정할 수 있음
- 예외 발생 시 json의 형태로 결과를 반환하기 위해서는 @RestControllerAdvice를 사용하면 됨
@ExceptionHandler
- 예외 처리 상황이 발생하면 해당 Handler로 처리하겠다고 명시하는 어노테이션
- 어노테이션 뒤에 괄호를 붙여 어떤 ExceptionClass를 처리할지 설정할 수 있음
- Exception.class는 최상위 클래스로 하위 세부 예외 처리 클래스로 설정한 핸들러가 존재하면, 그 핸들러가 우선 처리하게 되며, 처리 되지 못하는 예외 처리에 대해 ExceptionClass에서 핸들링함
- @ControllerAdvice로 설정된 클래스 내에서 메소드로 정의할 수 있지만, 각 Controller 안에 설정도 가능
- 전역 설정(@ControllerAdvice)보다 설정(Controller)으로 정의한 Handler가 우선순위를 가짐