김영한 강사님의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 듣고 정리한 내용입니다. 자세한 내용은 강의를 참고해주세요
server.error.whitelabel.enabled=false

HTTP Status 500 – Internal Server Error를 볼 수 있다HttpServletResponse 가 제공하는 sendError 라는 메서드를 사용해도 된다.response.sendError(HTTP 상태 코드)response.sendError(HTTP 상태 코드, 오류 메시지)이렇게 서블릿 컨테이너가 제공하는 기본 예외 처리 화면은 사용자가 보기 불편하다... 서버가 문제 있나?라고 느낄 수 있다
이제 의미 있게 요류 화면을 제공해보자
@Component
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
// http 상태 코드 오류
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-page/500");
// Exception이 발생 했을 때
ErrorPage errorPageEx = new ErrorPage(RuntimeException.class, "/error-page/500");
factory.addErrorPages(errorPage404,errorPage500,errorPageEx);
}
}
WebServerFactoryCustomizer<ConfigurableWebServerFactory>를 구현한 클래스를 만든다customize : 메서드를 오버라이드해서 등록한다ErrorPage 객체를 생성해서 만들어준다addErrorPages를 이용해 만든 오류 객체를 추가해준다Servlet에서 오류를 등록하는 방법이다! -> 서블릿을 이용한다면 따라하자 ㅎㅎ


1. 먼저 에러페이지로 이동을 한다...!
2. 컨트롤러부터 error가 WAS 까지 타고간다.
3. WAS는 WebServerCustomizer에 등록된 오류를 확인한다
4. 등록된 오류타입에 등록된 url로 WAS가 다시 요청을한다!(오류가 났기 때문에)
5. 오류 화면을 보여주기 위해 새로운 컨트롤러로 이동을 한다
6. 컨트롤러 로직에 따라 오류 페이지를 렌더링 하는 view로 이동한다
즉, 처음에 오류가 발생하는 컨트롤러와, WAS가 오류화면을 보여주기 위한 컨트롤러 2개가 존재하는 것이다!!!
정상요청인지 아니면, WAS서버에서 요류로 인한 내부요청인지 구분을 해야 한다!!!Dispatcher Type이라는 정보를 추가 제공한다
Dispatcher Type이라고 다음과 같이 제공을 한다
REQUEST : 클라이언트 요청ERROR : 오류 요청FORWARD : MVC에서 배웠던 서블릿에서 다른 서블릿이나 JSP를 호출할 때INCLUDE : 서블릿에서 다른 서블릿이나 JSP의 결과를 포함할 때ASYNC : 서블릿 비동기 호출어떻게 작동하는지 보기 위해서, 저번시간에 사용했던 LogFilter파일을 그대로 가져온 후에,,,
@Configuration,@Bean을 이용해 설정정보를 저장하고FilterRegistrationBean<Filter>에다가LogFilter을 등록한다setDispatcherTypes을 이용해DispatcherType.REQUEST,
DispatcherType.ERROR을 넣어서- Error와 Request 두경우만 사용하는 필터를 만든다!!!

[REQUEST]로 클라이언트가 요청을 하였고[ERROR]로 뜨는 것을 볼 수 있다
- 그런데,
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST,DispatcherType.ERROR);이 기본 타입이기 때문에- 굳이, 오류 페이지 경로를 필터로 적용할 것이 아니라면, 기본값을 그대로 사용하면 된다.
필터와 마찬가지로, 인터셉터 또한 오류로 인한 요청에 대해서, 중복 호출을 제거해보자
마찬가지로 저번시간에 했었던 LogInterceptor 파일을 가져온다
앞서 필터의 경우에는 필터를 등록할 때 어떤 DispatcherType 인 경우에 필터를 적용할 지 선택할 수 있었다
그런데 인터셉터는 서블릿에서 제공하는게 아니라 스프링에서 제공하는 기능이다
DispatcherType이 없다...
따라서, WAS가 오류페이지를 제공하기 위해 이동하는 컨트롤러 url을 excludePathPatterns통해서 제거해주면 된다
여기서는 /error-page/**이므로
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**","*.ico","/error","/error-page/**");
@Configuration에 담아주면 된다
지금까지 오류가 나면 서블릿에서 어떻게 처리되는지 알아보았다, 이제부터 Spring에서 어떻게 편리하게 이용할 수 있는지 알아보자
WebServerCustomizer을 이용해 예외처리 페이지를 만들었고ErrorPage를 추가하고, 각각의 예외 종류 마다, 예외 처리용 컨트롤러 ErrorPageController를 만들었다Errorpage를 자동으로 등록해준다!!!BasicErrorController 라는 스프링 컨트롤러를 자동으로 등록한다ErrorPage에서 등록한 /error를 매핑해서 처리하는 컨트롤러이다이제 오류가 발생했을 때 오류 페이지로
/error를 기본 요청한다. 스프링 부트가 자동 등록한BasicErrorController는 이 경로를 기본으로 받는다
BasicErrorController 는 기본적인 로직이 모두 개발되어 있다.BasicErrorController 가 제공하는 룰과 우선순위에 따라서 등록하면 된다.


BasicErrorController 컨트롤러는 다음 정보를 model에 담아서 뷰에 전달한다. 

thymeleaf를 이용해 화면에서, 출력할 수 있다application.properties

on_param 으로 설정하고 다음과 같이 HTTP 요청시 파라미터를 전달하면 해당 정보들이 model 에 담겨서 뷰 템플릿에서 출력된다. message=&errors=&trace=실무에서는 이것들을 노출하면 안된다! 사용자에게는 이쁜 오류 화면과 고객이 이해할 수 있는 간단한 오류 메시지를 보여주고 오류는 서버에 로그로 남겨서 로그로 확인해야 한다.
스프링 부트 오류 관련 옵션
ErrorController 인터페이스를 상속 받아서 구현하거나BasicErrorController 상속 받아서 기능을 추가하면 공통 처리 컨트롤러의 기능을 변경할 수 있다