문제 상황 분석
- 각 서비스에서 Exception 모듈 의존성을 추가하여 GlobalException은 잘 동작하지만, 모듈 내에 정의한 예외 핸들러가 제대로 동작하지 않는 문제가 발생
- 예외 핸들러 클래스가 Spring 애플리케이션 컨텍스트에 포함되지 않아서 발생하는 것
문제 상황
- Exception 모듈은 컴포넌트로 등록되어 있으나, 해당 서비스가 이 모듈을 스캔하지 않아 예외 핸들러를 사용할 수 없는 상황
- Spring의 예외 핸들러는 @RestControllerAdvice나 @ControllerAdvice 같은 어노테이션을 사용해 예외를 처리하며, 이러한 핸들러가 정상적으로 동작하려면 Spring 애플리케이션 컨텍스트에 포함되어 있어야 한다.
해결 방안
이 문제를 해결하기 위해, 각 서비스에서 Spring의 @ComponentScan을 사용해 예외 핸들러가 있는 패키지를 스캔하고, 이를 Spring 애플리케이션 컨텍스트에 포함시켜야 한다.
이를 통해 예외 핸들러가 정상적으로 동작할 수 있도록 한다.
@Configuration
@ComponentScan(basePackages = {
"com.fortickets.exception"
})
public class ComponentConfig {
}
- @ComponentScan: basePackages 속성을 통해 지정된 패키지 내의 모든 클래스를 스캔해 Spring 컨텍스트에 등록
- 이 경우, com.fortickets.exception 패키지에 위치한 예외 핸들러 클래스가 포함
중요한 점
- 모듈 구조: MSA 또는 다중 모듈 구조에서는 각 모듈이 독립적으로 동작하기 때문에, 예외 핸들러가 포함된 패키지를 명시적으로 스캔하지 않으면 해당 서비스에서 예외 핸들러를 인식하지 못함.
- 범용성: 위와 같은 설정을 각 서비스에 적용하면, 모든 서비스에서 Exception 모듈의 예외 핸들러를 사용할 수 있음.
결론
Spring 애플리케이션에서 예외 핸들러가 제대로 동작하지 않는 문제는 주로 해당 핸들러가 Spring 컨텍스트에 포함되지 않아서 발생함. 이를 해결하기 위해 각 서비스에 @ComponentScan을 사용해 예외 핸들러가 있는 패키지를 명시적으로 스캔하도록 설정함으로써, 모든 서비스에서 동일한 예외 핸들링 로직을 사용할 수 있게 됨.