본문 바로가기
프레임워크/Spring

필터에서 예외처리

by taeung515 2025. 6. 12.

필터내부에서 예외를 던졌을 때, @ControllerAdvice가 처리하지 못하고 500에러만 응답하는 이유에 대해서 알아보겠습니다.

발생한 문제

Jwt 필터에서 jwtUtil.validateToken 토큰의 유효성 검증 중 예외를 던졌을때 예상과 다르게 500 Internal Server Error가 발생하였습니다.


원인 분석

Spring에서 @ControllerAdviceDispatcherServlet 이후의 흐름에서 발생한 예외만 처리할 수 있습니다. 하지만 Filter, Interceptor등은 DispatcherServlet보다 앞단에서 실행되므로, 이 구간에서 발생한 예외는 @ControllerAdvice가 관여할 수 없습니다.

 즉, 필터 내부에서 예외를 던지더라도, 스프링의 예외처리 흐름과 분리되어 있기 때문에 전역예외처리기가 호출되지 않았습니다.


처음 시도한 방법

JWT 검증 실패 시 다음과 같은 방식으로 예외를 던졌습니다.

httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "유효하지 않은 토큰입니다.");

그러나 이 방식은 공동응답객체로 응답통일하는 원칙과 맞지 않아 적절하지 않았습니다.

 

해결 방법

필터에서 발생한 예외는 직접 HttpServletResponse를 조작해야 하므로, 다음과 같이 JSON 형태의 에러 응답을 내려주는 예외처리 메서드를 필터 내부에 별도로 구현하였습니다.

jwtExceptionHandler(httpResponse, ErrorCode.NOT_VALID_TOKEN);

public void jwtExceptionHandler(HttpServletResponse response, ErrorCode errorCode) {
    response.setStatus(errorCode.getStatus().value());
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    try {
        String json = new ObjectMapper().writeValueAsString(ApiResponse.failure(errorCode.getMsg()));
        response.getWriter().write(json);
    } catch (Exception e) {
        log.error(e.getMessage());
    }
}

이후 예외 발생 시에도 공동응답객체 형식으로 응답이 일관되게 반환되었고, 사용자에게 명확한 에러 메시지가 전달되도록 개선되었습니다. 

@ControllerAdvice의 한계를 정확히 이해하게 되었고, 필터/인터셉터 구간에서는 별도의 예외처리 전략이 필요하다는 점을 학습할 수 있었습니다.

'프레임워크 > Spring' 카테고리의 다른 글

JWT, Spring security  (0) 2025.06.23
Spring Boot에서 AOP와 Interceptor를 활용한 로깅 방법  (0) 2025.06.12
테스트코드 알아보기  (0) 2025.06.12