🔥 의존성이란?

513자
8분

강의 목차

현대 개발은 외부 의존성의 사용으로 가속화됩니다(좋든 나쁘든). 이는 짧은 시간에 더 많은 일을 할 수 있게 해주지만, 프로젝트에 의존성을 추가하면 그에 따른 추가 작업과 노력이 필요합니다.

의존성의 소스 코드를 다운로드하고 빌드하는 것 외에도, 해당 의존성이 가진 의존성들도 다운로드하고 빌드해야 하며, 이는 전체 의존성 그래프가 충족될 때까지 반복됩니다. 의존성은 자신이 필요로 하는 다른 의존성의 버전을 지정할 수 있습니다. 그런데 문제는, 여러 의존성이 같은 의존성을 필요로 하면서 서로 다른 버전을 요구할 수 있다는 거예요. 이럴 때는 그 버전 요구사항들을 하나로 조율해야 합니다.

패지지 매니저의 역할은 프로젝트의 모든 의존성을 다운로드하고 빌드하는 과정을 자동화하고, 코드 재사용과 관련된 추가 작업과 노력을 최소화하는 것입니다.

의존성은 Package.swift 매니페스트 파일에 명시됩니다.

의존성 지옥

"의존성 지옥"은 프로젝트에 필요한 의존성 그래프를 충족할 수 없는 상황을 일컫는 속어입니다. 사용자는 이 시나리오를 해결해야 하는데, 보통은 어려운 작업입니다:

  1. 충돌이 사용자가 명시적으로 요청하지 않은 익숙하지 않은 의존성(의 의존성)에 있을 수 있습니다.
  2. 개발의 특성상 두 개의 의존성 그래프가 동일할 가능성은 희박합니다. 따라서 다른 사용자(심지어 패키지 작성자)가 제공할 수 있는 도움의 양은 제한적입니다. 인터넷 검색은 별 소용이 없을 것입니다.

좋은 패지지 매니저는 시작부터 의존성 지옥의 위험을 최소화하도록 설계되어야 하며, 이것이 불가능한 경우에는 이를 완화하고 사용자가 최소한의 문제로 시나리오를 해결할 수 있는 도구를 제공해야 합니다. Package Manager Community Proposal에는 이러한 의존성 지옥을 염두에 두고 어떻게 반복할 것인지에 대한 생각이 담겨 있습니다.

다음은 가장 흔한 "의존성 지옥" 시나리오 중 일부입니다:

  • 부적절한 버전 관리 - 패키지가 릴리즈에 부적절한 버전을 지정할 수 있습니다. 예를 들어, 버전이 1.2.3으로 태그되었지만, 광범위하고 호환성이 깨지는 API 변경 사항을 도입하여 2.0.0으로 주요 버전을 올려야 합니다.
  • 호환되지 않는 주요 버전 요구사항 - 패키지가 동일한 패키지에 대해 호환되지 않는 버전 요구사항을 가진 의존성을 가질 수 있습니다. 예를 들어, FooBaz~>1.0 버전에 의존하고 BarBaz~>2.0 버전에 의존한다면, 두 요구사항을 모두 충족시킬 수 있는 Baz 버전은 없습니다. 이러한 상황은 많은 패키지가 공유하는 의존성이 새로운 주요 버전으로 업데이트될 때 자주 발생하며, 그 패키지들이 자신의 의존성을 업데이트하는 데 오랜 시간이 걸립니다.
  • 호환되지 않는 부 버전 또는 업데이트 버전 요구사항 - 패키지가 너무 엄격하게 지정되어 서로 다른 부 버전이나 업데이트 버전에 대한 요구사항이 호환되지 않을 수 있습니다. 예를 들어, FooBaz==2.0.1 버전에 의존하고 BarBaz==2.0.2 버전에 의존한다면, 또다시 두 요구사항을 모두 충족시킬 수 있는 Baz 버전은 없습니다. 이는 종종 의존성의 패치 릴리스에서 도입된 회귀로 인해 패키지가 해당 의존성을 특정 버전에 고정시키는 결과입니다.
  • 네임스페이스 충돌 - 패키지가 이름이 같은 두 개 이상의 의존성을 가질 수 있습니다. 예를 들어, Person 패키지는 사람에게 우편 주소를 할당하기 위한 프로토콜을 정의하는 Addressable 패키지와 다른 사람에게 공식적으로 말하기 위한 프로토콜을 정의하는 Addressable 패키지에 의존할 수 있습니다.
  • 깨진 소프트웨어 - 패키지가 사용성, 보안 또는 성능에 영향을 미치는 미해결된 버그가 있는 의존성을 가질 수 있습니다. 이는 단순히 패지지 매니저 측의 적시성 문제일 수도 있고, 패키지에 대한 기대치의 차이일 수도 있습니다.
  • 전역 상태 충돌 - 패키지가 동일한 전역 상태에 대해 배타적 액세스 권한을 가정하는 두 개 이상의 의존성을 가질 수 있습니다. 예를 들어, 한 패키지는 다른 패키지가 특정 파일 경로에서 읽는 동안 같은 파일 경로에 쓰는 것을 수용하지 못할 수 있습니다.
  • 패키지가 사용 불가능해짐 - 패키지가 사용 불가능해진 패키지에 대한 의존성을 가질 수 있습니다. 이는 소스 URL에 접근할 수 없게 되거나 관리자가 게시된 버전을 삭제하여 발생할 수 있습니다.