현 프로젝트에서는 Spring에서 제공하는 @ControllerAdvice 어노테이션을 사용하여 전역 예외 처리를 하고 있으며, @ExceptionHandler를 통해 각 Custom Exception에 상응하는 status code를 내려주고 있다.
하지만 Filter에서 발생하는 JWT 예외는 위와 같은 방법으로 처리할 수 없다!
Why
Filter와 @ControllerAdvice는 서로 다른 컨텍스트에서 동작한다.

위의 그림을 통해 볼 수 있듯이 Filter는 Spring Context의 앞단인 Servlet Context에서 관리되는 영역으로, Spring에서 제공하는 @ControllerAdvice와는 예외 처리 메커니즘이 분리되어 있다. 따라서 Filter에서 발생하는 예외는 전역 예외 처리와는 별개의 예외 처리가 필요하다.
How
JwtFilter 앞단에 별도의 예외 처리 Filter를 두는 방법을 떠올렸으나, 프로젝트 팀장님께서 JWT 예외만을 처리하기 위해 별도의 Filter를 하나 더 두는 것이 의미가 있는지 질문하였다. 나는
1. 예외 처리 로직을 JWT 필터와 분리시키기 위해
2. 대부분의 사람들이 해당 방식으로 구현해서 (즉, 리소스가 많아서)
위 두 가지 이유로 예외 필터를 고민했었는데, 팀장님 말을 듣고 보니 실제로 예외 처리 코드가 몇 줄 되지 않아
JwtAuthenticationFilter에서 예외 처리까지 해주었다.
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
try {
trySettingAuthentication(request);
} catch (JwtException e) {
setResponse(response, e);
}
filterChain.doFilter(request, response);
}
private void setResponse(HttpServletResponse response, JwtException e) throws IOException {
var responseEntity = ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
response.getWriter().print(responseEntity);
}
현재 전역 예외 처리 시 ResponseEntity에 HttpStatus를 담아 내려주고 있어서 Filter에서도 같은 방식으로 response를 넘겨주었다. 논의 후 에러 메시지 등이 추가될 것으로 보여진다.
'Coding' 카테고리의 다른 글
GitHub Actions + Elastic Beanstalk으로 배포 파이프라인 구축하기 (0) | 2024.10.25 |
---|---|
[JAVA] boolean 타입의 is prefix와 Lombok, Jackson (0) | 2024.09.11 |
[JPA] @OneToOne, 일대일(1:1) 연관관계 매핑 시 주의할 점 (지연 로딩 이슈) (0) | 2023.08.11 |
[Spring] @JsonInclude와 @JsonIgnore (0) | 2023.07.12 |
[AWS S3] 여러 객체 삭제 (0) | 2023.07.10 |