개요

소프트웨어를 개발할 경우 규모가 커지고 복잡해지고 외부 라이브러리를 많이 사용할수록 의존성 지옥 이라는 아주 머리 아프고 해결이 힘든 문제에 직면하는 경우가 많으며 다음과 같은 여러 가지 의존성 지옥들이 있습니다.

Many dependencies

한 app 이 많은 라이브러리에 의존하고 있어서 사용하려면 많은 라이브러리를 다운받아서 설치해야 하는 상황으로 Windows 환경에서 자주 겪게 됩니다.

실행하려면 특정 DLL 이 없다는 에러를 내고 그 DLL 을 다운받으면 또 다른 DLL 이 없다고 요구하는 등 컴퓨터에 익숙하지 않은 사용자들을 무지 성가시게 합니다.

Long chains of dependencies

Hello.dll 은 world.dll 에 의존하고 이건 Baz.dll 에 의존하고 이건 Qux.dll 에 의존하는등 의존하는 라이브러리가 다른 라이브러리에 의존하는 경우입니다.

Conflicting dependencies

예로 Hello 라이브러리를 사용하여 A 프로젝트를 개발했는데 이 라이브러리는 Foo 와 World 라이브러리에 의존성이 있습니다.

A 프로젝트는 새로운 버전을 개발중이며 Hello 라이브러리도 같이 개발중인데 Hello 가 사용하는 Foo와 World 라이브러리도 업데이트 되야 합니다.

Foo 와 World 는 Qux 가 필요한데 Foo 는 Qux 2.3이 World 는 3.1 이 필요합니다. 이렇게 의존성이 꼬여 버린 경우를 의존성 지옥이라고 하며 프로젝트에서는 많은 라이브러리를 사용하므로 실제 의존성 지옥은 이것보다 매우 복잡합니다.


사용하는 개발 언어와 프레임워크, 운영체제를 막론하고 의존성 지옥은 자주 발생했고 특히 예전 버전의 윈도우는 시스템에서 전역적으로 사용되는 MFC.DLL 같은 공유 라이브러리 파일들이 명확하게 버전 관리가 되지 않아서 "DLL  Hell" 이라는 용어가 있을 만큼 골치 아픈 문제였습니다.

자바 진영에서도 비슷한 "jar Hell" 이라는 용어가 있을 정도로 의존성 지옥 해결은 골치아픈 문제였습니다.


같이 보기

Ref