springboot - exception 처리방법

김성지·2022년 5월 11일
0

스프링기초

목록 보기
6/13

많음

그래서 3가지만 알아둘거다

spring boot의 예외 처리 방법

DispatcherServlet 보기!

public class DispatcherServlet {
  protected void doDispatch(...) throws Exception {
    // ...
    try {
      ModelAndView mv = null;
      Exception dispatchException = null;

      try {
          // Controller 로직 실행 (핸들러를 찾고, 해당 로직을 실행)
      } catch (Exception ex) {
        dispatchException = ex;
      }
      // Dispatch 결과 처리 (예외 처리도 여기서 진행)
      processDispatchResult(...,dispatchException);
    } catch {...}
    // ...
  }
}

HandlerExceptionResolver.resolveExceptionHandler()에서 어떤 ExceptionResolver를 택하는지 결정한다.다음의 3가지의 ExceptionResolver가 존재함

  • ExceptionHandlerExceptionResolver
  • ResponseStatusExceptinoResolver
  • DefaultHandlerExceptinoResolver

1번과 2번 각각 ExceptionHandler 로 정의한경우
ResponseStatus로 정의한 경우 ResponseStatusExceptionResovler로 처리한다.

Controller에 @ExceptionHandler 정의

Controller에 정의된 ExceptionHandler는 그 Exception이 발생할 때야 객체로 생성이 된다. 2번째부터는 exceptionHandlerCache에 저장된 HandlerMethodResovler를 바로 사용한다.

ControllerAdvice에 @ExceptionHandler 정의

ExceptionHandlerExceptionResolver 내부의 exceptionHandlerCache에서 관리된다.
initExceptionHandlerAdviceCache메소드를 통해서 ExceptionHandlerExceptionResolver 가 초기에 생성한 시점에 캐시에 ControllerAdvice에 정의된 ExceptionHandler에 해당하는 HandlerMethodResovler가 등록된다.
getExceptionHandlerMethod에서 확인하면 Controller에서 정의한 ExceptionHandler를 먼저 조회하기 때문에 1번에 비해 우선순위에서 밀린다.

Exception에 @ResponseStatus 어노테이션 추가

ResponseStatusExceptionResolver에서 예외 처리한다.
HandlerExceptionResovlerComposite.resolveException()에서
resovler를 순회할 때,ExceptionHandlerExceptionResovler를 먼저 순회하기 때문에 1,2번의 예외 처리보다 우선순위에서 밀린다.

ResponseEntity

public class HttpEntity<T> {

	private final HttpHeaders headers;

	@Nullable
	private final T body;
}

라는게 존재하는데
이를 상속받아 구현한 클래스가 RequestEntity 와 ResponseEntity 이다.

즉 HttpHeader와 body + status 를 가질 수 있다.

CheckedException 과 UncheckedException

나중에 적기...

0개의 댓글