일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 인터페이스
- 의존관계
- ocp
- HttpServletResponse
- 오블완
- 스프링
- 코드트리
- 스프링컨테이너
- 테스트코드
- java
- 코딩테스트
- 다형성
- 추상클래스
- equals()
- @configuration
- http 메시지 컨버터
- objecterror
- 참조변수
- 서블릿
- 오버라이딩
- html form
- JSON
- 김영한
- 티스토리챌린지
- 싱글톤
- 프록시
- fielderror
- DI
- 코드트리조별과제
- 백준
- Today
- Total
minOS
스프링 부트 - 오류 페이지 본문
스프링 부트 - 오류 페이지1
지금까지 예외 처리 페이지를 만들기 위해서 다음과 같은 복잡한 과정을 거쳤다.
1)`WebServerCustomizer` 를 만들고 2)예외 종류에 따라서 `ErrorPage` 를 추가하고 3)예외 처리용 컨트롤러 `ErrorPageController` 를 만듬
스프링 부트는 이런 과정을 모두 기본으로 제공한다.
1) `ErrorPage` 를 자동으로 등록한다. 이때 `/error` 라는 경로로 기본 오류 페이지를 설정한다.
ㄴ`new ErrorPage("/error")` , 상태코드와 예외를 설정하지 않으면 기본 오류 페이지로 사용된다.
ㄴ서블릿 밖으로 예외가 발생하거나, `response.sendError(...)` 가 호출되면 모든 오류는 `/error` 를호출하게 된다.
2) 'BasicErrorController` 라는 스프링 컨트롤러를 자동으로 등록한다.
ㄴ`ErrorPage` 에서 등록한 `/error` 를 매핑해서 처리하는 컨트롤러다.
이제 오류가 발생했을 때 오류 페이지로 `/error` 를 기본 요청한다. 스프링 부트가 자동 등록한`BasicErrorController` 는 이 경로를 기본으로 받는다.
@Controller @RequestMapping("${server.error.path:${error.path:/error}}") public class BasicErrorController extends AbstractErrorController { private final ErrorProperties errorProperties; /** * Create a new {@link BasicErrorController} instance. * @param errorAttributes the error attributes * @param errorProperties configuration properties */ public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties) { this(errorAttributes, errorProperties, Collections.emptyList()); } /** * Create a new {@link BasicErrorController} instance. * @param errorAttributes the error attributes * @param errorProperties configuration properties * @param errorViewResolvers error view resolvers */ public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List<ErrorViewResolver> errorViewResolvers) { super(errorAttributes, errorViewResolvers); Assert.notNull(errorProperties, "ErrorProperties must not be null"); this.errorProperties = errorProperties; }
개발자는 오류 페이지만 등록
`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
해당 경로 위치에 HTTP 상태 코드 이름의 뷰 파일을 넣어두면 된다.
뷰 템플릿이 정적 리소스보다 우선순위가 높고, 404, 500처럼 구체적인 것이 5xx처럼 덜 구체적인 것 보다 우선순위 높다.
5xx, 4xx 라고 하면 500대, 400대 오류를 처리해준다.
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> </head> <body> <div class="container" style="max-width: 600px"> <div class="py-5 text-center"> <h2>500 오류 화면 스프링 부트 제공</h2> </div> <div> </div> <p>오류 화면 입니다.</p> <hr class="my-4"> </div> <!-- /container --> </body> </html> ``` `resources/templates/err
이렇게 등록만 하면
오류 페이지가 렌더링된다.
스프링 부트 - 오류 페이지2
BasicErrorController가 제공하는 기본 정보들
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> </head> <body> <div class="container" style="max-width: 600px"> <div class="py-5 text-center"> <h2>500 오류 화면 스프링 부트 제공</h2> </div> <div> </div> <p>오류 화면 입니다.</p> </div> <ul> <li>오류 정보</li> <ul> <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> </ul> </li> </ul> <!-- /container --> <hr class="my-4"> </body> </html>
오류 관련 내부 정보들을 고객에게 노출하는 것은 좋지 않다. 고객이 해당 정보를 읽어도 혼란만 더해지고, 보안상 문제가 될 수도 있다.
`BasicErrorController` 오류 컨트롤러에서 다음 오류 정보를 `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`
-`never` : 사용하지 않음
-`always` :항상 사용
- `on_param` : 파라미터가 있을 때 사용(`message=&errors=&trace=)
http://localhost:8080/error-ex?message=&errors=&trace=
실무에서는 이것들을 노출하면 안된다! 사용자에게는 이쁜 오류 화면과 고객이이해할 수 있는 간단한 오류 메시지를 보여주고 오류는 서버에 로그로 남겨서 로그로 확인해야 한다
'TIL > 김영한의 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
API 예외처리 - 스프링 부트 기본 오류 처리 (1) | 2024.10.03 |
---|---|
API 예외 처리 - 시작 (0) | 2024.10.02 |
서블릿 예외 처리 - 필터 ,인터셉터 (1) | 2024.10.01 |
서블릿 예외 처리 - 시작 ,오류 화면 제공 , 오류 페이지 작동 원리 (1) | 2024.10.01 |
로그인 처리2 - 스프링 인터셉터 소개 , 스프링 인터셉터 요청 로그 , 스프링 인터셉터 인증 체크 (2) | 2024.09.27 |