오봉이와 함께하는 개발 블로그

스프링 MVC 2 - 서블릿 예외 처리 오류 화면 제공 본문

BE/Spring

스프링 MVC 2 - 서블릿 예외 처리 오류 화면 제공

오봉봉이 2022. 8. 30. 20:24
728x90

서블릿 예외 처리 - 오류 화면 제공

서블릿 컨테이너가 제공하는 기본 예외 처리 화면은 고객 친화적이지 않기 때문에 서블릿이 제공하는 오류 화면 기능을 사용해보자.

서블릿은 Exception(예외)가 발생해서 서블릿 밖으로 전달되거나 response.sendError()가 호출 되었을 때 각각의 상황에 맞춘 오류 처리 기능을 제공한다.
이 기능을 사용하면 친절한 오류 처리 화면을 준비해서 고객에게 보여줄 수 있다.

과거에는 web.xml이라는 파일에 오류 화면을 등록했지만, 지금은 스프링 부트를 통해서 서블릿 컨테이너를 실행하기 때문에 스프링 부트가 제공하는 기능을 서용해서 서블릿 오류 페이지를 등록하면 된다.

서블릿 오류 페이지 등록

@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);
    }
}
  • response.sendError(404) : errorPage404 호출
  • response.sendError(500) : errorPage500 호출
  • RuntimeException : RuntimeException 또는 그 자식 타입의 예외 errorPageEx 호출

500 예외가 서버 내부에서 발생한 오류라는 뜻을 포함하고 있기 때문에 여기서는 예외가 발생한 경우도 500 오류 화면으로 처리했다.

오류가 발생했을 때 처리할 수 있는 컨트롤러가 필요하다.
예를 들어서 RuntimeException예외가 발생하면 WAS에서부터 컨트롤러까지 errorPageEx에서 지정한 /error-page/500이 호출되는데, 해당 오류를 처리할 컨트롤러가 필요하다.

오류 처리 컨트롤러

@Slf4j
@Controller
public class ErrorPageController {

    @GetMapping("/error-page/404")
    public String errorPage404(HttpServletRequest request, HttpServletResponse response) {
        log.info("errorPage 404");
        return "error-page/404";
    }
    @GetMapping("/error-page/500")
    public String errorPage500(HttpServletRequest request, HttpServletResponse response) {
        log.info("errorPage 500");
        return "error-page/500";
    }
}

오류 처리 View

/templates/error-page/404.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
  <div class="container" style="max-width: 600px">
    <div class="py-5 text-center">
      <h2>404 오류 화면</h2> </div>
    <div>
      <p>오류 화면 입니다.</p>
    </div>
    <hr class="my-4">
  </div> <!-- /container -->
  </body>
</html>

/templates/error-page/500.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <div class="container" style="max-width: 600px">
      <div class="py-5 text-center">
        <h2>500 오류 화면</h2>
      </div>
      <div>
        <p>오류 화면 입니다.</p>
      </div>
      <hr class="my-4">
    </div> <!-- /container -->
  </body>
</html>

정리

컨트롤러에서 예외가 발생하면 WAS까지 전달되고, ErrorPage를 띄우도록 설정한 컴포넌트(WebServerCustomizer)를 참조해서 예외에 알맞는 HttpStatus를 참조한다.
HttpStatus를 보고 설정된 path("/error-page/404")를 컨트롤러를 통해 다시 띄워주고 컨트롤러에서 동작하게 된다.
실행시 설정한 오류 페이지가 정상 노출되는 것을 볼 수 있다.

출처 : 인프런 김영한 지식공유자님 강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
728x90
Comments