uv로 파이썬 의존성 관리하기 — pip·poetry에서 뭐가 달라지나

uv로 파이썬 의존성

pip이나 poetry로 프로젝트를 돌리다가 “uv로 파이썬 의존성 관리하기”가 요즘 자주 언급돼서 검색해 보셨다면, 결론부터 말씀드릴게요. uv는 pip·pip-tools·venv·pyenv·poetry가 각각 하던 일을 명령어 하나로 묶은 도구이고, 실제로 옮길 때 달라지는 건 속도보다 “파일 구조”와 “명령어 습관” 쪽입니다. requirements.txt나 poetry.lock에 익숙하다면 처음 며칠은 명령어를 새로 외워야 하지만, 프로젝트 구조 자체는 pyproject.toml 하나로 단순해집니다.

이 글은 uv를 처음 써보는 분이 pip 프로젝트, poetry 프로젝트 각각에서 실제로 어떤 절차를 거치는지, 그리고 옮겼을 때 불편해지는 지점까지 구체적으로 짚어 드립니다.

pip·poetry와 뭐가 다른가 — 파일 여러 개가 하나로 줄어듭니다

pip 기반 프로젝트는 보통 requirements.txt(때로 requirements-dev.txt까지), 가상환경 폴더, 그리고 pyenv 같은 별도 파이썬 버전 관리 도구까지 세 가지를 따로 운영합니다. poetry는 pyproject.toml과 poetry.lock으로 의존성은 정리되지만, 파이썬 버전 자체를 설치하는 기능은 없어서 pyenv를 여전히 같이 씁니다.

uv는 이 역할을 하나의 바이너리로 흡수합니다. uv python install로 파이썬 인터프리터 자체를 설치하고, uv venv로 가상환경을 만들고, uv add로 의존성을 추가하면 pyproject.toml과 uv.lock이 자동으로 갱신됩니다. 즉 “파이썬 버전 관리 + 가상환경 + 패키지 설치 + 잠금 파일”이 별도 도구 조합이 아니라 uv 하나의 서브커맨드로 처리된다는 점이 가장 큰 구조적 차이입니다.

속도 차이도 실제로 체감됩니다. uv는 Rust로 작성돼 있고, 전역 캐시에 내려받은 패키지를 하드링크로 재사용하기 때문에 같은 패키지를 여러 프로젝트에서 설치할 때 특히 빠릅니다. 다만 정확한 배수는 네트워크 환경과 패키지 구성에 따라 달라지므로, 이 글에서 임의의 수치를 단정하지는 않겠습니다.

설치와 프로젝트 생성, 명령어로 직접 확인해보세요

macOS·리눅스에서는 curl 스크립트로, 윈도우에서는 PowerShell 스크립트로 uv를 설치할 수 있고, 이미 파이썬이 있다면 pip install uv로도 설치가 됩니다. 설치 후 새 프로젝트를 만드는 흐름은 아래와 같습니다.

터미널에서 파이썬 패키지를 설치하는 개발자 화면

$ uv init demo-project
Initialized project `demo-project` at `/home/user/demo-project`

$ cd demo-project
$ uv add requests
Resolved 5 packages in 120ms
Prepared 5 packages in 340ms
Installed 5 packages in 15ms
 + certifi==2024.8.30
 + charset-normalizer==3.3.2
 + idna==3.8
 + requests==2.32.3
 + urllib3==2.2.3

$ uv run python -c "import requests; print(requests.__version__)"
2.32.3

uv add를 실행하는 순간 pyproject.toml에 requests가 의존성으로 기록되고, uv.lock에는 실제로 설치된 버전과 해시가 잠깁니다. uv run은 가상환경을 따로 activate하지 않아도 프로젝트 환경 안에서 명령을 실행해 주기 때문에, source .venv/bin/activate를 매번 치던 습관을 줄일 수 있습니다.

requirements.txt를 uv 프로젝트로 옮기는 3단계

기존 pip 프로젝트를 uv로 옮길 때는 굳이 전체 구조를 바꾸지 않고 점진적으로 진행할 수 있습니다.

  1. 프로젝트 루트에서 uv init --no-readme로 pyproject.toml만 먼저 만듭니다. 기존 파일은 건드리지 않습니다.
  2. uv add -r requirements.txt를 실행하면 requirements.txt에 적힌 패키지들이 pyproject.toml의 dependencies 항목으로 옮겨지고, 동시에 uv.lock이 생성됩니다.
  3. uv sync로 lock 파일 기준 가상환경을 맞춘 뒤, requirements.txt는 삭제하거나 CI 호환용으로 uv export --format requirements-txt로 다시 뽑아 남겨둡니다.

pip 명령을 그대로 쓰고 싶은 팀이라면 굳이 pyproject.toml로 전환하지 않고 uv pip install -r requirements.txt, uv pip compile requirements.in -o requirements.txt처럼 pip 호환 인터페이스만 가져다 쓰는 방법도 있습니다. 이 경우는 프로젝트 구조를 바꾸지 않고 설치 속도만 개선하는 절충안입니다.

poetry에서 넘어올 때 실제로 걸리는 것들

poetry 프로젝트는 pyproject.toml에 [tool.poetry] 섹션으로 의존성을 씁니다. uv는 PEP 621 표준인 [project] 섹션을 기준으로 동작하기 때문에, 이 둘은 형식이 다릅니다. uv에는 poetry 설정을 자동으로 변환해 주는 공식 명령이 없어서, [tool.poetry.dependencies] 항목을 [project.dependencies]로 손으로 옮기거나 uv add 명령을 패키지별로 다시 실행해서 새로 구성해야 합니다.

프로젝트 의존성 파일 구조를 보여주는 코드 편집기 화면

poetry의 dependency group([tool.poetry.group.dev.dependencies]) 기능은 uv의 [dependency-groups]로 대응되지만 문법이 조금 다르고, poetry 플러그인(예: poetry-dynamic-versioning)을 쓰던 프로젝트라면 uv에서 동일한 기능을 대체할 방법을 따로 찾아야 합니다. 여기서 시간이 꽤 걸릴 수 있다는 점은 미리 감안하시는 게 좋습니다.

버전 문자열 표기도 차이가 있습니다. poetry는 ^1.2.3 같은 캐럿 표기를 기본으로 쓰지만, uv가 따르는 PEP 621 표준 의존성 명세는 >=1.2.3,<2.0.0 같은 PEP 440 방식 범위 표기가 기본입니다. 이 변환도 자동화 도구 없이 수동으로 점검하는 편이 안전합니다.

uv가 안 맞는 경우도 있을까요?

세 도구를 표로 정리하면 차이가 더 분명해집니다.

항목 pip (+venv) poetry uv
의존성 파일 requirements.txt pyproject.toml + poetry.lock pyproject.toml + uv.lock
파이썬 버전 설치 미지원 (pyenv 별도) 미지원 (pyenv 별도) uv python install 내장
잠금 파일 해시 검증 pip-tools 별도 필요 기본 지원 기본 지원
가상환경 생성 python -m venv 자동 생성 uv venv / 자동 생성
CLI 도구 격리 실행 pipx 별도 미지원 uvx 내장

uv가 항상 정답은 아닙니다. conda로 CUDA·MKL 같은 비파이썬 바이너리 의존성까지 관리하던 과학계산·머신러닝 환경이라면, uv는 파이썬 패키지 영역만 다루기 때문에 conda를 완전히 대체하지 못합니다. 또 회사 CI 파이프라인이 poetry.lock 파일 형식이나 poetry 전용 사내 플러그인에 깊게 결합돼 있다면, 전환 작업량이 속도 이득보다 커질 수 있습니다. 이런 경우는 서두르지 말고 신규 프로젝트부터 uv로 시작하는 편이 현실적입니다.

오늘 사이드 프로젝트 하나만 먼저 옮겨보세요

지금까지 본 것처럼 uv로 파이썬 의존성 관리하기의 핵심은 속도보다 “파이썬 버전·가상환경·패키지·잠금 파일을 한 도구로 묶는다”는 구조 변화입니다. pip 프로젝트는 uv add -r requirements.txt 한 번으로 대부분 옮겨지고, poetry 프로젝트는 [tool.poetry]를 [project]로 수동 변환하는 작업이 필요합니다.

전체 서비스를 한 번에 옮기기보다는 운영 중이 아닌 사이드 프로젝트나 스크립트 하나부터 uv init으로 시작해 보시길 권합니다. 명령어 체계에 익숙해진 뒤 CI 설정과 팀 컨벤션까지 손볼 시점을 잡는 편이 안전합니다. 명령어와 옵션의 최신 목록은 uv 공식 문서에서 확인하실 수 있고, pyproject.toml 표준 명세 자체가 궁금하다면 PyPA의 pyproject.toml 규격 문서를, 가상환경의 기본 동작 원리는 파이썬 공식 문서의 venv 설명을 참고하시면 됩니다.

pandas read_csv가 파일 크기의 3배를 먹는 이유와 해결법

Leave a Comment