UV๋ Rust๋ก ๊ตฌํ๋ ์ด๊ณ ์ Python ํ๊ฒฝ ๊ด๋ฆฌ ๋๊ตฌ๋ก, Python ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๋ฉฐ ๊ฐ๋ ฅํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๊ธฐ์กด์ ์ฌ๋ฌ ๋๊ตฌ๋ค(pyenv, pip, pipenv, venv ๋ฑ)์ ํ๋๋ก ํตํฉํ์ต๋๋ค.
(๊นํ๋ธ) https://github.com/astral-sh/uv/blob/main/README.md

์ด ๊ฐ์ด๋์์๋ UV์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ์ค๋ฌด ์ ์ฉ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
UV๋ Astral์์ ๊ฐ๋ฐํ Rust ๊ธฐ๋ฐ์ Python ํ๊ฒฝ ๊ด๋ฆฌ ๋๊ตฌ๋ก, Python ์ํ๊ณ์์ ์ฌ์ฉ๋๋ ๋ค์ํ ๋๊ตฌ๋ค์ ํ๋์ ํตํฉ๋ CLI๋ก ์ ๊ณตํฉ๋๋ค.
pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv ๋ฑ์ ๋์ฒดํ ์ ์์ต๋๋ค.
pyproject.toml์ ํ์ค์ผ๋ก ์ฌ์ฉํ์ฌ PEP 621 ์ค์https://docs.astral.sh/uv/getting-started/installation/#standalone-installer
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
curl -LsSf https://astral.sh/uv/install.sh | sh
pip install uv
uv --version
๐ก ์ฐธ๊ณ : UV๋ฅผ ์ ์ญ์ผ๋ก ์ค์นํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
pip install uv๋ก ์ค์นํ ๊ฒฝ์ฐ ํน์ ํ๊ฒฝ์ ์ข ์๋๊ธฐ ๋๋ฌธ์, ์์ ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ค์น ๋ฐฉ๋ฒ์ด ๋ ํจ๊ณผ์ ์ ๋๋ค.
UV๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด pyenv์ ์ ์ฌํ๊ฒ ๋ค์ํ Python ๋ฒ์ ์ ์ค์นํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ต์ ํ์ด์ฌ ์ค์น:
uv python install
ํน์ ๋ฒ์ ํ์ด์ฌ ์ค์น:
uv python install 3.12
๋ณต์๊ฐ ํน์ ๋ฒ์ ํ์ด์ฌ ์ค์น:
uv python install 3.11 3.12
์ค์น ์ ์๋ฌ, ๋๋ ๋ค์ ์ค์น๊ฐ ํ์ํ ๊ฒฝ์ฐ
uv python install --reinstall
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
uv python install <๋ฒ์ > | ์ง์ ํ Python ๋ฒ์ ์ค์น (uv python install 3.12) |
uv python list | ์ค์น ๊ฐ๋ฅํ Python ๋ฒ์ ๋ชฉ๋ก ํ์ |
uv use <๋ฒ์ > | ํ์ฌ ๋๋ ํ ๋ฆฌ์ .python-version ํ์ผ ์์ฑํ์ฌ ๊ธฐ๋ณธ Python ๋ฒ์ ์ง์ |
๐ก ๊ณ ๊ธ ๊ธฐ๋ฅ:
uv python install --with-patches <ํจ์น๋ช > <๋ฒ์ >๊ณผ ๊ฐ์ด ํน์ ํจ์น๊ฐ ์ ์ฉ๋ Python ๋ฒ์ ์ ์ค์นํ ์๋ ์์ต๋๋ค.
Python ์ค์น ์, UV๋ python-build-standalone ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ต์ํ์ ๊ตฌ์ฑ์์๋ง ๋ค์ด๋ก๋ํฉ๋๋ค.
UV๋ ํ๋ก์ ํธ ์ด๊ธฐํ๋ฅผ ์ํ ๊ฐ๋จํ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช | ์์ฑ๋๋ ํ์ผ/๋๋ ํ ๋ฆฌ |
|---|---|---|
uv init | ๊ธฐ๋ณธ ํ๋ก์ ํธ ์ด๊ธฐํ | pyproject.toml, .python-version |
uv init --package | ํจํค์ง ํํ ํ๋ก์ ํธ ์์ฑ | pyproject.toml, .python-version, src/ ๋๋ ํ ๋ฆฌ |
uv init --lib | ๋ฐฐํฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ ์์ฑ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์กฐ์ pyproject.toml, ํ
์คํธ ๋๋ ํ ๋ฆฌ ๋ฑ |
๐ผ pyproject.toml ์์:
[project]
name = "my-project"
version = "0.1.0"
description = "A sample Python project"
requires-python = ">=3.8"
dependencies = []
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
๐ก ์ฐธ๊ณ :
uv init๋ช ๋ น์ด๋.venv๊ฐ์ํ๊ฒฝ์ ์ฆ์ ์์ฑํ์ง ์์ต๋๋ค.
- ํ์ง๋ง ์ดํ
uv add,uv run,uv sync๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
UV๋ ๊ฐ์ํ๊ฒฝ์ ํจ์จ์ ์ผ๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช | ์ฌ์ฉ ์ํฉ |
|---|---|---|
uv venv [๊ฒฝ๋ก] | ๊ฐ์ํ๊ฒฝ ์์ฑ | ํ๋ก์ ํธ์ ๋ณ๊ฐ๋ก ๋น ๋ฅด๊ฒ ๊ฐ์ํ๊ฒฝ ํ์ ์ |
uv venv -p 3.11 [๊ฒฝ๋ก] | ํน์ Python ๋ฒ์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ์์ฑ | ์์คํ Python๊ณผ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ์์ ํ์ ์ |
uv sync | pyproject.toml๊ณผ uv.lock ๊ธฐ๋ฐ์ผ๋ก .venv ๋๊ธฐํ | ํ๋ก์ ํธ ํด๋ก ํ ํ๊ฒฝ ์ฌํ ์ |
๐ผ venv ์์:
# ํน์ Python ๋ฒ์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ์์ฑ
uv venv -p 3.10 .venv-310
# ํ์ฌ ํ๋ก์ ํธ ์ค์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ๋๊ธฐํ
uv sync
ํ์ฌ ํ๋ก์ ํธ ์ค์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ๋๊ธฐํ๋?
uv sync ๋ช
๋ น์ด์ ์๋ฏธ๋ ๋จ์ํ "ํ์ฌ ๊ฒฝ๋ก์ .venv์ ๋๊ธฐํํ๋ค"๋ ์๋ฏธ๊ฐ ์๋๋ผ, ํ์ฌ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ์กด์ฌํ๋ pyproject.toml ๋ฐ uv.lock ํ์ผ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ํ๊ฒฝ์ ๊ตฌ์ฑ(์ฌํ)ํ๋ค๋ ์๋ฏธ์
๋๋ค.uv init ํน์ ์๋์ผ๋ก pyproject.toml ์์ฑuv add ...uv.lock ์์ฑ๋จ.venv๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋ or ์๋ก์ด ํ๊ฒฝ์ ๋ง๋ค์์ ๊ฒฝ์ฐuv sync๋ pyproject.toml๊ณผ uv.lock์ ๊ธฐ์ค์ผ๋ก ํ์ํ ํจํค์ง๋ฅผ .venv (ํน์ ๋ค๋ฅธ ์ง์ ๋ ๊ฐ์ํ๊ฒฝ) ์ ์ค์นํ์ฌ ํ๊ฒฝ์ ์ผ๊ด์ฑ ์๊ฒ ์ฌํํ๋ ์์
์ ์ํํฉ๋๋ค.๐ก ์ฑ๋ฅ ์ด์ : UV๋ก ์์ฑํ ๊ฐ์ํ๊ฒฝ์ ํ์ค
venv๋ชจ๋๋ก ์์ฑํ ๊ฒ๊ณผ ํธํ๋์ง๋ง, ์์ฑ ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
uv venv์ uv init์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ ์๋๋ฆฌ์ค๊ฐ ๋ค๋ฆ
๋๋ค:
uv venv
.venv ๋๋ ํ ๋ฆฌ)pyproject.toml) ์์ฑํ์ง ์์uv init
pyproject.toml, .python-version ๋ฐ ๊ธฐํ ํ๋ก์ ํธ ํ์ผuv sync, uv add ๋ฑ) ์คํ ์ ์๋์ผ๋ก ์์ฑUV์ ํฐ ์ฅ์ ์ค ํ๋๋ ์ ํต์ ์ธ ๊ฐ์ํ๊ฒฝ ํ์ฑํ(activate) ๊ณผ์ ์ด ํ์ ์๋ค๋ ์ ์ ๋๋ค.
1. UV ๋ช ๋ น์ด๋ก ์ง์ ์คํ (ํ์ฑํ ๋ถํ์)
uv run python script.py
uv add requests
uv run -- python -c "import sys; print(sys.prefix)"
2. ์ ํต์ ์ธ ๊ฐ์ํ๊ฒฝ ํ์ฑํ ๋ฐฉ๋ฒ
Windows:
.\.venv\Scripts\Activate.ps1
.\.venv\Scripts\activate.bat
macOS/Linux:
source .venv/bin/activate
3. ๊ฐ์ํ๊ฒฝ Python ์ง์ ์ฐธ์กฐ
Windows:
.\.venv\Scripts\python script.py
macOS/Linux:
./.venv/bin/python script.py
UV๋ ํ๋ก์ ํธ์ ์์กด์ฑ์ pyproject.toml ํ์ผ์ ๊ธฐ๋กํ๊ณ ๊ด๋ฆฌํ๋ ํ๋์ ์ธ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. uv add ๋ช
๋ น์ด๋ ๋จ์ํ ํจํค์ง๋ฅผ ์ค์นํ๋ ๊ฒ์ ๋์ด, ํ๋ก์ ํธ ์ค์ ํ์ผ์ ์์กด์ฑ์ ์๋์ผ๋ก ์ถ๊ฐํ๊ณ ๋ฝํ์ผ์ ์
๋ฐ์ดํธํฉ๋๋ค.
uv add๋ ํ๋ก์ ํธ ๋ ๋ฒจ์ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ช
๋ น์ด์
๋๋ค. ์ด ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด:
uv.lock ํ์ผ์ ์
๋ฐ์ดํธํ์ฌ ์ ํํ ๋ฒ์ ๊ณ ์ .venv๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก ์์ฑ| ๋ช ๋ น์ด | ์ค๋ช | pyproject.toml ๋ฐ์ |
|---|---|---|
uv add <ํจํค์ง> | ํ๋ก๋์ ์์กด์ฑ ์ถ๊ฐ | โ
[project.dependencies] |
uv add --dev <ํจํค์ง> | ๊ฐ๋ฐ ์์กด์ฑ ์ถ๊ฐ | โ
[dependency-groups.dev] |
uv add --optional <๊ทธ๋ฃน> <ํจํค์ง> | ์ ํ์ ์์กด์ฑ ์ถ๊ฐ | โ
[project.optional-dependencies.<๊ทธ๋ฃน>] |
uv remove <ํจํค์ง> | ์์กด์ฑ ์ ๊ฑฐ | โ ํด๋น ์น์ ์์ ์ ๊ฑฐ |
uv lock | ๋ฝํ์ผ ์์ฑ/๊ฐฑ์ | uv.lock ํ์ผ ์
๋ฐ์ดํธ |
1. ๊ธฐ๋ณธ ์์กด์ฑ ์ถ๊ฐ
# ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
uv add pandas numpy
# ๊ฒฐ๊ณผ: pyproject.toml
[project]
dependencies = [
"pandas>=2.1.0",
"numpy>=1.26.0",
]
2. ํน์ ๋ฒ์ ์ง์
# ์ ํํ ๋ฒ์ ์ง์
uv add "requests==2.31.0"
# ๋ฒ์ ๋ฒ์ ์ง์
uv add "fastapi>=0.104.0,<1.0.0"
# ์ต์ ๋ฒ์ ๋ง ์ง์
uv add "scikit-learn>=1.3.0"
3. ๊ฐ๋ฐ ์์กด์ฑ ๊ด๋ฆฌ
# ํ
์คํธ ๋ฐ ๋ฆฐํ
๋๊ตฌ ์ถ๊ฐ
uv add --dev pytest black ruff mypy
# ๊ฒฐ๊ณผ: pyproject.toml
[dependency-groups]
dev = [
"pytest>=7.4.0",
"black>=23.10.0",
"ruff>=0.1.0",
"mypy>=1.6.0",
]
4. ์ ํ์ ์์กด์ฑ ๊ทธ๋ฃน
# ๋ฌธ์ํ ๋๊ตฌ๋ฅผ ์ ํ์ ๊ทธ๋ฃน์ผ๋ก ์ถ๊ฐ
uv add --optional docs sphinx sphinx-rtd-theme
# ML ๊ด๋ จ ํจํค์ง๋ฅผ ๋ณ๋ ๊ทธ๋ฃน์ผ๋ก ๊ด๋ฆฌ
uv add --optional ml tensorflow torch
# ๊ฒฐ๊ณผ: pyproject.toml
[project.optional-dependencies]
docs = ["sphinx>=7.0.0", "sphinx-rtd-theme>=1.3.0"]
ml = ["tensorflow>=2.14.0", "torch>=2.1.0"]
5. Git ์ ์ฅ์์์ ์ง์ ์ค์น
# ํน์ ๋ธ๋์น๋ ํ๊ทธ์์ ์ค์น
uv add "git+https://github.com/user/repo.git@main"
uv add "git+https://github.com/user/repo.git@v1.0.0"
uv add pandas๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ์งํ๋ฉ๋๋ค:
[project.dependencies]์ ํจํค์ง ์ถ๊ฐuv.lock์ ์ ํํ ๋ฒ์ ์ ๋ณด ๊ธฐ๋ก.venv์ ์ค์ ํจํค์ง ์ค์น์ด ๋ชจ๋ ๊ณผ์ ์ด ์๋ํ๋์ด ์์ด, ๊ฐ๋ฐ์๋ ๋จ์ํ uv add ๋ช
๋ น๋ง ์คํํ๋ฉด ๋ฉ๋๋ค.
๐ก ํ๋ ๋งํฌ์ ์ด์ : UV๋ ํจํค์ง ์ค์น ์ ํ๋ ๋งํฌ๋ฅผ ํ์ฉํ์ฌ ๋์ผํ ํจํค์ง๊ฐ ์ฌ๋ฌ ํ๊ฒฝ์ ์ค์น๋๋๋ผ๋ ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํฉ๋๋ค.
- ํ๋ ๋งํฌ(Hard link)๋ ๋์ผํ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์์น์์ ๊ณต์ ํ๋๋ก ํ๋ ํ์ผ ์์คํ ๊ธฐ๋ฅ์ ๋๋ค.
- UV๋ ์ด๋ฏธ ์ค์น๋ ํจํค์ง์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ณต์ฌํ์ง ์๊ณ , ๋ค๋ฅธ ๊ฐ์ํ๊ฒฝ์์ ํด๋น ํ์ผ์ ๋ํ ํ๋ ๋งํฌ๋ง ์์ฑํ์ฌ ์ฐ๊ฒฐํฉ๋๋ค.
- ์ด ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ์ํ๊ฒฝ์ด ๋์ผํ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋์คํฌ ๊ณต๊ฐ์ ์ถ๊ฐ๋ก ์๋ชจํ์ง ์์ผ๋ฉฐ, ์ค์น ์๋๋ ๋น์ฝ์ ์ผ๋ก ํฅ์๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด numpy์ ๊ฐ์ ๋ํ ํจํค์ง๋ฅผ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋๋ผ๋ ์ค์ ๋์คํฌ์๋ ํ๋๋ง ์กด์ฌํ๋ฉฐ, ๊ฐ .venv๋ ํด๋น ํ์ผ์ ๋ํ ์ฐธ์กฐ๋ง ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
UV๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ํ๊ฒฝ ๋ด์์ ๋ช
๋ น์ด์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช | ์์ |
|---|---|---|
uv run <๋ช
๋ น์ด> | ๊ฐ์ํ๊ฒฝ์์ ๋ช ๋ น์ด ์คํ | uv run python script.py |
uv run --with <ํจํค์ง> <๋ช
๋ น์ด> | ์ถ๊ฐ ํจํค์ง์ ํจ๊ป ์คํ | uv run --with rich script.py |
uv pip freeze | ์ค์น๋ ํจํค์ง ๋ชฉ๋ก ์ถ๋ ฅ | uv pip freeze > requirements.txt |
๐ผ ์์ - ์์ฃผ ์ฌ์ฉํ๋ ๋ช ๋ น์ด:
# Jupyter Lab ์คํ
uv run jupyter lab
# ํ
์คํธ ์คํ
uv run pytest
๐ก ์๋ ๊ฐ์ํ๊ฒฝ ์์ฑ:
.venv๊ฐ ์๋ ์ํ์์uv run์ ์คํํ๋ฉด, UV๋ ์๋์ผ๋ก ๊ฐ์ํ๊ฒฝ์ ์์ฑํ๊ณ ์์กด์ฑ์ ์ค์นํฉ๋๋ค.
UV๋ Python ๊ธฐ๋ฐ CLI ๋๊ตฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช | ์์ |
|---|---|---|
uv tool install <๋๊ตฌ> | CLI ๋๊ตฌ ์๊ตฌ ์ค์น | uv tool install black |
uv tool uninstall <๋๊ตฌ> | ์ค์น๋ ๋๊ตฌ ์ ๊ฑฐ | uv tool uninstall black |
uv tool list | ์ค์น๋ ๋๊ตฌ ๋ชฉ๋ก ํ์ | uv tool list |
uvx๋ CLI ๋๊ตฌ๋ฅผ ์์ ํ๊ฒฝ์์ ์คํํ๋ ๋ช
๋ น์ด๋ก, uv tool run์ ๋ณ์นญ์
๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช | ์์ |
|---|---|---|
uvx <๋๊ตฌ> [์ธ์] | ๋๊ตฌ ์์ ์ค์น ๋ฐ ์คํ | uvx black . |
uvx --from '<ํจํค์ง>' <๋ช
๋ น์ด> | ํน์ ํจํค์ง ๋ฒ์ ์ผ๋ก ์คํ | uvx --from 'ruff==0.3.0' ruff check . |
๐ก ์ฑ๋ฅ ์ต์ ํ:
uvx๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋ฐ๋ณต ์คํํ ๋ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
๋ง์ ๊ฐ๋ฐ์๋ค์ด uv add์ uv tool์ ํผ๋ํฉ๋๋ค. ๋ ๋ช
๋ น์ด๋ ํจํค์ง๋ฅผ ์ค์นํ๋ค๋ ๊ณตํต์ ์ด ์์ง๋ง, ๋ชฉ์ ๊ณผ ๋ฒ์, ์ฌ์ฉ ์๋๋ฆฌ์ค๊ฐ ์์ ํ ๋ค๋ฆ
๋๋ค.
| ๊ตฌ๋ถ | uv add | uv tool |
|---|---|---|
| ๋ชฉ์ | ํ๋ก์ ํธ ์์กด์ฑ ๊ด๋ฆฌ | CLI ๋๊ตฌ ์ ์ญ ์ค์น |
| ๋ฒ์ | ํ์ฌ ํ๋ก์ ํธ๋ง | ์์คํ ์ ์ญ(์ฌ์ฉ์ ๋ ๋ฒจ) |
| ์ค์น ์์น | .venv/ (ํ๋ก์ ํธ๋ณ ๊ฐ์ํ๊ฒฝ) | ~/.local/bin/ (์ ์ญ ๊ฒฝ๋ก) |
| pyproject.toml | โ ๊ธฐ๋ก๋จ | โ ๊ธฐ๋ก ์ ๋จ |
| uv.lock | โ ๋ฒ์ ๊ณ ์ ๋จ | โ ๋ ๋ฆฝ ๊ด๋ฆฌ |
| ์ฌ์ฉ ๋์ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ | ์คํ ๊ฐ๋ฅํ CLI ๋๊ตฌ |
| ์์ | pandas, fastapi, requests | black, ruff, pytest |
uv add๋ ํ์ฌ ์์
์ค์ธ ํ๋ก์ ํธ์์ ์ฝ๋ ๋ด์์ importํ์ฌ ์ฌ์ฉํ ํจํค์ง๋ฅผ ์ถ๊ฐํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ ์๋๋ฆฌ์ค:
# โ
๋ฐ์ดํฐ ๋ถ์ ํ๋ก์ ํธ
uv add pandas numpy matplotlib
# โ
์น ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ
uv add fastapi uvicorn sqlalchemy
# โ
๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ
uv add scikit-learn tensorflow
# โ
ํ
์คํธ ์์ฑ (๊ฐ๋ฐ ์์กด์ฑ)
uv add --dev pytest pytest-cov
ํน์ง:
.venv์ ์ค์นpyproject.toml์ ์์กด์ฑ ๊ธฐ๋กuv sync๋ก ๋์ผ ํ๊ฒฝ ์ฌํ ๊ฐ๋ฅuv tool์ ํ๋ก์ ํธ์ ๋ฌด๊ดํ๊ฒ ๋ช
๋ น์ค์์ ์ง์ ์คํํ๋ CLI ๋๊ตฌ๋ฅผ ์์คํ
์ ์ญ์ ์ค์นํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ ์๋๋ฆฌ์ค:
# โ
์ฝ๋ ํฌ๋งทํฐ ์ ์ญ ์ค์น
uv tool install black
# โ
๋ฆฐํฐ ์ ์ญ ์ค์น
uv tool install ruff
# โ
HTTP ํด๋ผ์ด์ธํธ ๋๊ตฌ
uv tool install httpie
# โ
ํ๋ก์ ํธ ์ค์บํด๋ฉ ๋๊ตฌ
uv tool install cookiecutter
ํน์ง:
~/.local/bin/)์ ์ค์น์๋๋ฆฌ์ค 1: Black ํฌ๋งทํฐ
# โ ์๋ชป๋ ์ฌ์ฉ - ํ๋ก์ ํธ ์์กด์ฑ์ผ๋ก ์ถ๊ฐ
uv add black
# โ .venv์๋ง ์ค์น๋จ, ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฌ์ฉ ๋ถ๊ฐ
# โ ๋งค ํ๋ก์ ํธ๋ง๋ค ์ค์น ํ์
# โ
์ฌ๋ฐ๋ฅธ ์ฌ์ฉ - ์ ์ญ ๋๊ตฌ๋ก ์ค์น
uv tool install black
# โ ์์คํ
์ด๋์๋ `black` ๋ช
๋ น์ด ์ฌ์ฉ ๊ฐ๋ฅ
# โ ๋ชจ๋ ํ๋ก์ ํธ์์ ๋์ผํ ๋ฒ์ ์ฌ์ฉ
์๋๋ฆฌ์ค 2: Pytest
์ผ์ด์ค A - ํ๋ก์ ํธ ์์กด์ฑ์ผ๋ก ๊ด๋ฆฌ:
uv add --dev pytest
# โ ํ์๋ค๊ณผ ๋์ผํ pytest ๋ฒ์ ๊ณต์
# โ CI/CD ํ์ดํ๋ผ์ธ์์๋ ๋์ผ ๋ฒ์ ๋ณด์ฅ
์ผ์ด์ค B - ์ ์ญ ๋๊ตฌ๋ก ์ค์น:
uv tool install pytest
# โ ๋น ๋ฅธ ํ
์คํธ ์คํ์ ์ํ ๊ฐ์ธ ํ๊ฒฝ ๊ตฌ์ฑ
# โ ํ๋ก์ ํธ๋ณ ๋ฒ์ ์ฐจ์ด ๊ฐ๋ฅ์ฑ ์กด์ฌ
์๋๋ฆฌ์ค 3: ๋ฐ์ดํฐ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
# โ
์ฌ๋ฐ๋ฅธ ์ฌ์ฉ - ํ๋ก์ ํธ ์์กด์ฑ
uv add pandas numpy matplotlib
# โ import pandas๋ก ์ฝ๋์์ ์ฌ์ฉ
# โ pyproject.toml์ ๊ธฐ๋ก๋์ด ์ฌํ ๊ฐ๋ฅ
# โ ์๋ชป๋ ์ฌ์ฉ - ์ ์ญ ๋๊ตฌ๋ก ์ค์นํ๋ฉด ์ ๋จ
uv tool install pandas # ๋ถ๊ฐ๋ฅํ๊ณ ์๋ฏธ ์์
# โ pandas๋ CLI ๋๊ตฌ๊ฐ ์๋๋ฏ๋ก tool๋ก ์ค์น ๋ถ๊ฐ
uvx๋ uv tool run์ ๋ณ์นญ์ผ๋ก, ์ค์น ์์ด ๋๊ตฌ๋ฅผ ์์๋ก ์คํํ ๋ ์ฌ์ฉํฉ๋๋ค.
# ์์๋ก black ์คํ (์ค์นํ์ง ์์)
uvx black .
# ์์๋ก cookiecutter ์คํ
uvx cookiecutter gh:user/template
# ํน์ ๋ฒ์ ์ผ๋ก ์คํ
uvx --from 'ruff==0.1.6' ruff check .
uvx์ ์ฅ์ :
ํจํค์ง๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด?
โ
โโ ์ฝ๋์์ importํด์ ์ฌ์ฉํ๋? (pandas, requests, fastapi)
โ โโ YES โ `uv add <ํจํค์ง>`
โ
โโ ๋ช
๋ น์ค์์ ์คํํ๋ ๋๊ตฌ์ธ๊ฐ? (black, ruff, httpie)
โ โโ ์์ฃผ ์ฌ์ฉํ๋?
โ โ โโ YES โ `uv tool install <๋๊ตฌ>`
โ โ โโ NO โ `uvx <๋๊ตฌ>`
โ โโ ํ๋ก์ ํธํ๊ณผ ๋ฒ์ ๊ณต์ ํ์?
โ โโ YES โ `uv add --dev <๋๊ตฌ>`
โ
โโ ํ
์คํธ/๋ฆฐํธ ๋๊ตฌ์ธ๊ฐ? (pytest, mypy)
โโ ํ๊ณผ ๋ฒ์ ํต์ผ ํ์? โ `uv add --dev`
โโ ๊ฐ์ธ ํ๊ฒฝ ๊ตฌ์ฑ์ฉ? โ `uv tool install`
ํ๋ก์ ํธ ์์กด์ฑ์ผ๋ก ๊ด๋ฆฌ (uv add):
์ ์ญ ๋๊ตฌ๋ก ๊ด๋ฆฌ (uv tool):
์ผํ์ฑ ์คํ (uvx):
์์์ ์๊ฐํ ๋ด์ฉ๋ค๊ณผ UV์ ์ฃผ์ ๊ธฐ๋ฅ๋ณ ๋ช ๋ น์ด๋ฅผ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
uv python install: Python ๋ฒ์ ์ค์นuv python list: ์ค์น ๊ฐ๋ฅํ ๋ฒ์ ๋ชฉ๋ก ํ์uv python find: ํ์ฌ ์์คํ
์์ ์ค์น๋ Python ํ์uv python pin: ํ์ฌ ํ๋ก์ ํธ์ ํน์ ๋ฒ์ ๊ณ ์ uv python uninstall: ์ค์น๋ ๋ฒ์ ์ ๊ฑฐuv run: ์คํฌ๋ฆฝํธ ์คํ (๊ฐ์ํ๊ฒฝ ์๋ ์ ์ฉ)uv add --script: ์คํฌ๋ฆฝํธ ์ ์ฉ ์์กด์ฑ ์ถ๊ฐuv remove --script: ์คํฌ๋ฆฝํธ ์์กด์ฑ ์ ๊ฑฐuv init: ํ๋ก์ ํธ ์ด๊ธฐํ (pyproject.toml ์์ฑ)uv add: ํ๋ก์ ํธ ์์กด์ฑ ์ถ๊ฐuv remove: ํ๋ก์ ํธ ์์กด์ฑ ์ ๊ฑฐuv sync: ํ๊ฒฝ ๋๊ธฐํ (uv.lock ๊ธฐ๋ฐ)uv lock: ๋ฝํ์ผ ์์ฑ ๋ฐ ์
๋ฐ์ดํธuv run: ํ๋ก์ ํธ ํ๊ฒฝ ๋ด ๋ช
๋ น์ด ์คํuv tree: ์์กด์ฑ ํธ๋ฆฌ ์๊ฐํuv build: ํ๋ก์ ํธ ๋น๋uv publish: ํจํค์ง ๋ฐฐํฌuvx ๋๋ uv tool run: ์์ ํ๊ฒฝ์์ ๋๊ตฌ ์คํuv tool install: ์ฌ์ฉ์ ์ ์ญ ๋๊ตฌ ์ค์นuv tool uninstall: ์ ์ญ ๋๊ตฌ ์ ๊ฑฐuv tool list: ์ค์น๋ ๋๊ตฌ ๋ชฉ๋กuv tool update-shell: PATH ๋ฐ์ ๋ฑ ์ ์
๋ฐ์ดํธuv venv: ๊ฐ์ํ๊ฒฝ ์์ฑ (venv ๋์ฒด)uv pip install: ํจํค์ง ์ค์นuv pip uninstall: ํจํค์ง ์ ๊ฑฐuv pip freeze: ํจํค์ง ๋ชฉ๋ก ์ถ๋ ฅ (๋ฒ์ ํฌํจ)uv pip show: ์ค์น๋ ํจํค์ง ์์ธ ์ ๋ณดuv pip check: ํจํค์ง ํธํ์ฑ ๊ฒ์ฌuv pip list: ์ค์น๋ ํจํค์ง ๋์ดuv pip tree: ์์กด์ฑ ํธ๋ฆฌ ํ์ธuv pip compile: requirements.txt์์ ๋ฝํ์ผ ์์ฑuv pip sync: ๋ฝํ์ผ ๊ธฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ ๋๊ธฐํ๊ฐ๊ฐ์ ๋ช ๋ น์ด๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ผ๋ฉฐ, ์กฐํฉํ์ฌ ์์ ํ Python ๊ฐ๋ฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
# 1. ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir ds-project
cd ds-project
# 2. ํ๋ก์ ํธ ์ด๊ธฐํ ๋ฐ Python ๋ฒ์ ์ค์
uv init --package
uv python install 3.11
uv use 3.11
# 3. ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํต์ฌ ํจํค์ง ์ค์น
uv add numpy pandas matplotlib scikit-learn
# 4. ๊ฐ๋ฐ ๋๊ตฌ ์ค์น
uv add --dev ipython jupyterlab black ruff
# 5. ํ๊ฒฝ ์ ๊ธ ๋ฐ ๋๊ธฐํ
uv lock
uv sync
# 6. Jupyter Lab ์คํ
uv run jupyter lab
์ด ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ฉด ์ผ๊ด๋ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํ๊ฒฝ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
# 1. ํ๋ก์ ํธ ์์ฑ
mkdir web-project
cd web-project
# 2. ํ๋ก์ ํธ ์ด๊ธฐํ
uv init --package
uv python install 3.12
uv use 3.12
# 3. ์น ํ๋ ์์ํฌ ๋ฐ ๊ด๋ จ ํจํค์ง ์ค์น
uv add "fastapi>=0.104.0" "uvicorn[standard]" sqlalchemy pydantic
# 4. ๊ฐ๋ฐ ๋๊ตฌ ์ค์น
uv add --dev pytest pytest-cov black ruff
# 5. ํ๊ฒฝ ์ ๊ธ ๋ฐ ๋๊ธฐํ
uv lock
uv sync
# 6. ๊ฐ๋ฐ ์๋ฒ ์คํ
uv run uvicorn src.main:app --reload
๊ธฐ์กด์ requirements.txt ๋๋ Pipfile ๊ธฐ๋ฐ ํ๋ก์ ํธ๋ฅผ UV๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋ฐฉ๋ฒ:
# 1. ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd existing-project
# 2. UV ํ๋ก์ ํธ ์ด๊ธฐํ
uv init
# 3. requirements.txt๊ฐ ์๋ ๊ฒฝ์ฐ ์์กด์ฑ ๊ฐ์ ธ์ค๊ธฐ
cat requirements.txt | xargs uv add
# 4. ํ๊ฒฝ ์ ๊ธ ๋ฐ ๋๊ธฐํ
uv lock
uv sync
๐ก ํ ํ์ ํ:
uv.lockํ์ผ์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ํฌํจํ์ฌ ๋ชจ๋ ํ์์ด ๋์ผํ ํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
| ๊ธฐ๋ฅ | ๊ธฐ์กด ๋๊ตฌ | UV | UV์ ์ฅ์ |
|---|---|---|---|
| Python ์ค์น | pyenv install 3.11 | uv python install 3.11 | ๋น ๋ฅธ ์ค์น, ์๋ ํ๊ฒฝ ์ค์ |
| ๊ฐ์ํ๊ฒฝ ์์ฑ | python -m venv .venv | uv venv .venv | 10๋ฐฐ ์ด์ ๋น ๋ฅธ ์๋ |
| ํจํค์ง ์ค์น | pip install requests | uv add requests | ์์กด์ฑ ์๋ ๊ด๋ฆฌ, ํ๋ ๋งํฌ ํ์ฉ |
| ์์กด์ฑ ๊ณ ์ | pip freeze > requirements.txt | uv lock | ์ ํํ ์์กด์ฑ ํด๊ฒฐ, ํ๋ซํผ๋ณ ์ต์ ํ |
| ํ๊ฒฝ ๋๊ธฐํ | pip install -r requirements.txt | uv sync | ๋น ๋ฅธ ์ค์น, ํ์คํ ์ฌํ์ฑ |
| ๋๊ตฌ ์คํ | pipx run black . | uvx black . | ์บ์ฑ ํ์ฉ, ๋น ๋ฅธ ์คํ |
๋ค์์ ๋์ผํ ํ๊ฒฝ์์ ๊ฐ ๋๊ตฌ์ ์ฑ๋ฅ์ ๋น๊ตํ ์์์ ๋๋ค:
| ์์ | ๊ธฐ์กด ๋๊ตฌ | UV | ์๋ ํฅ์ |
|---|---|---|---|
| ๊ฐ์ํ๊ฒฝ ์์ฑ | 2-3์ด | 0.2-0.3์ด | ~10๋ฐฐ |
| pandas ์ค์น | 15-20์ด | 2-3์ด | ~7๋ฐฐ |
| ํ๋ก์ ํธ ํ๊ฒฝ ๋๊ธฐํ | 30-60์ด | 3-6์ด | ~10๋ฐฐ |
ํน์ ํจํค์ง ์ธ๋ฑ์ค(PyPI ์ธ์ ์์ค)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ:
# ํน์ ์ธ๋ฑ์ค์์ ํจํค์ง ์ค์น
uv pip install --index-url https://my-custom-index.org/simple some-package
# pyproject.toml์ ์ธ๋ฑ์ค ์ถ๊ฐ
# [tool.uv]
# index-url = "https://my-custom-index.org/simple"
UV๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ:
# ํจํค์ง ๋น๋
uv build
# PyPI์ ๋ฐฐํฌ
uv publish
๋ค๋ฅธ ๋๊ตฌ์์ ํธํ์ฑ์ ์ํ ํ๊ฒฝ ๋ด๋ณด๋ด๊ธฐ:
# requirements.txt๋ก ๋ด๋ณด๋ด๊ธฐ
uv pip freeze > requirements.txt
# Poetry ํ์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ
uv export -f poetry > pyproject.toml
UV ์ฌ์ฉ ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ:
# ์์ธํ ๋ก๊ทธ ์ถ๋ ฅ
uv --verbose add requests
# ์บ์ ์ ๋ฆฌ
uv cache clean
# ์์กด์ฑ ํธ๋ฆฌ ํ์ธ
uv pip show --tree pandas
๋๊ท๋ชจ ๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ์์ UV๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์์กด์ฑ ํด๊ฒฐ ๋ฐ ํ๊ฒฝ ์ค์ ์๊ฐ์ด ๊ธฐ์กด ๋๋น 85% ๊ฐ์ํ์ต๋๋ค. ํนํ GPU ๋๋ผ์ด๋ฒ์ ํธํ๋๋ ์ ํํ ํจํค์ง ๋ฒ์ ์ ๋น ๋ฅด๊ฒ ์ค์นํ ์ ์์ด ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค.
CI/CD ํ์ดํ๋ผ์ธ์์ UV๋ฅผ ํ์ฉํ ๊ฒฝ์ฐ, ๋น๋ ์๊ฐ์ด ํ๊ท 72% ๋จ์ถ๋์์ต๋๋ค. ํ๋ ๋งํฌ๋ฅผ ํ์ฉํ ๋์คํฌ ๊ณต๊ฐ ์ต์ ํ๋ก ํด๋ผ์ฐ๋ ํ๊ฒฝ์์์ ๋ฆฌ์์ค ํ์ฉ๋ ๊ฐ์ ๋์์ต๋๋ค.
์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๊ตฌ์ฑ๋ ํ๋ก์ ํธ์์ UV๋ฅผ ํตํด ์ผ๊ด๋ ํ๊ฒฝ์ ์ ์งํ๋ฉด์๋ ๊ฐ ์๋น์ค๋ณ ์์กด์ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์์ต๋๋ค. ํนํ uvx๋ฅผ ํตํ ๋๊ตฌ ์คํ์ผ๋ก ๊ฐ๋ฐ์ ๊ฐ ์ผ๊ด๋ ์ฝ๋ ํ์ง์ ์ ์งํ ์ ์์์ต๋๋ค.
UV๋ Python ๊ฐ๋ฐ ํ๊ฒฝ ๊ด๋ฆฌ๋ฅผ ์ํ ์๋ก์ด ํ์ค์ ์ ์ํฉ๋๋ค. Rust ๊ธฐ๋ฐ์ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ธฐ์กด ๋๊ตฌ๋ค์ ๋ณต์ก์ฑ์ ํด์ํ๊ณ , ํ๋ก์ ํธ ์์ฑ๋ถํฐ ๋ฐฐํฌ๊น์ง ์ผ๊ด๋ ์ํฌํ๋ก์ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ ์ฃผ์ ์ฅ์ :
pyproject.toml ์ง์UV๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ Python ๊ฐ๋ฐ์๋ ํ๊ฒฝ ์ค์ ์ ์์๋๋ ์๊ฐ์ ์ค์ด๊ณ , ์ค์ ๊ฐ๋ฐ์ ๋ ์ง์คํ ์ ์์ต๋๋ค. ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ ํ๊ฒฝ ๊ด๋ฆฌ๋ฅผ ํตํด ๋ ๋์ Python ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ UV๋ก์ ์ ํ์ ๊ณ ๋ คํด๋ณด์ธ์!!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
๐ก
pyproject.toml+uv lock๊ธฐ๋ฐ ๊ด๋ฆฌ
uv pip install numpy pandas
uv pip freeze > requirements.lock.txt
[tool.uv.dependencies]
numpy = "*"
pandas = "*"
๊ทธ๋ค์, ๋ฝํ์ผ ์์ฑ:
uv pip compile > requirements.lock.txt
Git ๋ฑ์ ํตํด ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ(์: my_project/)๋ฅผ ํด๋ก
๋๋ ํ ๋ฆฌ ์ง์ ํ:
cd my_project
.venv ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ์ ๊ฒจ์ง ํจํค์ง ์ค์น:uv sync
uv pip install -r requirements.lock.txt์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค.
์ง๋ฌธ์ด ํ๋ ์์ต๋๋ค.
์ ๋ scoop ์ ์ด์ฉํด์ uv๋ฅผ ์ค์นํ์ผ๋ฉฐ ์ค์น๋ uv๋ฅผ ํ์ฉํด์ copyparty๋ฅผ ์ด์ํ๊ณ ์ถ์ต๋๋ค.
์ด๋ uv tool install copyparty ํ๋ ๋ฐฉ๋ฒ์ธ์ ์ง์ ๋ ๊ฒฝ๋ก์ copyparty๋ฅผ ์ค์นํด์ ์ด์ํ๋ ๋ฐฉ๋ฒ์ด๋ ํฅํ python ๋ฒ์ ์ ๊ทธ๋ ์ด๋์ ๋์ฒํ๋ ๋ฐฉ๋ฒ๋ค์ ๋ํ ์กฐ์ธ์ ์ข ๊ตฌํ ์ ์์๊น์?
๊ธ์์ ์๊ฐํด ์ฃผ์ ๋ฐฉ๋ฒ๊ณผ copyparty git์์ ์๊ฐํ๋ ๋ฐฉ๋ฒ(python3 -m pip install --user -U copyparty) ๋๊ฐ์ ๋ฐฉ๋ฒ์ ์ด๋ป๊ฒ ์ผ์น์์ผ์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
uv pip install --index-url https://my-custom-index.org/simple some-package
์ ์ฝ๊ณ ๊ฐ๋๋ค. ๊น๋ํ ์ ๋ฆฌ ๊ฐ์ฌํฉ๋๋ค~