문제 상황
마이크로서비스 프로젝트에서 spring-kafka를 추가하고 brave-instrumentation-kafka-clients를 제거한 후 애플리케이션 시작 시 다음과 같은 오류가 발생했습니다:
Error processing condition on org.springframework.cloud.sleuth.instrument.messaging.TraceMessagingAutoConfiguration$SleuthKafkaConfiguration.kafkaTracing
at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:64)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108)
... 17 common frames omitted
Caused by: org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanTypeDeductionException: Failed to deduce bean type for org.springframework.cloud.sleuth.instrument.messaging.TraceMessagingAutoConfiguration$SleuthKafkaConfiguration.kafkaTracing
... 17 common frames omitted
Caused by: java.lang.ClassNotFoundException: brave.kafka.clients.KafkaTracing
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:275)
at org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanSearchSpec.getReturnType(OnBeanCondition.java:505)
at org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanSearchSpec.addDeducedBeanTypeForBeanMethod(OnBeanCondition.java:491)
... 22 common frames omitted
실행 환경
| 소프트웨어 | 버전 |
|---|---|
| JDK | 1.8 |
| spring-boot | 2.1.1.RELEASE |
원인 분석
오류 메시지를 보면 org.springframework.cloud.sleuth.instrument.messaging.TraceMessagingAutoConfiguration 클래스에서 문제가 발생하고 있습니다. pom.xml에서 brave-instrumentation-kafka-clients 의존성을 제거하면서 spring-kafka와의 충돌을 피하려 했지만, 이로 인해 필요한 클래스 brave.kafka.clients.KafkaTracing를 찾을 수 없게 되어 자동 설정 과정에서 예외가 발생했습니다.
해결 방안
해당 자동 설정 클래스를 제외함으로써 문제를 해결할 수 있습니다. 애플리케이션 시작 클래스에 다음 설정을 추가합니다:
@SpringBootApplication(exclude = {TraceMessagingAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
검증 결과
위 설정을 적용한 후 애플리케이션이 정상적으로 시작되었으며 Kafka 관련 기능도 올바르게 동작합니다.
결론
의존성 충돌을 해결하기 위해 특정 라이브러리를 제거할 때는 해당 라이브러리에 의존하는 다른 컴포넌트들까지 고려해야 합니다. 자동 설정 클래스들이 참조하는 빈이나 클래스가 누락되지 않도록 주의하며, 필요시 해당 설정들을 명시적으로 제외하는 것이 중요합니다.