Global Exception 처리
개발 할 때 try-catch{ } 문으로 예외 처리를 하다보면 공통적으로 잡는 Exception 이 보인다.
난 중복된 코드를 싫어하기에 매번 Method 작성할 때마다 같은류의 try catch 가 보이는게 보기 싫었다.
그래서 찾은게 @ControllerAdvice
@ControllerAdvice
➔ @ExceptionHandler, @ModelAttribute, @InitBinder 가 적용된 메서드들에 AOP를 적용해 Controller 단에 적용하기 위해 고안된 어노테이션.
클래스에 선언하면 되며, 모든 @Controller에 대한, 전역적으로 발생할 수 있는 예외를 잡아서 처리할 수 있다.
@RestControllerAdvice (@ControllerAdvice + @ResponseBody)
➔ @ControllerAdvice와 동일한 역할을 수행하고, 추가적으로 @ResponseBody를 통해 객체를 리턴.
따라서 단순히 예외만 처리하고 싶다면 @ControllerAdvice를 적용하면 되고, 응답으로 객체를 리턴해야 한다면 @RestControllerAdvice를 적용하면 된다.
@ExceptionHandler
➔ 이 어노테이션을 메서드에 선언하고 특정 예외 클래스를 지정해주면 해당 예외가 발생했을 때 메서드에 정의한 로직으로 처리할 수 있다.
@ControllerAdvice 또는 @RestControllerAdvice에 정의된 메서드가 아닌 일반 컨트롤러 단에 존재하는 메서드에 선언할 경우, 해당 Controller에만 적용된다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity systemException(Exception ex){
// ...
}
Exception 이 발생할 경우 해당 @ExceptionHandler 호출
또한, ControllerAdvice를 사용하여 Exception 처리를 한 곳으로 모으는 경우, ResponseEntityExceptionHandler 를 상속받도록 하여 Spring MVC에서 기본으로 제공되는 Exception들의 처리를 간단하게 등록할 수도 있다.
아래 공식홈 참조
ResponseEntityExceptionHandler (Spring Framework 6.0.11 API)
pageNotFoundLogger protected static final Log pageNotFoundLogger Specific logger to use when no mapped handler is found for a request. See Also:
docs.spring.io
참조 :
https://velog.io/@banjjoknim/RestControllerAdvice
https://supawer0728.github.io/2019/04/04/spring-error-handling/