Browse Source

๐ŸŒ Update Korean translation for `docs/ko/docs/virtual-environments.md` (#13630)

pull/13746/head
sungchan Yeo 2 months ago
committed by GitHub
parent
commit
61cc7014cc
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 846
      docs/ko/docs/virtual-environments.md

846
docs/ko/docs/virtual-environments.md

@ -0,0 +1,846 @@
# ๊ฐ€์ƒ ํ™˜๊ฒฝ
Python ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ•  ๋•Œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ** (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๋„๊ตฌ)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์ ํŠธ ๋งˆ๋‹ค ์„ค์น˜ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// info | ์ •๋ณด
์ด๋ฏธ ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ์ด ์„น์…˜์€ ๊ฑด๋„ˆ ๋›ฐ์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
///
/// tip | ํŒ
**๊ฐ€์ƒ ํ™˜๊ฒฝ(Virtual Environment)** ์€ **ํ™˜๊ฒฝ ๋ณ€์ˆ˜(Environment Variable)** ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
**ํ™˜๊ฒฝ ๋ณ€์ˆ˜**๋Š” ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
**๊ฐ€์ƒ ํ™˜๊ฒฝ**์€ ๋ช‡๋ช‡ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋œ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
///
/// info | ์ •๋ณด
์ด ํŽ˜์ด์ง€์—์„œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ**์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ **๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ** (Python ์„ค์น˜๊นŒ์ง€ ํฌํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”.
///
## ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
๋จผ์ €, ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋ณดํ†ต ์‚ฌ์šฉ์ž ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์— `code`๋ผ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
<div class="termy">
```console
// ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™
$ cd
// ๋ชจ๋“  ์ฝ”๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ
$ mkdir code
// code ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™
$ cd code
// ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ
$ mkdir awesome-project
// ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™
$ cd awesome-project
```
</div>
## ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ
Python ํ”„๋กœ์ ํŠธ๋ฅผ **์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ**, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ **<abbr title="๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๋„ ์žˆ์ง€๋งŒ, ์ด๊ฑด ๊ฐ„๋‹จํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค">ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€</abbr>**์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
/// tip | ํŒ
์ด ์ž‘์—…์€ **ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ์„ค์ •ํ•  ๋•Œ ํ•œ๋ฒˆ๋งŒ** ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ž‘์—…ํ•  ๋•Œ ๋ฐ˜๋ณตํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
///
//// tab | `venv`
Python ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ venv ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<div class="termy">
```console
$ python -m venv .venv
```
</div>
/// details | ๋ช…๋ น์–ด ์ƒ์„ธ ์„ค๋ช…
* `python`: `python` ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
* `-m`: ํŠน์ • ๋ชจ๋“ˆ์„ ์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ ๋ชจ๋“ˆ์„ ๋ฐ”๋กœ ๋’ค์— ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
* `venv`: Python ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ `venv` ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
* `.venv`: ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ `.venv` ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
///
////
//// tab | `uv`
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด, uv๋ฅผ ํ†ตํ•ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<div class="termy">
```console
$ uv venv
```
</div>
/// tip | ํŒ
`uv`๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ `.venv` ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋ณ„๋„๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ ์ถ”๊ฐ€ ์ธ์ž๋กœ ๋„˜๊ฒจ ์ฃผ๋ฉด ๊ฒฝ๋กœ๋ฅผ ์ง€์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
///
////
ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” `.venv` ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒˆ๋กœ์šด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
/// details | `.venv` ๋˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„
๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ด€๋ก€์ ์œผ๋กœ `.venv` ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
///
## ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์„ฑํ™”
์ดํ›„ ์‹คํ–‰ํ•˜๋Š” Python ๋ช…๋ น์–ด์™€ ํŒจํ‚ค์ง€ ์„ค์น˜๊ฐ€ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋”ฐ๋ฅด๋„๋ก, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.
/// tip | ํŒ
**ํ„ฐ๋ฏธ๋„์„ ์ƒˆ๋กœ ์—ด๊ณ ** ํ”„๋กœ์ ํŠธ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ๋Š”, **ํ•ญ์ƒ ์ด ์ž‘์—…์„** ํ•ด์ฃผ์„ธ์š”.
///
//// tab | Linux, macOS
<div class="termy">
```console
$ source .venv/bin/activate
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ .venv\Scripts\Activate.ps1
```
</div>
////
//// tab | Windows Bash
Windows์—์„œ Bash(์˜ˆ: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
<div class="termy">
```console
$ source .venv/Scripts/activate
```
</div>
////
/// tip | ํŒ
๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ํ™˜๊ฒฝ์„ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๋‹น ํŒจํ‚ค์ง€๋กœ ์„ค์น˜๋œ **ํ„ฐ๋ฏธ๋„(<abbr title="command line interface">CLI</abbr>) ํ”„๋กœ๊ทธ๋žจ**์„ ์‚ฌ์šฉํ•  ๋•Œ, ์ „์—ญ์— ์„ค์น˜๋œ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ์•„๋‹ˆ๋ผ, ๊ฐ€์ƒ ํ™˜๊ฒฝ ์•ˆ์— ์„ค์น˜๋œ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
///
## ๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ํ™œ์„ฑํ™” ์—ฌ๋ถ€ ํ™•์ธ
๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (์ด์ „ ๋ช…๋ น์–ด๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค).
/// tip | ํŒ
์ด ๋‹จ๊ณ„๋Š” **์„ ํƒ ์‚ฌํ•ญ**์ด์ง€๋งŒ, ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜๋„ํ•œ ๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ํ™œ์„ฑํ™” ๋˜์—ˆ๋Š” ์ง€ **ํ™•์ธ**ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
///
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ which python
/home/user/code/awesome-project/.venv/bin/python
```
</div>
`python` ์œ„์น˜๊ฐ€ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€(์ด ์˜ˆ์‹œ์—์„œ๋Š” `awesome-project`)์˜ `.venv/bin/python` ๊ฒฝ๋กœ๋กœ ํ‘œ์‹œ๋œ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
</div>
`python` ์œ„์น˜๊ฐ€ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€(์ด ์˜ˆ์‹œ์—์„œ๋Š” `awesome-project`)์˜ `.venv\bin\python` ๊ฒฝ๋กœ๋กœ ํ‘œ์‹œ๋œ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰
////
## pip ์—…๊ทธ๋ ˆ์ด๋“œ
/// tip | ํŒ
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, `pip` ๋Œ€์‹  `uv`๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ `pip`์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž
///
`pip`์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ (Python ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค), **์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ**ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
ํŒจํ‚ค์ง€ ์„ค์น˜ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•˜๊ณ  ํŠน์ดํ•œ ์—๋Ÿฌ๋“ค์€ `pip` ์—…๊ทธ๋ ˆ์ด๋“œ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
์ด ์ž‘์—…์€ ๋ณดํ†ต ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•œ **์งํ›„ ํ•œ ๋ฒˆ๋งŒ** ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
///
๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•œ ํ›„(์•ž์„œ ์„ค๋ช…ํ•œ ๋ช…๋ น์–ด ์‚ฌ์šฉ), ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:
<div class="termy">
```console
$ python -m pip install --upgrade pip
---> 100%
```
</div>
## `.gitignore` ์ถ”๊ฐ€ํ•˜๊ธฐ
**Git**์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด (์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค), `.gitignore` ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด์„œ `.venv` ๋””๋ ‰ํ„ฐ๋ฆฌ ์ „์ฒด๋ฅผ Git์—์„œ ์ œ์™ธํ•˜์„ธ์š”.
/// tip | ํŒ
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด, ์ด๋ฏธ ์ด ์ž‘์—…์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
///
/// tip | ํŒ
์ด ์ž‘์—…๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•œ **์งํ›„ ํ•œ ๋ฒˆ๋งŒ** ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
///
<div class="termy">
```console
$ echo "*" > .venv/.gitignore
```
</div>
/// details | ๋ช…๋ น์–ด ์ƒ์„ธ ์„ค๋ช…
* `echo "*"`: ํ„ฐ๋ฏธ๋„์— `*` ํ…์ŠคํŠธ๋ฅผ "์ถœ๋ ฅ"ํ•ฉ๋‹ˆ๋‹ค (๋‹ค์Œ ์„ค๋ช…์—์„œ ์กฐ๊ธˆ ๋ฐ”๋€๋‹ˆ๋‹ค)
* `>`: ์™ผ์ชฝ ๋ช…๋ น์–ด์˜ ์ถœ๋ ฅ ๋‚ด์šฉ์„ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅํ•˜์ง€ ์•Š๊ณ , ์˜ค๋ฅธ์ชฝ์— ์ง€์ •๋œ ํŒŒ์ผ๋กœ **๊ธฐ๋ก(write)** ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
* `.gitignore`: ์ถœ๋ ฅ๋œ ํ…์ŠคํŠธ๊ฐ€ ๊ธฐ๋ก๋  ํŒŒ์ผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Git์—์„œ `*`๋Š” "๋ชจ๋“  ๊ฒƒ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `.venv` ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋ฌด์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ๊ฐ€์ง„ `.gitignore` ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
```gitignore
*
```
///
## ํŒจํ‚ค์ง€ ์„ค์น˜
๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•œ ํ›„, ๊ทธ ์•ˆ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
ํ”„๋กœ์ ํŠธ์—์„œ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ๋Š” ์ด ์ž‘์—…์„ **ํ•œ ๋ฒˆ๋งŒ** ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ํŠน์ • ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธฐ๋ฉด **๋‹ค์‹œ ์ด ์ž‘์—…์„ ๋ฐ˜๋ณต**ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
///
### ํŒจํ‚ค์ง€ ์ง์ ‘ ์„ค์น˜
๊ธ‰ํ•˜๊ฒŒ ์ž‘์—…ํ•˜๊ฑฐ๋‚˜, ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก์„ ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํŒจํ‚ค์ง€๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
ํŒจํ‚ค์ง€ ์ด๋ฆ„๊ณผ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ํŒŒ์ผ์— ์ •๋ฆฌํ•ด๋‘๋Š” ๊ฒƒ(์˜ˆ: `requirements.txt` ๋˜๋Š” `pyproject.toml`)์€ (๋งค์šฐ) ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.
///
//// tab | `pip`
<div class="termy">
```console
$ pip install "fastapi[standard]"
---> 100%
```
</div>
////
//// tab | `uv`
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
<div class="termy">
```console
$ uv pip install "fastapi[standard]"
---> 100%
```
</div>
////
### `requirements.txt`์—์„œ ์„ค์น˜
`requirements.txt` ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ์•ˆ์— ๋ช…์‹œ๋œ ํŒจํ‚ค์ง€๋“ค์„ ํ•œ ๋ฒˆ์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
//// tab | `pip`
<div class="termy">
```console
$ pip install -r requirements.txt
---> 100%
```
</div>
////
//// tab | `uv`
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
<div class="termy">
```console
$ uv pip install -r requirements.txt
---> 100%
```
</div>
////
/// details | `requirements.txt`
๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•œ `requirements.txt`์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:
```requirements.txt
fastapi[standard]==0.113.0
pydantic==2.8.0
```
///
## ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•œ ํ›„์—๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ํ•ด๋‹น ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ Python๊ณผ ํŒจํ‚ค์ง€๋“ค์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
<div class="termy">
```console
$ python main.py
Hello World
```
</div>
## ์—๋””ํ„ฐ ์„ค์ •
์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์•ž์„œ ๋งŒ๋“  ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (๋Œ€๋ถ€๋ถ„์˜ ์—๋””ํ„ฐ๋Š” ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.)
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์ด๋‚˜ ์ฝ”๋“œ ๋‚ด ์˜ค๋ฅ˜ ํ‘œ์‹œ ๊ธฐ๋Šฅ์„ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ์‹œ:
* <a href="https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment" class="external-link" target="_blank">VS Code</a>
* <a href="https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html" class="external-link" target="_blank">PyCharm</a>
/// tip | ํŒ
์ด ์„ค์ •์€ ๋ณดํ†ต ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ **์ฒ˜์Œ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ํ•œ ๋ฒˆ๋งŒ** ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
///
## ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™”
ํ”„๋กœ์ ํŠธ ์ž‘์—…์ด ๋๋‚ฌ๋‹ค๋ฉด, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ **๋น„ํ™œ์„ฑํ™”**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<div class="termy">
```console
$ deactivate
```
</div>
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ดํ›„์— `python` ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ Python์ด๋‚˜ ๊ทธ ์•ˆ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
## ์ด์ œ ์ž‘์—…ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์ด์ œ ํ”„๋กœ์ ํŠธ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
์œ„ ๋‚ด์šฉ์„ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
๊ทธ๋ ‡๋‹ค๋ฉด ๊ณ„์† ์ฝ์–ด ์ฃผ์„ธ์š”. ๐Ÿ‘‡๐Ÿค“
///
## ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€
FastAPI๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € <a href="https://www.python.org/" class="external-link" target="_blank">Python</a>์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ํ›„์—๋Š” FastAPI์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  **๊ธฐํƒ€ ํŒจํ‚ค์ง€๋“ค**์„ **์„ค์น˜**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋ณดํ†ต Python์— ๊ธฐ๋ณธ ํฌํ•จ๋œ `pip` ๋ช…๋ น์–ด(๋˜๋Š” ์œ ์‚ฌํ•œ ๋„๊ตฌ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ `pip`์„ ๊ทธ๋ƒฅ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ํŒจํ‚ค์ง€๋“ค์€ **์ „์—ญ Python ํ™˜๊ฒฝ**(์‹œ์Šคํ…œ ์ „์ฒด์— ์„ค์น˜๋œ Python)์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
### ๋ฌธ์ œ์ 
๊ทธ๋ ‡๋‹ค๋ฉด, ์ „์—ญ Python ํ™˜๊ฒฝ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ์š”?
์–ด๋А ์‹œ์ ์ด ๋˜๋ฉด, **์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค**์— ์˜์กดํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค ์ค‘ ์ผ๋ถ€๋Š” **๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „**์„ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ฑ
์˜ˆ๋ฅผ ๋“ค์–ด, `๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ(philosophers-stone)` ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€ `ํ•ด๋ฆฌ ํฌํ„ฐ(harry)`๋ผ๋Š” ํŒจํ‚ค์ง€์˜ `v1` ๋ฒ„์ „์„ **์˜์กด**ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `harry`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
```mermaid
flowchart LR
stone(philosophers-stone) -->|requires| harry-1[harry v1]
```
๊ทธ๋Ÿฐ๋ฐ ๋‚˜์ค‘์— `์•„์ฆˆ์นด๋ฐ˜์˜ ์ฃ„์ˆ˜(prisoner-of-azkaban)`์ด๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๊ณ , ์ด ํ”„๋กœ์ ํŠธ๋„ ์—ญ์‹œ `harry` ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ํ”„๋กœ์ ํŠธ๋Š” `harry`์˜ `v3` ๋ฒ„์ „์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
```mermaid
flowchart LR
azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
```
ํ•˜์ง€๋งŒ ์ด์ œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋Œ€์‹ ์— ์ „์—ญ ํ™˜๊ฒฝ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฉด, ์–ด๋–ค ๋ฒ„์ „์˜ `harry`๋ฅผ ์„ค์น˜ํ• ์ง€๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, `๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ(philosophers-stone)`์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋จผ์ € `harry` `v1` ๋ฒ„์ „์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
<div class="termy">
```console
$ pip install "harry==1"
```
</div>
๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ตญ ์ „์—ญ Python ํ™˜๊ฒฝ์—๋Š” `harry` `v1`๋ฒ„์ „์ด ์„ค์น˜๋œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
```mermaid
flowchart LR
subgraph global[global env]
harry-1[harry v1]
end
subgraph stone-project[philosophers-stone project]
stone(philosophers-stone) -->|requires| harry-1
end
```
ํ•˜์ง€๋งŒ ์ด์ œ `์•„์ฆˆ์นด๋ฐ˜์˜ ์ฃ„์ˆ˜(prisoner-of-azkaban)`์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, `harry` `v1`๋ฒ„์ „์„ ์ œ๊ฑฐํ•˜๊ณ  `harry` `v3`๋ฒ„์ „์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋˜๋Š” ๋‹จ์ˆœํžˆ `v3`๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ธฐ์กด์˜ `v1`๋ฒ„์ „์ด ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.)
<div class="termy">
```console
$ pip install "harry==3"
```
</div>
๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ œ ์ „์—ญ Python ํ™˜๊ฒฝ์—๋Š” `harry` `v3`๋ฒ„์ „์ด ์„ค์น˜๋œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ `๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ(philosophers-stone)`์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, **์ž‘๋™ํ•˜์ง€** ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ํ”„๋กœ๊ทธ๋žจ์€ `harry` `v1`๋ฒ„์ „์„ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
```mermaid
flowchart LR
subgraph global[global env]
harry-1[<strike>harry v1</strike>]
style harry-1 fill:#ccc,stroke-dasharray: 5 5
harry-3[harry v3]
end
subgraph stone-project[philosophers-stone project]
stone(philosophers-stone) -.-x|โ›”๏ธ| harry-1
end
subgraph azkaban-project[prisoner-of-azkaban project]
azkaban(prisoner-of-azkaban) --> |requires| harry-3
end
```
/// tip | ํŒ
Python ํŒจํ‚ค์ง€๋“ค์€ **์ƒˆ ๋ฒ„์ „**์—์„œ **ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ(breaking changes)**๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ตœ๋Œ€ํ•œ ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์—…ํ•˜๋ ค๋ฉด, ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด์„œ ์ƒˆ ๋ฒ„์ „์„ ์˜๋„์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
///
์ด์ œ, ์ด๋Ÿฐ ์ผ์ด ์—ฌ๋Ÿฌ๋ถ„์˜ **๋ชจ๋“  ํ”„๋กœ์ ํŠธ**๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” **์ˆ˜๋งŽ์€ ํŒจํ‚ค์ง€๋“ค**์—์„œ ๋™์‹œ์— ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ์ด๋Š” ๋งค์šฐ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ, ๊ฒฐ๊ตญ **์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฒ„์ „**์˜ ํŒจํ‚ค์ง€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ , ๊ทธ๋กœ ์ธํ•ด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์‚ฌ์šฉํ•˜๋Š” ์šด์˜์ฒด์ œ(Linux, Windows, macOS ๋“ฑ)์— ๋”ฐ๋ผ Python์ด **๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ์„ ์ˆ˜๋„** ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์šด์˜์ฒด์ œ์˜ ๋™์ž‘์— ํ•„์š”ํ•œ ํŠน์ • ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋“ค์ด ํ•จ๊ป˜ ์„ค์น˜๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ์ „์—ญ Python ํ™˜๊ฒฝ์— ์ž„์˜์˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด, ์šด์˜์ฒด์ œ์— ํฌํ•จ๋œ ํ”„๋กœ๊ทธ๋žจ ์ผ๋ถ€๊ฐ€ **๊นจ์งˆ ์œ„ํ—˜**๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
## ํŒจํ‚ค์ง€๋“ค์€ ์–ด๋””์— ์„ค์น˜๋˜๋Š”๊ฐ€
Python์„ ์„ค์น˜ํ•˜๋ฉด, ์ปดํ“จํ„ฐ์— ์—ฌ๋Ÿฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
์ด ์ค‘ ์ผ๋ถ€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ๋ณด๊ด€ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด:
<div class="termy">
```console
// ์ง€๊ธˆ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค, ๊ทธ๋ƒฅ ์˜ˆ์ œ์ผ ๋ฟ์ด์—์š” ๐Ÿค“
$ pip install "fastapi[standard]"
---> 100%
```
</div>
ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” FastAPI ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ ์••์ถ• ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๋ณดํ†ต <a href="https://pypi.org/project/fastapi/" class="external-link" target="_blank">PyPI</a>์—์„œ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.
๋˜ํ•œ FastAPI๊ฐ€ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค๋„ ํ•จ๊ป˜ **๋‹ค์šด๋กœ๋“œ**๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ **์••์ถ• ํ•ด์ œ**ํ•œ ๋’ค, ์ปดํ“จํ„ฐ์˜ ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ํŒŒ์ผ๋“ค์€ Python์ด ์„ค์น˜๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ, ์ฆ‰ **์ „์—ญ ํ™˜๊ฒฝ**์— ๋‚ด์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
## ๊ฐ€์ƒ ํ™˜๊ฒฝ์ด๋ž€
์ „์—ญ ํ™˜๊ฒฝ์— ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€, ์ž‘์—…ํ•˜๋Š” **๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๊ฐ€์ƒ ํ™˜๊ฒฝ**์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฐ€์ƒ ํ™˜๊ฒฝ์€ ์ „์—ญ ํ™˜๊ฒฝ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ํ•˜๋‚˜์˜ **๋””๋ ‰ํ„ฐ๋ฆฌ**์ด๋ฉฐ, ๊ทธ ์•ˆ์— ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ํ”„๋กœ์ ํŠธ๋Š” ์ž์ฒด์ ์ธ ๊ฐ€์ƒ ํ™˜๊ฒฝ(`.venv` ๋””๋ ‰ํ„ฐ๋ฆฌ)์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉฐ, ๊ทธ ์•ˆ์— ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ์ „์šฉ ํŒจํ‚ค์ง€๋“ค์„ ๋ณด์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
```mermaid
flowchart TB
subgraph stone-project[philosophers-stone project]
stone(philosophers-stone) --->|requires| harry-1
subgraph venv1[.venv]
harry-1[harry v1]
end
end
subgraph azkaban-project[prisoner-of-azkaban project]
azkaban(prisoner-of-azkaban) --->|requires| harry-3
subgraph venv2[.venv]
harry-3[harry v3]
end
end
stone-project ~~~ azkaban-project
```
## ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์„ฑํ™” ์˜๋ฏธ
๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์€, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:
//// tab | Linux, macOS
<div class="termy">
```console
$ source .venv/bin/activate
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ .venv\Scripts\Activate.ps1
```
</div>
////
//// tab | Windows Bash
Windows์—์„œ Bash(์˜ˆ: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
<div class="termy">
```console
$ source .venv/Scripts/activate
```
</div>
////
์ด ๋ช…๋ น์–ด๋Š” ์ดํ›„์— ์‹คํ–‰๋  ๋ช…๋ น์–ด์—์„œ ์‚ฌ์šฉ๋  [ํ™˜๊ฒฝ ๋ณ€์ˆ˜](environment-variables.md){.internal-link target=_blank} ๋ช‡ ๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ณ€์ˆ˜๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ `PATH` ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
/// tip | ํŒ
`PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด [ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฌธ์„œ์˜ PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„น์…˜](environment-variables.md#path-environment-variable){.internal-link target=_blank}์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
///
๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด, ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ๊ฒฝ๋กœ์ธ `.venv/bin` (Linux์™€ macOS) ๋˜๋Š” `.venv\Scripts`(Windows)๋ฅผ `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์˜ `PATH` ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค:
//// tab | Linux, macOS
```plaintext
/usr/bin:/bin:/usr/sbin:/sbin
```
์‹œ์Šคํ…œ์€ ๋‹ค์Œ ๊ฒฝ๋กœ๋“ค์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
* `/usr/bin`
* `/bin`
* `/usr/sbin`
* `/sbin`
////
//// tab | Windows
```plaintext
C:\Windows\System32
```
์‹œ์Šคํ…œ์€ ๋‹ค์Œ ๊ฒฝ๋กœ๋“ค์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
* `C:\Windows\System32`
////
๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•œ ํ›„์—๋Š”, `PATH` ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค:
//// tab | Linux, macOS
```plaintext
/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
์‹œ์Šคํ…œ์€ ๊ฐ€์žฅ ๋จผ์ € ๋‹ค์Œ ๊ฒฝ๋กœ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค:
```plaintext
/home/user/code/awesome-project/.venv/bin
```
๊ทธ ํ›„์— ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋“ค์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํ„ฐ๋ฏธ๋„์— `python`์„ ์ž…๋ ฅํ•˜๋ฉด, ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ์œ„์น˜์— ์žˆ๋Š” Python ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
```plaintext
/home/user/code/awesome-project/.venv/bin/python
```
๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น Python์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
////
//// tab | Windows
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
```
์‹œ์Šคํ…œ์€ ๊ฐ€์žฅ ๋จผ์ € ๋‹ค์Œ ๊ฒฝ๋กœ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค:
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts
```
๊ทธ ํ›„์— ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋“ค์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํ„ฐ๋ฏธ๋„์— `python`์„ ์ž…๋ ฅํ•˜๋ฉด, ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ๊ฒฝ๋กœ์— ์žˆ๋Š” Python ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น Python์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
////
์ค‘์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š”, ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ๊ฒฝ๋กœ๊ฐ€ `PATH` ๋ณ€์ˆ˜์˜ ๊ฐ€์žฅ **์•ž**์— ์ถ”๊ฐ€๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ Python๋“ค๋ณด๋‹ค **๋จผ์ €** ์ด ๊ฒฝ๋กœ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ„ฐ๋ฏธ๋„์—์„œ `python`์„ ์‹คํ–‰ํ•˜๋ฉด, ์ „์—ญ ํ™˜๊ฒฝ์˜ Python์ด ์•„๋‹Œ **๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์žˆ๋Š”** Python์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ: ์ „์—ญ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ `python`์ด ์žˆ๋”๋ผ๋„ ๊ทธ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.)
๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ด ์™ธ์—๋„ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ด ๋ณ€๊ฒฝ๋˜์ง€๋งŒ, ์ด๋Š” ๊ทธ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ณ€ํ™” ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
## ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™•์ธํ•˜๊ธฐ
๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ํ™œ์„ฑํ™” ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
//// tab | Linux, macOS, Windows Bash
<div class="termy">
```console
$ which python
/home/user/code/awesome-project/.venv/bin/python
```
</div>
////
//// tab | Windows PowerShell
<div class="termy">
```console
$ Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python
```
</div>
////
์ฆ‰, ํ˜„์žฌ ์‚ฌ์šฉ๋˜๋Š” `python` ํ”„๋กœ๊ทธ๋žจ์€ **๊ฐ€์ƒ ํ™˜๊ฒฝ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฒƒ**์ž…๋‹ˆ๋‹ค.
Linux์™€ macOS์—์„œ๋Š” `which`, Windows PowerShell์—์„œ๋Š” `Get-Command` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ช…๋ น์–ด๋Š” `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๊ฒฝ๋กœ๋“ค์„ **์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰**ํ•˜๋ฉด์„œ `python`์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
์ฐพ๋Š” ์ฆ‰์‹œ, ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์˜ **๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅ**ํ•ฉ๋‹ˆ๋‹ค.
์ค‘์š”ํ•œ ์ ์€ ํ„ฐ๋ฏธ๋„์—์„œ `python`์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” "`python`"์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํ˜„์žฌ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
ํ•˜๋‚˜์˜ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•œ ๋’ค, ํ•ด๋‹น Python์„ ๊ฐ€์ง„ ์ƒํƒœ์—์„œ **๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ**๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ํ”ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋•Œ ์ด์ „ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์žˆ๋Š” **์ž˜๋ชป๋œ Python ์‹คํ–‰ ํŒŒ์ผ**์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์ƒˆ ํ”„๋กœ์ ํŠธ๊ฐ€ **์ •์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.**
๊ทธ๋ž˜์„œ ํ˜„์žฌ ์–ด๋–ค `python`์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
///
## ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์ด์œ 
์˜ˆ๋ฅผ ๋“ค์–ด `๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ(philosophers-stone)`์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—… ์ค‘์ด๋ผ๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ํ•ด๋‹น **๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”**ํ•˜๊ณ , ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉฐ ์ž‘์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด์ œ๋Š” **๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ**์ธ `์•„์ฆˆ์นด๋ฐ˜์˜ ์ฃ„์ˆ˜(prisoner-of-azkaban)`์„ ์ž‘์—…ํ•˜๊ณ  ์‹ถ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ทธ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค:
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
```
</div>
๋งŒ์•ฝ `๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ(philosophers-stone)`์˜ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ํ„ฐ๋ฏธ๋„์—์„œ `python`์„ ์‹คํ–‰ํ•  ๋•Œ ์—ฌ์ „ํžˆ `๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ(philosophers-stone)` ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ Python์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
$ python main.py
// sirius๋ฅผ ์ž„ํฌํŠธํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์•„์š” ๐Ÿ˜ฑ
Traceback (most recent call last):
File "main.py", line 1, in <module>
import sirius
```
</div>
ํ•˜์ง€๋งŒ `๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ(philosophers-stone)`์˜ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `์•„์ฆˆ์นด๋ฐ˜์˜ ์ฃ„์ˆ˜(prisoner-of-azkaban)` ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด, ์ด์ œ `python` ๋ช…๋ น์–ด๋Š” `์•„์ฆˆ์นด๋ฐ˜์˜ ์ฃ„์ˆ˜(prisoner-of-azkaban)` ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ Python์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
<div class="termy">
```console
$ cd ~/code/prisoner-of-azkaban
// ์ด์ „ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์„ ํ•„์š” ์—†์ด, ์–ด๋””์„œ๋“  ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•œ ํ›„์—๋„ ๊ดœ์ฐฎ์•„์š” ๐Ÿ˜Ž
$ deactivate
// prisoner-of-azkaban/.venv ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค ๐Ÿš€
$ source .venv/bin/activate
// ์ด์ œ python์„ ์‹คํ–‰ํ•˜๋ฉด, ์ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ sirius ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค โœจ
$ python main.py
๋ชป๋œ ์ง“์„ ๊พธ๋ฏธ๊ณ  ์žˆ์Œ์„ ์—„์ˆ™ํžˆ ๋งน์„ธํ•ฉ๋‹ˆ๋‹ค.๐Ÿง™
ImportError๋Š” ์ด์ œ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿบ
```
</div>
## ๋Œ€์•ˆ๋“ค
์ด ๋ฌธ์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด Python ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , **๊ทธ ๋‚ด๋ถ€์—์„œ** ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค.
๊ฐ€์ƒ ํ™˜๊ฒฝ, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ(Requirements), ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์ด ์™ธ์—๋„ ๋‹ค์–‘ํ•œ **๋Œ€์•ˆ**๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด, **ํ”„๋กœ์ ํŠธ ์ „์ฒด**, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ, ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋“ฑ์„ ํ†ตํ•ฉ์ ์œผ๋กœ **๊ด€๋ฆฌ**ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ์จ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ ์ถ”์ฒœํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>์ž…๋‹ˆ๋‹ค.
`uv`๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
* ๋‹ค์–‘ํ•œ ๋ฒ„์ „์˜ **Python ์„ค์น˜**
* ๊ฐ ํ”„๋กœ์ ํŠธ ๋ณ„ **๊ฐ€์ƒ ํ™˜๊ฒฝ ๊ด€๋ฆฌ**
* **ํŒจํ‚ค์ง€ ์„ค์น˜**
* ํ”„๋กœ์ ํŠธ์˜ **์˜์กด์„ฑ๊ณผ ๋ฒ„์ „** ๊ด€๋ฆฌ
* ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋“ค๊ณผ ๊ทธ ๋ฒ„์ „์„ **์ •ํ™•ํžˆ ๊ณ ์ •(lock)**ํ•ด์„œ,๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์ด ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅ
* ์ด ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›
## ๊ฒฐ๋ก 
์—ฌ๊ธฐ๊นŒ์ง€ ๋ชจ๋‘ ์ฝ๊ณ  ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด์ œ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค๋ณด๋‹ค ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ **ํ›จ์”ฌ ๋” ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ด**ํ•˜๊ฒŒ ๋˜์…จ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
์ด๋Ÿฐ ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด, ์–ธ์  ๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด๋Š” ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•  ๋•Œ ๋ถ„๋ช…ํžˆ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ๋Š” **์ด ๋ชจ๋“  ๊ฒƒ๋“ค์ด ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€** ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜Ž
Loadingโ€ฆ
Cancel
Save