@RestControllerAdvice 전역 예외 클래스 관련 질문
84
작성한 질문수 11
안녕하세요 김영한님의 강의를 들으며 많은 지식을 얻고, 꾸준히 실력을 키워나가고 있는 주니어 백엔드 개발자입니다!
개발 도중에, 전역 예외 클래스 관련 질문이 생겨 질문 드립니다.
현재 @RestControllerAdvice 어노테이션이 있는 전역 예외 클래스 중 일부 코드입니다.
@ExceptionHandler(PersistenceException.class)
public ResponseEntity<Object> handlePersistenceException(Exception ex, WebRequest request) {
log.debug("handlePersistenceException : {}", ex.getMessage(), ex);
// return ResponseEntity 로직
}
@ExceptionHandler(Exception.class) public ResponseEntity<Object> handleAllException(Exception ex, WebRequest request) {
log.debug("handleException : {}", ex.getMessage(), ex);
// return ResponseEntity 로직
}
*/
개발한 api를 테스트할 때, 비즈니스 로직단에서 로직을 수행하다 PersistenceException이 발생하면, 당연히, 둘 중 더 구체적인 예외인 @ExceptionHandler(PersistenceException.class)의 메소드가 동작해야한다고 생각을 했는데 최상단 예외인 @ExceptionHandler(Exception.class)이 붙은 메소드를 전체 주석 처리할 때에만 @ExceptionHandler(PersistenceException.class)의 메소드가 호출되어서 동작하고, @ExceptionHandler(Exception.class)의 주석을 다시 해제하면 @ExceptionHandler(Exception.class)의 메소드가 호출되어서 동작합니다..
저는 @ExceptionHandler(Exception.class)에 주석이 있건, 없건 더 구체적인 예외가 우선순위로 호출되어야한다고 생각했는데.. 제가 잘못 생각한 부분이 있을까요?
아니면 혹시 구체적인 예외가 우선순위로 동작하는 건 맞으나 제가 놓친 부분이 있는 걸까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
님이 마주한 현상은 @RestControllerAdvice의 작동 방식과 관련이 있습니다. 일반적으로 @ExceptionHandler는 예외를 처리할 때 가장 구체적인 예외 유형부터 매치되어 처리됩니다. 즉, PersistenceException이 발생했을 때, @ExceptionHandler(PersistenceException.class)가 정의되어 있다면 해당 핸들러가 우선적으로 동작해야 합니다. 하지만 모든 예외를 처리하는 @ExceptionHandler(Exception.class)가 있을 경우, 구체적인 예외 타입에 대해서도 이 핸들러가 처리하게 될 수 있습니다.
이러한 현상이 발생하는 정확한 원인은 Spring의 예외 처리 기준과 프로젝트의 컨텍스트에 따라 다를 수 있으며, 여러 요인에 의해 영향을 받을 수 있습니다. 예를 들어, 스프링의 내부적인 예외 해석 방식, 컨트롤러에서 발생된 예외가 정확히 어떤 방식으로 전달되는지, 그리고 다른 예외 처리기(@ControllerAdvice, @RestControllerAdvice)의 존재 여부 및 그 정의 방식 등이 문제에 영향을 줄 수 있습니다.
구체적인 예외가 우선순위로 동작하지 않는 문제를 해결하기 위해, 다음과 같이 접근할 수 있습니다:
- 예외 처리 메소드가 속한 @RestControllerAdvice나 @ControllerAdvice 클래스의 순서를 조정해보세요. 때로는 스프링이 이러한 빈들을 스캔하는 순서에 따라 우선 순위가 달라질 수 있습니다.
- 정확한 예외 타입을 확인해보세요. PersistenceException이 정말로 발생하는 예외 타입인지, 아니면 그 하위 타입의 예외가 발생하는지 확인해볼 필요가 있습니다.
- 스프링 부트 버전이나 스프링 프레임워크 버전에 따라 예외 처리 메커니즘이 달라질 수 있으므로, 구체적인 예외 처리가 제대로 동작하지 않는다면, 버전을 확인하고 관련 문서를 살펴보는 것도 도움이 될 수 있습니다.
참고로, @RestControllerAdvice와 @ExceptionHandler를 사용하여 전역 예외 처리를 구현하는 것은 매우 좋은 방법입니다. 다만, 예외 처리 로직이 예상대로 동작하지 않는 경우, 스프링의 예외 처리 메커니즘을 더 깊이 이해하고, 프로젝트의 컨텍스트 내에서 모든 예외 처리기의 동작 방식을 면밀히 검토해야 할 필요가 있습니다.
시도해볼 수 있는 다른 방법이나, 추가적인 정보가 필요하신 경우, 언제든지 질문해주세요.
강의 추천해주세요
2
27
1
케이테스트 서버 운영 방법
2
49
1
Navigation Mobile 토글 베리어블이 안됩니당
1
36
2
프로필 사진 세팅과 관련하여 질문 드립니다
1
48
2





