며칠전, gradle 설정을 하다가 디펜던시 충돌로 인해 다운그레이드된 버전이 적용되어 문제가 발생했습니다.
원인을 찾지못해 삽질을 오래했는데 그 과정에서 알게된 것들에 대해서 글을 작성 해보았습니다.
gradle을 통해 의존성 관리를 하다보면 중복되는 jar 파일이 존재하는 경우가 있다.
implementation 'com.slack.api'
implementation 'com.http.httpClient'
com.slack.api
와 com.http.httpClient
가 하위 디펜던시로 같은 jar를 가지고 있다고 생각해보자.
만약 두 개의 jar 파일의 버전이 다르다면 gradle은 자동으로 더 최신 버전의 jar를 선택한다.
분명 최신버전을 가져오는 것으로 알고 있었는데 더 낮은 버전을 가지고 오는 문제가 있었다.
okhttp3를 보면 4.9.1 버전을 의존하고 있지만 실제로는 3.14.8 을 적용하고 있다.
왜 이런 문제가 발생한 걸까?
일단 내 프로젝트 내에서 okhttp를 의존하고 있는 다른 모듈을 찾아보았다.
spring-boot-starer-cache
에서 사용하고 있는것을 알게 되었다..!
스프링이랑 관련이 있는 것 같아서 스프링과 gradle 버전을 연관지어 구글링을 해보았다.
문제는 스프링의 dependency-management
플러그인에 있었다!
dependency-management
플러그인을 적용시키면 현재 사용하고 있는 스프링 버전에 따라 의존성을 관리해 주기 때문에 자동으로 스프링과 호환되는 버전으로 가져와버린 것이었다.
어떤 버전을 가지고 오는지는 ./gradlew dependencyManagement
명령어를 통해 확인할 수 있다.
또는
https://search.maven.org/artifact/org.springframework.boot/spring-boot-dependencies
위 사이트에서도 확인이 가능하다.
해결방법은 간단하다. 자신이 사용할 버전을 build.gradle
에 정확히 명시해주면 된다.
ext['okhttp3.version'] = '4.9.1'
이라고 한 줄 작성해주면 된다.
잘 바뀐 모습이다!
주의할 점은,
이렇게 버전을 바꾼 경우에는 기존 스프링 모듈중에 영향을 받는 모듈들이 어떤 것들이 있는지 잘 체크하고 오류가 나지 않도록 꼼꼼하게 체크해야 한다는 점이다.
내 경우에는 3.14.8 에서 4.9.1로 바꾸는 것이기 때문에 버전 차이가 상당히 컸다.
spring-boot-starter-cache
에서 오류가 나는지 까지는 확인하지 않았는데 굳이 스프링이 정한 버전을 거스르는 위험성을 감수하고 싶지는 않아서 okhttp 모듈을 사용하지 않는 것을 선택했다.
감사합니다👍