Poetry: 현대적인 의존성 관리와 패키징 도구

Python

Python 생태계에서 의존성 관리와 패키징은 오랫동안 복잡하고 때로는 고통스러운 과정이었습니다. pip, virtualenv, setuptools 등 다양한 도구들이 각자의 역할을 수행했지만, 이들을 함께 사용하는 과정은 종종 혼란스럽고 비효율적이었습니다. 이러한 문제를 해결하기 위해 등장한 것이 바로 Poetry입니다.

Poetry란?

Poetry는 Python 프로젝트의 의존성 관리와 패키징을 위한 현대적인 도구입니다. 2018년에 Sébastien Eustace에 의해 처음 공개된 이후, Python 커뮤니티에서 빠르게 인기를 얻고 있습니다. Poetry는 Node.js의 npm이나 Ruby의 Bundler와 같은 역할을 Python 생태계에서 수행합니다.

Poetry의 주요 기능

의존성 관리

Poetry의 가장 큰 장점 중 하나는 프로젝트 의존성을 쉽고 효율적으로 관리하는 기능입니다.

# 의존성 추가
poetry add requests

# 개발 의존성 추가
poetry add pytest --dev

# 의존성 제거
poetry remove requests

Poetry는 의존성 해결을 위해 강력한 알고리즘을 사용하여 호환되는 패키지 버전을 찾아냅니다. 이는 “의존성 지옥”이라 불리는 문제를 효과적으로 해결합니다.

가상 환경 관리

Poetry는 프로젝트별 가상 환경을 자동으로 생성하고 관리합니다.

# 가상 환경 내에서 명령 실행
poetry run python script.py

# 가상 환경 쉘 활성화
poetry shell

기본적으로 Poetry는 프로젝트 외부의 중앙 위치에 가상 환경을 생성하지만, 설정을 통해 프로젝트 디렉토리 내에 가상 환경을 생성하도록 변경할 수 있습니다.

프로젝트 패키징 및 배포

Poetry는 Python 패키지를 쉽게 빌드하고 PyPI에 배포할 수 있는 기능을 제공합니다.

# 패키지 빌드
poetry build

# PyPI에 배포
poetry publish

이전에는 setup.py, setup.cfg, MANIFEST.in 등 여러 파일을 생성하고 관리해야 했던 복잡한 과정이 Poetry에서는 단일 pyproject.toml 파일로 단순화됩니다.

Poetry 시작하기

설치

Poetry를 설치하는 가장 권장되는 방법은 공식 설치 스크립트를 사용하는 것입니다:

curl -sSL https://install.python-poetry.org | python3 -

Windows에서는 PowerShell을 사용할 수 있습니다:

(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

새 프로젝트 생성

Poetry를 사용하여 새 Python 프로젝트를 생성하는 방법은 매우 간단합니다:

poetry new my-project

이 명령은 다음과 같은 구조의 프로젝트를 생성합니다:

my-project/
├── pyproject.toml
├── README.md
├── my_project/
│   └── __init__.py
└── tests/
    └── __init__.py

기존 프로젝트에 Poetry 추가

이미 존재하는 프로젝트에 Poetry를 적용하려면:

cd my-project
poetry init

이 명령은 대화형 프롬프트를 통해 pyproject.toml 파일을 생성합니다.

pyproject.toml

Poetry의 핵심은 pyproject.toml 파일입니다. 이 파일은 PEP 518에서 정의된 표준 형식을 따르며, 프로젝트의 메타데이터와 의존성 정보를 포함합니다.

[tool.poetry]
name = "my-project"
version = "0.1.0"
description = "A sample Python project"
authors = ["Your Name <your.email@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.8"
requests = "^2.28.1"

[tool.poetry.group.dev.dependencies]
pytest = "^7.1.3"
black = "^22.8.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

실제 사용 사례

의존성 잠금 (Lock)

Poetry의 중요한 기능 중 하나는 의존성 잠금 메커니즘입니다. poetry.lock 파일은 프로젝트의 모든 직접 및 간접 의존성의 정확한 버전을 저장합니다.

# 의존성 설치 및 lock 파일 생성/업데이트
poetry install

이 기능은 “내 컴퓨터에서는 작동합니다”라는 문제를 효과적으로 해결하며, 모든 개발자와 배포 환경에서 동일한 패키지 버전을 사용하도록 보장합니다.

개발 워크플로우

Poetry는 개발 워크플로우를 크게 개선합니다:

1. 프로젝트 설정

poetry new my-project
cd my-project

2. 의존성 추가

poetry add fastapi uvicorn
poetry add pytest black flake8 --dev

3. 개발 환경 활성화

poetry shell

4. 애플리케이션 실행

poetry run uvicorn app:app --reload

5. 테스트 실행

poetry run pytest

Poetry vs 다른 도구들

Poetry vs pip + virtualenv

전통적인 pipvirtualenv의 조합에 비해 Poetry는:

  • 의존성 해결이 더 정교함
  • 단일 명령어로 가상 환경 생성 및 의존성 설치 가능
  • requirements.txt보다 더 표현력 있는 의존성 명세 제공

Poetry vs Pipenv

Pipenv는 Poetry와 유사한 목표를 가진 도구이지만:

  • Poetry가 더 빠른 의존성 해결 알고리즘 사용
  • Poetry는 패키징 기능 내장
  • Poetry의 pyproject.toml이 Pipenv의 Pipfile보다 더 표준화됨

Poetry vs Conda

Conda는 더 넓은 범위의 패키지(Python 외 바이너리 포함)를 관리할 수 있지만:

  • Poetry는 Python 생태계에 더 특화됨
  • PyPI와 더 긴밀하게 통합됨
  • 더 가벼움

고급 기능

여러 환경 설정

Poetry는 다양한 환경(개발, 테스트, 프로덕션 등)에 대한 의존성을 효과적으로 관리할 수 있습니다:

[tool.poetry.dependencies]
python = "^3.8"
requests = "^2.28.1"

[tool.poetry.group.dev.dependencies]
pytest = "^7.1.3"
black = "^22.8.0"

[tool.poetry.group.docs.dependencies]
sphinx = "^5.2.0"

특정 그룹의 의존성만 설치할 수 있습니다:

poetry install --with dev,docs

플러그인 시스템

Poetry는 확장 가능한 플러그인 시스템을 제공합니다. 예를 들어, poetry-dynamic-versioning은 버전 관리를 자동화하고, poetry-plugin-exportrequirements.txt 파일을 생성할 수 있게 해줍니다.

# 플러그인 설치
poetry self add poetry-plugin-export

# requirements.txt 생성
poetry export -f requirements.txt -o requirements.txt

환경 변수 및 시크릿 관리

Poetry는 .env 파일을 자동으로 로드하는 기능을 제공합니다:

poetry run python -c "import os; print(os.environ['API_KEY'])"

모범 사례

poetry.lock 파일을 버전 관리에 포함하기

# .gitignore에 poetry.lock을 제외하지 마세요!
git add pyproject.toml poetry.lock
git commit -m "Updated dependencies"

이렇게 하면 모든 팀원이 동일한 환경에서 작업할 수 있습니다.

의존성 그룹 활용하기

[tool.poetry.group.dev.dependencies]
pytest = "^7.1.3"

[tool.poetry.group.lint.dependencies]
black = "^22.8.0"
flake8 = "^5.0.4"

[tool.poetry.group.docs.dependencies]
sphinx = "^5.2.0"

의존성 버전 지정 이해하기

dependencies = {
    "exact-version": "1.2.3",       # 정확히 1.2.3
    "caret-version": "^1.2.3",      # >=1.2.3 <2.0.0
    "tilde-version": "~1.2.3",      # >=1.2.3 <1.3.0
    "greater-version": ">=1.2.3",   # 1.2.3 이상
    "wildcard-version": "1.2.*",    # >=1.2.0 <1.3.0
}

결론

Poetry는 Python 프로젝트 관리의 많은 고통 포인트를 해결하는 강력한 도구입니다. 의존성 관리, 가상 환경 설정, 패키징, 배포 등 다양한 작업을 단순화하고 효율적으로 만들어 줍니다. Python 개발 워크플로우를 현대화하고 싶다면, Poetry는 훌륭한 선택입니다.

Python 생태계는 지속적으로 발전하고 있으며, Poetry는 이러한 발전의 중요한 부분입니다. 기존의 복잡한 도구 조합을 단일 도구로 대체함으로써, Poetry는 Python 개발자들이 프로젝트 관리보다 실제 코드 작성에 더 집중할 수 있게 해줍니다.

Poetry를 통해 Python 프로젝트 관리의 새로운 시대를 경험해보세요!

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤