SpringBoot Application 구동 후 별다른 작업없이 페이지에 접속해보면
아래와 같은 화이트레벨 에러페이지를 볼 수있다.
Spring Boot는 오류가 발생하면 server.error.path 에 설정된 경로에서 요청을 처리하게 한다.
Spring Boot에서는 기본적으로 BasicErrorController가 등록이 되어 해당 요청을 처리하게 된다.
(HTML로 응답을 주는 경우 errorHtml에서 응답을 처리, JSON은 ErrorAttributes에서 가져온 모델로 응답을 생성)
페이지 문구에 '/error' 에 매핑된게 없다고 하니 직접 만들어주자.
ErrorController의 구현체를 개발자가 bean으로 등록한다면
Spring Boot는 해당 빈을 먼저 찾아 BasicErrorController 대신 오류 처리를 위해 사용한다.
@Controller
public class CustomErrorController implements ErrorController {
@GetMapping("/error")
String errorTest(){
System.out.println("==== Error Controller");
return "error";
}
}
- 서블릿 컨테이너(ex: 톰캣)에서 등록된 서블릿에서 요청처리
- 오류발생
- 해당 서블릿에서 처리하지 못하고
- 서블릿 컨테이너까지 오류가 전파되었을 때, 서블릿 컨테이너가 오류를 처리하기 위해 특정 경로(server.error.path)로 해당 요청처리를 위임할 때 사용
Spring-mvc Exception 기반으로 Servlet Container 를 구현하는 경우 주로 쓰인다.
SpringFramework 5에 추가된 spring-webflux에서는
발생한 Exception을 기반으로 오류를 처리할 수 있도록 @ExceptionHandler를 제공한다.
https://ssmyefrin.tistory.com/22
✔ ErrorController 와 ControllerAdvice
이 두가지 에러의 가장 큰 차이는 실행될수 있는 위치가 다르다는 것이다.
때문에 Exception이 발생했을 때 처리하는 방법도 달라진다.
Spring MVC 구조에서 Filter와 Interceptor는 실행되는 위치가 다르다.
Interceptor는 DispatcherServlet 내부에서 발생하기 때문에 ControllerAdvice를 적용할 수 있다.
하지만 Filter는 DispatcherServlet 외부에서 발생해서 ErrorController에서 처리해야 한다.
나는 여태 단순히
RestController 구현시 공통 Exception 처리할 땐 ControllerAdvice,
Servlet 컨테이너 구현시(Thymeleaf) 특정 컨트롤러에 대한 처리시 ErrorController 라 생각했는데... 실행될 수 있는 위치가 다른건 전혀 몰랐다.
다음엔 참고하여 개발해야겠다.
참고 : https://goddaehee.tistory.com/214
https://supawer0728.github.io/2019/04/04/spring-error-handling/
'web > SpringBoot' 카테고리의 다른 글
HTTPS(SSL) 적용 (0) | 2023.09.11 |
---|---|
Maven VS Gradle (0) | 2023.09.07 |
Global Exception 처리 (0) | 2023.09.06 |
DataJpaTest 중 삽질해결 기록.... (0) | 2023.08.31 |
Spring Boot 3.1.x 으로 RestFul API 서버 만들기(3) (0) | 2023.08.31 |