yoncho`s blog
[Spring MVC] Global Exception Handler (@ControllerAdvice, @ExceptionHandler) 본문
[Spring MVC] Global Exception Handler (@ControllerAdvice, @ExceptionHandler)
욘초 2023. 10. 10. 21:17순서 :
1) Global Exception을 Handler 할 Class를 생성한다. (with @ControllerAdvice)
* @ExceptionHandler가 하나의 클래스에 대한 것이라면, @ControllerAdvice는 모든 @Controller 즉, 전역에서 발생할 수 있는 예외를 잡아 처리해주는 annotation이다.
2) Exception Handlering 할 함수를 생성한다. (with @ExceptionHandler(Exception.class))
*Exception.class를 인자로 해서 Exception이 발생할 경우 Catch해 함수를 호출시켜 준다.
즉, Exception.class를 인자로 하므로 모든 Exception을 catch하겠다는 뜻
3) 함수 내에서 Exception 처리
1. Global Exception을 Handler 할 Class를 생성한다. (with @ControllerAdvice)
@ControllerAdvice
public class GlobalExceptionHandler {
...
}
모든 Controller를 상대로 Exception을 catch할 수 있기 때문에 사용한다.
2. Exception Handlering 할 함수를 생성한다. (with @ExceptionHandler(Exception.class))
@ExceptionHandler(Exception.class)
public String handlerException(Model model, Exception e) {
//exception 처리 (로깅, exception view(jsp))
}
@ExceptionHandler의 인자가 Exception.class로 되어있다.
이건 Exception 혹은 상속 받은 하위 모든 Exception들에 대해 catch 하겠다는 걸 의미 한다.
즉, 모든 Exception을 처리할 수 있는 것
3. 함수 내에서 Exception 처리
private static final Log logger = LogFactory.getLog(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
public String handlerException(Model model, Exception e) {
//1. 404 Error check
if(e instanceof NoHandlerFoundException) {
return "error/404";
}
//2. Loging
StringWriter errors = new StringWriter();
e.printStackTrace(new PrintWriter(errors));
logger.error(errors.toString());
//3. 사과 페이지
model.addAttribute("errors", errors.toString());
return "error/exception";
}
1) 404 error check : exception handler가 지정되어있지 않는 경우.
NoHandlerFoundException에 대해서 web.xml을 java파일로 옮긴 WebApplicationInitializer.java를 보면
handler mapping에 존재하지 않는 경우 NoHandlerFoundException이 발생하게 설정해주는 코드가 아래와 같이 설정되어있다. 그래서 Global Exception Handler에서 처리할 수 있게 되는 것이다.
public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
....
@Override
protected FrameworkServlet createDispatcherServlet(WebApplicationContext servletAppContext) {
DispatcherServlet servlet = (DispatcherServlet)super.createDispatcherServlet(servletAppContext);
servlet.setThrowExceptionIfNoHandlerFound(true); //global handler로 exception
return servlet;
}
.....
}
2) logging - error logging
3) error page - 사용자가에 보여줄 error page (공통)
'기술, 나의 공부를 공유합니다. > [Web][BE] JAVA' 카테고리의 다른 글
[Spring Configuration] 설정 파일 변화 ( .xml -> .java -> .yml ) (0) | 2023.10.14 |
---|---|
[Plugin Setting & Jenkins Build] 배포 준비 과정 (0) | 2023.10.11 |
[Spring MVC] ApplicationContext에 Dynamic Bean Create (0) | 2023.10.10 |
CentOS7 ip 변경 (0) | 2023.10.07 |
[Spring Framework] Work Flow (0) | 2023.10.06 |