spring dependency management로 인한 gradle 버전 충돌문제

Minsu Kang·2021년 3월 27일
0

트러블 슈팅

목록 보기
1/1

며칠전, gradle 설정을 하다가 디펜던시 충돌로 인해 다운그레이드된 버전이 적용되어 문제가 발생했습니다.
원인을 찾지못해 삽질을 오래했는데 그 과정에서 알게된 것들에 대해서 글을 작성 해보았습니다.

gradle의 기본 충돌 관리

gradle을 통해 의존성 관리를 하다보면 중복되는 jar 파일이 존재하는 경우가 있다.

implementation 'com.slack.api'
implementation 'com.http.httpClient'

com.slack.apicom.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 모듈을 사용하지 않는 것을 선택했다.

profile
백엔드 개발자

1개의 댓글

comment-user-thumbnail
2022년 2월 16일

감사합니다👍

답글 달기