Spring Error page

강정우·2024년 1월 2일
0

Spring-boot

목록 보기
47/73

스프링 부트 에러 페이지

앞서 exception에 관하여 filter와 interceptor에 대해 알아보았는데 이게 또 귀찮은게

  1. WebServerCustomizer 를 만들고
  2. 예외 종류에 따라서 ErrorPage 를 추가하고
  3. 예외 처리용 컨트롤러 ErrorPageController 를 만들어야한다.

그래서 이 과정을 없애기위해 스프링 부트는 이 과정으로 모두 제공한다.
즉, webserverfactorycustomizer를 대신하는 간편한 방법이다.

BasicErrorController

  1. 스프링 부트는 ErrorPage 를 자동으로 등록한다. 이때 /error 라는 경로로 기본 오류 페이지를 설정한다.
    new ErrorPage("/error"): 상태코드와 예외를 설정하지 않으면 기본 오류 페이지로 사용된다.
  2. 서블릿 밖으로 예외가 발생하거나, response.sendError(...) 가 호출되면 모든 오류는 /error 를 호출하게 된다.
  3. BasicErrorController 라는 스프링 컨트롤러를 자동으로 등록한다.
    ErrorPage 에서 등록한 /error 를 매핑해서 처리하는 컨트롤러다.

참고로 ErrorMvcAutoConfiguration 이라는 클래스가 오류 페이지를 자동으로 등록하는 역할을 한다.

  • cmd + opt + O로 BasicErrorController를 검색해보면 기본적으로 컨트롤러들이 만들어져 있다.
    그래서 보면 오류가 발생했을 때 오류 페이지로 /error 를 기본 요청한다. 스프링 부트가 자동 등록한 BasicErrorController 는 이 경로를 기본으로 받는다.

따라서 개발자는 오류 페이지 화면만 BasicErrorController 가 제공하는 룰과 우선순위에 따라서 등록하면 된다.
예를들어 정적HTML이면 정적 리소스, 뷰 템플릿을 사용해서 동적으로 오류 화면을 만들고 싶으면 뷰 템플릿 경로에 오류 페이지 파일을 만들어서 넣어두기만 하면 된다.

뷰 선택 우선순위

BasicErrorController 의 처리 순서

  1. 뷰 템플릿
    resources/templates/error/500.html
    resources/templates/error/5xx.html

  2. 정적 리소스( static , public )
    resources/static/error/400.html
    resources/static/error/404.html
    resources/static/error/4xx.html

  3. 적용 대상이 없을 때 뷰 이름( error )
    resources/templates/error.html

  • 언제나 우선순위는 더 자세한 것이 우선이다. ( 500>5xx )

오류 컨트롤러 정보

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>

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

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 상속 받아서 기능을 추가하면 된다.

profile
智(지)! 德(덕)! 體(체)!

0개의 댓글