Poetry와 Pipenv를 활용한 Python 의존성 관리 탐색
Grace Collins
Solutions Engineer · Leapcell

Python 프로젝트 관리의 진화하는 환경
Python은 방대한 라이브러리 및 프레임워크 생태계를 통해 커뮤니티 기여로 번성합니다. 그러나 이러한 풍부함이 바로 결정적인 과제를 제시하는데, 그것이 바로 의존성 관리입니다. 재현 가능한 빌드를 보장하고, 프로젝트 환경을 격리하며, 의존성 충돌을 처리하는 것은 역사적으로 Python 개발자들에게 어려운 문제였습니다. pip install -r requirements.txt
만 사용하던 시절은 많은 사람들에게 과거의 유물이 되었으며, 이러한 복잡성을 해결하기 위해 더 정교한 도구들이 등장했습니다. 오늘날 현대 Python 프로젝트 관리에서 두 가지 주요한 경쟁자가 돋보이는데, 바로 Poetry와 Pipenv입니다. 이 글에서는 이들의 철학, 기능 및 실제 적용 사례를 심층적으로 살펴보고, 강력하고 유지보수 가능한 Python 개발을 위한 옵션을 탐색하는 데 도움을 드릴 것입니다.
핵심 개념 해부
Poetry와 Pipenv를 비교하기 전에, 그들이 해결하고자 하는 근본적인 문제들과 활용하는 핵심 개념들을 이해하는 것이 중요합니다:
- 의존성 (Dependencies): 프로젝트가 의존하는 외부 라이브러리 또는 패키지입니다. 일반적인 Python 프로젝트는 웹 개발을 위해 Flask, HTTP 요청을 위해 Requests, 또는 수치 계산을 위해 NumPy에 의존할 수 있습니다.
- 의존성 해결 (Dependency Resolution): 모든 직접적 및 간접적 의존성의 특정 버전이 충돌 없이 함께 설치될 수 있는지 파악하는 과정입니다. 여러 패키지가 동일한 의존성의 다른 버전을 요구할 때 이 과정은 복잡해질 수 있습니다.
- 가상 환경 (Virtual Environments): 특정 프로젝트의 의존성을 다른 프로젝트나 시스템의 전역 Python 설치를 방해하지 않고 관리할 수 있게 해주는 격리된 Python 환경입니다. 이는 한 프로젝트의 요구사항이 다른 프로젝트와 충돌하는 "의존성 지옥"을 방지합니다.
venv
및virtualenv
와 같은 도구가 여기서 기본이 됩니다. - 잠금 파일 (Lock Files): 성공적으로 설치되고 해결된 모든 의존성(직접 및 전이적)의 정확한 버전을 정밀하게 기록하는 파일(예:
poetry.lock
,Pipfile.lock
)입니다. 이는 시간과 여러 컴퓨터에 걸쳐 동일한 설치를 보장하여 재현 가능한 빌드를 촉진합니다. - 패키지 관리 (Package Management): 패키지를 설치, 업데이트 및 제거하는 전반적인 프로세스로, 종종 PyPI (Python Package Index)와 같은 패키지 인덱스와 상호 작용합니다.
- 프로젝트 메타데이터 (Project Metadata): 프로젝트에 대한 정보(이름, 버전, 작성자, 설명, 필요한 의존성)는 일반적으로
pyproject.toml
또는setup.py
와 같은 파일에 저장됩니다.
Poetry와 Pipenv 모두 이러한 복잡성의 상당 부분을 추상화하여 의존성 관리, 가상 환경 처리 및 패키지 게시를 위한 통합 솔루션을 제공하는 것을 목표로 합니다.
Poetry: 전체론적 패키저
Poetry는 Python을 위한 완전한 패키징 및 의존성 관리 솔루션으로 자리매김하고 있습니다. 프로젝트 생성부터 의존성 관리, 빌드 및 패키지 게시까지 전체 워크플로우를 단순화하는 것을 목표로 합니다.
Poetry 작동 방식
Poetry는 단일 pyproject.toml
파일을 사용하여 프로젝트 메타데이터, 직접 의존성 및 개발 의존성을 선언합니다. 이 현대적인 TOML 기반 형식은 Python 생태계에서 점점 더 많이 사용되고 있습니다. 의존성을 추가하거나 업데이트할 때 Poetry는 지능적으로 이를 해결하고 정확한 버전을 poetry.lock
파일에 기록합니다.
주요 기능 및 원칙:
- 단일
pyproject.toml
: 프로젝트 메타데이터, 의존성, 빌드 시스템 및 기타 도구 설정을 위한 통합 구성 파일입니다. - 엄격한 의존성 해결: Poetry의 해결자는 강력하고 빠르며, 가장 호환되는 의존성 세트를 찾는 것을 목표로 합니다.
- 가상 환경 통합: Poetry는 프로젝트에 대한 가상 환경을 자동으로 생성하고 관리하며, 기본적으로 프로젝트 디렉토리 외부에 배치합니다(설정 가능). 일반적으로
venv
명령과 직접 상호 작용할 필요가 없습니다. poetry.lock
을 통한 재현 가능한 빌드: 프로젝트 작업을 하는 모든 사람이 정확히 동일한 의존성 버전을 설치하도록 보장합니다.- 패키지 빌드 및 게시: Poetry는 배포 가능한 패키지(sdist 및 wheel)를 빌드하고 PyPI 또는 다른 패키지 인덱스에 게시하는 명령을 제공합니다.
- PEP 517/518 준수: 최신 Python 빌드 시스템 표준을 준수합니다.
Poetry를 사용한 실제 예시
Poetry로 새 프로젝트를 시작해 보겠습니다:
poetry new my-poetry-app cd my-poetry-app
이것은 기본 디렉토리 구조와 pyproject.toml
파일을 생성합니다:
# my-poetry-app/pyproject.toml [tool.poetry] name = "my-poetry-app" version = "0.1.0" description = "" authors = ["Your Name <you@example.com>"] readme = "README.md" packages = [{include = "my_poetry_app"}] [tool.poetry.dependencies] python = "^3.10" [tool.poetry.group.dev.dependencies] pytest = "^7.1.2" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
이제 requests
와 같은 의존성을 추가해 보겠습니다:
poetry add requests
Poetry는 requests
와 그 의존성을 해결하고 가상 환경에 설치한 다음 pyproject.toml
을 업데이트하고 poetry.lock
을 생성합니다:
# my-poetry-app/pyproject.toml (requests 추가 후) [tool.poetry.dependencies] python = "^3.10" requests = "^2.28.1" # 추가됨
poetry.lock
파일에는 requests
, certifi
, charset-normalizer
, idna
, urllib3
의 정확한 설치 버전이 포함됩니다.
그런 다음 가상 환경 내에서 명령을 실행할 수 있습니다:
poetry run python -c "import requests; print(requests.__version__)"
테스트를 실행합니다:
poetry run pytest
새로운 컴퓨터에서 의존성을 설치하려면:
poetry install
이 명령은 poetry.lock
을 읽고 정확히 동일한 버전이 설치되도록 보장합니다.
Pipenv: 공식 권장 사항, 통합 워크플로우
Pipenv는 Kenneth Reitz가 개발했으며 한동안 PyPA (Python Packaging Authority)에서 공식적으로 권장하는 도구였습니다. Node.js의 npm이나 Ruby의 Bundler와 같이 다른 언어 생태계의 개념을 차용하여 Python 패키징에 최선을 다하는 것을 목표로 합니다.
Pipenv 작동 방식
Pipenv는 직접 의존성을 선언하기 위한 Pipfile
과 정확하게 해결된 의존성을 기록하기 위한 Pipfile.lock
을 관리합니다. pip
와 virtualenv
기능을 긴밀하게 통합하여 별도의 pip
또는 virtualenv
호출 대신 주로 pipenv
명령과 상호 작용합니다.
주요 기능 및 원칙:
Pipfile
및Pipfile.lock
:Pipfile
에서 추상 의존성을 선언하고Pipfile.lock
에서 정확한 버전을 잠급니다.- 가상 환경 관리: 자동으로 가상 환경을 생성하고 관리하며, 일반적으로 프로젝트 디렉토리의 이름을 따서 명명되고 종종 중앙 캐시(
~/.local/share/virtualenvs
)에 위치합니다. 암시적으로 활성화/비활성화를 처리합니다. pip
통합: 내부적으로 패키지 설치를 위해pip
를 활용하지만, 더 높은 수준의 인터페이스를 제공합니다.- 의존성 그래프 및 보안: 의존성 그래프를 표시하고 보안 취약점을 확인할 수 있습니다.
- 개발 및 프로덕션 의존성:
Pipfile
의[packages]
(프로덕션) 및[dev-packages]
(개발) 섹션을 쉽게 구분합니다.
Pipenv를 사용한 실제 예시
먼저 프로젝트 디렉토리를 생성해 보겠습니다:
mkdir my-pipenv-app cd my-pipenv-app
이제 의존성을 설치합니다. 이렇게 하면 Pipenv가 초기화되고 Pipfile
및 Pipfile.lock
이 생성됩니다:
pipenv install flask
이것은 다음과 같은 Pipfile
을 생성합니다:
# my-pipenv-app/Pipfile [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] flask = "*" # 또는 설치된 특정 버전에 따라 "==2.3.2" [dev-packages] [requires] python_version = "3.10" # 또는 현재 Python 버전
그리고 Flask
와 그 의존성(Jinja2
, Werkzeug
, ItsDangerous
, click
)의 정확한 버전을 포함하는 Pipfile.lock
을 생성합니다.
Pipenv 환경 내에서 스크립트를 실행하려면:
pipenv run python -c "import flask; print(flask.__version__)"
개발 의존성(예: pytest
)을 설치하려면:
pipenv install --dev pytest
이것은 Pipfile
의 [dev-packages]
섹션에 pytest
를 추가합니다.
모든 의존성을 설치하려면 (Pipfile.lock
이 존재하는 경우, 그렇지 않으면 Pipfile
에서):
pipenv install
가상 환경 내 쉘을 시작하려면:
pipenv shell
Poetry 대 Pipenv: 비교 분석
두 도구 모두 유사한 문제를 해결하는 것을 목표로 하지만, 접근 방식과 기능 세트에는 분명한 차이가 있습니다.
기능 | Poetry | Pipenv |
---|---|---|
구성 파일 | pyproject.toml (PEP 517/518 준수) | Pipfile |
잠금 파일 | poetry.lock | Pipfile.lock |
가상 환경 위치 | 프로젝트 내부 .venv (기본 비활성화) 또는 전역 캐시 | 기본적으로 전역 캐시 (~/.local/share/virtualenvs ) |
의존성 해결 | 강력하고 엄격하며 빠름 | 일반적으로 좋지만, Poetry가 성공하는 곳에서 충돌을 보고하는 경우도 있음 |
패키지 빌드/게시 | 통합됨 (핵심 기능) | 직접 지원되지 않음; setuptools 또는 유사한 도구 필요 |
명령 구문 | poetry add , poetry install , poetry run | pipenv install , pipenv run , pipenv shell |
도구 철학 | 게시를 포함한 전체적인 프로젝트 관리 | pip + virtualenv 경험 통합 |
호환성 | requirements.txt 읽기, requirements.txt 로 내보내기 가능 | requirements.txt 를 읽어 Pipfile 채우기 가능 |
커뮤니티 및 개발 | 매우 활발하고 생기 넘치는 커뮤니티 | 활발하지만 최근 몇 년 동안 주요 업데이트가 덜 빈번함 |
Poetry를 선택해야 할 때
- 배포를 위한 라이브러리 또는 패키지를 구축하는 경우: Poetry의 통합 빌드 및 게시 기능은 큰 이점입니다.
- 단일의 현대적인 구성 파일(
pyproject.toml
)을 선호하는 경우: PEP 517/518 표준을 채택하면 프로젝트 설정이 단순화됩니다. - 엄격하고 신뢰할 수 있는 의존성 해결을 중요하게 생각하는 경우: Poetry의 해결자는 복잡한 의존성 그래프를 처리하는 능력으로 자주 칭찬받습니다.
- 더 주관적이고 올인원 워크플로우를 원하는 경우: Poetry는 새 프로젝트 생성부터 게시까지 모든 것을 처리합니다.
- 기본적으로
.venv
디렉토리가 없는 더 깔끔한 프로젝트 구조를 선호하는 경우 (설정 가능).
Pipenv를 선택해야 할 때
- 주로 라이브러리 배포가 아닌 애플리케이션을 구축하는 경우: 게시가 주요 관심사가 아니라면 Pipenv의 애플리케이션 의존성 관리 초점이 충분할 수 있습니다.
- 이미
pip
와virtualenv
에 익숙하고 간단한 래퍼를 원하는 경우: Pipenv는 이러한 도구에 익숙한 사용자에게 자연스러운 진화처럼 느껴집니다. - 가상 환경을 중앙 위치에서 관리하는 것을 선호하는 경우: Pipenv의 기본 동작은 프로젝트 디렉토리를 더 깔끔하게 유지하는 데 도움이 될 수 있습니다.
- 워크플로우의 일부에 대해 여전히
requirements.txt
에 의존하는 경우: Pipenv는 변환을 잘 처리합니다.
더 나아갈 길: 정보에 입각한 선택
Poetry와 Pipenv 모두 전통적인 pip
및 venv
워크플로우보다 상당한 발전을 나타냅니다. 두 도구 모두 의존성 관리를 간소화하고 재현 가능한 빌드를 보장하여 Python 개발에서 오래된 불만을 해결하는 것을 목표로 합니다.
패키징에 대한 전체적인 접근 방식, 강력한 의존성 해결, pyproject.toml
을 통한 최신 표준 준수를 갖춘 Poetry는 특히 라이브러리 저작자에게 더 완전하고 미래 지향적인 솔루션으로 자주 느껴집니다. 반면에 Pipenv는 친숙한 pip
및 virtualenv
패러다임을 기반으로 하여 애플리케이션 의존성을 관리하는 데 더 직접적이고 통합된 경험을 제공합니다.
궁극적으로 최상의 선택은 특정 프로젝트 요구 사항, 팀 숙련도 및 개인적 선호도에 따라 달라집니다. 새로운 프로젝트, 특히 배포를 염두에 둔 프로젝트의 경우 Poetry는 종종 더 부드럽고 포괄적인 경험을 제공합니다. 그러나 기존 프로젝트 또는 pip
/venv
사고방식에 크게 투자한 팀의 경우 Pipenv는 편안하고 강력한 업그레이드를 제공합니다. 어떤 도구를 선택하든 현대적인 의존성 관리자를 채택하면 의심할 여지 없이 더 강력하고 재현 가능하며 궁극적으로 더 즐거운 Python 개발로 이어질 것입니다.