본문 바로가기
web/SpringBoot

Global Exception 처리

by 뽀리님 2023. 9. 6.

개발 할 때 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들의 처리를 간단하게 등록할 수도 있다.

아래 공식홈 참조

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.html

 

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/