우리가 웹사이트나 애플리케이션을 이용하다가 에러가 400 혹은 500 종류의 에러가 나면 어떻게 될까?
아마 경험해본 사람이라면 알겠지만 해당 웹사이트나 애플리케이션은 아래와 같이 상황에 맞는 적절한 에러 화면을 보낸다.
이번 글에서는 에러가 발생했을 때 서블릿은 어떤 방식을 이용해서 에러를 처리하는지 알아보겠다.
서블릿의 예외 처리 방법은 Exception과 response.sendError() 두 가지가 있다.
Exception은 우리가 흔히 알고 있는 Exception으로 아래와 같이 작성한다.
@GetMapping("/error-ex")
public void errorEx() {
throw new RuntimeException("예외 발생");
}
}
response.sendError()은 아래와 같은 방법으로 response에 에러를 코드와 함께 보내는 방법이다.
@RequestMapping("/error-page/404")
public String errorPage404(HttpServletRequest request, HttpServletResponse
response) {
log.info("errorPage 404");
return "error-page/404";
}
스프링을 쓴다면 Model, View를 이용해서 바로 에러 화면을 보여줄 수 있겠지만 지금은 서블릿 방식을 이용하기 때문에 C한 가지를 더 추가해줘야 한다.
@Component
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404");
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);
}
}
이제 이러한 오류 처리 방식이 어떻게 이루어지는지 살펴보자.
sendError 방식
WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 |
위와 같은 정상적인 흐름에서 컨트롤러가 response.sendError()를 호출한다면 다시 컨트롤러에서 WAS로 에러가 났다는 소식을 알린다.
컨트롤러 (response.sendError()) -> 인터셉터 -> 서블릿 -> 필터 -> WAS |
에러를 받은 WAS는 new ErrorPage를 통해서 어떤 에러이고 어떤 뷰를 보여줘야 할지 확인한다.
전체적인 흐름은 이렇다.
1. WAS - 필터 - 서블릿 - 인터셉터 - 컨트롤러 // 컨트롤러에서 예외가 발생하면? 2. 컨트롤러 - 인터셉터 - 서블릿 - 필터 - WAS // 컨트롤러는 예외를 WAS까지 전달한다. 3. WAS - 필터 - 서블릿 - 인터셉터 - 컨트롤러 // WAS는 예외를 확인하고 에러 페이지를 호출하기 위해 다시 컨트롤러를 호출 |
여기서 필터, 인터셉터가 무의미하게 2번 호출되는 것을 볼 수 있다.
(여기서 2번 호출된다라는 것은 1번 3번 과정을 말합니다. 호출은 메서드가 불려졌다는 것을 말하는데 여기서 필터, 인터셉터 의 기능을 '이 사람이 로그인을 했는지 확인하기' 라고 한다면 이 기능은 1번과 3번에서 수행되어야 하지 2번에서는 이러한 기능을 수행한다고 보기 어렵습니다. 단지 오류를 전달하기 위한 과정 중 하나라고 보시면 됩니다.)
다음 글에서는 이러한 무의미한 호출을 해결하는 방법에 대해 알아보겠습니다.
출처 : 인프런 - 스프링 MVC 2편 (김영한)
'Spring > Spring' 카테고리의 다른 글
[Spring] 서블릿 예외 처리 - 인터셉터 (0) | 2024.12.05 |
---|---|
[Spring] 서블릿 예외 처리 - 필터 (0) | 2024.12.05 |
[Spring] 스프링 인터셉터 (0) | 2024.12.03 |
[Spring] 서블릿 필터 (2) | 2024.12.02 |
[Spring] BindingFailure (0) | 2024.11.26 |