본문 바로가기
Spring|Spring-boot

Spring-boot Error Page

by oncerun 2022. 1. 13.
반응형

 

기존 서블릿의 예외 처리를 보면 정말 복잡하게 예외처리를 진행했다.

 

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

댓글