6 분 소요

image


개요

  • Python 생태계는 오랫동안 패키지 관리, 버전 관리, 가상환경 관리, 빌드 도구 등이 파편화되어 혼란스럽다는 평가를 받아왔습니다.
  • Astral이 만든 uv는 2024년 초에 출시되어, pip, poetry, conda 등 다양한 도구들의 장점을 통합하고, Rust를 활용한 초고속 의존성 해석(Resolver)으로 큰 주목을 받고 있습니다.
  • Anthropic, OpenAI 를 포함한 실제 ML/DS(데이터 사이언스), 백엔드, 오픈소스 프로젝트 등 여러 분야에서 uv 도입 사례가 급격히 늘고 있습니다.


Python 패키징이 복잡해진 역사

image

1. 초기 시절: easy_install

  • 2000년대 후반 ~ 2010년대 초반에는 PyPI와 pip가 지금처럼 성숙하지 않았습니다.
  • 당시에는 easy_install이 사실상 유일한 선택지였고, 설치한 패키지를 제거하거나, 설치된 패키지 버전을 지정·고정하는 기능이 부족해 많은 불편이 있었습니다.

2. pip의 등장

  • pip는 requirements.txt를 통해 의존성을 고정하고 설치할 수 있는 기능을 제공하면서, 그야말로 Python 커뮤니티의 표준이 되었습니다.
  • Python 공식 패보판에도 점차 포함되어 사실상 “파이썬 하면 pip”라는 인식이 굳어지기도 했습니다.

3. conda의 등장과 머신러닝 생태계

  • conda는 주로 NumPy, SciPy 같은 과학 컴퓨팅 라이브러리를 쉽게 설치하고자 하는 목적에서 개발되었습니다.
  • 하지만 conda는 별도의 패키지 저장소(Anaconda Cloud, conda-forge)를 사용하고, pip와는 분리된 자체 의존성 해석 방식, 가상환경 관리 방식을 채택하고 있어서 생태계가 이원화되는 문제를 야기했습니다.
  • 그 결과, 리서쳐와 서비스 개발자 간의 소통 문제가 빈번히 발생해 왔습니다.

4. poetry의 부상

  • poetry는 pyproject.toml과 poetry.lock 기반으로 의존성을 엄격히 고정하고, 여러 플랫폼에서 재현 가능한 빌드를 제공한다는 점에서 각광 받았습니다.
  • 단점으로는, 복잡한 의존성을 가진 프로젝트에서 해석 속도가 느리다는 점이 종종 지적되었습니다.
  • 그럼에도 Poetry는 제대로 동작하는 것을 보장한다는 확실한 장점을 가진 덕분에, 비교적 규모가 큰 팀이나 오픈소스 프로젝트에서 널리 채택되었습니다.
  • pyenv, pipx, pienv, pip-tools 등의 도구도 각자 가상환경·의존성 관리, Python 버전 관리, 종속성 락(lock) 파일 관리 등 다양한 문제를 해결하고자 시도했습니다.
  • 하지만 이런 도구마다 관점이 달라서, 서로 비슷한 기능이 겹치거나, 설정 방식이 달라 숙련된 개발자조차 혼란스러워하는 지점이 많았습니다.


uv 소개

uv는 astral에서 Rust로 만든 파이썬 패키지 및 프로젝트 관리 도구 입니다. 가장 큰 장점은 패키지 설치가 엄청나게 빠르다는 것입니다.

기존의 pip를 비롯해 여러 패키지 관리도구와 Trio 파이썬 패키지 설치 속도를 비교한 그래프를 참고해보면, uv가 얼마나 빠른지 알 수 있습니다.

image

또한 의존성 관리를 더 효율적으로 도와줍니다. MCP(Model Context Protocol) 개발에 공식적으로 사용을 권장하면서 더욱 큰 관심을 받고 있습니다.

1. uv가 해결하려는 문제

  • uv는 Rust로 작성된 고속 의존성 해석 엔진을 앞세워, 가상환경 생성, 의존성 관리, 파이썬 버전 관리, 패키징, 포매터/린터 같은 서드파티 도구 실행을 한 번에 처리합니다.

2. 주요 특징

성능(Performance)

  • Rust 기반 Resolver로 의존성 설치 속도가 pip나 poetry 대비 10~100배 빠르다는 공식 벤치마크가 있습니다.
  • 캐싱과 최적화를 적극 활용하여 대규모 프로젝트에서도 빠른 설치 및 업데이트가 가능합니다.

사용 편의성(Usability)

  • uv add 등 단순화된 CLI 명령어로 대부분의 작업을 수행할 수 있습니다.
  • .venv 폴더나 파이썬 버전 설정(.python-version 등)을 직접 신경 쓰지 않아도 자동으로 생성·관리해줍니다.
  • Rust에서 “Carge 하나로 빌드, 의존성 관리, 패키징, 배포 등 모든 작업”을 해결하는 것처럼, Python 환경에서도 “uv 하나로” 가능하게끔 디자인되어 있습니다.
  • Astral의 CEO Charlie Marsh 및 rye 개발자 Armin Ronacher 등이 Python tooling 역사의 문제점을 충분히 연구하고, 그 교훈을 uv에 반영했습니다.
  • uv는 오픈소스로 공개되어 있으며, 활발한 커뮤니티 피드백을 받고 있습니다.
  • “단일 툴이 지배해야 생태계를 발전시킨다”라는 Armin Ronacher의 글처럼, uv를 함께 발전시키려는 커뮤니티 움직임이 확산되고 있습니다.


uv 설치

Installing uv 페이지를 참고해서 설치를 진행합니다.

설치 방법은 크게 두 가지로 나눠집니다. 기존의 패키지 관리 도구를 통해 설치하는 방법과 단독으로 독립형(standalone) 설치가 가능합니다.

독립형(standalone) 설치

MCP를 사용할 목적이면 독립형으로 설치할 것을 추천합니다.

# On Windows.
> powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# On macOS and Linux.
$ curl -LsSf https://astral.sh/uv/install.sh | sh

기존 패키지 관리 도구로 설치

# With pip.
$ pip install uv

# Or pipx.
$ pipx install uv

설치 확인

설치가 제대로 됐는지 아래의 명령으로 uv 버전을 확인합니다.

$ uv --version
uv 0.6.14 (a4cec56dc 2025-04-09)

버전 업데이트

독립형(standaline)으로 설치한 경우에만 아래의 명령으로 uv 버전을 업데이트를 할 수 있습니다.

$ uv self update


uv 명령어 구조

기존적인 사용법은 아래와 같습니다. 몇 가지 주요한 명령어를 알아보겠습니다.

사용법: uv [옵션] <명령어>

명령어:
  run      명령어나 스크립트 실행
  init     새 프로젝트 생성
  add      프로젝트에 의존성 추가
  remove   프로젝트에서 의존성 제거
  sync     프로젝트의 환경 업데이트
  lock     프로젝트의 락파일 업데이트
  export   프로젝트의 락파일을 다른 형식으로 내보내기
  tree     프로젝트의 의존성 트리 표시
  tool     Python 패키지가 제공하는 명령어 실행 및 설치
  python   Python 버전 및 설치 관리
  pip      pip 호환 인터페이스로 Python 패키지 관리
  venv     가상 환경 생성
  build    Python 패키지를 소스 배포판 및 휠로 빌드
  publish  배포판을 인덱스에 업로드
  cache    uv의 캐시 관리
  self     uv 실행 파일 관리
  version  uv 버전 표시
  help     명령어에 대한 문서 표시

주요 명령어

CLI Reference 페이지에서 모든 명령어의 옵션과 설명을 확인할 수 있습니다.

  • python
  • run
  • venv
  • init
  • add / remove
  • sync / pip / export
  • tree


uv 주요 기능

파이썬 설치: uv python

uv python 명령어를 통해서 원하는 버전의 파이썬을 한 번에 설치 가능합니다.

$ uv python install 3.12 3.13

가상환경에서 실행: uv run

uv run 명령어를 사용하여 설치되지 않은 파이썬 버전을 자동으로 설치하고, 필요한 패키지를 포함시켜 스크립트를 실행할 수 있습니다.

$ uv run --python 3.11 --with fastapi,pytest main.py
  • python 3.11이 설치되어 있지 않다면 자동으로 다운로드하고 설치
  • fastapi와 pytest 패키지를 설치
  • main.py 파일을 실행

가상 환경: uv venv

uv venv로 가상 환경을 생성하고 관리합니다. 특정 Python 버전을 사용하여 가상 환경을 생성할 수 있습니다. 설치되지 않은 파이썬 버전이면 자동으로 설치합니다.

$ uv venv --python 3.10 .venv


uv로 프로젝트 관리

프로젝트 초기화: uv init

uv init 명렁어는 프로젝트 구조를 자동으로 설정하고 필요한 기본 파일들을 생성해줍니다.

$ uv init my-app --app --python 3.11
└── my-app
   ├── .venv
   ├── README.md
   ├── main.py
   ├── pyproject.toml
   └── uv.lock
  • --app: 애플리케이션용 프로젝트 생성
  • --python <PYTHON>: 지원할 최소 파이썬 버전 지정

필요에 따라서 기존의 프로젝트에 pyproject.toml 파일만 추가해서 패키지를 설치하고 관리 할 수도 있습니다.

$ uv init --bare
  • --bare: pyproject.toml 파일만 생성
  • --script: 스크립트 생성
  • --package: 파이썬 패키지로 프로젝트 설정
  • --lib: 라이브러리용 프로젝트 생성

패키지 관리

uv add를 통해 원하는 패키지를 추가할 수 있습니다.

  • --extra <EXTRA>: 패키지의 선택적 의존성(extras)을 설치하는 데 사용
  • --dev: 개발 의존성으로 추가
  • --group <GROUP>: 특정 그룹으로 의존성 추가
$ uv add fastapi

$ uv add uvicorn --extra standard

$ uv add ruff --dev

$ uv add pytest --group test
[project]
name = "my-app"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = [
    "fastapi>=0.115.12",
    "uvicorn[standard]>=0.34.1",
]

[dependency-groups]
dev = [
    "ruff>=0.11.5",
]
test = [
    "pytest>=8.3.5",
]

의존성 패키지를 삭제할 때는 uv remove 명령어를 사용합니다. add와 유사한 옵션을 사용할 수 있습니다.

$ uv remove fastapi uvicorn
$ uv remove --dev
$ uv remove --group test

패키지 설치 및 동기화

pyproject.toml 파일이 있는 경우에는 uv sync를 사용할 수 있습니다. 다양한 옵션으로 그룹을 지정하여 패키지를 설치할 수 있습니다.

# 모든 의존성 설치 (기본값)
$ uv sync

# 개발 의존성을 제외하고 설치
$ uv sync --no-dev

# 개발 의존성만 설치
$ uv sync --only-dev

# 명시적으로 특정 의존성 포함하여 설치
$ uv sync --group test

또는 uv pip install를 통해 requirements.txt에서 패키지를 설치할 수 있습니다.

$ uv pip install -r requirements.txt

반대로 uv export 명령어를 통해 현재 설치된 패키지를 requirements.txt 파일로 만들 수 있습니다.

$ uv export -o requirements.txt

의존성 시각화

$ uv tree
my-app v0.1.0
└── fastapi v0.115.12
    ├── pydantic v2.11.3
    │   ├── annotated-types v0.7.0
    │   ├── pydantic-core v2.33.1
    │   │   └── typing-extensions v4.13.2
    │   ├── typing-extensions v4.13.2
    │   └── typing-inspection v0.4.0
    │       └── typing-extensions v4.13.2
    ├── starlette v0.46.2
    │   └── anyio v4.9.0
    │       ├── idna v3.10
    │       ├── sniffio v1.3.1
    │       └── typing-extensions v4.13.2
    └── typing-extensions v4.13.2


마무리

uv는 차세대 파이썬 패키지 및 프로젝트 관리 도구로 이미 자리를 잡고있습니다. 게다가 MCP 활용으로 인해 더욱 인지도가 높아지고 있습니다.

  • 속도: 기존 도구들보다 몇 배 더 빠른 패키지 설치 속도
  • 통합 관리: 파이썬 버전 관리부터 패키지 설치, 가상 환경 생성
  • 사용 편의성: pip와 호환되는 인터페이스로 쉽게 적응 가능
  • 프로젝트 관리: 프로젝트 초기화, 의존성 관리, 락파일 지원으로 일관된 환경 유지

태그:

카테고리:

업데이트:

댓글남기기