스프링 부트는 앞서 서블릿 오류페이지 처리의 과정들을 기본으로 제공한다. 그로 인해 스프링 부트에서 복잡한 처리를 진행해주어서 개발자는 오류페이지만 등록해주면 된다.
스프링 부트 예외 페이지 처리
- ErrorPage를 자동으로 등록한다. => ' /error ' 경로로 기본 오류페이지를 설정한다.
- new ErrorPage("/error")
- 서블릿 밖으로 예외가 발생하거나, response.sendError(...) 가 호출되면 모든 오류는 /error 를 호출하게 된다.
- BasicErrorController를 자동으로 등록 : ErrorPage에서 등록한 /error 를 매핑해서 처리하는 컨트롤러
이러한 처리로 개발자는 오류 페이지 화면만 규칙에 맞게 작성하여 등록하면 된다.
BasicErrorController의 View 선택 처리 순서
다음 아래와 같은 해당 경로 위치에 HTTP 상태코드 이름의 뷰 파일(400.html, 5xx.html, ...)을 넣어두면 된다.
[우선 순위]
- 동적 리소스 (뷰템플릿) -> 정적 리소스 -> 뷰 이름
- 구체적인 것(400.html) -> 범용적인 것(4xx.html)
1. 뷰 템플릿 (동적 리소스)
1) resources/templates/error/500.html
2) resources/templates/error/5xx.html
- 500 처럼 구체적인 파일명이 우선순위가 높다.
- 5xx와 같이 상태코드를 지정해놓으면 500, 501, 502...에 해당하는 상태코드 오류 시, 해당 오류 페이지가 호출된다.
2. 정적 리소스 (static, public)
1) resources/static/error/400.html
1) resources/static/error/404.html
2) resources/static/error/4xx.html
3. 적용 대상이 없을 때 뷰 이름(error)
resources/templates/error.html
BasicErrorController가 제공하는 기본 정보
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`)
- but, 위와 같은 내부 오류 정보들을 클라이언트에 노출하는 것은 좋지 않다. => 해커에게 노출되면 위험!!
- 따라서, 위 정보들 중 오류메시지 정도만 화면에 출력하고 나머지는 서버 내부에서 로그로 확인하는 것이 좋다.
스프링 부트 오류 관련 옵션
- server.error.whitelabel.enabled=true(false) : 오류 처리 화면을 못 찾을 시, 스프링 whitelabel 오류 페이지 적용
- server.error.path=/error : 오류 페이지 경로, 스프링이 자동 등록하는 서블릿 글로벌 오류 페이지 경로와 BasicErrorController 오류 컨트롤러 경로에 함께 사용된다.
- server.error.include-*=never(권장) : *에 오류 정보들을 넣으면 해당 정보를 볼 수 있다.
- never : 사용하지 않음
- always : 항상 사용
- on_param : 파라미터가 있을 때 사용
'Spring > SpringMVC' 카테고리의 다른 글
HandlerExceptionResolver (0) | 2024.03.15 |
---|---|
API 예외 처리 (1) | 2024.02.27 |
서블릿 예외처리 (0) | 2024.02.15 |
필터, 인터셉터 (0) | 2024.02.11 |
쿠키, 세션을 활용한 로그인, 로그아웃 (0) | 2024.02.04 |