Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Scroll ignore

...

...

들어가며

패키지 관리자(Package Manager) 란

소프트웨어가 점점 복잡해지고 외부 라이브러리를 사용하는 경우가 많아지면서 외부 라이브러리를 설치하고 관리하는 문제과  의존성 지옥(dependency hell)소프트웨어 저장소(Software Repository) 는 이라는 골치 아픈 문제가 발생했습니다.

 

먼저 라이브러리의 버전 갱신시 호환성 보장을 위해 버전을 기술하는 표준 명명법인 유의적 버전(Semantic Versioning) 이라는 버전 기술 방법도 제안되었습니다.

 

그리고 이를 기반으로 언어나 프레임워크의 사용자 커뮤니티에서는 유의적 버전에 기반하여 의존성 있는 라이브러리의 설치/갱신/삭제를 처리하는 패키지 관리자(Package Manager) 가 의존성 있는 패키지를 다운로드할수 있는 공간을 의미하며 일반적으로 온라인으로 서비스를 제공한다.

 

...

또는 의존성 관리자(Dependency Manager) 라고 부르는 전용 프로그램을 만들었고 사용자의 많은 호응을 받아서 지속적으로 발전해 가고 있습니다.

 

패키지 관리자는 해결하고자 하는 문제는 동일하므로 개념을 이해하면 언어나 프레임워크가 변경되어도 크게 어렵지 않게 적응할 수 있으며 유명한 패키지 관리자는 아래와 같습니다.

언어패키지 관리자
Java

maven, gradle

RubyRubyGems, Bundler
.NETnuget
PythonPyPI
PHPComposer
Node.JSnpm, Yarn

아티팩트(artifact) 

아티팩트는 소프트웨어 개발 프로젝트를 진행하면서 생성하는 다양한 산출물을 의미한다. 의미하며 각종 설계 문서, 유즈 케이스, UML 다이어그램, 소스 코드, 소스를 빌드하여 생성된 라이브러리나 실행 파일도 모두 아티팩트에 속한다속합니다.

자바 프로젝트를 빌드할 때 많이 사용되는 주로 자바 진영에서 사용하는 용어로 라이브러리나 패키지보다 더 큰 개념이라고 볼 수 있으며 자바에서 많이 사용하는 메이븐(maven) 에서는 빌드로 생성되는 프로젝트의 결과물을 의미하며, 아티팩트는 자바 프로젝트의 성격에 따라 다르지만 일반적으로는 .jar, .war, .ear 등의 확장자를 갖게 된다됩니다.

.jar 확장자를 갖는 자바 라이브러리는 아티팩트의 일종이므로 이번 장에서 라이브러리라고 할 경우 아티팩트와 동일한 의미로 이해하면 된다.

아티팩트 저장소(Artifact Repository)

아티팩트 저장소는 아티팩트와 메타 데이타를 저장하고 관리하는 장소를 의미한다.

spring 프레임워크이나 JDBC 구현물, 아파치 재단 산하의 오픈소스 프로젝트등  외부에서 개발된 라이브러리를 저장하기도 하지만 내부에서 개발되었거나 또는 개발하고 있는 라이브러리를 다른 개발자나 프로젝트와 공유하기 위한 배포 용도로도 사용한다.

서브버전이나 git 등의 버전 관리 시스템은 소스의 이력 및 공유 용도로 사용하지만 저장소는 아티팩트를 공유하기 위한 용도로 사용되는게 다른 점이다.

아티팩트 저장소(artifact repository) 는 간단하게 저장소라고 하며 이번 장에서 의미하는 저장소는 아티팩트 저장소이다.

 

저장소의 필요성

저장소가 없던 시절의 프로젝트를 생각해 보자. 프로젝트 빌드는 ant 를 사용하였고 ant 는 저장소 관련 기능이 없으므로 프로젝트에 필요한 라이브러리는 CVS나 서브버전에 라이브러리용 폴더(예: lib)를 만들고 커밋하여 관리를 했다.

일반적인 프로젝트의 디렉터리 구조는 다음과 같이 소스와 라이브러리를 모두 저장했다.

No Format
src
	com
	org
lib
	log4j.jar
	mylib.jar
build.xml

 

...


저장소(Repository) 란?

저장소는 아티팩트와 메타 데이타, 라이브러리, 패키지를 저장하고 관리하는 장소를 의미하며 패키지 관리자가 패키지를 다운로드받고 업로드할 수 있는 기능을 제공합니다.

패키지 관리자를 제공하는 언어들은 각자의 중앙 저장소(Central Repository)가 있으며 자바의 경우 https://repo1.maven.org/maven2, 파이썬의 경우 https://pypi.python.org, PHP 의 경우 http://packagist.org/ 등의 저장소가 있습니다.

 

이외에도 상용 라이브러리이거나 내부에서 개발한 라이브러리를 사내의 다른 개발자나 프로젝트와 공유하기 위한 배포 용도로 사용하는 사설 저장소(Private Repository)도 있습니다.

 

특히 사설 저

이런 방식을 사용할 경우 다음과 같은 문제점들이 발생했다.

...