yoncho`s blog

[Spring MVC] Global Exception Handler (@ControllerAdvice, @ExceptionHandler) 본문

기술, 나의 공부를 공유합니다./[Web][BE] JAVA

[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 (공통)

Comments