이전 시간에 알아본 서블릿의 오류 페이지 설정을 스프링 부트에서는 기본으로 제공한다.
ErrorPage
를 자동으로 등록하는 이때 경로는 /error
이다. 즉 서블릿 밖으로 예외가 발생하거나 response.sendError()
의 기록이 남아있다면 /error
에서 이 오류를 처리할 수 있는지 확인한다.
어떻게?
BasicErrorController
라는 스프링 컨트롤러를 자동으로 등록하는데 이 컨트롤러가 /error
를 매핑해서 처리한다.
참고로 ErrorMvcAutoConfiguration
이라는 클ㄹ래스가 오류 페이지를 자동으로 등록하는 역할을 한다.
기본적으로 뷰 템플릿의 error
패키지를 찾아보고 없다면 static의 error
패키지를 찾아본다.
그리고 html의 이름은 오류 응답 코드로 작성하면 된다.
예를 들어, 404 오류 응답코드에 대한 오류 페이지를 찾는다면 다음과 같은 순서로 찾게된다.
resources/templates/error/404.html
resousrces/templates/error/4xx.html
resources/static/error/404.html
resources/static/error/4xx.html
resources/templates/error.html
역시 예를 들어 보니까 이해가 빨리 간다. 기본적으로 뷰 템플릿의 에러 패키지의 404.html
을 찾아보고 없다면 400번대의 오류 페이지를 공통으로 처리하는 4xx.html
을 찾는다.
템플릿에 없다면 정적 리소스에서 찾아본다.
그래도 없다면 default값으로 볼 수 있는 템플릿 안의 error.html
파일을 찾는다.
BasicErrorController
는 모델에 오류에 대한 기본정보를 담아 뷰에 전달한다. 확인해보자.
/hello
)이제 오류 페이지에 기본 정보를 넣고 싶다면 이전에 배운 thymeleaf 기술을 통해 나타낼 수 있다.
예를 들면
<ul>
<li>오류 정보</li>
<ul>
<li th:text="|timestamp: ${timestamp}|"></li>
<li th:text="|status: ${status}|"></li>
<li th:text="|error: ${error}|"></li>
<li th:text="|exception: ${exception}|"></li>
</ul>
</ul>
하지만 이를 사용할 이유는 없다. 고객에게 혼동만 줄 뿐 아무런 도움이 안된다. 더군다나 이는 보안상 위험을 초래할 뿐이다.
BasicErrorController
에서 다음과 같은 오류 정보를 model
에 포함 여부를 설정할 수 있다.
application.properties에서
server.error.include-exception=true
server.error.include-message=on_param
server.error.include-stacktrace=on_param
server.error.include-binding-errors=on_param
옵션은 never
, always
, on_param
3가지가 있다. 이름에서 알 수 있는 옵션들이니 넘어가겠다.
참고로 개발단계에서는 여러 옵션들을 사용해보는 것은 괜찮지만 운영단계에서는 권장하지 않는다고 한다.
사용자에게는 예쁜 오류 페이지를 보여주고 고객이 이해할 수 있는 오류 내용을 보여주고 나머지는 서버에 로그로 남겨서 확인하는 것을 권장한다.
저번 시간에 알아본 서블릿 오류 처리를 스프링 부트가 모두 자동화해준 것을 확인할 수 있었다. ErrorController
인터페이스를 상속받아 구현하거나 BasicErrorController
를 상속받아 추가적인 기능을 제작할 수도 있다. 하지만 일반적인 예외에 대한 대부분의 기능들이 추가돼있는 것을 직접 확인해봤고 아마 오류 페이지에 대한 템플릿만 작성할 일이 비교적 많아보인다.