[Spring MVC] 스프링 부트 - 오류 페이지
전 과정에서 예외 처리 페이지를 만들기 위해 복잡한 과정을 거쳤다.
WebServerCustomizer
를 만들었다.- 예외 종류에 따라서
ErrorPage
를 추가 - 예외 처리용 컨트롤러
ErrorPageController
를 만들었다.
오류 페이지1
스프링 부트는 이런 과정을 기본으로 제공한다.
ErrorPage
를 자동으로 등록한다. 이때/error
라는 경로로 기본 오류 페이지를 설정.new ErrorPage("/error")
, 상태코드와 예외를 설정하지 않으면 기본 오류 페이지로 사용.- 서블릿 밖으로 예외가 발생하거나,
response.sendError()
가 호출되면 모든 오류는/error
를 호출하게 된다.
BasicErrorController
라는 스프링 컨트롤러를 자동으로 등록한다.ErrorPage
에서 등록한/error
를 매핑해서 처리하는 컨트롤러.
[참고]
ErrorMvcAutoConfiguration
이라는 클래스가 오류 페이지를 자동으로 등록하는 역할을 한다.
오류 페이지만 등록
BasicErrorController
는 기본적인 로직이 모두 개발되어 있기 때문에, 개발자는 오류 페이지 화면만 BasicErrorController
가 제공하는 룰과 우선순위에 따라서 등록하면 된다.
뷰 선택 우선순위
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
테스트
- http://localhost:8080/error-404
404.html
- http://localhost:8080/error-400
4xx.html
(400 오류 페이지가 없지만 4xx가 있음) - http://localhost:8080/error-500
500.html
- http://localhost:8080/error-ex
500.html
(예외는 500으로 처리)
오류 페이지2
BasicErrorController가 제공하는 기본 정보들
BasicErrorController
는 다음 정보를 model에 담아서 뷰에 전달한다.
* timestamp: Fri Feb 05 00:00:00 KST 2021
* status: 400
* error: Bad Request
* exception: org.springframework.validation.BindException
* trace: 예외 trace
* message: Validation failed for object='data'. Error count: 1
* errors: Errors(BindingResult)
* path: 클라이언트 요청 경로 (`/hello`)
오류 관련 내부 정보를 클라이언트에게 노출하는 것은 좋지 않다.
그래서 BasicErrorController
오류 컨트롤러에서 다음 오류 정보를 model
에 포함할지 여부를 선택할 수 있다.
application.properties
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
포함 여부
기본 값이 never
인 부분은 3가지 옵션을 사용할 수 있다.
never
, always
, on_param
never
: 사용하지 않음always
: 항상 사용on_param
: 파라미터가 있을 때 사용
on_param
은 파라미터가 있으면 해당 정보를 노출하여 디버그 시 문제를 확인하기 위해 사용할 수 있다. 하지만 이 부분도 개발 서버에서 사용할 수 있지만, 운영 서버에서는 권장하지 않는다.
on_param
으로 설정하고 다음과 같이 HTTP 요청시 파라미터를 전달하면 해당 정보들이 model
에 담겨서 뷰 템플릿에서 출력된다.
http://localhost:8080/error-ex?message=&errors=&trace=
스프링 부트 오류 관련 옵션
server.error.whitelabel.enabled=true
: 오류 처리 화면을 못 찾을 시, 스프링 whitelabel 오류 페이지 적용server.error.path=/error
: 오류 페이지 경로, 스프링이 자동 등록하는 서블릿 글로벌 오류 페이지 경로와BasicErrorController
오류 컨트롤러 경로에 함께 사용된다.
확장 포인트
에러 공통 처리 컨트롤러의 기능을 변경하고 싶다면 ErrorController
인터페이스를 상속 받아서 구현하거나 BasicErrorController
를 상속 받아서 기능을 추가하면 된다.
<출처 : 인프런 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술(김영한)>
댓글남기기