5개의 도구를 번갈아 사용하지 마세요, Python의 uv가 모든 것을 해결합니다 (그리고 매우 빠릅니다)
요약
Python 패키지 및 프로젝트 관리 도구인 uv를 소개합니다. Rust로 작성되어 pip, pyenv, venv 등 기존의 여러 도구를 하나로 대체하며, 압도적인 속도와 간편한 워크플로우를 제공합니다.
핵심 포인트
- pip, pyenv, venv 등 5개 도구를 uv 하나로 통합 대체 가능
- Rust 기반으로 pip 대비 10~100배 빠른 성능 제공
- 하드 링크와 글로벌 캐시를 활용한 초고속 패키지 설치
- Python 버전 관리부터 프로젝트 초기화까지 단일 도구로 해결
Python을 1년 이상 작성해 보셨다면, 그 의식을 알고 계실 겁니다. 새로운 프로젝트. 새로운 터미널. 그리고 나서:
pyenv install 3.12.3
pyenv local 3.12.3
python -m venv .venv
...
코드 한 줄을 쓰기도 전에 6개의 명령어를 입력해야 합니다. 게다가 아무것도 고장 나지 않았을 때의 이야기입니다.
uv의 등장: pip, virtualenv, pip-tools, pyenv, 그리고 pipx를 대체하는 단일 바이너리입니다. Rust로 작성되었습니다. pip보다 10~100배 빠릅니다. 그리고 솔직히 말해서, 지난 몇 년간 Python 생태계에서 사용해 본 도구 중 가장 즐거운 도구 중 하나입니다.
자세히 살펴보겠습니다.
uv란 무엇인가?
uv는 모두가 갈아타고 다시는 돌아보지 않은 린터(linter)인 ruff를 만든 Astral 팀이 구축한 Python 패키지 및 프로젝트 관리자입니다. 목표는 간단합니다. Python을 위한 Cargo가 되는 것입니다. 하나의 도구, 하나의 락파일(lockfile), 마찰 없는 환경.
이것은 Python 의존성이 전혀 없는 독립형 바이너리이며, 이는 Python이 설치되기 전에도 작동함을 의미합니다.
uv 설치하기
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
...
확인:
uv --version
# uv 0.9.x
속도 주장은 진짜인가?
네. 부끄러울 정도로 빠릅니다.
다음은 Apple Silicon(Python 3.14)에서의 시간 측정 비교입니다:
| 작업 | pip / venv | uv |
|---|---|---|
| 가상 환경 생성 (Create virtual env) | ~2초 | 35밀리초 (milliseconds) |
| ... |
웜 캐시(warm cache) 케이스는 uv가 진정으로 빛을 발하는 부분입니다. uv는 글로벌 캐시를 사용하며 패키지를 환경으로 복사하는 대신 하드 링크(hard-links)를 사용합니다. 만약 이전 프로젝트에서 requests를 설치했다면, 다음 프로젝트에서는 거의 즉시 사용할 수 있습니다.
새로운 프로젝트 시작하기
이 부분에서 uv는 완전히 다른 세상처럼 느껴집니다:
uv init my-api
cd my-api
이 단일 명령어가 다음을 제공합니다:
my-api/
├── .git/
├── .venv/ ← 이미 생성됨
...
별도의 python -m venv, git init, 템플릿 복사 과정이 필요 없습니다. 모든 것이 준비되어 있습니다.
Python 버전 관리
uv 이전에는 이것이 pyenv를 의미했습니다. 이제는 다음과 같습니다:
# 모든 Python 버전 설치
uv python install 3.12
...
uv는 시스템에 설치된 Python과는 독립적으로 자체적인 Python 설치를 관리합니다. 더 이상 which python3 명령어로 혼란을 겪을 필요가 없습니다.
의존성 추가 및 제거 (Adding and Removing Dependencies)
# 패키지 추가 (pyproject.toml + uv.lock 업데이트)
uv add fastapi
...
무엇이 빠졌는지 주목해 보세요: pip install도 없고, pip freeze > requirements.txt도 없으며, pyproject.toml을 수동으로 편집할 필요도 없습니다. uv add가 이 모든 과정을 원자적(atomically)으로 처리합니다.
uv.lock 파일은 운영체제(OS)에 관계없이 팀 전체가 사용할 수 있는 크로스 플랫폼(cross-platform) 및 크로스 Python 버전(cross-Python-version) 단일 잠금 파일(lockfile)입니다.
가상 환경(Venv) 활성화 없이 명령 실행하기
이것은 실무에서 큰 차이를 만드는 작은 기능입니다:
# 대신에: source .venv/bin/activate && python main.py
uv run main.py
...
uv run은 프로젝트의 가상 환경(virtual environment)을 자동으로 사용합니다. 이제 더 이상 활성화(activation)에 대해 고민할 필요가 없습니다.
일회성 도구 실행을 위한 pipx 대체
pipx는 격리된 환경에서 CLI 도구를 실행할 수 있게 해줍니다. uv 역시 이 기능을 제공합니다:
# 도구를 전역(globally)으로 설치하지 않고 실행
uvx ruff check .
uvx black --check src/
...
uvx는 Python의 npx와 같습니다. 도구를 한 번 실행하고, 환경을 더럽히지 마세요.
인라인 스크립트 의존성 (Inline Script Dependencies)
이것은 잘 알려지지 않았지만 스크립팅에 매우 유용한 기능입니다:
# /// script
# requires-python = ">=3.11"
# dependencies = ["httpx", "rich"]
...
다음 명령으로 실행하세요:
uv run my_script.py
uv는 인라인 메타데이터(inline metadata)를 읽고, 임시 격리 환경을 생성하며, httpx와 rich를 설치한 뒤 스크립트를 실행합니다. 수동 설정이 필요 없습니다. 팀원들과 공유하는 일회성 자동화 스크립트에 완벽합니다.
기존 프로젝트 마이그레이션 (Migrating an Existing Project)
이미 requirements.txt나 Poetry 프로젝트를 가지고 계신가요? 마이그레이션은 매우 간편합니다:
# requirements.txt로부터
uv init
uv add $(cat requirements.txt)
...
또한 uv는 워크플로우를 즉시 변경하지 않고도 속도 향상을 원하는 팀들을 위해 pip 호환 인터페이스(uv pip install, uv pip freeze 등)를 제공합니다.
사고 모델의 전환 (The Mental Model Shift)
제가 이를 내재화하는 데 잠시 시간이 걸렸던 부분이 있습니다. 전통적인 Python 도구 체계에서는 여러 계층을 관리해야 합니다:
pyenv → Python 버전
venv → 격리된 환경 (Isolated environment)
pip → 패키지 설치 (Package installation)
...
각 계층은 자신만의 상태, 설정, 그리고 실패 모드 (failure modes)를 가지고 있습니다.
uv를 사용하면 사고 모델 (mental model)이 훨씬 더 단순해집니다:
uv → 모든 것
단 하나의 도구가 Python 버전, 환경, 의존성 (dependencies), 락파일 (lockfiles), 그리고 도구 실행을 모두 관리합니다. 인지적 부하 (cognitive overhead)가 그냥... 사라져 버립니다.
여전히 주의해야 할 점
uv는 프로덕션 환경에서 사용할 준비가 되어 있지만, 다음과 같은 특이사항을 알아둘 가치가 있습니다:
- Conda 환경: uv는 conda를 대체하지 않습니다. 만약 데이터 과학 분야에 종사하며 네이티브 패키지나 CUDA 빌드를 위해 conda에 의존하고 있다면, uv는 아직 완전한 대체재가 아닙니다.
- 복잡한 빌드 요구사항: 특수한 컴파일러나 시스템 라이브러리가 필요한 패키지들도 잘 작동하지만, pip를 사용할 때와 마찬가지로 해당 시스템 의존성 (system deps)이 갖춰져 있어야 합니다.
- 아직 1.0 버전 이전임: uv는 현재 ~0.9.x 버전입니다. API는 일상적인 사용에 안정적이지만, 이를 기반으로 엔터프라이즈급 도구를 구축하고 있다면 변경 로그 (changelog)를 계속 주시해야 합니다.
결론
uv는 Python 생태계가 필요로 했던 도구 체계의 재설정 (reset)입니다. 이것은 실험적인 것이 아니라 빠르고, 실용적이며, 수년간 함께 사용하기에 어색했던 도구 스택을 진정으로 대체합니다.
새로운 프로젝트를 시작한다면: uv init으로 시작하세요. 이전 방식이 그리워지지 않을 것입니다.
기존 프로젝트라면: 먼저 pip 대신 uv pip install로 교체해 보세요. 단 한 글자만 바꾸면 되며, 즉시 속도 차이를 느낄 수 있을 것입니다. 그 이후에 전체 워크플로우를 채택하는 것은 자연스러운 다음 단계가 될 것입니다.
이 내용이 유용했다면 ❤️를 남겨주시거나, 프로젝트를 시작하기 위해 여전히 6개의 명령어를 입력하고 있는 누군가에게 공유해 주세요. 더 깊이 알고 싶다면 docs.astral.sh/uv에 있는 uv 문서가 정말 훌륭합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기