Spring web exception hierarchy

spring 6.0 이후 기준

스프링 web 예외는 크게 2가지의 최상위 예외 클래스를 구현함

core 모듈 예외

web 모듈 예외

ErrorResponse

spring web에서 HTTP error 응답을 나타내는 인터페이스

status, headers, ProblemDetail 객체를 필드로 가짐

ProblemDetail 필드

RFC 7807의 Problem Detail

RFC 7807은 Problem Detail을 정의하는 문서임(권장 사항 문서)

Problem Detail은 API 클라이언트에게 HTTP API에서 발생하는 문제 발생 상황을 표현하는 방법임(common error format)

JSON으로 직렬화할 때 application/problem+json 미디어 타입을 사용함

HTTP/1.1 403 Forbidden
Content-Type: application/problem+json
Content-Language: en

{
"type": "https://example.com/probs/out-of-credit",
"title": "You do not have enough credit.",
"detail": "Your current balance is 30, but that costs 50.",
"instance": "/account/12345/msgs/abc",
"balance": 30,
"accounts": ["/account/12345",
             "/account/67890"]
}

type

title

detail

status

instance

balance, accounts : 추가 정보

ErrorResponseException

최상위 예외 클래스로 ErrorResponse를 구현함

spring web의 모든 예외는 ErrorResponseException을 상속받음

Exception resolution process

public class DispatcherServlet extends FrameworkServlet {

    @Nullable
    private List<HandlerExceptionResolver> handlerExceptionResolvers;
}
  1. handler 예외 발생
  2. DispatcherServlet -> handlerExceptionResolvers 순회하며 예외 처리 시도
  3. 해당 resolver가 null을 반환하면 다음 resolver에게 예외 처리 위임
    1. resolver가 예외 처리를 하면 해당 resolver가 반환한 ModelAndView를 반환 -> 다음 resolver는 실행되지 않음
    2. 모든 resolver가 예외 처리 실패하면 servlet container에게 예외를 던짐

Spring web exception resolver

HandlerExceptionResolver

handler 예외를 처리하는 최상위 인터페이스

예외 발생 시점

public interface HandlerExceptionResolver {
    ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}

handler : 실행된 handler 또는 null(핸들러 매핑이 실패한 경우)

ModelAndView

DefaultHandlerExceptionResolver

HandlerExceptionResolver의 기본 구현체

표준 spring mvc 예외들을 해결하고 그에 맞는 http status code로 변환함

지원하는 표준 spring mvc 예외들

SimpleMappingExceptionResolver

예외 클래스와 뷰 이름을 매핑하는 구현체

ExceptionHandlerExceptionResolver

@ExceptionHandler

@ControllerAdvice, @RestControllerAdvice

ExceptionHandlerExceptionResolver

ResponseEntityExceptionHandler

HandlerExceptionResolver를 구현하지 않고 ResponseEntity를 반환하는 예외 처리 추상 클래스

기본적으로 표준 spring mvc 예외 처리를 지원함

ResponseEntityExceptionHandler의 구현체는 오버라이딩을 통해 표준 spring mvc 예외 처리 및 커스텀 예외 처리를 확장할 수 있음

핵심 메서드

BasicErrorController

spring boot에서 기본 제공하는 에러 처리 컨트롤러(/error 경로의 요청을 처리)

애플리케이션에서 처리되지 않은 예외가 발생했을 때 동작함