Back-End/Spring

[Spring MVC2][예외 처리와 오류 페이지] - 스프링이 지원하는 오류 페이지 처리 방식

얄루몬 2022. 5. 30. 14:19

 

💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.

https://inf.run/vQHp

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com


목차
1. 스프링 부트 - 오류페이지 1
2. 스프링 부트 - 오류페이지 2

스프링 부트 - 오류페이지 1

예외처리를 위해서 앞서서는 다음과 같은 복잡한 과정을 거쳤다.

  • 서블릿이 제공하는 예외 발생 시 해당 페이지를 제공해주는 클래스를 생성해야 했다.
  • 예외 종류에 따라서 ErrorPage를 추가 해줬어야 했다. (뷰페이지 생성을 의미한다. html 등..)
  • 예외 처리용 컨트롤러를 만들어야 했다.

스프링 부트를 사용한 방식

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

개발자는 오류 페이지만 등록

BasicErrorController는 기본적인 로직이 모두 개발되어 있기 때문에 개발자는 오류 페이지 화면만 BasicErrorController가 제공하는 우선순위와 룰에 따라서 등록해주면 된다.

뷰 선택 우선순위

  1. 뷰 템플릿(templates에 들어 있는 html)
  2. 정적 리소스(static에 들어 있는 html)
  3. 적용 대상이 없을 때 뷰 이름(error.html)

또한 뷰 선택 우선순위 역시 404, 500처럼 구체적인 것이 5xx처럼 덜 구체적인 것보다 우선순위가 높다.

스프링 부트 - 오류페이지 2

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`)
  • BasicErrorController는 위와 같은 정보를 model에 담아 뷰에 전달한다.
  • 뷰 템플릿은 이 값을 활용해 출력이 가능하다.
  • 그러나 오류 관련 내부 정보를 노출하는 것은 해킹에 취약하게 하고 고객에게도 별 도움이 되지 않는다. 그래서 컨트롤러에서 다음 오류 정보를 model에 포함할지 여부를 선택할 수 있게 한다.

오류 정보 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 : 파라미터가 있을 때 사용(해당 정보를 노출하는 개념으로 디버그 시 문제 확인에 사용할 수 있다 개발 서버에서는 사용할 수 있지만, 운영 서버에서는 권장하지 않는다.)