본문 바로가기
Spring/Spring Boot

@ControllerAdvice & @RestControllerAdvice

by Soono991 2023. 4. 23.
💡 이번 포스팅에서는 @ControllerAdvice & @RestControllerAdvice에 대해 정리해 보도록 하겠습니다.

 

이전에 @ControllerAdvice, @RestControllerAdvice에 대해 찾아봤던 적이 있는데, 지금 다시 보니 잘 못된 부분이 있어 다시 정리해보고자 합니다.

 

때는 입사한 지 얼마 안 된 신입 때였는데 @ControllerAdvice, @RestControllerAdvice를 찾을 때 공식 문서나 java docs 대신 블로그 자료를 찾았었습니다.

 

@ControllerAdvice를 설명할 때 ExceptionHandler와 같이 설명하는 블로그들을 쉽게 찾아볼 수 있을 것입니다.

 

보면 공통적으로 전역 예외 처리를 위해 @ControllerAdvice를 사용한다고 하는데요,

결론적으로 말하면 반은 맞습니다.

예. @ControllerAdvice는 전역 예외 처리를 하기 위해 사용하기도 합니다.

하지만 그게 전부는 아닙니다.

 

이제 정확히 @ControllerAdvice가 어떤 기능을 담당하는지, 어떻게 사용할 수 있는지 확인해 보겠습니다.

 

 

 

@ControllerAdvice의 설명입니다.

확인해 보면 그 어디에도 전역 예외 처리라는 내용은 언급되지 않습니다.

대신 공통, 또는 공유라는 내용이 언급되는데 이 부분 때문에 전역 예외 처리라는 글들이 파생된 것 같다고 생각합니다.

 

정리하면 @ControllerAdvice는 여러 @Controller에서 공유할 데이터, 초기화 코드, 예외 처리 등을 선언할 수 있도록 도와주는 annotation입니다. 

 

모든 @Controller에서 초기화 시 동일한 코드(로직)가 실행되어야 한다면 @ControllerAdvice에 @InitBinder를 사용할 수 있습니다.

또는 모든 @Controller에서 동일한 데이터를 Model 객체에 추가해야 한다면 @ControllerAdvice에 @ModelAttribute를 사용할 수 있습니다.

그리고 앞서 설명했던 것처럼 @Controller에서 발생하는 예외를 공통적으로 처리하고 싶은 경우 @ControllerAdvice에 @ExceptionHandler를 사용할 수 있습니다.

 

 

그리고 위처럼 baseBackages를 사용하여 @ControllerAdvice가 적용될 범위도 설정할 수 있습니다.

 

@RestControllerAdvice의 경우 @ControllerAdvice와 동일하지만 @Controller, @RestController의 차이처럼 @ResponseBody가 추가된다는 점이 다릅니다.

 

댓글