Spring Boot 기반의 웹 애플리케이션에서 @ExceptionHandler를 통해 예외를 처리하던 도중, 간헐적으로 다음과 같은 경고 로그가 발생했다.

 
Failure in @ExceptionHandler ~~~~
 

본 게시글에서는 해당 로그가 발생하게 된 실무 사례를 바탕으로, 발생 원인을 분석하고  대응 방안을 제시한다.


문제 상황 개요

해당 문제는 다음과 같은 구조의 시스템에서 발생하였다.

[Client] → [Load Balancer (timeout: 60s)] → [WAS (Spring Boot)] → [외부 API (timeout: 60s)]
 

클라이언트는 LB를 통해 WAS로 요청을 보내고, WAS는 외부 연계 시스템에 API 요청을 수행한다.

재현된 시나리오

  1. 클라이언트가 API를 요청함.
  2. WAS는 내부에서 외부 API를 호출함.
  3. 외부 API 응답이 60초를 초과하여 지연됨.
  4. LB는 설정된 60초의 timeout에 도달하여 클라이언트와의 커넥션을 강제 종료함.
  5. 이후 WAS에서 외부 API 타임아웃 발생 → ServiceException 발생 → @ExceptionHandler 호출
  6. 하지만 이미 클라이언트 커넥션이 끊긴 상태이므로 응답 전송 중 ClientAbortException 발생
  7. 이 과정에서 다음의 Spring 내부 로그가 출력됨:
Failure in @ExceptionHandler com.~~~.exception.ServiceExceptionHandler#handleServiceException(ServiceException)org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
 

이는 @ExceptionHandler 메서드에서 ResponseEntity로 클라이언트에 오류 응답을 내려주는 과정에서,
클라이언트가 이미 연결을 종료한 상태이므로 발생한 예외이다.

Spring MVC는 @ExceptionHandler 메서드에서 예외가 발생할 경우
ExceptionHandlerExceptionResolver 클래스 내부에서 해당 상황을 감지하고 다음과 같은 로그를 출력한다.

catch (Throwable invocationEx) {
    if (logger.isWarnEnabled()) {
        logger.warn("Failure in @ExceptionHandler " + exceptionHandlerMethod, invocationEx);
    }
    return null;
}

위 소스는 Spring Framework의 ExceptionHandlerExceptionResolver.java 내부에 포함된 코드로,
핸들러 실행 도중 예외가 재발생할 경우, 이를 warn 로그로 출력하고 이후 resolver chain으로 처리를 넘긴다.

 


원인 정리

외부 API 응답 지연 외부 시스템의 응답이 60초를 초과함
LB timeout 설정 LB가 60초 이상 응답이 없자 커넥션 종료
클라이언트 커넥션 끊김 WAS가 응답을 전송하려는 시점에는 클라이언트가 이미 연결을 끊음
예외 핸들러 재예외 발생 @ExceptionHandler 실행 중 ClientAbortException 발생하여 처리 실패
 

대응 방안

외부 API Timeout 설정을 LB보다 짧게 조정

외부 API 호출 시 사용되는 HTTP 클라이언트 (RestTemplate, WebClient, 또는 커스텀 library)에 설정된 timeout 값을
LB timeout보다 작게 설정해야 한다.

ex) LB timeout이 60초라면, 외부 API timeout은 50초 이하로 설정


결론

“Failure in @ExceptionHandler” 로그는 @ExceptionHandler 메서드의 처리 중
다시 예외가 발생했을 때 출력되는 Spring의 내부 경고 로그이다.
이 사례에선 클라이언트가 먼저 커넥션을 종료한 경우에 발생하며, 구조적 타임아웃 설정 불일치가 주요 원인이다.

적절한 timeout 설정과 예외 처리 방식을 적용함으로써, 불필요한 에러 로그를 방지하고 시스템 안정성을 높일 수 있다.

+ Recent posts