SPRING/API 예외처리

API예외처리 하는법2(global)처리 - @ControllerAdvice, @RestControllerAdvice

공기팝님 2021. 10. 30. 11:03
반응형

스프링 부트에서 API예외처리를 글로벌하게 처리하는 방법을 알아보겠습니다.

이전 글 에서는 해당 컨트롤러에서만 예외 처리 적용이 되게 설정을 하였다면, 이번 글에선 글로벌하게 처리하는 법을 알아보겠습니다.  [이전 스프링 부트에서 API예외 처리하는 법 글을 보지 않으셨던 분은 꼭 보고 와 주세요!]

우선 이전 코드를 보겠습니다.

ExceptionHandler 분리전
예외처리코드 분리 전

보시다시피 정상 코드와 예외처리 코드가 하나의 컨트롤러에 섞여있습니다. 

정상 코드와 예외 처리 코드를 분리하고 싶다면 @ControllerAdvice 또는 @RestControllerAdvice를 사용하면
둘을 분리할 수 있습니다.

이 둘의 차이점을 보기 위해 RestControllerAdvice 내부 코드를 캡처

RestControllerAdvice
RestControllerAdvice 내부

@ControllerAdvice는 대상으로 지정한 여러 컨트롤러에 @ExceptionHandler , @InitBinder 기능을 부여해주는 역할을 한다. [아래 그림 참고]

@ControllerAdvice에 대상을 지정하지 않으면 모든 컨트롤러에 적용된다. (글로벌 적용) [아래 그림 참고]

@RestControllerAdvice는 @ControllerAdvice와 같고, @ResponseBody 가 추가되어 있다.
-> RestControllerAdvice  =  @ControllerAdvice  +  @ResponseBody

@Controller , @RestController의 차이와 같다.

 

그럼 이제, 바로 한번 적용해 보겠습니다. 

우선 ApiExceptionV2 Controller에 있는 @ExceptionHandler코드를 모두 분리해보겠습니다.

ExceptionHandler 분리
예외처리 코드 분리 후

분리 한 코드를 그대로 ExRestControllerAdvice.class에 옮겨보겠습니다.

ExceptionHandler global
ExRestControllerAdvice(예외처리 글로벌설정)

[주석 참고]
특정 애노테이션이 있는 컨트롤러를 지정할 수 있고, 특정 패키지를 직접 지정할 수도 있다.
패키지 지정의 경우 해당 패키지와 그 하위에 있는 컨트롤러가 대상이 된다.
그리고 특정 클래스를 지정할 수도 있고. 대상 컨트롤러 지정을 생략하면 모든 컨트롤러에 적용된다.

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-anncontroller- advice (스프링 공식 문서)

 

모든 설정이 끝났습니다.

끝으로 글로벌하게 처리가 되었는지  확인해보겠습니다.

결과확인
@ExceptionHandler 글로벌설정 확인

 

참고 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2  (김영한님 스프링 2편)

반응형