앞서 exception에 관하여 filter와 interceptor에 대해 알아보았는데 이게 또 귀찮은게
그래서 이 과정을 없애기위해 스프링 부트는 이 과정으로 모두 제공한다.
즉, webserverfactorycustomizer를 대신하는 간편한 방법이다.
ErrorPage
를 자동으로 등록한다. 이때 /error
라는 경로로 기본 오류 페이지를 설정한다.new ErrorPage("/error")
: 상태코드와 예외를 설정하지 않으면 기본 오류 페이지로 사용된다.response.sendError(...)
가 호출되면 모든 오류는 /error
를 호출하게 된다.BasicErrorController
라는 스프링 컨트롤러를 자동으로 등록한다.ErrorPage
에서 등록한 /error
를 매핑해서 처리하는 컨트롤러다.참고로 ErrorMvcAutoConfiguration
이라는 클래스가 오류 페이지를 자동으로 등록하는 역할을 한다.
cmd + opt + O
로 BasicErrorController를 검색해보면 기본적으로 컨트롤러들이 만들어져 있다./error
를 기본 요청한다. 스프링 부트가 자동 등록한 BasicErrorController
는 이 경로를 기본으로 받는다.따라서 개발자는 오류 페이지 화면만 BasicErrorController
가 제공하는 룰과 우선순위에 따라서 등록하면 된다.
예를들어 정적HTML이면 정적 리소스, 뷰 템플릿을 사용해서 동적으로 오류 화면을 만들고 싶으면 뷰 템플릿 경로에 오류 페이지 파일을 만들어서 넣어두기만 하면 된다.
BasicErrorController 의 처리 순서
뷰 템플릿
resources/templates/error/500.html
resources/templates/error/5xx.html
정적 리소스( static , public )
resources/static/error/400.html
resources/static/error/404.html
resources/static/error/4xx.html
적용 대상이 없을 때 뷰 이름( error )
resources/templates/error.html
BasicErrorController 컨트롤러는 다음 정보를 model에 담아서 뷰에 전달한다. 뷰 템플릿은 이 값을 활용해서 출력할 수 있다.
<li th:text="|timestamp: ${timestamp}|"></li>
<li th:text="|path: ${path}|"></li>
<li th:text="|status: ${status}|"></li>
<li th:text="|message: ${message}|"></li>
<li th:text="|error: ${error}|"></li>
<li th:text="|exception: ${exception}|"></li>
<li th:text="|errors: ${errors}|"></li>
<li th:text="|trace: ${trace}|"></li>
server.error.include-exception=true
server.error.include-message=on_param
server.error.include-stacktrace=on_param
server.error.include-binding-errors=on_param
server.error.include-exception=false : exception 포함 여부( true , false )
server.error.include-message=never : message 포함 여부
server.error.include-stacktrace=never : trace 포함 여부
server.error.include-binding-errors=never : errors 포함 여부
on_param
이라고 명시해두면 req url에 파라미터로 해당 값이 있을 때만 정보를 띄워준다.http://localhost:8080/error-ex?message=&errors=&trace
server.error.whitelabel.enabled=true
: 오류 처리 화면을 못 찾을 시, 스프링 whitelabel 오류 페이지 적용
server.error.path=/error
: 오류 페이지 경로, 스프링이 자동 등록하는 서블릿 글로벌 오류 페이지 경로 와 BasicErrorController 오류 컨트롤러 경로에 함께 사용된다.
에러 공통 처리 컨트롤러의 기능을 변경하고 싶으면 ErrorController 인터페이스를 상속 받아서 구현하거나 BasicErrorController 상속 받아서 기능을 추가하면 된다.