Global Exception 처리

코딩을 합시다·2023년 2월 17일
0

전역에서 예외처리하기!

전역에서 어떻게 예외처리를 할까?

@ControllerAdvice 또는 @RestControllerAdvice를 이용해서 처리한다.

  • @RestControllerAdvice는
    @ControllerAdvice + @ResponseBody이다. (@Controller와 @RestController 같은 느낌)

어떻게 사용을 할까?

컨트롤러에서 발생하는 모든 예외는 @RestControllerAdvice가 잡고, @ExceptionHandler가 개별적으로 예외를 잡아 처리하는 방식!

궁금점 1

그럼 @Controller에서의 예외는 @ControllerAdvice, @RestController에서의 예외는 @RestControllerAdvice에서 잡아주는 것일까?

아니다.
@Controller에서 예외가 발생해도 @RestControllerAdvice에서 잡을 수 있고, @RestController에서의 예외가 발생해도 @ControllerAdvice가 잡아줄 수 있다.

Controller에 RestController를 붙였지만 GlobalExceptionHandler에는 실수로 @ControllerAdvice를 붙인 적이 있다. 하지만 GlobalExceptionHandler에서 Controller에 대한 예외를 잡았다.

이유 : 단순하게 @RestController와 @RestControllerAdvice는 @Controller와 @ControllerAdvice에 @ResponseBody를 붙였을 뿐이라서 예외를 잡는 것에 영향을 주지 못한다.

다만, @RestControllerAdvice는 @RestController와 마찬가지로 @ResponseBody가 있어서 자바 객체를 Json/Xml 형태로 반환하여 HTTP Response Body에 담을 수 있다.

궁금점 2

그러면 @RestControllerAdvice를 사용해서 @RestController에서 발생한 예외만 받을 수는 없을까?

가능하다
@RestControllerAdvice를 사용할 때 @RestControllerAdvice(annotations = RestController.class) 이렇게 셋팅하면 @RestController에서 발생하는 예외만 가져올 수 있다. @ControllerAdvice도 마찬가지다

예시 코드

@RestControllerAdvice로 모든 익셉션을 받아오고 @ExceptionHandler로 Exception에 따라 처리해주게 구현했다.
그리고
커스텀 익셉션을 하나 추가하여 내 입맛에 맛게 사용 할 수 있게 구현했다


참고 : https://tecoble.techcourse.co.kr/post/2020-07-28-global-exception-handler/

0개의 댓글