[Spring] Servlet에서 예외 처리는 어떻게 진행 될까?
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
본 글은 인프런의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 작성되었습니다~
Spring Boot 로 오류 페이지를 작성하기에 앞서 Servlet이 예외 처리를 어떻게 하는지 알아보려고 합니다.
기본적으로 Servlet은 Exception과 sendError로 예외 처리를 진행합니다.
Exception
웹 애플리케이션에서 예외 발생시 예외를 try-catch로 잡지 못하고, Servlet 밖으로 전달된다면 아래와 같이 동작합니다.
컨트롤러에서 예외발생 -> 인터셉터 -> 서블릿 -> 필터 -> 최종적으로 WAS 까지 전달 !!
application.properties에 Spring Boot가 기본적으로 제공하는 예외 페이지를 지우기 위해 아래 코드를 작성해줍니다.
server.error.whitelabel.enabled=false
localhost:8080/404 를 호출하면 톰캣이 기본적으로 제공하는 오류 페이지가 아래와 같이 올라옵니다.
response.sendError
다음은 HttpServletResponse이 제공하는 sendError라는 메서드입니다. sendError의 사용법은 아래와 같습니다.
sendError(Http 상태 코드)
sendError(Http 상태 코드, 오류 메시지)
sendError는 아래와 같이 동작합니다
컨트롤러 -> 인터셉터 -> 서블릿 -> 필터 -> WAS에서 sendError 호출 기록 확인 !!
오류 페이지
이제 예외 처리 방법을 알아보았으니 Servlet이 제공하는 오류 페이지를 사용해 보겠습니다. 기본적으로 오류 페이지 처리는 아래와 같이 해줄 수 있습니다.
@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);
}
}
그리고 오류가 발생했을 때 처리해줄 수 있는 컨트롤러가 필요하기 때문에 컨트롤러도 만들어줍니다 !
@Slf4j
@Controller
public class ErrorPageController {
@RequestMapping("/error-page/404")
public String errorPage404(HttpServletRequest request, HttpServletResponse response) {
log.info("errorPage 404");
return "error-page/404";
}
@RequestMapping("/error-page/500")
public String errorPage500(HttpServletRequest request, HttpServletResponse response) {
log.info("errorPage 500");
return "error-page/500";
}
}
그리고 뷰를 만들어주면 !!
이렇게 오류 페이지를 수정해줄 수 있습니다 ~ 위 과정의 흐름은 아래와 같습니다
WAS `/error-page/404` 다시 요청 -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러(/error-page/404) -> View
1. WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
2. WAS `/error-page/404` 다시 요청 -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러(/error-page/404) -> View
예외 발생 시 WAS 까지 전달되고 WAS는 오류 페이지를 호출할 때 필터, 서블릿, 인터셉터, 컨틀롤러도 다시 호출시킵니다.
여기까지 Servlet 이 예외 처리를 하는 흐름에 대해서 이해해보았습니다.
'Spring Boot' 카테고리의 다른 글
[Spring] 챗봇을 활용한 레시피 추천 앱 (0) | 2024.05.02 |
---|---|
[Spring] Spring Boot는 어떤 방법으로 예외 처리를 할까? @ExceptionHandler, @ControllerAdvice (0) | 2024.04.29 |
[Spring Boot] Spring Boot와 MongoDB 연동하기 (2) | 2023.07.19 |
[Spring] Grafana와 Prometheus로 서버 모니터링 하기 (0) | 2023.07.07 |
[Spring] Spring MVC의 구조 (0) | 2023.06.03 |
댓글