Trouble shooting
프로젝트에서 에러코드가 자꾸 500번대로 나가는 이슈가 발생했다. 현재 프로젝트는 ResponseEntityExceptionHandler(관점지향 - 역할과 책임의 분리)를 상속해 예외처리를 하고 있는 상태였다. 분명 RunTimeException을 상속해 GeneralException을 만들어 커스텀 예외를 처리하게끔 했는데도 이 ExceptionHandler에서 처리가 되고 있는 것을 확인할 수 있었다.

물론 RuntimeException을 GeneralExcetion 상속하고 있긴하지만 분명히 더 구체적인 하위 클래스부터 처리가 된다고 알고 있었기 때문에 이는 문제가 아니라고 생각했다.
해결
디버깅 모드로 돌려보니 로깅을 위해 사용하던 LoggingAspect 클래스에서 예외처리가 선행되는 것을 발견할 수 있었다. AOP 포인트 컷이 @Around("within(@org.springframework.web.bind.annotation.RestController *)")로 되어있어 @RestController와 처리되는 포인트 컷이 같았다.
Throwable을 잡아서 RuntimeException을 생성해 예외를 서블릿에 던지는 로직에서 문제가 발생했던 것 같다. 모든 에러를 잡아 RuntimeException을 생성해 던지니 Exception을 처리하는 로직에 걸릴수 밖에 없었다. LoggingAspect는 다른 팀원이 만들었기에 왜 Throwable을 잡았는지 의문이 있었지만 이유가 있을 것이라 생각해 RuntimeException을 생성하지 않고 아래와 같이 RuntimeException이 아닌 unchecked 예외로 감싸는 로직으로 변경했다. 그러고 나서 테스트를 해보니 예외에 맞게 처리가 잘되는 것을 확인할 수 있었다.
처리순서가 @Around("within(@org.springframework.web.bind.annotation.RestController *)") -> @RestControllerAdivce로 되는 것을 보아 @RestControllerAdivce는 서블릿단에서 처리되어 넘어가는 것을 확인할 수 있었다.
'Spring' 카테고리의 다른 글
연관관계 (단방향과 양방향) 정리 (0) | 2024.10.17 |
---|---|
싱글톤 (프로토타입과 스코프) (0) | 2024.04.18 |
IoC 컨테이너란 무엇인가 (0) | 2024.04.16 |
어노테이션이란? (0) | 2024.04.02 |
트랜잭션 어노테이션 (@Transactional, 속성, 정책, 방법) (0) | 2024.03.28 |