Intro
스프링 프로젝트에서 0.9버전의 old kafka 라이브러리(kafka_2.10:0.9.0.0)를 사용할 일이 있었는데요. 해당 라이브러리와 의존관계가 있는 kafka-client 버전이 로컬에서 0.9에서 2.3.1로 변경되는 것을 확인했습니다.
문제는 2.3.1 version이 붙어서 잘 되면 상관없지만... old kafka와 kafka 2.x의 인터페이스가 많이 바뀌었다보니 특정 메서드를 찾지 못하는 에러가 발생했습니다.
사실 단순히 0.9버전의 kafka-client lib의 디펜던시를 받아서 사용하면 문제는 해결되었는데요.
저의 경우엔 관련해서 프로젝트를 뒤져봐도 2.3.1버전의 kafka-client dependency를 추가하지 않았는데 2.3.1버전으로 잡히는 것이 이상하여 좀 더 찾아보기로 했습니다.
dependencyInsight
Gradle에서는 의존관계 트리를 볼 수 있도록 dependencies, dependencyInsight 등을 제공하는데요.
저는 kafka-client에 엮긴 의존관계만 확인하고 싶었기에 특정 의존성에 관해 상세 정보 출력해주는 dependencyInsight로 확인해봤습니다.
./gradlew common:dependencyInsight --dependency org.apache.kafka:kafka-clients
이렇게 확인해보니 아래와 같이 찍히는 것을 확인했습니다.
> Task :common:dependencyInsight
org.apache.kafka:kafka-clients:2.3.1 (selected by rule)
variant "compile" [
org.gradle.status = release (not requested)
org.gradle.usage = java-api
org.gradle.category = library (not requested)
Requested attributes not found in the selected variant:
org.gradle.dependency.bundling = external
org.jetbrains.kotlin.platform.type = jvm
org.gradle.jvm.version = 8
]
org.apache.kafka:kafka-clients:0.9.0 -> 2.3.1
...
저는 여기서 selected by rule 부분에 이상함을 느끼고, 이것과 관련해서 찾아보니 제가 궁금한 부분이 앞서 stack overflow에 올라온 것을 발견했습니다 ㅎ
https://stackoverflow.com/questions/37153484/why-does-gradle-downgrade-my-transitive-dependencies-in-a-grails-3-1-application
spring-boot-dependencies
결과를 요약하자면 spring-boot 가 특정 kafka 버전을 강제 적용(overwrite)한 것이였는데요. 제가 사용하는 Spring boot버전은 2.2.8버전이고, 이 버전에서 stack overflow에 적힌 방법대로 진행해보니 kafka 2.3.1 버전이 기입되어 있는 것을 확인했습니다.
cd ~/.gradle/caches/modules-2/files-2.1
grep -r "2.3.1" *
//결과
...
org.springframework.boot/spring-boot-dependencies/2.2.2.RELEASE/.../spring-boot-dependencies-2.2.2.RELEASE.pom:
<kafka.version>2.3.1</kafka.version>
...
더불어서 스프링 부트 공식사이트에서 아래와 같은 내용을 확인할 수 있었습니다.
spring-boot-dependencies POM은 일반적인 dependency 버전을 관리합니다. Maven 및 Gradle용 Spring Boot 플러그인을 사용하면 빌드 속성을 사용하여 이러한 관리되는 종속성 버전을 사용자 지정할 수 있습니다.
만약 스프링부트가 강제한 버전을 다시 overwrite하고 싶다면 아래와 같이 overwrite할 대상과 버전을 명시하여 build.gradle에 추가해주면 됩니다.
ext['kafka.version'] = '0.9.0.0'
Spring과 Gradle의 얕은 지식이 이런 부분에서 드러나는 것 같습니다.
삽질하는 시간을 점점 줄일 수 있도록 많이 공부해야겠어요 :)
댓글