(1) 스프링 부트 오류 페이지

CJY·2023년 4월 12일
0

스프링

목록 보기
14/14

스프링 부트

이전 시간에 알아본 서블릿의 오류 페이지 설정을 스프링 부트에서는 기본으로 제공한다.

ErrorPage를 자동으로 등록하는 이때 경로는 /error이다. 즉 서블릿 밖으로 예외가 발생하거나 response.sendError()의 기록이 남아있다면 /error에서 이 오류를 처리할 수 있는지 확인한다.

어떻게?

BasicErrorController라는 스프링 컨트롤러를 자동으로 등록하는데 이 컨트롤러가 /error를 매핑해서 처리한다.

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

BasicErrorController의 처리 순서

  1. 뷰 템플릿
  2. 정적 리소스

기본적으로 뷰 템플릿의 error패키지를 찾아보고 없다면 static의 error패키지를 찾아본다.

그리고 html의 이름은 오류 응답 코드로 작성하면 된다.

예를 들어, 404 오류 응답코드에 대한 오류 페이지를 찾는다면 다음과 같은 순서로 찾게된다.

  1. resources/templates/error/404.html
    resousrces/templates/error/4xx.html

  2. resources/static/error/404.html
    resources/static/error/4xx.html

  3. resources/templates/error.html

역시 예를 들어 보니까 이해가 빨리 간다. 기본적으로 뷰 템플릿의 에러 패키지의 404.html을 찾아보고 없다면 400번대의 오류 페이지를 공통으로 처리하는 4xx.html을 찾는다.

템플릿에 없다면 정적 리소스에서 찾아본다.

그래도 없다면 default값으로 볼 수 있는 템플릿 안의 error.html파일을 찾는다.

BasicErrorController가 제공하는 기본 정보

BasicErrorController는 모델에 오류에 대한 기본정보를 담아 뷰에 전달한다. 확인해보자.

  • 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)

이제 오류 페이지에 기본 정보를 넣고 싶다면 이전에 배운 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를 상속받아 추가적인 기능을 제작할 수도 있다. 하지만 일반적인 예외에 대한 대부분의 기능들이 추가돼있는 것을 직접 확인해봤고 아마 오류 페이지에 대한 템플릿만 작성할 일이 비교적 많아보인다.

profile
열심히 성장 중인 백엔드

0개의 댓글