강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

jayjoy05님의 프로필 이미지
jayjoy05

작성한 질문수

@RestControllerAdvice 전역 예외 클래스 관련 질문

작성

·

71

0

안녕하세요 김영한님의 강의를 들으며 많은 지식을 얻고, 꾸준히 실력을 키워나가고 있는 주니어 백엔드 개발자입니다!

개발 도중에, 전역 예외 클래스 관련 질문이 생겨 질문 드립니다.

 

현재 @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)의 존재 여부 및 그 정의 방식 등이 문제에 영향을 줄 수 있습니다.

구체적인 예외가 우선순위로 동작하지 않는 문제를 해결하기 위해, 다음과 같이 접근할 수 있습니다:

  1. 예외 처리 메소드가 속한 @RestControllerAdvice나 @ControllerAdvice 클래스의 순서를 조정해보세요. 때로는 스프링이 이러한 빈들을 스캔하는 순서에 따라 우선 순위가 달라질 수 있습니다.
  2. 정확한 예외 타입을 확인해보세요. PersistenceException이 정말로 발생하는 예외 타입인지, 아니면 그 하위 타입의 예외가 발생하는지 확인해볼 필요가 있습니다.
  3. 스프링 부트 버전이나 스프링 프레임워크 버전에 따라 예외 처리 메커니즘이 달라질 수 있으므로, 구체적인 예외 처리가 제대로 동작하지 않는다면, 버전을 확인하고 관련 문서를 살펴보는 것도 도움이 될 수 있습니다.

참고로, @RestControllerAdvice와 @ExceptionHandler를 사용하여 전역 예외 처리를 구현하는 것은 매우 좋은 방법입니다. 다만, 예외 처리 로직이 예상대로 동작하지 않는 경우, 스프링의 예외 처리 메커니즘을 더 깊이 이해하고, 프로젝트의 컨텍스트 내에서 모든 예외 처리기의 동작 방식을 면밀히 검토해야 할 필요가 있습니다.

시도해볼 수 있는 다른 방법이나, 추가적인 정보가 필요하신 경우, 언제든지 질문해주세요.

jayjoy05님의 프로필 이미지
jayjoy05

작성한 질문수

질문하기