기존 서블릿의 예외 처리를 보면 정말 복잡하게 예외처리를 진행했다.
WebServerCustomizer를 만들고, 예외 종류에 따라서 ErrorPage를 설정하고 해당 예외를 받을 수 있는 Controller를 만들고 Filter 중에 제외해야 할 필터를 선별하여 DispatcherType을 지정해주고 Interceptor에 excludePathPatterns를 추가하여 Spring에 등록하는 과정을 거쳤다.
@Component
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory 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);
}
}
스프링 부트는 이러한 설정을 모두 기본으로 제공한다.
1. ErrorPage를 자동으로 등록한다. 이때 /error 라는 경로로 기본 오류 페이지를 설정한다.
2. BasicErrorController라는 스프링 컨트롤러를 자동으로 등록하여 ErrorPage에서 등록한 /error를 매핑해서 처리하는 컨트롤러다.
* ErrorMvcAutoConfiguration이라는 클래스가 오류 페이지를 자동으로 등록하는 역할을 한다.
따라서 개발자는 오류 페이지만 등록하면 된다. 정적 리소스는 static, 동적 리소스는 templates 오류 파일만 만들면 된다.
뷰 선택 우선순위
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 상태 코드 이름의 뷰 파일을 넣어두면 된다.
뷰 템플릿이 정적 리소스보다 우선순위가 높고, 404, 500처럼 구체적인 것이 5xx처럼 덜 구체적인 것보다
우선순위가 높다. 5xx, 4xx라고 하면 500대, 400대 오류를 처리해준다.
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`)
하지만 스프링은 오류 정보를 false로 처리하고 사용할 정보만 true로 별도로 설정해주어야 한다.
application.properties에 다음 정보를 추가하면 해당 정보를 Model에 담아서 전달해 준다.
server.error.include-exception=true
server.error.include-message=always
server.error.include-stacktrace=always
server.error.include-binding-errors=always
'Spring|Spring-boot' 카테고리의 다른 글
파일 업로드 및 다운로드 (0) | 2022.01.26 |
---|---|
Spring-boot ExceptionResolver (0) | 2022.01.15 |
Spring Formatter (0) | 2022.01.10 |
Spring Converter (0) | 2022.01.10 |
Spring MessageCodesResolver (0) | 2022.01.08 |
댓글