WAS <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러 (예외발생)
@GetMapping("/error-ex")
public void errorEx() {
throw new RuntimeException("예외 발생");
}
WAS(sendError 호출 기록 확인) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러 (response.sendError())
@GetMapping("/error-404")
public void error404(HttpServletResponse response) throws IOException {
response.sendError(404,"404 오류!");
}
@GetMapping("/error-500")
public void error500(HttpServletResponse response) throws IOException {
response.sendError(500,"500 오류!");
}
WebServerFactoryCustomizer<ConfigurableWebServerFactory>
를 상속받아 수동으로 에러가 발생했을 때의 호출할 url을 지정할 수 있다.
@Component
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/400");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-page/500");
ErrorPage errorPageEx = new ErrorPage(RuntimeException.class, "/error-page/500");
factory.addErrorPages(errorPage404,errorPage500,errorPageEx);
}
}
컨트롤러에서 에러가 발생하면 서블릿 컨테이너까지 전달되고, 에러 종류에 따라 위에서 지정한 url로 다시 요청한다.
그렇기때문에 필터, 서블릿, 인터셉터 컨트롤러의 과정을 다시 거치게 된다.
이 과정에서 WAS는 단순히 다시 요청만 하는게 아니라 오류정보를 request의 attribute에 추가한다.