Poetry는 Python 프로젝트에서 의존성 관리와 패키지 관리의 복잡성을 해결하기 위한 도구로, 간결하고 직관적인 방식으로 프로젝트를 생성하고 관리할 수 있도록 도와준다. 기존에 Python 생태계에서 많이 사용되던 도구들인 pip, virtualenv, setuptools, requirements.txt 등의 다양한 패키지 관리 방식을 통합하여 일관된 워크플로우를 제공한다. 이를 통해 개발자는 더 간편하게 의존성 관리, 패키징, 빌드, 배포까지 처리할 수 있다.

Poetry의 주요 특징

Poetry의 특징은 다음과 같다.

  1. 의존성 관리 통합
    Poetry는 의존성 관리와 패키지 관리 기능을 모두 하나의 툴에서 제공한다. 기존에는 pip를 통해 패키지를 설치하고, requirements.txt로 의존성을 관리하는 방식이 많이 사용되었으나, 이는 복잡한 의존성 트리의 문제나 충돌이 발생할 가능성이 높다. Poetry는 이러한 문제를 해결하기 위해 프로젝트 내의 의존성과 하위 의존성까지 포함한 모든 의존성을 하나의 관리 체계로 통합한다.

  2. 가상 환경 자동 관리
    Python 프로젝트에서는 가상 환경을 사용하는 것이 필수적이다. 가상 환경은 시스템의 Python 설치와 독립적으로 프로젝트별로 별도의 패키지 환경을 제공하여 충돌을 방지한다. Poetry는 프로젝트를 생성할 때 자동으로 가상 환경을 생성해주며, 별도의 설정 없이도 프로젝트와 연결된 가상 환경을 사용하도록 지원한다.

  3. pyproject.toml을 통한 설정
    Poetry는 프로젝트의 메타 정보를 관리하고 의존성을 정의하기 위해 pyproject.toml 파일을 사용한다. 이 파일은 기존의 setup.py, requirements.txt, Pipfile 등을 대체하며, 직관적이고 명료한 형식으로 프로젝트 설정을 제공한다.

```toml [tool.poetry] name = "my_project" version = "0.1.0" description = "A simple Python project" authors = ["Author Name email@example.com"]

[tool.poetry.dependencies] python = "^3.8" flask = "^2.0"

[tool.poetry.dev-dependencies] pytest = "^6.0" ```

  1. 의존성 버전 고정과 잠금
    Poetry는 의존성 버전을 명확하게 고정할 수 있으며, 의존성 트리 전체를 poetry.lock 파일에 잠급니다. 이 방식은 모든 개발자들이 동일한 의존성 버전을 사용할 수 있도록 하여, 일관된 개발 환경을 제공한다. poetry.lock 파일은 프로젝트의 안정성과 재현성을 보장하기 때문에, 협업 시에도 중요한 역할을 한다.

  2. 간편한 빌드 및 배포
    Poetry는 프로젝트를 패키지로 빌드하고, PyPI(Python Package Index)나 개인 저장소로 배포하는 기능도 지원한다. 이를 통해 개발자는 패키지 배포 과정에서의 복잡성을 줄일 수 있다.

  3. 의존성 충돌 해결
    다양한 라이브러리나 패키지를 사용하는 대규모 프로젝트에서는 종종 의존성 충돌이 발생할 수 있다. Poetry는 이런 충돌을 미리 감지하고 자동으로 해결 방법을 제안한다. 이를 통해 개발자는 별도의 복잡한 작업 없이 충돌 문제를 간단히 처리할 수 있다.

Poetry의 장점

Poetry를 사용하면 다음과 같은 장점을 누릴 수 있다.

  1. 일관된 워크플로우
    여러 도구를 조합하는 대신, Poetry는 하나의 툴로 모든 작업을 처리할 수 있는 일관된 워크플로우를 제공한다. 프로젝트 생성부터 의존성 관리, 빌드, 배포까지 하나의 도구 안에서 쉽게 관리할 수 있다.

  2. 의존성 충돌 방지
    Poetry의 의존성 해결 메커니즘 덕분에 패키지 의존성 간 충돌을 사전에 방지할 수 있으며, 잠금 파일을 통해 동일한 개발 환경을 보장받을 수 있다.

  3. 쉽고 직관적인 설정
    pyproject.toml 파일은 간결하고 직관적이어서, 복잡한 설정 파일을 별도로 작성할 필요 없이 프로젝트를 쉽게 설정할 수 있다.

  4. 자동 가상 환경 관리
    가상 환경을 별도로 관리하는 수고를 덜어주며, 프로젝트별로 자동 생성된 가상 환경을 바로 사용할 수 있다. 이로 인해 환경 설정 및 충돌 문제를 최소화할 수 있다.

  5. 배포 과정 간소화
    Poetry는 빌드와 배포 과정을 자동화하여, 개발자가 복잡한 설정이나 명령어를 알 필요 없이 패키지를 쉽게 배포할 수 있도록 지원한다.

Poetry의 작동 방식

Poetry는 Python 프로젝트의 관리에서 중요한 두 가지 측면을 자동화한다: 의존성 관리가상 환경 관리이다. 이 두 기능을 통해 프로젝트의 설치, 업데이트, 배포 등을 간편하게 할 수 있으며, 특히 의존성 문제를 해결하는 데 강력한 도구이다.

1. 의존성 관리

Poetry는 의존성 설치 및 관리에서 중요한 역할을 한다. 의존성을 정의하는 방식은 pyproject.toml 파일을 통해 이루어지며, 이 파일에서 필요한 패키지와 해당 패키지의 버전 범위를 명시할 수 있다.

의존성 설치 명령어

의존성을 설치할 때는 다음 명령어를 사용할 수 있다.

poetry add <패키지 이름>

예를 들어 requests 패키지를 추가하려면:

poetry add requests

이 명령어는 패키지를 설치하면서 동시에 pyproject.toml 파일에 해당 패키지를 의존성으로 추가하고, 잠금 파일(poetry.lock)에도 반영한다.

의존성 범위 설정

특정 버전의 패키지를 설치하고 싶을 때는 버전 번호를 명시할 수 있다. 예를 들어 requests 패키지의 2.x 버전만 설치하고 싶다면:

poetry add requests@^2.0

이 명령어는 requests의 2.0 이상 3.0 미만의 버전을 설치하게 된다.

개발 의존성과 일반 의존성

일반적으로 개발 중에만 필요한 패키지와 실제 배포 시 필요한 패키지를 구분해서 관리해야 한다. Poetry는 dev 의존성이라는 개념을 제공하여, 테스트나 개발 도구와 같은 패키지는 별도로 설치할 수 있다.

개발 의존성을 추가할 때는 다음과 같이 --dev 옵션을 사용한다.

poetry add --dev pytest

이 명령어는 테스트 도구인 pytest를 개발 의존성으로 추가하여, 프로덕션 환경에서는 설치되지 않도록 한다.

2. 가상 환경 관리

Poetry는 프로젝트별로 자동으로 가상 환경을 생성하고 관리한다. 이로 인해 프로젝트 간의 의존성 충돌을 방지할 수 있으며, 각각의 프로젝트가 독립적인 패키지 환경을 유지하게 된다.

가상 환경 확인

Poetry가 만든 가상 환경의 경로를 확인하려면 다음 명령어를 사용할 수 있다.

poetry env info

이 명령어는 가상 환경의 경로 및 Python 버전, 활성화된 상태 등을 표시해 준다.

가상 환경 활성화

Poetry는 가상 환경을 자동으로 관리하지만, 수동으로 활성화하고 싶은 경우에는 다음 명령어를 사용할 수 있다.

poetry shell

이 명령어를 실행하면 프로젝트와 연결된 가상 환경이 활성화되어, 그 상태에서 명령을 실행할 수 있다.

가상 환경 비활성화

활성화된 가상 환경을 비활성화하려면 단순히 쉘에서 exit 명령을 실행하면 된다.

exit

이를 통해 가상 환경을 벗어나 일반 환경으로 돌아간다.

3. 잠금 파일과 버전 고정

Poetry는 의존성 관리를 더 철저히 하기 위해 잠금 파일(poetry.lock)을 생성한다. 이 파일은 정확한 패키지 버전 정보를 포함하고 있어, 개발자들 사이에서 동일한 패키지 버전이 사용될 수 있도록 보장한다.

잠금 파일 생성

프로젝트에서 의존성을 추가하거나 제거할 때마다 poetry.lock 파일이 갱신된다. 이 파일을 통해 정확한 의존성 트리가 관리되며, 재현 가능한 빌드 환경을 보장한다.

잠금 파일을 통한 설치

프로젝트의 의존성을 설치할 때는 pyproject.toml 파일뿐만 아니라 poetry.lock 파일도 참조하여, 정의된 의존성 버전에 따라 패키지를 설치한다. 이를 통해 의존성 트리에 발생할 수 있는 문제를 방지한다.

poetry install

이 명령어는 잠금 파일에 정의된 버전 그대로 패키지를 설치한다.