이전 버전에는 개별적인 Controller에서 @ExceptionHandler 를 활용해서 Exception을 모았었다.
공통화를 위해 고민해보다가 @ExceptionHandler 함수 구현을 상위 클래스에 두고 Controller에서 해당 클래스를 모조건 상속을 받게끔 하는 방법으로 해보았었는데.. 좀 찜짐한감이 없잖아 있었다..(불필요한 코딩 한자라도 줄이고 싶었다.., 또한 특정 템플릿을 강요하고 싶지도 않았다..)
아니면 Interceptor 에서 Exception을 Cache 하여 처리하는 방법으로 했다던가..
셈플링 해보던중.. @ControllerAdvice를 발견!!
상속, Interceptor 없이 모든 Exception을 모을 수 있다!!
@ControllerAdvice public class DefaultControllerAdvice { private static final Logger logger = LoggerFactory.getLogger(DefaultControllerAdvice.class); @ExceptionHandler(RuntimeException.class) public ModelAndView handleRuntimeException(RuntimeException ex) { logger.error("에러임 RuntimeException: {}", ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("result", "999"); mv.addObject("message", ex.getMessage()); return mv; } }
<mvc:annotation-driven /> <context:component-scan base-package="pe.kr.ddakker" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" /> </context:component-scan>