본문 바로가기
허브 살리기 프로젝트

버전 충돌

by jay-choe 2024. 10. 24.

의문점

SDK를 개발하는 상황에서 왜 특정 프레임 워크에 의존하는 것이 좋지 않을까?

 

이에 대한 답은 보통 프레임 워크의 버전에 영향을 받기 때문이라고 한다.

 

조금 애매하게 알았던 탓인지, 다른 버전의 의존성을 같이 패키징 하는데 다른 버전이어도 상관 없지 않나? 라는 생각을 했었다.

 

그렇다면 여러 버전의 의존성이 있는 상황에는 어떤 일이 발생할까? 나는 JVM쪽 언어를 사용하기 때문에 해당 언어에 초점을 맞춰서 확인했다.

 

클래스로더와 버전 충돌

단순하게 생각해보면, 버전이 다른 경우에도 동일한 패키지명과 이름을 갖는 클래스들이 존재할 것이다.

그렇다면 버전만 다른데 동일한 클래스가 존재하면 어떤 클래스가 사용되는 걸까?

 

오라클 자바 문서 에 따르면 이미 클래스가 로드되어 있다면 해당 클래스를 사용한다는 것을 확인 할 수 있다.

If a class has already been loaded, it returns it.

 

 

그렇다면 먼저 로드 된 클래스를 사용한다는 것인데, JVM에서 클래스가 로드되는 시점은 해당 클래스가 처음 등장하는 시점이기에 경우에 따라서 최신 버전의 클래스가 로드 되고, 이전 버전에서 사용하는 함수가 사라졌다던지 한다면 이는 에러를 발생할 것이고 이를 버전 충돌이라고 할 수 있을 것 같다.

 

물론 다른 클래스 로더를 사용하면 다른 버전의 클래스를 로드할 수도 있겠지만 우회해서 사용하는 방법은 예기치 못 한 부작용이 발생할 수 있어 좋지 않아보인다.

 

빌드 도구의 버전 충돌 관리

내가 사용하고 있는 빌드 도구인 Gradle에서는 의존성 끼리 버전이 충돌 될 시 가장 최신 버전의 것을 선택하는 전략을 기본적으로 사용한다고 한다. 다른 빌드 도구도 이와 같은 전략을 택하는 것으로 보인다.

Gradle will consider all requested versions, wherever they appear in the dependency graph. By default, it will select the highest version. More information on version ordering here.

 

즉, 빌드 도구에 의해 기존에 사용하고 있던 의존성의 버전이 다른 버전(더 최신 버전)으로 사용 될 수도 있다는 것이다.

이는 메이저 버전 업 같은 경우에는 큰 변경을 수반하기 때문에 충돌이 일어날 확률이 높아진다.

 

정리

빌드 도구의 의존성 충돌 해결 전략과 언어적인 특성 때문에 라이브러리나 SDK를 개발하는 상황이면 특정 구현에 가능한 의존하지 않는 것이 좋다.

 

참고

'허브 살리기 프로젝트' 카테고리의 다른 글

TopN 구하기 (3)  (0) 2024.10.23
Feign Client Retry  (0) 2024.08.30
Redis로 Rate Limit 구현  (0) 2024.06.23
TopN 구하기 (2)  (1) 2024.06.16
TopN 구하기 (1)  (1) 2024.06.09