그래서 3가지만 알아둘거다
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가 존재함
1번과 2번 각각 ExceptionHandler 로 정의한경우
ResponseStatus로 정의한 경우 ResponseStatusExceptionResovler로 처리한다.
Controller에 정의된 ExceptionHandler는 그 Exception이 발생할 때야 객체로 생성이 된다. 2번째부터는 exceptionHandlerCache에 저장된 HandlerMethodResovler를 바로 사용한다.
ExceptionHandlerExceptionResolver 내부의 exceptionHandlerCache에서 관리된다.
initExceptionHandlerAdviceCache메소드를 통해서 ExceptionHandlerExceptionResolver 가 초기에 생성한 시점에 캐시에 ControllerAdvice에 정의된 ExceptionHandler에 해당하는 HandlerMethodResovler가 등록된다.
getExceptionHandlerMethod에서 확인하면 Controller에서 정의한 ExceptionHandler를 먼저 조회하기 때문에 1번에 비해 우선순위에서 밀린다.
ResponseStatusExceptionResolver에서 예외 처리한다.
HandlerExceptionResovlerComposite.resolveException()에서
resovler를 순회할 때,ExceptionHandlerExceptionResovler를 먼저 순회하기 때문에 1,2번의 예외 처리보다 우선순위에서 밀린다.
public class HttpEntity<T> {
private final HttpHeaders headers;
@Nullable
private final T body;
}
라는게 존재하는데
이를 상속받아 구현한 클래스가 RequestEntity 와 ResponseEntity 이다.
즉 HttpHeader와 body + status 를 가질 수 있다.
나중에 적기...