부트에서 예외처리
- 아래의 3가지 방법이 있다.
- 자바의 방법 : try/catch 사용
- 컨트롤러 단위 : 각각의 컨트롤러에서 @ExceptionHandler 사용
- 전역 처리 : @ControllerAdvice을 사용한 전역 예외처리
@ExceptionHandler는 중복코드가 발생한다고 한다.. 여기서 나올 중복 코드가 그 중복이 아닐텐데..
@ControllerAdvice
- 스프링 3.2에서 추가됨.
- Annotation만으로 추가 설정없이 예외 처리 가능.
@ControllerAdvice
@Slf4j
public class ExceptionHandler {
@org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
public ModelAndView defaultExceptionHandler(HttpServletRequest request, Exception exception) {
ModelAndView modelAndView = new ModelAndView("/error/defaultError");
modelAndView.addObject("defaultError", exception);
log.error("defaultExceptionHandler", exception);
return modelAndView;
}
- @ControllerAdvice : 예외처리 객체임을 알림.
- @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class) : 예외 발생시 처리할 예외의 지정. (여기서는 예제기 때문에 모든 예외) 실제 개발에서는 필요한 예외에 따라 구현해야한다.
- modelAndView : 예외시 보여줄 view의 지정
- modelAndView.addObject() : view(template)에 전달
- log.error() : 콘솔에 에러 역시 출력
근데 템플릿 추가해서 보니 내부 코드에 대한 예외는 처리하는데 없는 페이지 같은 500 에러에 대해서는 처리하지않는다.. 이걸 dispatcher servlet앞의 필터로 하는건가? -> 찾아본 글