여러가지 공통 handler를 만들수있는데 exception역시 내가 잡아서 커스텀할수있다.
@ControllerAdvice
public class ErrorControllerAdvice {
@ExceptionHandler(Exception.class)
public ModelAndView ExceptionHandler(Exception e) {
ModelAndView mav = new ModelAndView();
log.debug("===== ErrorControllerAdvice =====");
mav.setViewName("/url...");
return mav;
}
}
이것도 어노테이션이 잘되어 있어서 만드는 방법자체는 쉽다.
저렇게하면 예외가 뜨면 저곳으로 다 모일것이다.
어노테이션을 하나씩 뜯어봅시다
사용법 자체는 이렇게하면 된다.
@ExceptionHandler(잡을 예외 종류)
@ExceptionHandler({종류1, 종류2})
@ExceptionHandler 자체는 등록되어있는 @Controller, @RestController에서만 동작한다.
@Service 나 @Repository에서는 동작을 안한다는 소리다.
@Controller
or
@RestController
public class SampleController {
// ...
@ExceptionHandler(Exception.class)
public String sampleHandler(Exception e) {
// ...
}
}
이렇게 하면 이 해당 컨트롤러 안에서 발생하는 exception은 여기로 모일것이다.
하지만 우리가 기대하는것은 보통 이런게 아닐것이다.
전역적으로 동작하도록 다른 컨트롤러에서 발생하는 exception도 한번에 다 잡아서 보고 싶을것이다.
그럴때 필요한게 @ControllerAdvice, @RestControllerAdvice이다
이러면 모든 controller에서 발생하는게 잡힐것이다.
내가 젤 처음에 작성한 코드가 그 예시이다
RestControllerAdvice는 예상가능할것이다.
@ControllerAdvice + @ResponseBody
이러면 전역적으로 사용이 가능하다.