오봉이와 함께하는 개발 블로그
스프링 MVC 2 - 서블릿 예외 처리 오류 화면 제공 본문
서블릿 예외 처리 - 오류 화면 제공
서블릿 컨테이너가 제공하는 기본 예외 처리 화면은 고객 친화적이지 않기 때문에 서블릿이 제공하는 오류 화면 기능을 사용해보자.
서블릿은 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편 - 백엔드 웹 개발 활용 기술
'BE > Spring' 카테고리의 다른 글
스프링 MVC 2 - 서블릿 예외 처리 : 필터 (0) | 2022.08.30 |
---|---|
스프링 MVC 2 - 서블릿 예외 처리 오류 페이지 작동 원리 (0) | 2022.08.30 |
스프링 MVC 2 - 서블릿 예외 처리 시작 (0) | 2022.08.30 |
스프링 MVC 2 - ArgumentResolver 활용 (0) | 2022.08.30 |
스프링 MVC 2 - 스프링 인터셉터 인증 체크 (0) | 2022.08.30 |