강의 정보 : 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링이 없는 순수 서블릿에서는 예외 처리를 위해 다음과 같은 복잡한 과정을 거친다.
WebServerCustomizer생성 후- 예외 종류에 따라서
ErrorPage를 추가 및 예외 처리용 컨트롤러ErrorPageController생성
스프링 부트는 이런 과정을 모두 기본으로 제공한다.
ErrorPage 를 자동으로 등록 및 /error 라는 경로로 기본 오류 페이지를 설정new ErrorPage("/error") , 상태코드와 예외를 설정하지 않으면 기본 오류 페이지로 사용response.sendError(...) 가 호출되면 모든 오류는 /error 를 호출BasicErrorController 라는 스프링 컨트롤러를 자동으로 등록ErrorPage 에서 등록한 /error 를 매핑해서 처리하는 컨트롤러
BasicErrorController의 처리 순서
1. 뷰 템플릿
2. 정적 리소스
3. 적용 대상이 없을 때 뷰 이름
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`)
류 관련 내부 정보들을 고객에게 노출하는 것은 좋지 않다. 고객이 해당 정보를 읽어도 혼란만 더해지고, 보안상 문제가 될 수도 있다.
그래서 BasicErrorController 오류 컨트롤러에서 다음 오류 정보를 model 에 포함할지 여부 선택할 수 있다.
application.properties
server.error.include-exception=true // exception 포함 여부
server.error.include-message=on_param // message 포함 여부
server.error.include-stacktrace=on_param // trace 포함 여부
server.error.include-binding-errors=on_param // errors 포함 여부
기본값이 never인 부분은 다음 3가지 옵션을 사용할 수 있다. (실무에서는 이것들을 노출하면 안 된다.)
never : 사용하지 않음always : 항상 사용on_param : 파라미터가 있을 때 사용확장 포인트
에러 공통 처리 컨트롤러의 기능을 변경하고 싶으면 ErrorController 인터페이스를 상속 받아서 구현하거나 BasicErrorController 상속 받아서 기능을 추가하면 된다.