Springあるある
WebServerFactoryCustomizer<>(Feat. 오류 페이지 처리, Error page)
JIN_YOUNG _KIM
2025. 1. 19. 10:32
우선 "서블릿 컨테이너는 스프링(정확히는 스프링 부트)가 실행/관리"한다는 점을 상기하자!
스프링에서 예외(Exception)이나 Response에 오류 정보가 담긴 경우 WAS까지 그 정보가 전달이 된다.
이때 스프링에서 별도로 개발자가 오류 페이지를 만들어 주지 않으면 WAS 자체에 이미 만들어 져 있는 사용자 친화적이지
지 않은 오류 페이지를 전송을 한다.
(스프링에서 오류를 전달하는 2가지 방법
1] 예외(Exception) 전달
2] Response 객체에 오류 상태 지정)
고로, 우리는 WAS가 오류를 만났을 때 개발자가 만든 사용자 친화적 오류 페이지를 보여 주도록 개발을
해야 한다.
스트링 부트는 WebServerCustimizer<>를 사용하여 WAS(톰캣)가 개발자가 만든 오류 페이지를 찾도록 개발을 해주
는 기능을 제공하고 있다.
// WebServerFactoryCustomizer< > : 웹 서버(톰캣)을 커스터마이징(스프링 부트가 제공)
// -> 서블릿 컨테이너는 스프링 부트가 실행/관리하고 있다는 점을 상기하자!
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
/**
* 컨트롤러에서 Exception이나 Response에 오류 정보가 있을 경우
* [서블릿에서] 해당 오류 페이지를 호출
* *주의 : "/error-page/500" 등은 오류 페이지가 아니라 오류 페이지를 찾게 해주는
* URL이다.
*/
// Exception(해당 예외 객체의 자식 타입도 포함)
ErrorPage errorPageEx = new ErrorPage(RuntimeException.class, "/error-page/500");
// Response 오류 정보
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/400");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-page/500");
// 등록
factory.addErrorPages(errorPage404,errorPage500,errorPageEx);
}
"/error-page/500" 등의 URL을 보고 해당 오류 페이지를 찾아 줄 컨트롤러가 필요하다.
이때 실행 흐름에 대해 매우 주의를 해야 한다.
위에서 나는 " 예외(Exception)이나 Response에 오류 정보가 담긴 경우 WAS까지 그 정보가 전달이 된다."라고 언급을 하
였다.
WebServerCustimizer<>을 이용하게 되면, 예외나 오류 정보가 담긴 Response가 WAS까지 전달이 되고,
"/error-page/500" URL을 처리할 컨트롤러를 WAS가 재호출 한다.