Specialization of @Component for classes that declare @ExceptionHandler, @InitBinder, or @ModelAttribute methods to be shared across multiple @Controller classes.
여러 @Controller 클래스에서 공유할 @ExceptionHandler, @InitBinder 또는 @ModelAttribute 메서드를 선언하는 클래스에 대한 @Component의 특수화입니다. Spring API Docs
여러 @Controller
클래스에서 어떤 로직(주로 예외처리)을 한 곳에서 수행할 수 있다.
-
@ControllerAdvice
가 붙은 빈이 컴포넌트 스캔을 통해 등록 될 떄,ControllerAdviceBean
으로 등록된다.ExceptionHandlerExceptionResolver
가 필드로exceptionHandlerAdviceCache
를 가진다.ExceptionHandlerExceptionResolver.initExceptionHandlerAdviceCache()
에서 생성할 때,List<ControllerAdviceBean>
을 가져와 등록한다.
-
ExceptionHandlerExceptionResolver
가exceptionHandlerCache
(Controller에 있는ExceptionHandler
)를 먼저 확인하고 있으면 해당 객체에 예외 해결을 위임한다.- 없다면
exceptionHandlerAdviceCache
에 등록된ExceptionHandler
을 읽고 처리한다.
@ControllerAdvice
의 Advice는 AOP에서 사용되는 용어이다.
CGLIB나 Proxy를 사용하지 않지만, 횡단 관심사(예외처리 등)을 분리하고 모듈화 한다는 점에서 AOP라고 볼 수 있다.
AOP는 어떤 구현 방식이라기보다 패러다임이기 때문이다.