본문 바로가기
web/SpringBoot

ErrorContoller 오류처리

by 뽀리님 2023. 9. 6.

SpringBoot Application 구동 후 별다른 작업없이 페이지에 접속해보면

아래와 같은 화이트레벨 에러페이지를 볼 수있다.

 

HTML 응답

 

 

 

JSON 응답

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";
    }
}

 

출처 https://supawer0728.github.io/2019/04/04/spring-error-handling/

 

  1. 서블릿 컨테이너(ex: 톰캣)에서 등록된 서블릿에서 요청처리
  2. 오류발생
  3. 해당 서블릿에서 처리하지 못하고
  4. 서블릿 컨테이너까지 오류가 전파되었을 , 서블릿 컨테이너가 오류를 처리하기 위해 특정 경로(server.error.path) 해당 요청처리를 위임할  사용

Spring-mvc Exception 기반으로 Servlet Container 구현하는 경우 주로 쓰인다.

 

SpringFramework 5에 추가된 spring-webflux에서는 

발생한 Exception 기반으로 오류를 처리할 있도록 @ExceptionHandler 제공한다.

https://ssmyefrin.tistory.com/22

 

Global Exception 처리

개발 할 때 try-catch{ } 문으로 예외 처리를 하다보면 공통적으로 잡는 Exception 이 보인다. 난 중복된 코드를 싫어하기에 매번 Method 작성할 때마다 같은류의 try catch 가 보이는게 보기 싫었다. 그래

ssmyefrin.tistory.com

 

 

ErrorController 와 ControllerAdvice 

이 두가지 에러의 가장 큰 차이는 실행될수 있는 위치가 다르다는 것이다.

때문에 Exception이 발생했을 때 처리하는 방법도 달라진다.

 

 

출처 https://supawer0728.github.io/2019/04/04/spring-error-handling/

 

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/

https://xggames.tistory.com/33

'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