Browse Source

๐ŸŒ Update translations for ko (update outdated, found by fixer tool) (#14738)

* Update outdated pages found by fixer tool

* Re-translate with updated prompt (fixed translation for `you`)

* Re-translate with `gtpt-5` model

* Re-translate with new preferred translation for `burger`

* Re-translate with new preferred translations for `app` and `command`
pull/14770/head
Motov Yurii 4 months ago
committed by GitHub
parent
commit
eaf07c5d84
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 370
      docs/ko/docs/async.md
  2. 108
      docs/ko/docs/fastapi-cli.md
  3. 176
      docs/ko/docs/features.md
  4. 199
      docs/ko/docs/help-fastapi.md
  5. 82
      docs/ko/docs/history-design-future.md

370
docs/ko/docs/async.md

@ -1,18 +1,18 @@
# ๋™์‹œ์„ฑ๊ณผ async / await
# ๋™์‹œ์„ฑ๊ณผ async / await { #concurrency-and-async-await }
*๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*์—์„œ์˜ `async def` ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ๊ณผ ๋น„๋™๊ธฐ ์ฝ”๋“œ, ๋™์‹œ์„ฑ ๋ฐ ๋ณ‘๋ ฌ์„ฑ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ์˜ `async def` ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ๊ณผ ๋น„๋™๊ธฐ ์ฝ”๋“œ, ๋™์‹œ์„ฑ ๋ฐ ๋ณ‘๋ ฌ์„ฑ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ
## ๋ฐ”์˜์‹  ๊ฒฝ์šฐ
## ๋ฐ”์˜์‹ ๊ฐ€์š”? { #in-a-hurry }
<strong>์š”์•ฝ</strong>
<abbr title="too long; didn't read - ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์ฝ์ง€ ์•Š์Œ"><strong>TL;DR:</strong></abbr>
๋‹ค์Œ๊ณผ ๊ฐ™์ด `await`๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœํ•˜๋Š” ์ œ3์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
๋‹ค์Œ๊ณผ ๊ฐ™์ด `await`๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœํ•˜๋ผ๊ณ  ์•ˆ๋‚ดํ•˜๋Š” ์ œ3์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
```Python
results = await some_library()
```
๋‹ค์Œ์ฒ˜๋Ÿผ *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*๋ฅผ `async def`๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค:
๋‹ค์Œ์ฒ˜๋Ÿผ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ `async def`๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค:
```Python hl_lines="2"
@app.get('/')
@ -29,7 +29,7 @@ async def read_results():
---
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, API, ํŒŒ์ผ์‹œ์Šคํ…œ ๋“ฑ๊ณผ ์˜์‚ฌ์†Œํ†ตํ•˜๋Š” ์ œ3์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ๊ฒƒ์ด `await`๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(ํ˜„์žฌ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ทธ๋Ÿฌํ•ฉ๋‹ˆ๋‹ค), *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*๋ฅผ ์ผ๋ฐ˜์ ์ธ `def`๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค:
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, API, ํŒŒ์ผ์‹œ์Šคํ…œ ๋“ฑ๊ณผ ์˜์‚ฌ์†Œํ†ตํ•˜๋Š” ์ œ3์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ๊ฒƒ์ด `await` ์‚ฌ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ทธ๋Ÿฌํ•ฉ๋‹ˆ๋‹ค), *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ ์ผ๋ฐ˜์ ์ธ `def`๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค:
```Python hl_lines="2"
@app.get('/')
@ -40,23 +40,23 @@ def results():
---
๋งŒ์•ฝ ๋‹น์‹ ์˜ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด (์–ด์งธ์„œ์ธ์ง€) ๋‹ค๋ฅธ ๋ฌด์—‡๊ณผ ์˜์‚ฌ์†Œํ†ตํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์‘๋‹ตํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด `async def`๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด (์–ด์งธ์„œ์ธ์ง€) ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ํ†ต์‹ ํ•˜๊ณ  ๊ทธ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด, ๋‚ด๋ถ€์—์„œ `await`๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋”๋ผ๋„ `async def`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
---
๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ๊ทธ๋ƒฅ `def`๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ์ผ๋ฐ˜์ ์ธ `def`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
---
**์ฐธ๊ณ **: *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*์—์„œ ํ•„์š”ํ•œ๋งŒํผ `def`์™€ `async def`๋ฅผ ํ˜ผ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ€์žฅ ์•Œ๋งž์€ ๊ฒƒ์„ ์„ ํƒํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FastAPI๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์•Œ๋งž์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
**์ฐธ๊ณ **: *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ํ•„์š”ํ•œ ๋งŒํผ `def`์™€ `async def`๋ฅผ ํ˜ผ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์•Œ๋งž์€ ์˜ต์…˜์„ ์„ ํƒํ•ด ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. FastAPI๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์–ด์ฐŒ๋˜์—ˆ๋“ , ์ƒ๊ธฐ ์–ด๋– ํ•œ ๊ฒฝ์šฐ๋ผ๋„, FastAPI๋Š” ์—ฌ์ „ํžˆ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ์œ„์˜ ์–ด๋–ค ๊ฒฝ์šฐ์—์„œ๋„ FastAPI๋Š” ์—ฌ์ „ํžˆ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ƒ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ์–ด๋А ์ •๋„์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์œ„์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๋ฉด, ๋ช‡ ๊ฐ€์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ
## ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ { #technical-details }
์ตœ์‹  ํŒŒ์ด์ฌ ๋ฒ„์ „์€ `async`์™€ `await` ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ **โ€œ์ฝ”๋ฃจํ‹ดโ€**์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” **โ€œ๋น„๋™๊ธฐ ์ฝ”๋“œโ€**๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์ตœ์‹  ํŒŒ์ด์ฌ ๋ฒ„์ „์€ **โ€œ์ฝ”๋ฃจํ‹ดโ€**์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” **โ€œ๋น„๋™๊ธฐ ์ฝ”๋“œโ€**๋ฅผ **`async` ๋ฐ `await`** ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์„น์…˜๋“ค์—์„œ ํ•ด๋‹น ๋ฌธ์žฅ์„ ๋ถ€๋ถ„๋ณ„๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:
@ -64,251 +64,283 @@ def results():
* **`async`์™€ `await`**
* **์ฝ”๋ฃจํ‹ด**
## ๋น„๋™๊ธฐ ์ฝ”๋“œ
## ๋น„๋™๊ธฐ ์ฝ”๋“œ { #asynchronous-code }
๋น„๋™๊ธฐ ์ฝ”๋“œ๋ž€ ์–ธ์–ด ๐Ÿ’ฌ ๊ฐ€ ์ฝ”๋“œ์˜ ์–ด๋А ํ•œ ๋ถ€๋ถ„์—์„œ, ์ปดํ“จํ„ฐ / ํ”„๋กœ๊ทธ๋žจ๐Ÿค–์—๊ฒŒ *๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€*๊ฐ€ ์–ด๋”˜๊ฐ€์—์„œ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. *๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€*๊ฐ€ โ€œ๋А๋ฆฐ-ํŒŒ์ผ" ๐Ÿ“ ์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ์–ธ์–ด ๐Ÿ’ฌ ๊ฐ€ ์ฝ”๋“œ์˜ ์–ด๋А ํ•œ ๋ถ€๋ถ„์—์„œ ์ปดํ“จํ„ฐ/ํ”„๋กœ๊ทธ๋žจ ๐Ÿค– ์—๊ฒŒ, ์–ด๋А ์‹œ์ ์—๋Š” ์–ด๋”˜๊ฐ€์—์„œ *๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€*๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ทธ *๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€*๋ฅผ "slow-file" ๐Ÿ“ ์ด๋ผ๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ โ€œ๋А๋ฆฐ-ํŒŒ์ผโ€ ๐Ÿ“์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ์ปดํ“จํ„ฐ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ ์ปดํ“จํ„ฐ๋Š” "slow-file" ๐Ÿ“ ์ด ๋๋‚˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๋Ÿฌ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ ์ปดํ“จํ„ฐ / ํ”„๋กœ๊ทธ๋žจ ๐Ÿค– ์€ ๋‹ค์‹œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋Œ์•„์˜ค๊ฑฐ๋‚˜, ํ˜น์€ ๋‹น์‹œ์— ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—…๋“ค์ด ์™„๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ ๐Ÿค– ์€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋˜ ์ž‘์—… ์ค‘ ์–ด๋А ๊ฒƒ์ด ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€, ๊ทธ๊ฒƒ ๐Ÿค– ์ด ํ•ด์•ผํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ ์ปดํ“จํ„ฐ/ํ”„๋กœ๊ทธ๋žจ ๐Ÿค– ์€ ๋‹ค์‹œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋Œ์•„์˜ค๊ฑฐ๋‚˜, ํ˜น์€ ๊ทธ ์‹œ์ ์— ํ•ด์•ผ ํ•  ์ž‘์—…์„ ๋ชจ๋‘ ๋๋‚ผ ๋•Œ๋งˆ๋‹ค ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋˜ ์ž‘์—… ์ค‘ ์ด๋ฏธ ๋๋‚œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉด์„œ, ํ•ด์•ผ ํ–ˆ๋˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์œผ๋กœ, ๊ทธ๊ฒƒ ๐Ÿค– ์€ ์™„๋ฃŒํ•  ์ฒซ๋ฒˆ์งธ ์ž‘์—…์— ์ฐฉ์ˆ˜ํ•˜๊ณ (์šฐ๋ฆฌ์˜ "๋А๋ฆฐ-ํŒŒ์ผ" ๐Ÿ“ ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค) ๊ทธ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์œผ๋กœ, ์™„๋ฃŒ๋œ ์ฒซ ๋ฒˆ์งธ ์ž‘์—…(์šฐ๋ฆฌ์˜ "slow-file" ๐Ÿ“ ์ด๋ผ๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค)์„ ๊ฐ€์ ธ์™€์„œ, ๊ทธ์— ๋Œ€ํ•ด ํ•ด์•ผ ํ–ˆ๋˜ ์ž‘์—…์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
"๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ"์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„๊ต์  "๋А๋ฆฐ" (ํ”„๋กœ์„ธ์„œ์™€ RAM ๋ฉ”๋ชจ๋ฆฌ ์†๋„์— ๋น„ํ•ด) <abbr title="Input and Output">I/O</abbr> ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ์˜ ๊ฒƒ๋“ค์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:
์ด "๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ"์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์„ธ์„œ์™€ RAM ๋ฉ”๋ชจ๋ฆฌ ์†๋„์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ "๋А๋ฆฐ" <abbr title="Input and Output - ์ž…๋ ฅ/์ถœ๋ ฅ">I/O</abbr> ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:
* ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ
* ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ˆ˜์‹ ํ• , ๋‹น์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ
* ์‹œ์Šคํ…œ์ด ์ฝ๊ณ  ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•  ๋””์Šคํฌ ๋‚ด์˜ ํŒŒ์ผ ๋‚ด์šฉ
* ๋‹น์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์Šคํ…œ์— ์ „๋‹ฌํ•˜๋Š”, ๋””์Šคํฌ์— ์ž‘์„ฑ๋  ๋‚ด์šฉ
* ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ
* ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ
* ์‹œ์Šคํ…œ์ด ๋””์Šคํฌ์˜ ํŒŒ์ผ ๋‚ด์šฉ์„ ์ฝ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ
* ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์Šคํ…œ์— ์ „๋‹ฌํ•œ ๋‚ด์šฉ์„ ๋””์Šคํฌ์— ์“ฐ๋Š” ๊ฒƒ
* ์›๊ฒฉ API ์ž‘์—…
* ์™„๋ฃŒ๋  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…
* ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ
* ๊ธฐํƒ€
* ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ
* ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ
* ๊ธฐํƒ€ ๋“ฑ๋“ฑ
์ˆ˜ํ–‰ ์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„์ด <abbr title="Input and Output">I/O</abbr> ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š”๋ฐ์— ์†Œ์š”๋˜๊ธฐ ๋•Œ๋ฌธ์—, "I/O์— ๋ฌถ์ธ" ์ž‘์—…์ด๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.
์‹คํ–‰ ์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„์ด <abbr title="Input and Output - ์ž…๋ ฅ/์ถœ๋ ฅ">I/O</abbr> ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ์†Œ๋น„๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ "I/O bound" ์ž‘์—…์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ "๋น„๋™๊ธฐ"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”๋ฐ ์ปดํ“จํ„ฐ / ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก, ๋А๋ฆฐ ์ž‘์—…์— "๋™๊ธฐํ™”"๋˜์–ด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ž‘์—…์ด ์™„๋ฃŒ๋  ์ •ํ™•ํ•œ ์‹œ์ ๋งŒ์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์ปดํ“จํ„ฐ/ํ”„๋กœ๊ทธ๋žจ์ด ๋А๋ฆฐ ์ž‘์—…๊ณผ "๋™๊ธฐํ™”"๋˜์–ด, ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์€ ์ฑ„ ๊ทธ ์ž‘์—…์ด ๋๋‚˜๋Š” ์ •ํ™•ํ•œ ์‹œ์ ๋งŒ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์™€ ์ผ์„ ๊ณ„์†ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— "๋น„๋™๊ธฐ"๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.
์ด ๋Œ€์‹ ์—, "๋น„๋™๊ธฐ" ์‹œ์Šคํ…œ์—์„œ๋Š”, ์ž‘์—…์€ ์ผ๋‹จ ์™„๋ฃŒ๋˜๋ฉด, ์ปดํ“จํ„ฐ / ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ผ์„ ์™„๋ฃŒํ•˜๊ณ  ์ดํ›„ ๋‹ค์‹œ ๋Œ์•„์™€์„œ ๊ทธ๊ฒƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ์ง€์†ํ•  ๋•Œ๊นŒ์ง€ ์ž ์‹œ (๋ช‡ ๋งˆ์ดํฌ๋กœ์ดˆ) ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€์‹  "๋น„๋™๊ธฐ" ์‹œ์Šคํ…œ์—์„œ๋Š”, ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ปดํ“จํ„ฐ/ํ”„๋กœ๊ทธ๋žจ์ด ํ•˜๋Ÿฌ ๊ฐ”๋˜ ์ผ์„ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ์ž ์‹œ(๋ช‡ ๋งˆ์ดํฌ๋กœ์ดˆ) ์ค„์—์„œ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€, ๋‹ค์‹œ ๋Œ์•„์™€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"๋™๊ธฐ"("๋น„๋™๊ธฐ"์˜ ๋ฐ˜๋Œ€)๋Š” ์ปดํ“จํ„ฐ / ํ”„๋กœ๊ทธ๋žจ์ด ์ƒ์ดํ•œ ์ž‘์—…๋“ค๊ฐ„ ์ „ํ™˜์„ ํ•˜๊ธฐ ์ „์— ๊ทธ๊ฒƒ์ด ๋Œ€๊ธฐ๋ฅผ ๋™๋ฐ˜ํ•˜๊ฒŒ ๋ ์ง€๋ผ๋„ ๋ชจ๋“  ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— "์ˆœ์ฐจ"๋ผ๋Š” ์šฉ์–ด๋กœ๋„ ํ”ํžˆ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.
"๋™๊ธฐ"(โ€œ๋น„๋™๊ธฐโ€์˜ ๋ฐ˜๋Œ€)๋Š” ๋ณดํ†ต "์ˆœ์ฐจ"๋ผ๋Š” ์šฉ์–ด๋กœ๋„ ๋ถˆ๋ฆฌ๋Š”๋ฐ, ์ปดํ“จํ„ฐ/ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค๋ฅธ ์ž‘์—…์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ๊ทธ ๋‹จ๊ณ„๋“ค์— ๊ธฐ๋‹ค๋ฆผ์ด ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
### ๋™์‹œ์„ฑ๊ณผ ๋ฒ„๊ฑฐ
### ๋™์‹œ์„ฑ๊ณผ ํ–„๋ฒ„๊ฑฐ { #concurrency-and-burgers }
์œ„์—์„œ ์„ค๋ช…ํ•œ **๋น„๋™๊ธฐ** ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋…์€ ์ข…์ข… **"๋™์‹œ์„ฑ"**์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ **"๋ณ‘๋ ฌ์„ฑ"**๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
์œ„์—์„œ ์„ค๋ช…ํ•œ **๋น„๋™๊ธฐ** ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋…์€ ๋•Œ๋•Œ๋กœ **"๋™์‹œ์„ฑ"**์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” **"๋ณ‘๋ ฌ์„ฑ"**๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
**๋™์‹œ์„ฑ**๊ณผ **๋ณ‘๋ ฌ์„ฑ**์€ ๋ชจ๋‘ "๋™์‹œ์— ์ผ์–ด๋‚˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ผ๋“ค"๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
**๋™์‹œ์„ฑ**๊ณผ **๋ณ‘๋ ฌ์„ฑ**์€ ๋ชจ๋‘ "๋Œ€๋žต ๊ฐ™์€ ์‹œ๊ฐ„์— ์ผ์–ด๋‚˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ผ๋“ค"๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ *๋™์‹œ์„ฑ*๊ณผ *๋ณ‘๋ ฌ์„ฑ*์˜ ์„ธ๋ถ€์ ์ธ ๊ฐœ๋…์—๋Š” ๊ฝค ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ์˜ ๋ฒ„๊ฑฐ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค:
์ฐจ์ด๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ์˜ ํ–„๋ฒ„๊ฑฐ ์ด์•ผ๊ธฐ๋ฅผ ์ƒ์ƒํ•ด๋ณด์„ธ์š”:
### ๋™์‹œ ๋ฒ„๊ฑฐ
### ๋™์‹œ ํ–„๋ฒ„๊ฑฐ { #concurrent-burgers }
๋‹น์‹ ์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์™€ ํŒจ์ŠคํŠธํ‘ธ๋“œ ๐Ÿ” ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ”์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ ์› ๐Ÿ’ ์ด ๋‹น์‹  ์•ž์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ฃผ๋ฌธ์„ ๋ฐ›์„ ๋™์•ˆ ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€ ํŒจ์ŠคํŠธํ‘ธ๋“œ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ”๊ณ , ์ ์›์ด ์—ฌ๋Ÿฌ๋ถ„ ์•ž ์‚ฌ๋žŒ๋“ค์˜ ์ฃผ๋ฌธ์„ ๋ฐ›๋Š” ๋™์•ˆ ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ˜
์ด์ œ ๋‹น์‹ ์˜ ์ˆœ์„œ๊ฐ€ ๋˜์–ด์„œ, ๋‹น์‹ ์€ ๋‹น์‹ ๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ๋ฅผ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ ๊ณ ๊ธ‰์Šค๋Ÿฌ์šด ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ์ฃผ๋ฌธํ•ฉ๋‹ˆ๋‹ค.
<img src="/img/async/concurrent-burgers/concurrent-burgers-01.png" class="illustration">
๋‹น์‹ ์ด ๋ˆ์„ ๋ƒ…๋‹ˆ๋‹ค ๐Ÿ’ธ.
์ด์ œ ์—ฌ๋Ÿฌ๋ถ„ ์ฐจ๋ก€๊ฐ€ ๋˜์–ด, ์—ฌ๋Ÿฌ๋ถ„๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€๋ฅผ ์œ„ํ•ด ๋งค์šฐ ๊ณ ๊ธ‰์Šค๋Ÿฌ์šด ํ–„๋ฒ„๊ฑฐ 2๊ฐœ๋ฅผ ์ฃผ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ”๐Ÿ”
์ ์› ๐Ÿ’ ์€ ์ฃผ๋ฐฉ ๐Ÿ‘จโ€๐Ÿณ ์— ์š”๋ฆฌ๋ฅผ ํ•˜๋ผ๊ณ  ์ „๋‹ฌํ•˜๊ณ , ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์€ ๋‹น์‹ ์˜ ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ์ค€๋น„ํ•ด์•ผํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋ฉ๋‹ˆ๋‹ค(๊ทธ๋“ค์ด ์ง€๊ธˆ์€ ๋‹น์‹  ์•ž ๊ณ ๊ฐ๋“ค์˜ ์ฃผ๋ฌธ์„ ์ค€๋น„ํ•˜๊ณ  ์žˆ์„์ง€๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค).
<img src="/img/async/concurrent-burgers/concurrent-burgers-02.png" class="illustration">
์ ์› ๐Ÿ’ ์€ ๋‹น์‹ ์˜ ์ˆœ์„œ๊ฐ€ ์ ํžŒ ๋ฒˆํ˜ธํ‘œ๋ฅผ ์ค๋‹ˆ๋‹ค.
์ ์›์€ ์ฃผ๋ฐฉ์˜ ์š”๋ฆฌ์‚ฌ์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งํ•ด, (์ง€๊ธˆ์€ ์•ž์„  ์†๋‹˜๋“ค์˜ ์ฃผ๋ฌธ์„ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋”๋ผ๋„) ์—ฌ๋Ÿฌ๋ถ„์˜ ํ–„๋ฒ„๊ฑฐ๋ฅผ ์ค€๋น„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๋‹น์‹ ์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์™€ ํ•จ๊ป˜ ํ…Œ์ด๋ธ”์„ ๊ณ ๋ฅด๊ณ , ์ž๋ฆฌ์— ์•‰์•„ ์˜ค๋žซ๋™์•ˆ (๋‹น์‹ ์ด ์ฃผ๋ฌธํ•œ ๋ฒ„๊ฑฐ๋Š” ๊ฝค๋‚˜ ๊ณ ๊ธ‰์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ค€๋น„ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค โœจ๐Ÿ”โœจ) ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
<img src="/img/async/concurrent-burgers/concurrent-burgers-03.png" class="illustration">
์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์™€ ํ…Œ์ด๋ธ”์— ์•‰์•„์„œ ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๊ทธ ์‚ฌ๋žŒ ๐Ÿ˜ ์ด ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง€๊ณ , ์‚ฌ๋ž‘์Šค๋Ÿฝ๊ณ , ๋˜‘๋˜‘ํ•œ์ง€ ๊ฐํƒ„ํ•˜๋ฉฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค โœจ๐Ÿ˜โœจ.
์—ฌ๋Ÿฌ๋ถ„์ด ๋ˆ์„ ๋ƒ…๋‹ˆ๋‹ค. ๐Ÿ’ธ
์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์™€ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ์–˜๊ธฐํ•˜๋Š” ๋™์•ˆ, ๋•Œ๋•Œ๋กœ, ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์นด์šดํ„ฐ์˜ ๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์ ์›์€ ์—ฌ๋Ÿฌ๋ถ„ ์ฐจ๋ก€ ๋ฒˆํ˜ธ๋ฅผ ์ค๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค ์–ด๋А ์ˆœ๊ฐ„, ๋‹น์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์— ๊ฐ€์„œ, ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ๋ฐ›๊ณ , ํ…Œ์ด๋ธ”๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
<img src="/img/async/concurrent-burgers/concurrent-burgers-04.png" class="illustration">
๋‹น์‹ ๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ๋Š” ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ๋จน์œผ๋ฉฐ ์ข‹์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค โœจ.
๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€ ํ•จ๊ป˜ ์ž๋ฆฌ๋ฅผ ๊ณ ๋ฅด๊ณ  ์•‰์•„ ์˜ค๋žซ๋™์•ˆ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ•๋‹ˆ๋‹ค(์—ฌ๋Ÿฌ๋ถ„์˜ ํ–„๋ฒ„๊ฑฐ๋Š” ๋งค์šฐ ๊ณ ๊ธ‰์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ค€๋น„ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค).
์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€ ํ…Œ์ด๋ธ”์— ์•‰์•„ ํ–„๋ฒ„๊ฑฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๊ทธ ์‚ฌ๋žŒ์ด ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง€๊ณ  ๊ท€์—ฝ๊ณ  ๋˜‘๋˜‘ํ•œ์ง€ ๊ฐํƒ„ํ•˜๋ฉฐ ์‹œ๊ฐ„์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โœจ๐Ÿ˜โœจ.
<img src="/img/async/concurrent-burgers/concurrent-burgers-05.png" class="illustration">
๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋Œ€ํ™”ํ•˜๋Š” ๋™์•ˆ, ๋•Œ๋•Œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์€ ์นด์šดํ„ฐ์— ํ‘œ์‹œ๋˜๋Š” ๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด ์—ฌ๋Ÿฌ๋ถ„ ์ฐจ๋ก€์ธ์ง€ ๋ด…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค ์–ด๋А ์ˆœ๊ฐ„ ๋งˆ์นจ๋‚ด ์—ฌ๋Ÿฌ๋ถ„ ์ฐจ๋ก€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์นด์šดํ„ฐ์— ๊ฐ€์„œ ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋ฐ›๊ณ , ํ…Œ์ด๋ธ”๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
<img src="/img/async/concurrent-burgers/concurrent-burgers-06.png" class="illustration">
์—ฌ๋Ÿฌ๋ถ„๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€๋Š” ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋จน์œผ๋ฉฐ ์ข‹์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. โœจ
<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
/// info | ์ •๋ณด
์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. ๐ŸŽจ
///
---
๋‹น์‹ ์ด ์ด ์ด์•ผ๊ธฐ์—์„œ ์ปดํ“จํ„ฐ / ํ”„๋กœ๊ทธ๋žจ ๐Ÿค– ์ด๋ผ๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
์ด ์ด์•ผ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ์ปดํ“จํ„ฐ/ํ”„๋กœ๊ทธ๋žจ ๐Ÿค– ์ด๋ผ๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”.
์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๋‹น์‹ ์€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ๐Ÿ˜ด ๋‹น์‹ ์˜ ์ฐจ๋ก€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ์–ด๋– ํ•œ "์ƒ์‚ฐ์ ์ธ" ์ผ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์› ๐Ÿ’ ์ด (์Œ์‹์„ ์ค€๋น„ํ•˜์ง€๋Š” ์•Š๊ณ ) ์ฃผ๋ฌธ์„ ๋ฐ›๊ธฐ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค„์ด ๋นจ๋ฆฌ ์ค„์–ด๋“ค์–ด์„œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
์ค„์„ ์„œ ์žˆ๋Š” ๋™์•ˆ, ์—ฌ๋Ÿฌ๋ถ„์€ ๊ทธ๋ƒฅ ์‰ฌ๊ณ  ๐Ÿ˜ด, ์ฐจ๋ก€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ๊ทธ๋‹ค์ง€ "์ƒ์‚ฐ์ ์ธ" ์ผ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์›์€ ์ฃผ๋ฌธ๋งŒ ๋ฐ›์ง€(์Œ์‹์„ ์ค€๋น„ํ•˜์ง„ ์•Š๊ธฐ) ๋•Œ๋ฌธ์— ์ค„์ด ๋น ๋ฅด๊ฒŒ ์ค„์–ด๋“ค์–ด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
๊ทธ๋‹ค์Œ, ๋‹น์‹ ์ด ์ฐจ๋ก€๊ฐ€ ์˜ค๋ฉด, ๋‹น์‹ ์€ ์‹ค์ œ๋กœ "์ƒ์‚ฐ์ ์ธ" ์ผ ๐Ÿค“ ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋ฉ”๋‰ด๋ฅผ ๋ณด๊ณ , ๋ฌด์—‡์„ ๋จน์„์ง€ ๊ฒฐ์ •ํ•˜๊ณ , ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์˜ ์„ ํƒ์„ ๋ฌป๊ณ , ๋ˆ์„ ๋‚ด๊ณ  ๐Ÿ’ธ , ๋งž๋Š” ์นด๋“œ๋ฅผ ๋ƒˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋น„์šฉ์ด ์ œ๋Œ€๋กœ ์ง€๋ถˆ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ฃผ๋ฌธ์ด ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธ์„ ํ•˜๋Š” ์ž‘์—… ๋“ฑ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ ์—ฌ๋Ÿฌ๋ถ„ ์ฐจ๋ก€๊ฐ€ ๋˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์‹ค์ œ๋กœ "์ƒ์‚ฐ์ ์ธ" ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋‰ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฌด์—‡์„ ๋จน์„์ง€ ๊ฒฐ์ •ํ•˜๊ณ , ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์˜ ์„ ํƒ์„ ํ™•์ธํ•˜๊ณ , ๊ฒฐ์ œํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅธ ํ˜„๊ธˆ์ด๋‚˜ ์นด๋“œ๋ฅผ ๋ƒˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ •ํ™•ํžˆ ์ฒญ๊ตฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ฃผ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅธ ํ•ญ๋ชฉ๋“ค์ด ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋“ฑ๋“ฑ์„ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ดํ›„์—๋Š”, ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ์•„์ง ๋ฐ›์ง€ ๋ชปํ–ˆ์Œ์—๋„, ๋ฒ„๊ฑฐ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ๐Ÿ•™ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์› ๐Ÿ’ ๊ณผ์˜ ์ž‘์—…์€ "์ผ์‹œ์ •์ง€" โธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ ๋‹ค์Œ์—๋Š”, ์•„์ง ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ๋”๋ผ๋„, ํ–„๋ฒ„๊ฑฐ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ๐Ÿ•™ ํ•˜๋ฏ€๋กœ ์ ์›๊ณผ์˜ ์ž‘์—…์€ "์ผ์‹œ์ •์ง€" โธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋ฒˆํ˜ธํ‘œ๋ฅผ ๋ฐ›๊ณ  ์นด์šดํ„ฐ์—์„œ ๋‚˜์™€ ํ…Œ์ด๋ธ”์— ์•‰์œผ๋ฉด, ๋‹น์‹ ์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์™€ ๊ทธ "์ž‘์—…" โฏ ๐Ÿค“ ์— ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ๐Ÿ”€ ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹น์‹ ์€ ๋‹ค์‹œ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์—๊ฒŒ ์ž‘์—…์„ ๊ฑฐ๋Š” ๋งค์šฐ "์ƒ์‚ฐ์ ์ธ" ์ผ ๐Ÿค“ ์„ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋ฒˆํ˜ธ๋ฅผ ๋“ค๊ณ  ์นด์šดํ„ฐ์—์„œ ๋ฒ—์–ด๋‚˜ ํ…Œ์ด๋ธ”์— ์•‰์œผ๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์—๊ฒŒ ๊ด€์‹ฌ์„ ์ „ํ™˜ ๐Ÿ”€ ํ•˜๊ณ , ๊ทธ์— ๋Œ€ํ•œ "์ž‘์—…" โฏ ๐Ÿค“ ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹ค์‹œ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์—๊ฒŒ ์ž‘์—…์„ ๊ฑฐ๋Š” ๋งค์šฐ "์ƒ์‚ฐ์ ์ธ" ์ผ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค ๐Ÿ˜.
์ ์› ๐Ÿ’ ์ด ์นด์šดํ„ฐ ํ™”๋ฉด์— ๋‹น์‹ ์˜ ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œํ•จ์œผ๋กœ์จ "๋ฒ„๊ฑฐ ๐Ÿ” ๊ฐ€ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ํ•ด๋„, ๋‹น์‹ ์€ ์ฆ‰์‹œ ๋›ฐ์ณ๋‚˜๊ฐ€์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๊ณ ์žˆ๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ฌด๋„ ๋‹น์‹ ์˜ ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ํ›”์ณ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ ์ ์› ๐Ÿ’ ์ด ์นด์šดํ„ฐ ํ™”๋ฉด์— ์—ฌ๋Ÿฌ๋ถ„ ๋ฒˆํ˜ธ๋ฅผ ๋„์›Œ "ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”"๋ผ๊ณ  ๋งํ•˜์ง€๋งŒ, ํ‘œ์‹œ๋œ ๋ฒˆํ˜ธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„ ์ฐจ๋ก€๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ํ•ด์„œ ์ฆ‰์‹œ ๋ฏธ์นœ ๋“ฏ์ด ๋›ฐ์–ด๊ฐ€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์—ฌ๋Ÿฌ๋ถ„ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋‹ˆ, ์•„๋ฌด๋„ ์—ฌ๋Ÿฌ๋ถ„ ํ–„๋ฒ„๊ฑฐ๋ฅผ ํ›”์ณ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ๊ฐ€ ์ด์•ผ๊ธฐ๋ฅผ ๋๋‚ผ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ (ํ˜„์žฌ ์ž‘์—… ์™„๋ฃŒ โฏ / ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—… ์ฒ˜๋ฆฌ ๐Ÿค“ ), ์ •์ค‘ํ•˜๊ฒŒ ๋ฏธ์†Œ์ง“๊ณ  ๋ฒ„๊ฑฐ๋ฅผ ๊ฐ€์ง€๋Ÿฌ ๊ฐ€๊ฒ ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค โธ.
๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ๋ถ„์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€๊ฐ€ ์ด์•ผ๊ธฐ๋ฅผ ๋๋‚ผ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ(ํ˜„์žฌ ์ž‘์—… โฏ / ์ฒ˜๋ฆฌ ์ค‘์ธ ์ž‘์—… ๐Ÿค“ ์„ ๋๋‚ด๊ณ ), ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋ฏธ์†Œ ์ง€์œผ๋ฉฐ ํ–„๋ฒ„๊ฑฐ๋ฅผ ๊ฐ€์ง€๋Ÿฌ ๊ฐ€๊ฒ ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค โธ.
๊ทธ๋‹ค์Œ ๋‹น์‹ ์€ ์นด์šดํ„ฐ์— ๊ฐ€์„œ ๐Ÿ”€ , ์ดˆ๊ธฐ ์ž‘์—…์„ ์ด์ œ ์™„๋ฃŒํ•˜๊ณ  โฏ , ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ๋ฐ›๊ณ , ๊ฐ์‚ฌํ•˜๋‹ค๊ณ  ๋งํ•˜๊ณ  ํ…Œ์ด๋ธ”๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์นด์šดํ„ฐ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋‹จ๊ณ„ / ์ž‘์—…์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค โน.
๊ทธ ๋‹ค์Œ ์—ฌ๋Ÿฌ๋ถ„์€ ์นด์šดํ„ฐ๋กœ ๊ฐ€์„œ ๐Ÿ”€, ์ด์ œ ๋๋‚œ ์ดˆ๊ธฐ ์ž‘์—… โฏ ์œผ๋กœ ๋Œ์•„์™€ ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋ฐ›๊ณ , ๊ฐ์‚ฌ ์ธ์‚ฌ๋ฅผ ํ•˜๊ณ , ํ…Œ์ด๋ธ”๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์นด์šดํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ทธ ๋‹จ๊ณ„/์ž‘์—…์ด ๋๋‚ฉ๋‹ˆ๋‹ค โน. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ์ƒˆ๋กœ์šด ์ž‘์—…์ธ "ํ–„๋ฒ„๊ฑฐ ๋จน๊ธฐ" ๐Ÿ”€ โฏ ๋ฅผ ๋งŒ๋“ค์ง€๋งŒ, ์ด์ „ ์ž‘์—…์ธ "ํ–„๋ฒ„๊ฑฐ ๋ฐ›๊ธฐ"๋Š” ๋๋‚ฌ์Šต๋‹ˆ๋‹ค โน.
์ด์ „ ์ž‘์—…์ธ "๋ฒ„๊ฑฐ ๋ฐ›๊ธฐ"๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด โน "๋ฒ„๊ฑฐ ๋จน๊ธฐ"๋ผ๋Š” ์ƒˆ๋กœ์šด ์ž‘์—…์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค ๐Ÿ”€ โฏ.
### ๋ณ‘๋ ฌ ํ–„๋ฒ„๊ฑฐ { #parallel-burgers }
### ๋ณ‘๋ ฌ ๋ฒ„๊ฑฐ
์ด์ œ ์ด๊ฒƒ์ด "๋™์‹œ ํ–„๋ฒ„๊ฑฐ"๊ฐ€ ์•„๋‹ˆ๋ผ "๋ณ‘๋ ฌ ํ–„๋ฒ„๊ฑฐ"๋ผ๊ณ  ์ƒ์ƒํ•ด๋ด…์‹œ๋‹ค.
์ด์ œ "๋™์‹œ ๋ฒ„๊ฑฐ"๊ฐ€ ์•„๋‹Œ "๋ณ‘๋ ฌ ๋ฒ„๊ฑฐ"๋ฅผ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
์—ฌ๋Ÿฌ๋ถ„์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€ ํ•จ๊ป˜ ๋ณ‘๋ ฌ ํŒจ์ŠคํŠธํ‘ธ๋“œ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ‘๋‹ˆ๋‹ค.
๋‹น์‹ ์€ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ์™€ ํ•จ๊ป˜ ๋ณ‘๋ ฌ ํŒจ์ŠคํŠธํ‘ธ๋“œ ๐Ÿ” ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ”์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์€ ์—ฌ๋Ÿฌ ๋ช…(์˜ˆ: 8๋ช…)์˜ ์ ์›์ด ๋™์‹œ์— ์š”๋ฆฌ์‚ฌ์ด๊ธฐ๋„ ํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„ ์•ž ์‚ฌ๋žŒ๋“ค์˜ ์ฃผ๋ฌธ์„ ๋ฐ›๋Š” ๋™์•ˆ ์ค„์„ ์„œ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹น์‹ ์€ ์—ฌ๋Ÿฌ๋ช…(8๋ช…์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค)์˜ ์ ์›์ด ๋‹น์‹  ์•ž ์‚ฌ๋žŒ๋“ค์˜ ์ฃผ๋ฌธ์„ ๋ฐ›์œผ๋ฉฐ ๋™์‹œ์— ์š”๋ฆฌ ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ ๋„ ํ•˜๋Š” ๋™์•ˆ ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„ ์•ž์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€, 8๋ช…์˜ ์ ์› ๊ฐ๊ฐ์ด ๋‹ค์Œ ์ฃผ๋ฌธ์„ ๋ฐ›๊ธฐ ์ „์— ๋ฐ”๋กœ ํ–„๋ฒ„๊ฑฐ๋ฅผ ์ค€๋น„ํ•˜๋Ÿฌ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, ์นด์šดํ„ฐ๋ฅผ ๋– ๋‚˜์ง€ ์•Š๊ณ  ํ–„๋ฒ„๊ฑฐ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
๋‹น์‹  ์•ž ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋ฒ„๊ฑฐ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ์นด์šดํ„ฐ์—์„œ ๋– ๋‚˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ•™ . ์™œ๋ƒํ•˜๋ฉด 8๋ช…์˜ ์ง์›๋“ค์ด ๋‹ค์Œ ์ฃผ๋ฌธ์„ ๋ฐ›๊ธฐ ์ „์— ๋ฒ„๊ฑฐ๋ฅผ ์ค€๋น„ํ•˜๋Ÿฌ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
<img src="/img/async/parallel-burgers/parallel-burgers-01.png" class="illustration">
๋งˆ์นจ๋‚ด ๋‹น์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ์™”๊ณ , ๋‹น์‹ ์€ ๋‹น์‹ ๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ๋ฅผ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ ๊ณ ๊ธ‰์Šค๋Ÿฌ์šด ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ์ฃผ๋ฌธํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์นจ๋‚ด ์—ฌ๋Ÿฌ๋ถ„ ์ฐจ๋ก€๊ฐ€ ๋˜์–ด, ์—ฌ๋Ÿฌ๋ถ„๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€๋ฅผ ์œ„ํ•ด ๋งค์šฐ ๊ณ ๊ธ‰์Šค๋Ÿฌ์šด ํ–„๋ฒ„๊ฑฐ 2๊ฐœ๋ฅผ ์ฃผ๋ฌธํ•ฉ๋‹ˆ๋‹ค.
๋‹น์‹ ์ด ๋น„์šฉ์„ ์ง€๋ถˆํ•ฉ๋‹ˆ๋‹ค ๐Ÿ’ธ .
์—ฌ๋Ÿฌ๋ถ„์ด ๋ˆ์„ ๋ƒ…๋‹ˆ๋‹ค ๐Ÿ’ธ.
์ ์›์ด ์ฃผ๋ฐฉ์— ๊ฐ‘๋‹ˆ๋‹ค ๐Ÿ‘จโ€๐Ÿณ .
<img src="/img/async/parallel-burgers/parallel-burgers-02.png" class="illustration">
๋‹น์‹ ์€ ๋ฒˆํ˜ธํ‘œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฌ๋„ ๋‹น์‹ ์˜ ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ๋Œ€์‹  ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์—†๋„๋ก ์นด์šดํ„ฐ์— ์„œ์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ•™ .
์ ์›์€ ์ฃผ๋ฐฉ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
๋‹น์‹ ๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ƒˆ์น˜๊ธฐํ•ด์„œ ๋ฒ„๊ฑฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋А๋ผ ๋ฐ”์˜๊ธฐ ๋•Œ๋ฌธ์— ๐Ÿ•™ , ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์—๊ฒŒ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ๐Ÿ˜ž .
์—ฌ๋Ÿฌ๋ถ„์€ ๋ฒˆํ˜ธํ‘œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์—ฌ๋Ÿฌ๋ถ„๋ณด๋‹ค ๋จผ์ € ํ–„๋ฒ„๊ฑฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ๋ชปํ•˜๋„๋ก ์นด์šดํ„ฐ ์•ž์— ์„œ์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ•™.
์ด๊ฒƒ์€ "๋™๊ธฐ" ์ž‘์—…์ด๊ณ , ๋‹น์‹ ์€ ์ ์›/์š”๋ฆฌ์‚ฌ ๐Ÿ‘จโ€๐Ÿณ ์™€ "๋™๊ธฐํ™”" ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๐Ÿ•™ , ์ ์›/์š”๋ฆฌ์‚ฌ ๐Ÿ‘จโ€๐Ÿณ ๊ฐ€ ๋ฒ„๊ฑฐ ๐Ÿ” ์ค€๋น„๋ฅผ ์™„๋ฃŒํ•œ ํ›„ ๋‹น์‹ ์—๊ฒŒ ์ฃผ๊ฑฐ๋‚˜, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ทธ ์ˆœ๊ฐ„์— ๊ทธ ๊ณณ์— ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
<img src="/img/async/parallel-burgers/parallel-burgers-03.png" class="illustration">
์นด์šดํ„ฐ ์•ž์—์„œ ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ๐Ÿ•™ , ์ ์›/์š”๋ฆฌ์‚ฌ ๐Ÿ‘จโ€๐Ÿณ ๊ฐ€ ๋‹น์‹ ์˜ ๋ฒ„๊ฑฐ ๐Ÿ” ๋ฅผ ๊ฐ€์ง€๊ณ  ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€๋Š” ํ–„๋ฒ„๊ฑฐ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ผ์–ด๋“ค์–ด ๊ฐ€์ ธ๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋А๋ผ ๋ฐ”์˜๊ธฐ ๋•Œ๋ฌธ์—, ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์—๊ฒŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ž
๋‹น์‹ ์€ ๋ฒ„๊ฑฐ๋ฅผ ๋ฐ›๊ณ  ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€ ํ•จ๊ป˜ ํ…Œ์ด๋ธ”๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ "๋™๊ธฐ" ์ž‘์—…์ด๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ ์›/์š”๋ฆฌ์‚ฌ ๐Ÿ‘จโ€๐Ÿณ ์™€ "๋™๊ธฐํ™”"๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์›/์š”๋ฆฌ์‚ฌ ๐Ÿ‘จโ€๐Ÿณ ๊ฐ€ ํ–„๋ฒ„๊ฑฐ๋ฅผ ์™„์„ฑํ•ด ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์ฃผ๋Š” ์ •ํ™•ํ•œ ์ˆœ๊ฐ„์— ๊ทธ ์ž๋ฆฌ์— ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ, ์—ฌ๋Ÿฌ๋ถ„์€ ๊ธฐ๋‹ค๋ ค์•ผ ๐Ÿ•™ ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ฐ€์ ธ๊ฐˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹จ์ง€ ๋จน๊ธฐ๋งŒ ํ•˜๋‹ค๊ฐ€, ๋‹ค ๋จน์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ” โน.
<img src="/img/async/parallel-burgers/parallel-burgers-04.png" class="illustration">
์นด์šดํ„ฐ ์•ž์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ๐Ÿ•™ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€ํ™”๋ฅผ ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์„ ๊ฑธ ์‹œ๊ฐ„์ด ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ž .
๊ทธ๋Ÿฌ๋‹ค ์ ์›/์š”๋ฆฌ์‚ฌ ๐Ÿ‘จโ€๐Ÿณ ๊ฐ€ ์นด์šดํ„ฐ ์•ž์—์„œ ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฐ ๐Ÿ•™ ๋์— ๋งˆ์นจ๋‚ด ํ–„๋ฒ„๊ฑฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
---
<img src="/img/async/parallel-burgers/parallel-burgers-05.png" class="illustration">
์—ฌ๋Ÿฌ๋ถ„์€ ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋ฐ›์•„ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€ ํ…Œ์ด๋ธ”๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ๋จน๊ณ , ๋์ž…๋‹ˆ๋‹ค. โน
<img src="/img/async/parallel-burgers/parallel-burgers-06.png" class="illustration">
๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์นด์šดํ„ฐ ์•ž์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ๐Ÿ•™ ์ผ๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€ํ™”ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์„ ๊ฑธ ์‹œ๊ฐ„์€ ๋งŽ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ž
์ด ๋ณ‘๋ ฌ ๋ฒ„๊ฑฐ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ, ๋‹น์‹ ์€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๐Ÿ•™ , ์˜ค๋žœ ์‹œ๊ฐ„๋™์•ˆ "์นด์šดํ„ฐ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š”" ๐Ÿ•™ ๋ฐ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋Š” โฏ ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ(๋‹น์‹ ๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€๐Ÿ˜)๋ฅผ ๊ฐ€์ง„ ์ปดํ“จํ„ฐ / ํ”„๋กœ๊ทธ๋žจ ๐Ÿค– ์ž…๋‹ˆ๋‹ค.
/// info | ์ •๋ณด
ํŒจ์ŠคํŠธํ‘ธ๋“œ์ ์—๋Š” 8๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ(์ ์›/์š”๋ฆฌ์‚ฌ) ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ ๋ฒ„๊ฑฐ๋Š” ๋‹จ ๋‘ ๊ฐœ(ํ•œ ๋ช…์˜ ์ง์›๊ณผ ํ•œ ๋ช…์˜ ์š”๋ฆฌ์‚ฌ) ๐Ÿ’ ๐Ÿ‘จโ€๐Ÿณ ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. ๐ŸŽจ
ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ, ๋ณ‘๋ ฌ ๋ฒ„๊ฑฐ ์˜ˆ์‹œ๊ฐ€ ์ตœ์„ ์€ ์•„๋‹™๋‹ˆ๋‹ค ๐Ÿ˜ž .
///
---
์ด ์˜ˆ์‹œ๋Š” ๋ฒ„๊ฑฐ๐Ÿ” ์ด์•ผ๊ธฐ์™€ ๊ฒฐ์ด ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด ๋ณ‘๋ ฌ ํ–„๋ฒ„๊ฑฐ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ, ์—ฌ๋Ÿฌ๋ถ„์€ ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ(์—ฌ๋Ÿฌ๋ถ„๊ณผ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€)๋ฅผ ๊ฐ€์ง„ ์ปดํ“จํ„ฐ/ํ”„๋กœ๊ทธ๋žจ ๐Ÿค– ์ด๋ฉฐ, ๋‘˜ ๋‹ค ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๐Ÿ•™ ์˜ค๋žซ๋™์•ˆ "์นด์šดํ„ฐ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ" ๐Ÿ•™ ์— ์ฃผ์˜๋ฅผ โฏ ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค.
ํŒจ์ŠคํŠธํ‘ธ๋“œ์ ์—๋Š” 8๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ(์ ์›/์š”๋ฆฌ์‚ฌ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ ํ–„๋ฒ„๊ฑฐ ๊ฐ€๊ฒŒ๋Š” 2๊ฐœ(์ ์› 1๋ช…, ์š”๋ฆฌ์‚ฌ 1๋ช…)๋งŒ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋” "ํ˜„์‹ค์ ์ธ" ์˜ˆ์‹œ๋กœ, ์€ํ–‰์„ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ตœ์ข… ๊ฒฝํ—˜์€ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ž
์ตœ๊ทผ๊นŒ์ง€, ๋Œ€๋‹ค์ˆ˜์˜ ์€ํ–‰์—๋Š” ๋‹ค์ˆ˜์˜ ์€ํ–‰์›๋“ค ๐Ÿ‘จโ€๐Ÿ’ผ๐Ÿ‘จโ€๐Ÿ’ผ๐Ÿ‘จโ€๐Ÿ’ผ๐Ÿ‘จโ€๐Ÿ’ผ ๊ณผ ๊ธด ์ค„ ๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
---
๋ชจ๋“  ์€ํ–‰์›๋“ค์€ ํ•œ ๋ช… ํ•œ ๋ช…์˜ ๊ณ ๊ฐ๋“ค์„ ์ฐจ๋ก€๋กœ ์ƒ๋Œ€ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘จโ€๐Ÿ’ผโฏ .
์ด๊ฒƒ์ด ํ–„๋ฒ„๊ฑฐ์˜ ๋ณ‘๋ ฌ ๋ฒ„์ „์— ํ•ด๋‹นํ•˜๋Š” ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ๐Ÿ”
๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ์˜ค๋žซ๋™์•ˆ ์ค„์—์„œ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๊ณ  ๐Ÿ•™ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹น์‹ ์˜ ์ฐจ๋ก€๋ฅผ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ข€ ๋” "ํ˜„์‹ค์ ์ธ" ์˜ˆ์‹œ๋กœ, ์€ํ–‰์„ ์ƒ์ƒํ•ด๋ณด์„ธ์š”.
์•„๋งˆ ๋‹น์‹ ์€ ์€ํ–‰ ๐Ÿฆ ์‹ฌ๋ถ€๋ฆ„์— ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ๋ฅผ ๋ฐ๋ ค๊ฐ€๊ณ  ์‹ถ์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ตœ๊ทผ๊นŒ์ง€ ๋Œ€๋ถ€๋ถ„์˜ ์€ํ–‰์—๋Š” ์—ฌ๋Ÿฌ ์€ํ–‰์› ๐Ÿ‘จโ€๐Ÿ’ผ๐Ÿ‘จโ€๐Ÿ’ผ๐Ÿ‘จโ€๐Ÿ’ผ๐Ÿ‘จโ€๐Ÿ’ผ ๊ณผ ๊ธด ์ค„ ๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™๐Ÿ•™ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
### ๋ฒ„๊ฑฐ ์˜ˆ์‹œ์˜ ๊ฒฐ๋ก 
๋ชจ๋“  ์€ํ–‰์›์ด ํ•œ ๊ณ ๊ฐ์”ฉ ์ˆœ์„œ๋Œ€๋กœ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘จโ€๐Ÿ’ผโฏ.
"์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€์˜ ํŒจ์ŠคํŠธํ‘ธ๋“œ์  ๋ฒ„๊ฑฐ" ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ, ์˜ค๋žœ ๊ธฐ๋‹ค๋ฆผ ๐Ÿ•™ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ ์‹œ์Šคํ…œ โธ๐Ÿ”€โฏ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๋ถ„์€ ์˜ค๋žซ๋™์•ˆ ์ค„์—์„œ ๊ธฐ๋‹ค๋ ค์•ผ ๐Ÿ•™ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฐจ๋ก€๋ฅผ ์žƒ์Šต๋‹ˆ๋‹ค.
๋Œ€๋‹ค์ˆ˜์˜ ์›น ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ๊ฐ€ ๊ทธ๋Ÿฌํ•ฉ๋‹ˆ๋‹ค.
์•„๋งˆ ์€ํ–‰ ๐Ÿฆ ์—…๋ฌด๋ฅผ ๋ณด๋Ÿฌ ๊ฐˆ ๋•Œ ์ง์‚ฌ๋ž‘ ์ƒ๋Œ€ ๐Ÿ˜ ๋ฅผ ๋ฐ๋ ค๊ฐ€๊ณ  ์‹ถ์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋งค์šฐ ๋งŽ์€ ์ˆ˜์˜ ์œ ์ €๊ฐ€ ์žˆ์ง€๋งŒ, ์„œ๋ฒ„๋Š” ๊ทธ๋“ค์˜ ์š”์ฒญ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋‹ฅ-์ข‹์ง€-์•Š์€ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ•™ .
### ํ–„๋ฒ„๊ฑฐ ์˜ˆ์‹œ์˜ ๊ฒฐ๋ก  { #burger-conclusion }
๊ทธ๋ฆฌ๊ณ  ์‘๋‹ต์ด ๋Œ์•„์˜ฌ ๋•Œ๊นŒ์ง€ ๋‹ค์‹œ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ•™ .
"์ง์‚ฌ๋ž‘ ์ƒ๋Œ€์™€์˜ ํŒจ์ŠคํŠธํ‘ธ๋“œ์  ํ–„๋ฒ„๊ฑฐ" ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๊ธฐ๋‹ค๋ฆผ ๐Ÿ•™ ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ๋™์‹œ ์‹œ์Šคํ…œ โธ๐Ÿ”€โฏ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
์ด "๊ธฐ๋‹ค๋ฆผ" ๐Ÿ•™ ์€ ๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„์ด์ง€๋งŒ, ๋ชจ๋‘ ๋”ํ•ด์ง€๋ฉด, ๊ฒฐ๊ตญ์—๋Š” ๋งค์šฐ ๊ธด ๋Œ€๊ธฐ์‹œ๊ฐ„์ด ๋ฉ๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์›น API๋ฅผ ์œ„ํ•ด ๋น„๋™๊ธฐ โธ๐Ÿ”€โฏ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
๋งค์šฐ ๋งŽ์€ ์‚ฌ์šฉ์ž๋“ค์ด ์žˆ๊ณ , ์„œ๋ฒ„๋Š” ๊ทธ๋“ค์˜ ์ข‹์ง€ ์•Š์€ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์š”์ฒญ์ด ์ „์†ก๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ•™.
๋Œ€๋ถ€๋ถ„์˜ ์กด์žฌํ•˜๋Š” ์œ ๋ช…ํ•œ ํŒŒ์ด์ฌ ํ”„๋ ˆ์ž„์›Œํฌ (Flask์™€ Django ๋“ฑ)์€ ์ƒˆ๋กœ์šด ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ๋“ค์ด ํŒŒ์ด์ฌ์— ์กด์žฌํ•˜๊ธฐ ์ „์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ๊ทธ๋“ค์˜ ๋ฐฐํฌ ๋ฐฉ์‹์€ ๋ณ‘๋ ฌ ์‹คํ–‰๊ณผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋งŒํผ ๊ฐ•๋ ฅํ•˜์ง€๋Š” ์•Š์€ ์˜ˆ์ „ ๋ฒ„์ „์˜ ๋น„๋™๊ธฐ ์‹คํ–‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‘๋‹ต์ด ๋Œ์•„์˜ค๊ธฐ๋ฅผ ๋‹ค์‹œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ•™.
๋น„๋™๊ธฐ ์›น ํŒŒ์ด์ฌ(ASGI)์— ๋Œ€ํ•œ ์ฃผ์š” ๋ช…์„ธ๊ฐ€ ์›น์†Œ์ผ“์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Django์—์„œ ๊ฐœ๋ฐœ ๋˜์—ˆ์Œ์—๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
์ด "๊ธฐ๋‹ค๋ฆผ" ๐Ÿ•™ ์€ ๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„๋กœ ์ธก์ •๋˜์ง€๋งŒ, ๋ชจ๋‘ ํ•ฉ์น˜๋ฉด ๊ฒฐ๊ตญ ๊ฝค ๋งŽ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋น„๋™๊ธฐ์„ฑ์€ (NodeJS๋Š” ๋ณ‘๋ ฌ์ ์ด์ง€ ์•Š์Œ์—๋„) NodeJS๊ฐ€ ์‚ฌ๋ž‘๋ฐ›๋Š” ์ด์œ ์ด๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ์„œ์˜ Go์˜ ๊ฐ•์ ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์›น API์—๋Š” ๋น„๋™๊ธฐ โธ๐Ÿ”€โฏ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  **FastAPI**๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋™์ผํ•œ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋น„๋™๊ธฐ์„ฑ์€ NodeJS๊ฐ€ ์ธ๊ธฐ ์žˆ๋Š” ์ด์œ (๋น„๋ก NodeJS๊ฐ€ ๋ณ‘๋ ฌ์€ ์•„๋‹ˆ์ง€๋งŒ)์ด์ž, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ์„œ Go์˜ ๊ฐ•์ ์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ์„ฑ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ NodeJS ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์–ป๊ณ  C์— ๋” ๊ฐ€๊นŒ์šด ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go์™€ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค<a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(๋ชจ๋‘ Starlette ๋•๋ถ„์ž…๋‹ˆ๋‹ค)</a>.
๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด **FastAPI**๋กœ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค.
### ๋™์‹œ์„ฑ์ด ๋ณ‘๋ ฌ์„ฑ๋ณด๋‹ค ๋” ๋‚˜์€๊ฐ€?
๋˜ํ•œ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ์„ฑ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๋œ NodeJS ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์–ป๊ณ , C์— ๋” ๊ฐ€๊นŒ์šด ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go์™€ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(๋ชจ๋‘ Starlette ๋•๋ถ„์ž…๋‹ˆ๋‹ค)</a>.
๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๊ทธ๊ฒƒ์ด ์ด์•ผ๊ธฐ์˜ ๊ตํ›ˆ์€ ์•„๋‹™๋‹ˆ๋‹ค.
### ๋™์‹œ์„ฑ์ด ๋ณ‘๋ ฌ์„ฑ๋ณด๋‹ค ๋” ๋‚˜์€๊ฐ€์š”? { #is-concurrency-better-than-parallelism }
๋™์‹œ์„ฑ์€ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋งŽ์€ ๋Œ€๊ธฐ๋ฅผ ํ•„์š”๋กœํ•˜๋Š” **ํŠน์ •ํ•œ** ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด, ์›น ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์—์„œ ๋™์‹œ์„ฑ์ด ๋ณ‘๋ ฌ์„ฑ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
์•„๋‹ˆ์š”! ๊ทธ๊ฒŒ ์ด ์ด์•ผ๊ธฐ์˜ ๊ตํ›ˆ์€ ์•„๋‹™๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ์˜ ์งง์€ ์ด์•ผ๊ธฐ๋ฅผ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค:
๋™์‹œ์„ฑ์€ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ๊ธฐ๋‹ค๋ฆผ์ด ํฌํ•จ๋˜๋Š” **ํŠน์ •ํ•œ** ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋•Œ๋ฌธ์— ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ‘๋ ฌ์„ฑ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์— ํ•ด๋‹นํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.
> ๋‹น์‹ ์€ ํฌ๊ณ , ๋”๋Ÿฌ์šด ์ง‘์„ ์ฒญ์†Œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ์˜ ์งง์€ ์ด์•ผ๊ธฐ๋ฅผ ์ƒ์ƒํ•ด๋ณด์„ธ์š”:
> ์—ฌ๋Ÿฌ๋ถ„์€ ํฌ๊ณ  ๋”๋Ÿฌ์šด ์ง‘์„ ์ฒญ์†Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
*๋„ค, ์ด๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค*.
---
์–ด๋””์—๋„ ๋Œ€๊ธฐ ๐Ÿ•™ ๋Š” ์—†๊ณ , ์ง‘์•ˆ ๊ณณ๊ณณ์—์„œ ํ•ด์•ผํ•˜๋Š” ๋งŽ์€ ์ž‘์—…๋“ค๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด๋””์—๋„ ๊ธฐ๋‹ค๋ฆผ ๐Ÿ•™ ์€ ์—†๊ณ , ์ง‘์˜ ์—ฌ๋Ÿฌ ์žฅ์†Œ์—์„œ ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.
๋ฒ„๊ฑฐ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ฒ˜์Œ์—๋Š” ๊ฑฐ์‹ค, ๊ทธ ๋‹ค์Œ์€ ๋ถ€์—Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜, ๋ฌด์—‡๋„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๐Ÿ•™ ์•Š๊ณ  ๊ณ„์†ํ•ด์„œ ์ฒญ์†Œ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆœ์„œ๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ–„๋ฒ„๊ฑฐ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๊ฑฐ์‹ค๋ถ€ํ„ฐ, ๊ทธ ๋‹ค์Œ์€ ๋ถ€์—Œ์ฒ˜๋Ÿผ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์–ด๋–ค ๊ฒƒ๋„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๐Ÿ•™ ์•Š๊ณ  ๊ณ„์† ์ฒญ์†Œ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆœ์„œ๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ˆœ์„œ๊ฐ€ ์žˆ๋“  ์—†๋“  ๋™์ผํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ด๊ณ (๋™์‹œ์„ฑ) ๋™์ผํ•œ ์–‘์˜ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ˆœ์„œ๊ฐ€ ์žˆ๋“  ์—†๋“ (๋™์‹œ์„ฑ) ๋๋‚ด๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๊ฐ™๊ณ , ๊ฐ™์€ ์–‘์˜ ์ผ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—์„œ, 8๋ช…์˜ ์ „(ๅ‰)-์ ์›/์š”๋ฆฌ์‚ฌ์ด๋ฉด์„œ-ํ˜„(็พ)-์ฒญ์†Œ๋ถ€ ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ๐Ÿ‘ฉโ€๐Ÿณ๐Ÿ‘จโ€๐Ÿณ ๋ฅผ ๊ณ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋“ค ๊ฐ์ž(๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ )๊ฐ€ ์ง‘์˜ ํ•œ ๋ถ€๋ถ„์”ฉ ๋งก์•„ ์ฒญ์†Œ๋ฅผ ํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ **๋ณ‘๋ ฌ์ **์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ์กฐ๊ธˆ์˜ ๋„์›€์ด ์žˆ๋‹ค๋ฉด, ํ›จ์”ฌ ๋” ๋นจ๋ฆฌ ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ, ์ „(ๅ‰) ์ ์›/์š”๋ฆฌ์‚ฌ์ด์ž ํ˜„(็พ) ์ฒญ์†Œ๋ถ€๊ฐ€ ๋œ 8๋ช…์„ ๋ฐ๋ ค์˜ฌ ์ˆ˜ ์žˆ๊ณ , ๊ฐ์ž(๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๋ถ„)๊ฐ€ ์ง‘์˜ ๊ตฌ์—ญ์„ ํ•˜๋‚˜์”ฉ ๋งก์•„ ์ฒญ์†Œํ•œ๋‹ค๋ฉด, ์ถ”๊ฐ€ ๋„์›€๊ณผ ํ•จ๊ป˜ ๋ชจ๋“  ์ผ์„ **๋ณ‘๋ ฌ**๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ›จ์”ฌ ๋” ๋นจ๋ฆฌ ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ, (๋‹น์‹ ์„ ํฌํ•จํ•œ) ๊ฐ๊ฐ์˜ ์ฒญ์†Œ๋ถ€๋“ค์€ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ๊ฐ์ž์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ (์—ฌ๋Ÿฌ๋ถ„์„ ํฌํ•จํ•œ) ๊ฐ ์ฒญ์†Œ๋ถ€๋Š” ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋˜์–ด, ๋งก์€ ์ผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์‹คํ–‰ ์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„์ด ๋Œ€๊ธฐ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ž‘์—…์— ์†Œ์š”๋˜๊ณ , ์ปดํ“จํ„ฐ์—์„œ ์ž‘์—…์€ <abbr title="Central Processing Unit">CPU</abbr>์—์„œ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ "CPU์— ๋ฌถ์˜€"๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„์ด ๊ธฐ๋‹ค๋ฆผ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์ž‘์—…์— ์“ฐ์ด๊ณ , ์ปดํ“จํ„ฐ์—์„œ ์ž‘์—…์€ <abbr title="Central Processing Unit - ์ค‘์•™ ์ฒ˜๋ฆฌ ์žฅ์น˜">CPU</abbr>๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ "CPU bound"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
---
CPU์— ๋ฌถ์ธ ์—ฐ์‚ฐ์— ๊ด€ํ•œ ํ”ํ•œ ์˜ˆ์‹œ๋Š” ๋ณต์žกํ•œ ์ˆ˜ํ•™ ์ฒ˜๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
CPU bound ์ž‘์—…์˜ ํ”ํ•œ ์˜ˆ์‹œ๋Š” ๋ณต์žกํ•œ ์ˆ˜ํ•™ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด:
* **์˜ค๋””์˜ค** ๋˜๋Š” **์ด๋ฏธ์ง€** ์ฒ˜๋ฆฌ.
* **์ปดํ“จํ„ฐ ๋น„์ „**: ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋Š” ์ˆ˜๋ฐฑ๊ฐœ์˜ ํ”ฝ์…€๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๊ณ , ๊ฐ ํ”ฝ์…€์€ 3๊ฐœ์˜ ๊ฐ’ / ์ƒ‰์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๋‹น ํ”ฝ์…€๋“ค์— ๋Œ€ํ•ด ๋™์‹œ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋Š” ์ฒ˜๋ฆฌ.
* **๋จธ์‹ ๋Ÿฌ๋‹**: ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์€ "ํ–‰๋ ฌ"๊ณผ "๋ฒกํ„ฐ" ๊ณฑ์…ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋Œ€ํ•œ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ์— ์ˆ˜๋“ค์ด ์žˆ๊ณ  ๊ทธ ์ˆ˜๋“ค์„ ๋™์‹œ์— ๊ณฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค.
* **๋”ฅ๋Ÿฌ๋‹**: ๋จธ์‹ ๋Ÿฌ๋‹์˜ ํ•˜์œ„์˜์—ญ์œผ๋กœ, ๋™์ผํ•œ ์˜ˆ์‹œ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ด ๊ฒฝ์šฐ์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ์— ๊ณฑํ•ด์•ผํ•  ์ˆ˜๋“ค์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฑฐ๋Œ€ํ•œ ์„ธํŠธ์˜ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ๋“ค์ด ์žˆ๊ณ , ๋งŽ์€ ๊ฒฝ์šฐ์—, ์ด ๋ชจ๋ธ๋“ค์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ํ•œ ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
* **์˜ค๋””์˜ค** ๋˜๋Š” **์ด๋ฏธ์ง€** ์ฒ˜๋ฆฌ
* **์ปดํ“จํ„ฐ ๋น„์ „**: ์ด๋ฏธ์ง€๋Š” ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํ”ฝ์…€๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ฐ ํ”ฝ์…€์€ 3๊ฐœ์˜ ๊ฐ’/์ƒ‰์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ๊ทธ ํ”ฝ์…€๋“ค์— ๋Œ€ํ•ด ๋™์‹œ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* **๋จธ์‹ ๋Ÿฌ๋‹**: ๋ณดํ†ต ๋งŽ์€ "matrix"์™€ "vector" ๊ณฑ์…ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ ์žˆ๋Š” ๊ฑฐ๋Œ€ํ•œ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ƒ๊ฐํ•˜๊ณ , ๊ทธ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋™์‹œ์— ๊ณฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.
* **๋”ฅ๋Ÿฌ๋‹**: ๋จธ์‹ ๋Ÿฌ๋‹์˜ ํ•˜์œ„ ๋ถ„์•ผ์ด๋ฏ€๋กœ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ณฑํ•ด์•ผ ํ•  ์ˆซ์ž๊ฐ€ ์žˆ๋Š” ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๊ฐ€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ, ์•„์ฃผ ํฐ ์ง‘ํ•ฉ์ด๋ฉฐ, ๋งŽ์€ ๊ฒฝ์šฐ ๊ทธ ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ /๋˜๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
### ๋™์‹œ์„ฑ + ๋ณ‘๋ ฌ์„ฑ: ์›น + ๋จธ์‹ ๋Ÿฌ๋‹
### ๋™์‹œ์„ฑ + ๋ณ‘๋ ฌ์„ฑ: ์›น + ๋จธ์‹ ๋Ÿฌ๋‹ { #concurrency-parallelism-web-machine-learning }
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›น ๊ฐœ๋ฐœ์—์„œ๋Š” ๋งค์šฐ ํ”ํ•œ ๋™์‹œ์„ฑ์˜ ์ด์ ์„ (NodeJS์˜ ์ฃผ๋œ ๋งค๋ ฅ๋งŒํผ) ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›น ๊ฐœ๋ฐœ์—์„œ ๋งค์šฐ ํ”ํ•œ ๋™์‹œ์„ฑ์˜ ์ด์ ์„( NodeJS์˜ ์ฃผ์š” ๋งค๋ ฅ๊ณผ ๊ฐ™์€) ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋จธ์‹ ๋Ÿฌ๋‹ ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์ด **CPU์— ๋ฌถ์ธ** ์ž‘์—…์„ ์œ„ํ•ด ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ(๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋™์ž‘์‹œํ‚ค๋Š” ๊ฒƒ)์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ **CPU bound** ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•ด ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ(์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰)์„ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ์ด **๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค**, ๋จธ์‹ ๋Ÿฌ๋‹๊ณผ ํŠนํžˆ ๋”ฅ๋Ÿฌ๋‹์— ์˜ ์ฃผ๋œ ์–ธ์–ด๋ผ๋Š” ๊ฐ„๋‹จํ•œ ์‚ฌ์‹ค์— ๋”ํ•ด์„œ, ์ด๊ฒƒ์€ FastAPI๋ฅผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค / ๋จธ์‹ ๋Ÿฌ๋‹ ์›น API์™€ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์— (๋‹ค๋ฅธ ๊ฒƒ๋“ค๋ณด๋‹ค) ์ข‹์€ ์„ ํƒ์ง€๊ฐ€ ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ํŒŒ์ด์ฌ์ด **๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค**, ๋จธ์‹ ๋Ÿฌ๋‹, ํŠนํžˆ ๋”ฅ๋Ÿฌ๋‹์˜ ์ฃผ์š” ์–ธ์–ด๋ผ๋Š” ๋‹จ์ˆœํ•œ ์‚ฌ์‹ค๊ณผ ๋”ํ•ด์ ธ, FastAPI๋ฅผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค/๋จธ์‹ ๋Ÿฌ๋‹ ์›น API ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๊ทธ ์™ธ์—๋„ ๋งŽ์€ ๊ฒƒ๋“ค)์— ๋งค์šฐ ์ž˜ ๋งž๋Š” ์„ ํƒ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
๋ฐฐํฌ์‹œ ๋ณ‘๋ ฌ์„ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š”์ง€ ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด, [๋ฐฐํฌ](deployment/index.md){.internal-link target=_blank}๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
ํ”„๋กœ๋•์…˜์—์„œ ์ด ๋ณ‘๋ ฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด [๋ฐฐํฌ](deployment/index.md){.internal-link target=_blank} ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
## `async`์™€ `await`
## `async`์™€ `await` { #async-and-await }
์ตœ์‹  ํŒŒ์ด์ฌ ๋ฒ„์ „์—๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋งค์šฐ ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๊ฒƒ์„ ํ‰๋ฒ”ํ•œ "์ˆœ์ฐจ์ " ์ฝ”๋“œ๋กœ ๋ณด์ด๊ฒŒ ํ•˜๊ณ , ์ ์ ˆํ•œ ์ˆœ๊ฐ„์— ๋‹น์‹ ์„ ์œ„ํ•ด "๋Œ€๊ธฐ"ํ•ฉ๋‹ˆ๋‹ค.
์ตœ์‹  ํŒŒ์ด์ฌ ๋ฒ„์ „์—๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋งค์šฐ ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ด๋ฅผ ํ‰๋ฒ”ํ•œ "์ˆœ์ฐจ" ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๊ณ , ์ ์ ˆํ•œ ์ˆœ๊ฐ„์— ์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•ด "๊ธฐ๋‹ค๋ฆผ"์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์—ฐ์‚ฐ์ด ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ๋Œ€๊ธฐ๋ฅผ ํ•ด์•ผํ•˜๊ณ  ์ƒˆ๋กœ์šด ํŒŒ์ด์ฌ ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•œ๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๊ฒฐ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ „์— ๊ธฐ๋‹ค๋ฆผ์ด ํ•„์š”ํ•œ ์ž‘์—…์ด ์žˆ๊ณ , ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ํŒŒ์ด์ฌ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```Python
burgers = await get_burgers(2)
```
์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ `await`์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŒŒ์ด์ฌ์—๊ฒŒ `burgers` ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ด์ „์— `get_burgers(2)`์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๐Ÿ•™ ๊ธฐ๋‹ค๋ฆฌ๋ผ๊ณ  โธ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด, ํŒŒ์ด์ฌ์€ ๊ทธ๋™์•ˆ (๋‹ค๋ฅธ ์š”์ฒญ์„ ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€) ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๐Ÿ”€ โฏ ์•Œ๊ฒŒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ `await`์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒ์ด์ฌ์—๊ฒŒ `get_burgers(2)`๊ฐ€ ๊ทธ ์ผ์„ ๋๋‚ผ ๋•Œ๊นŒ์ง€ ๐Ÿ•™ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก โธ ๋งํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ `burgers`์— ์ €์žฅํ•˜๊ธฐ ์ „์— ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŒŒ์ด์ฌ์€ ๊ทธ๋™์•ˆ(์˜ˆ: ๋‹ค๋ฅธ ์š”์ฒญ์„ ๋ฐ›๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Ÿฌ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ๐Ÿ”€ โฏ ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
`await`๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด, ์ด๊ฒƒ์€ ๋น„๋™๊ธฐ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ `async def`๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:
`await`๊ฐ€ ๋™์ž‘ํ•˜๋ ค๋ฉด, ์ด ๋น„๋™๊ธฐ์„ฑ์„ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด `async def`๋กœ ์„ ์–ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:
```Python hl_lines="1"
async def get_burgers(number: int):
# Do some asynchronous stuff to create the burgers
# ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰
return burgers
```
...`def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ :
...`def` ๋Œ€์‹ :
```Python hl_lines="2"
# This is not asynchronous
# ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
def get_sequential_burgers(number: int):
# Do some sequential stuff to create the burgers
# ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ˆœ์ฐจ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰
return burgers
```
`async def`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํŒŒ์ด์ฌ์€ ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ `await` ํ‘œํ˜„์— ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ, ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ "์ผ์‹œ์ •์ง€"โธํ•˜๊ณ  ๋‹ค์‹œ ๋Œ์•„์˜ค๊ธฐ ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰๐Ÿ”€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
`async def`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํŒŒ์ด์ฌ์€ ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ `await` ํ‘œํ˜„์‹์— ์ฃผ์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ "์ผ์‹œ์ •์ง€" โธ ํ•˜๊ณ  ๋‹ค์‹œ ๋Œ์•„์˜ค๊ธฐ ์ „์— ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Ÿฌ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ๐Ÿ”€ ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
`async def`f ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ ์ž ํ•  ๋•Œ, "๋Œ€๊ธฐ"ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์•„๋ž˜๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
`async def` ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š”, ๊ทธ ํ•จ์ˆ˜๋ฅผ "await" ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:
```Python
# This won't work, because get_burgers was defined with: async def
# ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. get_burgers๋Š” async def๋กœ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค
burgers = get_burgers(2)
```
---
๋”ฐ๋ผ์„œ, `await`f๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด `async def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
๋”ฐ๋ผ์„œ, `await`๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ `async def`๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
```Python hl_lines="2-3"
@app.get('/burgers')
@ -317,94 +349,96 @@ async def read_burgers():
return burgers
```
### ๋” ์„ธ๋ถ€์ ์ธ ๊ธฐ์ˆ ์  ์‚ฌํ•ญ
### ๋” ์„ธ๋ถ€์ ์ธ ๊ธฐ์ˆ ์  ์‚ฌํ•ญ { #more-technical-details }
`await`๋Š” `async def`๋กœ ์ •์˜๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑ„์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
`await`๊ฐ€ `async def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑ„์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋™์‹œ์—, `async def`๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋Š” "await" ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `async def`๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜๋Š” `async def`๋กœ ์ •์˜๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋™์‹œ์—, `async def`๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋“ค์€ "๋Œ€๊ธฐ"๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, `async def`๋ฅผ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜๋“ค์€ ์—ญ์‹œ `async def`๋ฅผ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด, ๋‹ญ์ด ๋จผ์ €๋ƒ ๋‹ฌ๊ฑ€์ด ๋จผ์ €๋ƒ์ฒ˜๋Ÿผ, ์ฒซ ๋ฒˆ์งธ `async` ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ญ์ด ๋จผ์ €๋ƒ, ๋‹ฌ๊ฑ€์ด ๋จผ์ €๋ƒ, ์ฒซ `async` ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๊นŒ?
**FastAPI**๋กœ ์ž‘์—…ํ•œ๋‹ค๋ฉด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ "์ฒซ" ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , FastAPI๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์—…ํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์„ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ "์ฒซ" ํ•จ์ˆ˜๋Š” ๋‹น์‹ ์˜ *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , FastAPI๋Š” ์–ด๋–ป๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์•Œ๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ FastAPI ์—†์ด `async` / `await`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  `async` / `await`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด ์—ญ์‹œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
### ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ { #write-your-own-async-code }
### ๋‹น์‹ ๋งŒ์˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ
Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a>์™€ <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> ๋ชจ๋‘์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
Starlette(๊ทธ๋ฆฌ๊ณ  FastAPI)๋Š” <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ ์žˆ๊ณ , ๋”ฐ๋ผ์„œ ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a> ๋ฐ <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a>์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
ํŠนํžˆ, ์ฝ”๋“œ์—์„œ ๋” ๊ณ ๊ธ‰ ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ๋™์‹œ์„ฑ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์ง์ ‘ <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ, ์ฝ”๋“œ์—์„œ ๊ณ ๊ธ‰ ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ๋™์‹œ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ง์ ‘์ ์œผ๋กœ <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๊ทธ ์ด์ (์˜ˆ: *structured concurrency*)์„ ์–ป๊ธฐ ์œ„ํ•ด <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋กœ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋†’์€ ํ˜ธํ™˜์„ฑ ๋ฐ <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>์˜ ์ด์ (์˜ˆ: *๊ตฌ์กฐํ™”๋œ ๋™์‹œ์„ฑ*)์„ ์ทจํ•˜๊ธฐ ์œ„ํ•ด <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ €๋Š” AnyIO ์œ„์— ์–‡์€ ๋ ˆ์ด์–ด๋กœ ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ์กฐ๊ธˆ ๊ฐœ์„ ํ•˜๊ณ  ๋” ๋‚˜์€ **์ž๋™์™„์„ฑ**, **์ธ๋ผ์ธ ์˜ค๋ฅ˜** ๋“ฑ์„ ์–ป๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ **์ดํ•ด**ํ•˜๊ณ  **์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ**๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋•๋Š” ์นœ์ ˆํ•œ ์†Œ๊ฐœ์™€ ํŠœํ† ๋ฆฌ์–ผ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: <a href="https://asyncer.tiangolo.com/" class="external-link" target="_blank">Asyncer</a>. ํŠนํžˆ **async ์ฝ”๋“œ์™€ ์ผ๋ฐ˜**(blocking/๋™๊ธฐ) ์ฝ”๋“œ๋ฅผ **๊ฒฐํ•ฉ**ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
### ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ํ˜•ํƒœ
### ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ํ˜•ํƒœ { #other-forms-of-asynchronous-code }
ํŒŒ์ด์ฌ์—์„œ `async`์™€ `await`๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ฒƒ์€ ๋น„๊ต์  ์ตœ๊ทผ์˜ ์ผ์ž…๋‹ˆ๋‹ค.
`async`์™€ `await`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด ์Šคํƒ€์ผ์€ ์–ธ์–ด์—์„œ ๋น„๊ต์  ์ตœ๊ทผ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋กœ ์ธํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ ์ž‘์—…์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ผ์„ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
๊ฐ™์€ (๋˜๋Š” ๊ฑฐ์˜ ์œ ์‚ฌํ•œ) ๋ฌธ๋ฒ•์€ ์ตœ์‹  ๋ฒ„์ „์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(๋ธŒ๋ผ์šฐ์ €์™€ NodeJS)์—๋„ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฑฐ์˜ ๋™์ผํ•œ ๋ฌธ๋ฒ•์ด ์ตœ๊ทผ ๋ธŒ๋ผ์šฐ์ €์™€ NodeJS์˜ ์ตœ์‹  JavaScript์—๋„ ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ ์ด์ „์—, ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šด ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ ์ด์ „์—๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ์˜ ์˜ˆ์ „ ๋ฒ„์ „์ด๋ผ๋ฉด, ์Šค๋ ˆ๋“œ ๋˜๋Š” <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•˜๊ณ , ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
์ด์ „ ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ๋˜๋Š” <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•˜๊ณ , ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์ „ ๋ฒ„์ „์˜ NodeJS / ๋ธŒ๋ผ์šฐ์ € ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ผ๋ฉด, "์ฝœ๋ฐฑ ํ•จ์ˆ˜"๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋กœ ์ธํ•ด "์ฝœ๋ฐฑ ์ง€์˜ฅ"์— ๋น ์ง€๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ „ ๋ฒ„์ „์˜ NodeJS/๋ธŒ๋ผ์šฐ์ € JavaScript์—์„œ๋Š” "callback"์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” "callback hell"๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
## ์ฝ”๋ฃจํ‹ด
## ์ฝ”๋ฃจํ‹ด { #coroutines }
**์ฝ”๋ฃจํ‹ด**์€ `async def` ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์นญํ•˜๋Š” ๋งค์šฐ ๊ณ ๊ธ‰์Šค๋Ÿฌ์šด ์šฉ์–ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์€ ๊ทธ๊ฒƒ์ด ์‹œ์ž‘๋˜๊ณ  ์–ด๋А ์‹œ์ ์—์„œ ์™„๋ฃŒ๋˜์ง€๋งŒ ๋‚ด๋ถ€์— `await`๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋‚ด๋ถ€์ ์œผ๋กœ ์ผ์‹œ์ •์ง€โธ๋  ์ˆ˜๋„ ์žˆ๋Š” ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.
**์ฝ”๋ฃจํ‹ด**์€ `async def` ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋งค์šฐ ๊ณ ๊ธ‰์Šค๋Ÿฌ์šด ์šฉ์–ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์€ ๊ทธ๊ฒƒ์ด ํ•จ์ˆ˜์™€ ๋น„์Šทํ•œ ๋ฌด์–ธ๊ฐ€๋กœ์„œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ , ์–ด๋А ์‹œ์ ์— ๋๋‚˜์ง€๋งŒ, ๋‚ด๋ถ€์— `await`๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋‚ด๋ถ€์ ์œผ๋กœ๋„ ์ผ์‹œ์ •์ง€ โธ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ `async` ๋ฐ `await`์™€ ํ•จ๊ป˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ๋“ค์€ "์ฝ”๋ฃจํ‹ด"์œผ๋กœ ๊ฐ„๋‹จํžˆ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Go์˜ ์ฃผ๋œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ "๊ณ ๋ฃจํ‹ด"์— ๊ฒฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ `async` ๋ฐ `await`์™€ ํ•จ๊ป˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์ข…์ข… "์ฝ”๋ฃจํ‹ด"์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” Go์˜ ์ฃผ์š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ "Goroutines"์— ๋น„๊ฒฌ๋ฉ๋‹ˆ๋‹ค.
## ๊ฒฐ๋ก 
## ๊ฒฐ๋ก  { #conclusion }
์ƒ๊ธฐ ๋ฌธ์žฅ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ด…์‹œ๋‹ค:
์œ„์˜ ๊ฐ™์€ ๋ฌธ์žฅ์„ ๋‹ค์‹œ ๋ด…์‹œ๋‹ค:
> ์ตœ์‹  ํŒŒ์ด์ฌ ๋ฒ„์ „์€ **`async` ๋ฐ `await`** ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ **โ€œ์ฝ”๋ฃจํ‹ดโ€**์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” **โ€œ๋น„๋™๊ธฐ ์ฝ”๋“œโ€**๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
> ์ตœ์‹  ํŒŒ์ด์ฌ ๋ฒ„์ „์€ **โ€œ์ฝ”๋ฃจํ‹ดโ€**์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” **โ€œ๋น„๋™๊ธฐ ์ฝ”๋“œโ€**๋ฅผ **`async` ๋ฐ `await`** ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ์ด ๋ง์„ ์กฐ๊ธˆ ๋” ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. โœจ
์ด์ œ ๋” ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. โœจ
์ด๊ฒƒ์ด (Starlette์„ ํ†ตํ•ด) FastAPI๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๊ทธ๊ฒƒ์ด ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ชจ๋“  ๊ฒƒ์ด FastAPI(Starlette์„ ํ†ตํ•ด)๋ฅผ ๊ตฌ๋™ํ•˜๊ณ , ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ์„ ๋‚ด๊ฒŒ ํ•˜๋Š” ์›๋™๋ ฅ์ž…๋‹ˆ๋‹ค.
## ๋งค์šฐ ์„ธ๋ถ€์ ์ธ ๊ธฐ์ˆ ์  ์‚ฌํ•ญ
## ๋งค์šฐ ์„ธ๋ถ€์ ์ธ ๊ธฐ์ˆ ์  ์‚ฌํ•ญ { #very-technical-details }
/// warning | ๊ฒฝ๊ณ 
์ด ๋ถ€๋ถ„์€ ๋„˜์–ด๊ฐ€๋„ ๋ฉ๋‹ˆ๋‹ค.
์ด ๋ถ€๋ถ„์€ ์•„๋งˆ ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ๋“ค์€ **FastAPI**๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋งค์šฐ ์„ธ๋ถ€์ ์ธ ๊ธฐ์ˆ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๊ธฐ์ˆ ์  ์ง€์‹(์ฝ”๋ฃจํ‹ด, ์Šค๋ ˆ๋“œ, ๋ธ”๋กํ‚น ๋“ฑ)์ด ์žˆ๊ณ  FastAPI๊ฐ€ ์–ด๋–ป๊ฒŒ `async def` vs `def`๋ฅผ ๋‹ค๋ฃจ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ๊ณ„์†ํ•˜์‹ญ์‹œ์˜ค.
(์ฝ”๋ฃจํ‹ด, ์Šค๋ ˆ๋“œ, ๋ธ”๋กœํ‚น ๋“ฑ) ๊ฐ™์€ ๊ธฐ์ˆ  ์ง€์‹์ด ๊ฝค ์žˆ๊ณ  FastAPI๊ฐ€ `async def`์™€ ์ผ๋ฐ˜ `def`๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ๊ณ„์† ์ฝ์–ด๋ณด์„ธ์š”.
///
### ๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜
### ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ { #path-operation-functions }
๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜๋ฅผ `async def` ๋Œ€์‹  ์ผ๋ฐ˜์ ์ธ `def`๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, (์„œ๋ฒ„๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ๊ทธ๊ฒƒ์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ๋Œ€๊ธฐ์ค‘์ธ ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ `async def` ๋Œ€์‹  ์ผ๋ฐ˜์ ์ธ `def`๋กœ ์„ ์–ธํ•˜๋ฉด, (์„œ๋ฒ„๋ฅผ ๋ธ”๋กœํ‚นํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹ ) ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ await ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์ƒ๊ธฐ์— ๋ฌ˜์‚ฌ๋œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ด์™”๊ณ  ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ (์•ฝ 100 ๋‚˜๋…ธ์ดˆ)์„ ์œ„ํ•ด `def`๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ณ„์‚ฐ๋งŒ์„ ์œ„ํ•œ ์‚ฌ์†Œํ•œ *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*๋ฅผ ์ •์˜ํ•ด์™”๋‹ค๋ฉด, **FastAPI**๋Š” ์ด์™€๋Š” ๋ฐ˜๋Œ€๋ผ๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—, *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*๊ฐ€ ๋ธ”๋กœํ‚น <abbr title="Input/Output: ๋””์Šคํฌ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ .">I/O</abbr>๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ `async def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.
์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ async ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์žˆ๊ณ , ์•„์ฃผ ์ž‘์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ(์•ฝ 100 ๋‚˜๋…ธ์ดˆ)์„ ์œ„ํ•ด ๊ณ„์‚ฐ๋งŒ ํ•˜๋Š” ์‚ฌ์†Œํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ ์ผ๋ฐ˜ `def`๋กœ ์ •์˜ํ•˜๊ณค ํ–ˆ๋‹ค๋ฉด, **FastAPI**์—์„œ๋Š” ๊ทธ ํšจ๊ณผ๊ฐ€ ์ •๋ฐ˜๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ๋ธ”๋กœํ‚น <abbr title="Input/Output - ์ž…๋ ฅ/์ถœ๋ ฅ: ๋””์Šคํฌ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ .">I/O</abbr> ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ `async def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, FastAPI๊ฐ€ ๋‹น์‹ ์ด ์ „์— ์‚ฌ์šฉํ•˜๋˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค [๋” ๋น ๋ฅผ](index.md#_11){.internal-link target=_blank} (์ตœ์†Œํ•œ ๋น„๊ฒฌ๋ ) ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, **FastAPI**๋Š” ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค [์—ฌ์ „ํžˆ ๋” ๋น ๋ฅผ](index.md#performance){.internal-link target=_blank} ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ตœ์†Œํ•œ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค).
### ์˜์กด์„ฑ
### ์˜์กด์„ฑ { #dependencies }
์˜์กด์„ฑ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด `async def`๊ฐ€ ์•„๋‹Œ ํ‘œ์ค€ `def` ํ•จ์ˆ˜๋ผ๋ฉด, ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
[์˜์กด์„ฑ](tutorial/dependencies/index.md){.internal-link target=_blank}์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด `async def` ๋Œ€์‹  ํ‘œ์ค€ `def` ํ•จ์ˆ˜๋ผ๋ฉด, ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
### ํ•˜์œ„-์˜์กด์„ฑ
### ํ•˜์œ„ ์˜์กด์„ฑ { #sub-dependencies }
ํ•จ์ˆ˜ ์ •์˜์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„œ๋กœ๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค์ˆ˜์˜ ์˜์กด์„ฑ๊ณผ ํ•˜์œ„-์˜์กด์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” `async def`๋กœ, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ผ๋ฐ˜์ ์ธ `def`๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ ์ž˜ ๋™์ž‘ํ•˜๊ณ , ์ผ๋ฐ˜์ ์ธ `def`๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ๋“ค์€ "๋Œ€๊ธฐ"๋˜๋Š” ๋Œ€์‹ ์— (์Šค๋ ˆ๋“œํ’€๋กœ๋ถ€ํ„ฐ) ์™ธ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
์„œ๋กœ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜์กด์„ฑ๊ณผ [ํ•˜์œ„ ์˜์กด์„ฑ](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}์„ ํ•จ์ˆ˜ ์ •์˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” `async def`๋กœ, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ •์ƒ ๋™์ž‘ํ•˜๋ฉฐ, ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ๋“ค์€ "await"๋˜๋Š” ๋Œ€์‹  (์Šค๋ ˆ๋“œํ’€์—์„œ) ์™ธ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
### ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
### ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ { #other-utility-functions }
์ง์ ‘ ํ˜ธ์ถœ๋˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์ธ `def`๋‚˜ `async def`๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๊ณ  FastAPI๋Š” ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ `def`๋‚˜ `async def`๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, FastAPI๋Š” ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ FastAPI๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์™€๋Š” ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค: *๊ฒฝ๋กœ ์ž‘๋™ ํ•จ์ˆ˜*์™€ ์˜์กด์„ฑ
์ด๋Š” FastAPI๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•ด ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜(์ฆ‰, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์™€ ์˜์กด์„ฑ)์™€ ๋Œ€๋น„๋ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๋‹น์‹ ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๊ฐ€ `def`๋ฅผ ์‚ฌ์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋ผ๋ฉด, ์Šค๋ ˆ๋“œํ’€์—์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง์ ‘ ํ˜ธ์ถœ(๋‹น์‹ ์ด ์ฝ”๋“œ์— ์ž‘์„ฑํ•œ ๋Œ€๋กœ)๋  ๊ฒƒ์ด๊ณ , `async def`๋กœ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๋ผ๋ฉด ์ฝ”๋“œ์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ํ•จ์ˆ˜๋ฅผ `await` ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๊ฐ€ `def`๋กœ ๋งŒ๋“  ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ผ๋ฉด, ์Šค๋ ˆ๋“œํ’€์ด ์•„๋‹ˆ๋ผ ์ง์ ‘(์ฝ”๋“œ์— ์ž‘์„ฑํ•œ ๋Œ€๋กœ) ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  `async def`๋กœ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๋ผ๋ฉด, ์ฝ”๋“œ์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ํ•จ์ˆ˜๋ฅผ `await` ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
---
๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ฐพ๊ณ ์žˆ๋˜ ๊ฒฝ์šฐ์— ํ•œํ•ด ์œ ์šฉํ•  ๋งค์šฐ ์„ธ๋ถ€์ ์ธ ๊ธฐ์ˆ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ๋“ค์€ ์•„๋งˆ๋„ ์ด๋ฅผ ์ฐพ๊ณ  ์žˆ์—ˆ๋˜ ๊ฒฝ์šฐ์— ์œ ์šฉํ•œ ๋งค์šฐ ์„ธ๋ถ€์ ์ธ ๊ธฐ์ˆ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ƒ๊ธฐ์˜ ๊ฐ€์ด๋“œ๋ผ์ธ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค: [๋ฐ”์˜์‹  ๊ฒฝ์šฐ](#_1).
๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, ์œ„ ์„น์…˜์˜ ๊ฐ€์ด๋“œ๋ผ์ธ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค: <a href="#in-a-hurry">๋ฐ”์˜์‹ ๊ฐ€์š”?</a>.

108
docs/ko/docs/fastapi-cli.md

@ -1,83 +1,75 @@
# FastAPI CLI
# FastAPI CLI { #fastapi-cli }
**FastAPI CLI**๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ , ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
**FastAPI CLI**๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น™ํ•˜๊ณ , FastAPI ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
FastAPI๋ฅผ ์„ค์น˜ํ•  ๋•Œ (์˜ˆ: `pip install "fastapi[standard]"` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ), `fastapi-cli`๋ผ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” `fastapi` ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
FastAPI๋ฅผ ์„ค์น˜ํ•  ๋•Œ(์˜ˆ: `pip install "fastapi[standard]"`), `fastapi-cli`๋ผ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด ํŒจํ‚ค์ง€๋Š” ํ„ฐ๋ฏธ๋„์—์„œ `fastapi` ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์šฉ์œผ๋กœ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด `fastapi dev` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๊ฐœ๋ฐœ์šฉ์œผ๋กœ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด `fastapi dev` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
<div class="termy">
```console
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">INFO </font> Using path <font color="#3465A4">main.py</font>
<font color="#3465A4">INFO </font> Resolved absolute path <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">INFO </font> Searching for package file structure from directories with <font color="#3465A4">__init__.py</font> files
<font color="#3465A4">INFO </font> Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
โ•ญโ”€ <font color="#8AE234"><b>Python module file</b></font> โ”€โ•ฎ
โ”‚ โ”‚
โ”‚ ๐Ÿ main.py โ”‚
โ”‚ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
<font color="#3465A4">INFO </font> Importing module <font color="#4E9A06">main</font>
<font color="#3465A4">INFO </font> Found importable FastAPI app
โ•ญโ”€ <font color="#8AE234"><b>Importable FastAPI app</b></font> โ”€โ•ฎ
โ”‚ โ”‚
โ”‚ <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822"> </span> โ”‚
โ”‚ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
<font color="#3465A4">INFO </font> Using import string <font color="#8AE234"><b>main:app</b></font>
<span style="background-color:#C4A000"><font color="#2E3436">โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ FastAPI CLI - Development mode โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ Serving at: http://127.0.0.1:8000 โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ API docs: http://127.0.0.1:8000/docs โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ Running in development mode, for production use: โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ </font></span><span style="background-color:#C4A000"><font color="#555753"><b>fastapi run</b></font></span><span style="background-color:#C4A000"><font color="#2E3436"> โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ”‚ โ”‚</font></span>
<span style="background-color:#C4A000"><font color="#2E3436">โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ</font></span>
<font color="#4E9A06">INFO</font>: Will watch for changes in these directories: [&apos;/home/user/code/awesomeapp&apos;]
<font color="#4E9A06">INFO</font>: Uvicorn running on <b>http://127.0.0.1:8000</b> (Press CTRL+C to quit)
<font color="#4E9A06">INFO</font>: Started reloader process [<font color="#34E2E2"><b>2265862</b></font>] using <font color="#34E2E2"><b>WatchFiles</b></font>
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">2265873</font>]
<font color="#4E9A06">INFO</font>: Waiting for application startup.
<font color="#4E9A06">INFO</font>: Application startup complete.
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ๐Ÿš€
Searching for package file structure from directories with
<font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> ๐Ÿ main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the
following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use:
<b>fastapi run</b>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories:
<b>[</b><font color="#4E9A06">&apos;/home/user/code/awesomeapp&apos;</font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C to
quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
```
</div>
`fastapi`๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ช…๋ น์–ด ํ”„๋กœ๊ทธ๋žจ์€ **FastAPI CLI**์ž…๋‹ˆ๋‹ค.
`fastapi`๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์€ **FastAPI CLI**์ž…๋‹ˆ๋‹ค.
FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„, `FastAPI` ์ธ์Šคํ„ด์Šค(์ผ๋ฐ˜์ ์œผ๋กœ `app`์œผ๋กœ ๋ช…๋ช…)๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ž„ํฌํŠธ ๊ณผ์ •์„ ๊ฒฐ์ •ํ•œ ํ›„ ์ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ๋ฐ›์•„ `FastAPI` ์ธ์Šคํ„ด์Šค(์ผ๋ฐ˜์ ์œผ๋กœ `app`์œผ๋กœ ์ด๋ฆ„์„ ๋ถ™์ž„)๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅธ ์ž„ํฌํŠธ ๊ณผ์ •์„ ๊ฒฐ์ •ํ•œ ๋‹ค์Œ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” `fastapi run` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€
ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋Œ€์‹  `fastapi run`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€
๋‚ด๋ถ€์ ์œผ๋กœ, **FastAPI CLI**๋Š” ๊ณ ์„ฑ๋Šฅ์˜, ํ”„๋กœ๋•์…˜์— ์ ํ•ฉํ•œ, ASGI ์„œ๋ฒ„์ธ <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
๋‚ด๋ถ€์ ์œผ๋กœ **FastAPI CLI**๋Š” ๊ณ ์„ฑ๋Šฅ์˜, ํ”„๋กœ๋•์…˜์— ์ ํ•ฉํ•œ ASGI ์„œ๋ฒ„์ธ <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
## `fastapi dev`
## `fastapi dev` { #fastapi-dev }
`fastapi dev` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๊ฐœ๋ฐœ ๋ชจ๋“œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
`fastapi dev`๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ฐœ๋ฐœ ๋ชจ๋“œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ **์ž๋™ ์žฌ์‹œ์ž‘(auto-reload)** ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜์–ด, ์ฝ”๋“œ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ, ๋น„ํ™œ์„ฑํ™”ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ์•ˆ์ •์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์„œ๋ฒ„๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” IP ์ฃผ์†Œ(`localhost`)์ธ `127.0.0.1`์—์„œ ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ **auto-reload**๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์ฝ”๋“œ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ, ๋น„ํ™œ์„ฑํ™”ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ์•ˆ์ •์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํ“จํ„ฐ๊ฐ€ ์ž์‹ ๊ณผ๋งŒ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ(`localhost`) IP์ธ `127.0.0.1`์—์„œ ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
## `fastapi run`
## `fastapi run` { #fastapi-run }
`fastapi run` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ FastAPI๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
`fastapi run`์„ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ FastAPI๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ **์ž๋™ ์žฌ์‹œ์ž‘(auto-reload)** ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  IP ์ฃผ์†Œ์ธ `0.0.0.0`์—์„œ ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์ปดํ“จํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ณต๊ฐœ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ **auto-reload**๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  IP ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” `0.0.0.0`์—์„œ ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ์ปดํ“จํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๊ณต๊ฐœ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ๋ณดํ†ต ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ "์ข…๋ฃŒ ํ”„๋ก์‹œ(termination proxy)"๋ฅผ ํ™œ์šฉํ•ด HTTPS๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์ด ์ž‘์—…์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜๋„ ์žˆ๊ณ , ์ง์ ‘ ์„ค์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์œ„์— "termination proxy"๋ฅผ ๋‘๊ณ  HTTPS๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ(๊ทธ๋ฆฌ๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ) ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ, ์ œ๊ณต์ž๊ฐ€ ์ด ์ž‘์—…์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜๋„ ์žˆ๊ณ  ์ง์ ‘ ์„ค์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip
/// tip | ํŒ
์ž์„ธํ•œ ๋‚ด์šฉ์€ [deployment documentation](deployment/index.md){.internal-link target=\_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ ๋ฌธ์„œ](deployment/index.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
///

176
docs/ko/docs/features.md

@ -1,43 +1,43 @@
# ๊ธฐ๋Šฅ
# ๊ธฐ๋Šฅ { #features }
## FastAPI์˜ ๊ธฐ๋Šฅ
## FastAPI์˜ ๊ธฐ๋Šฅ { #fastapi-features }
**FastAPI**๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
### ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ
### ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ { #based-on-open-standards }
* <abbr title="์—”๋“œํฌ์ธํŠธ, ๋ผ์šฐํŠธ๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค">๊ฒฝ๋กœ</abbr><abbr title="POST, GET, PUT, DELETE์™€ ๊ฐ™์€ HTTP ๋ฉ”์†Œ๋“œ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค">์ž‘๋™</abbr>, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ณธ๋ฌธ ์š”์ฒญ, ๋ณด์•ˆ ๊ทธ ์™ธ์˜ ์„ ์–ธ์„ ํฌํ•จํ•œ API ์ƒ์„ฑ์„ ์œ„ํ•œ <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a>
* <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (OpenAPI ์ž์ฒด๊ฐ€ JSON Schema๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œํ™”.
* ๋‹จ์ˆœํžˆ ๋– ์˜ฌ๋ ค์„œ ๋ง๋ถ™์ธ ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„ธ์‹ฌํ•œ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์นœ ํ›„, ์ด๋Ÿฌํ•œ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
* ์ด๋Š” ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ž๋™์ ์ธ **ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ**์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a>: <abbr title="๋˜ํ•œ ๋‹ค์Œ์œผ๋กœ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค: ์—”๋“œํฌ์ธํŠธ, ๋ผ์šฐํŠธ">path</abbr> <abbr title="HTTP ๋ฉ”์†Œ๋“œ(POST, GET, PUT, DELETE ๋“ฑ)๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค">operations</abbr>, ๋งค๊ฐœ๋ณ€์ˆ˜, ์š”์ฒญ ๋ณธ๋ฌธ, ๋ณด์•ˆ ๋“ฑ์˜ ์„ ์–ธ์„ ํฌํ•จํ•˜์—ฌ API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
* <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a>๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œํ™”(OpenAPI ์ž์ฒด๊ฐ€ JSON Schema๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
* ๋‹จ์ˆœํžˆ ๋– ์˜ฌ๋ ค์„œ ๋ง๋ถ™์ธ ๋ ˆ์ด์–ด๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ธ์‹ฌํ•œ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์นœ ๋’ค ์ด๋Ÿฌํ•œ ํ‘œ์ค€์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
* ์ด๋Š” ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ž๋™ **ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ**์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
### ๋ฌธ์„œ ์ž๋™ํ™”
### ๋ฌธ์„œ ์ž๋™ํ™” { #automatic-docs }
๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ์™€ ์›น ํƒ์ƒ‰ ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ OpenAPI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ์—, 2๊ฐ€์ง€ ์˜ต์…˜์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋“ค์–ด๊ฐ„ ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ์™€ ํƒ์ƒ‰์šฉ ์›น ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ OpenAPI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ์— ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
* ๋Œ€ํ™”ํ˜• ํƒ์ƒ‰ <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>๋ฅผ ์ด์šฉํ•ด, ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ API๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๋Œ€ํ™”ํ˜• ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>์„ ์ด์šฉํ•ด API ๋ฌธ์„œํ™”๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>์„ ์ด์šฉํ•œ ๋Œ€์ฒด API ๋ฌธ์„œํ™”.
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
### ๊ทธ์ € ํ˜„๋Œ€ ํŒŒ์ด์ฌ
### ๊ทธ์ € ํ˜„๋Œ€ ํŒŒ์ด์ฌ { #just-modern-python }
(Pydantic ๋•๋ถ„์—) FastAPI๋Š” ํ‘œ์ค€ **ํŒŒ์ด์ฌ 3.6 ํƒ€์ž…** ์„ ์–ธ์— ๊ธฐ๋ฐ˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋ฐฐ์šธ ๋ฌธ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ํ‘œ์ค€์ ์ธ ํ˜„๋Œ€ ํŒŒ์ด์ฌ์ž…๋‹ˆ๋‹ค.
( Pydantic ๋•๋ถ„์—) ๋ชจ๋“  ๊ฒƒ์ด ํ‘œ์ค€ **Python ํƒ€์ž…** ์„ ์–ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋ฐฐ์šธ ๋ฌธ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ํ‘œ์ค€์ ์ธ ํ˜„๋Œ€ ํŒŒ์ด์ฌ์ž…๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด ํŒŒ์ด์ฌ ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ 2๋ถ„ ์ •๋„์˜ ๋ณต์Šต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด (๋น„๋ก ์—ฌ๋Ÿฌ๋ถ„์ด FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค ํ•˜๋”๋ผ๋„), ๋‹ค์Œ์˜ ์งง์€ ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: [ํŒŒ์ด์ฌ ํƒ€์ž…](python-types.md){.internal-link target=\_blank}.
Python ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ 2๋ถ„ ์ •๋„ ๋ณต์Šต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด(FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„), ๋‹ค์Œ์˜ ์งง์€ ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: [Python ํƒ€์ž…](python-types.md){.internal-link target=_blank}.
์—ฌ๋Ÿฌ๋ถ„์€ ํƒ€์ž…์„ ์ด์šฉํ•œ ํ‘œ์ค€ ํŒŒ์ด์ฌ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
์—ฌ๋Ÿฌ๋ถ„์€ ํƒ€์ž…์ด ์žˆ๋Š” ํ‘œ์ค€ Python์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:
```Python
from datetime import date
from pydantic import BaseModel
# ๋ณ€์ˆ˜๋ฅผ str๋กœ ์„ ์–ธ
# ๊ทธ ํ›„ ํ•จ์ˆ˜ ์•ˆ์—์„œ ํŽธ์ง‘๊ธฐ ์ง€์›์„ ๋ฐ›์œผ์„ธ์š”
# ๋ณ€์ˆ˜๋ฅผ str๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค
# ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํŽธ์ง‘๊ธฐ ์ง€์›์„ ๋ฐ›์Šต๋‹ˆ๋‹ค
def main(user_id: str):
return user_id
@ -49,7 +49,7 @@ class User(BaseModel):
joined: date
```
์œ„์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๊ทธ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```Python
my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
@ -65,23 +65,23 @@ my_second_user: User = User(**second_user_data)
/// info | ์ •๋ณด
`**second_user_data`๊ฐ€ ๋œปํ•˜๋Š” ๊ฒƒ:
`**second_user_data`๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:
`second_user_data` ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค์™€ ๊ฐ’์„ ํ‚ค-๊ฐ’ ์ธ์ž๋กœ์„œ ๋ฐ”๋กœ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค: `User(id=4, name="Mary", joined="2018-11-30")`
`second_user_data` `dict`์˜ ํ‚ค์™€ ๊ฐ’์„ ํ‚ค-๊ฐ’ ์ธ์ž๋กœ์„œ ๋ฐ”๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ, ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค: `User(id=4, name="Mary", joined="2018-11-30")`
///
### ํŽธ์ง‘๊ธฐ ์ง€์›
### ํŽธ์ง‘๊ธฐ ์ง€์› { #editor-support }
๋ชจ๋“  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ข‹์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ๋„ ์ „์— ๋ชจ๋“  ๊ฒฐ์ •๋“ค์€ ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.
ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ๋„ ์ „์— ๋ชจ๋“  ๊ฒฐ์ •์€ ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ตœ๊ทผ ํŒŒ์ด์ฌ ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">"์ž๋™ ์™„์„ฑ"์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ</a>์ด๋ผ๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.
Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ "์ž๋™ ์™„์„ฑ"์ด๋ผ๋Š” ์ </a>์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
**FastAPI** ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์€ ์ด๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž๋™์™„์„ฑ์€ ์–ด๋А ๊ณณ์—์„œ๋‚˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
**FastAPI** ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์ด๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ์€ ์–ด๋””์„œ๋‚˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์€ ๋ฌธ์„œ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ์ผ์ด ๊ฑฐ์˜ ์—†์„ ๊ฒ๋‹ˆ๋‹ค.
๋ฌธ์„œ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ์ผ์€ ๊ฑฐ์˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ํŽธ์ง‘๊ธฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฌ๋Ÿฌ๋ถ„์„ ๋„์™€์ฃผ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:
ํŽธ์ง‘๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ์–ด๋–ป๊ฒŒ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”:
* <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>์—์„œ:
@ -91,111 +91,111 @@ my_second_user: User = User(**second_user_data)
![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png)
์—ฌ๋Ÿฌ๋ถ„์ด ์ด์ „์— ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ณ ๋ คํ–ˆ๋˜ ์ฝ”๋“œ๋„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์ฒญ์—์„œ ์ „๋‹ฌ๋˜๋Š” (์ค‘์ฒฉ๋  ์ˆ˜๋„ ์žˆ๋Š”)JSON ๋ณธ๋ฌธ ๋‚ด๋ถ€์— ์žˆ๋Š” `price` ํ‚ค์ž…๋‹ˆ๋‹ค.
์ด์ „์— ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ์ฝ”๋“œ์—์„œ๋„ ์ž๋™ ์™„์„ฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์ฒญ์—์„œ ์ „๋‹ฌ๋˜๋Š”(์ค‘์ฒฉ๋  ์ˆ˜๋„ ์žˆ๋Š”) JSON ๋ณธ๋ฌธ ๋‚ด๋ถ€์˜ `price` ํ‚ค ๊ฐ™์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
์ž˜๋ชป๋œ ํ‚ค ์ด๋ฆ„์„ ์ ์„ ์ผ๋„, ๋ฌธ์„œ๋ฅผ ์™”๋‹ค ๊ฐ”๋‹คํ•  ์ผ๋„ ์—†์œผ๋ฉฐ, ํ˜น์€ ๋งˆ์ง€๋ง‰์œผ๋กœ `username` ๋˜๋Š” `user_name`์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์ฐพ๊ธฐ ์œ„ํ•ด ์œ„ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•  ์ผ๋„ ์—†์Šต๋‹ˆ๋‹ค.
๋” ์ด์ƒ ์ž˜๋ชป๋œ ํ‚ค ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜, ๋ฌธ์„œ ์‚ฌ์ด๋ฅผ ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๊ฑฐ๋‚˜, `username`์„ ์ผ๋Š”์ง€ `user_name`์„ ์ผ๋Š”์ง€ ์ฐพ์œผ๋ ค๊ณ  ์œ„์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
### ํ† ๋ง‰ ์ •๋ณด
### ๊ฐ„๊ฒฐํ•จ { #short }
์–ด๋А ๊ณณ์—์„œ๋‚˜ ์„ ํƒ์  ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒƒ์— ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜, ์›ํ•˜๋Š” API๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ์„ธํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ ํƒ์  ๊ตฌ์„ฑ์„ ์–ด๋””์„œ๋‚˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด์„œ๋„, ๋ชจ๋“  ๊ฒƒ์— ํ•ฉ๋ฆฌ์ ์ธ **๊ธฐ๋ณธ๊ฐ’**์ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•„์š”ํ•œ ์ž‘์—…์„ ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ API๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ์„ธํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด "๊ทธ๋ƒฅ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค".
ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด **"๊ทธ๋ƒฅ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค"**.
### ๊ฒ€์ฆ
### ๊ฒ€์ฆ { #validation }
* ๋‹ค์Œ์„ ํฌํ•จํ•œ, ๋Œ€๋ถ€๋ถ„์˜ (ํ˜น์€ ๋ชจ๋“ ?) ํŒŒ์ด์ฌ **๋ฐ์ดํ„ฐ ํƒ€์ž…** ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* ๋‹ค์Œ์„ ํฌํ•จํ•ด ๋Œ€๋ถ€๋ถ„(ํ˜น์€ ์ „๋ถ€?)์˜ Python **๋ฐ์ดํ„ฐ ํƒ€์ž…**์— ๋Œ€ํ•œ ๊ฒ€์ฆ:
* JSON ๊ฐ์ฒด (`dict`).
* ์•„์ดํ…œ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” JSON ๋ฐฐ์—ด (`list`).
* ์ตœ์†Œ ๊ธธ์ด์™€ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฌธ์ž์—ด (`str`) ํ•„๋“œ.
* ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ˆซ์ž (`int`, `float`), ๊ทธ ์™ธ.
* ์ตœ์†Œ/์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฌธ์ž์—ด(`str`) ํ•„๋“œ.
* ์ตœ์†Œ/์ตœ๋Œ€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ˆซ์ž(`int`, `float`) ๋“ฑ.
* ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋”์šฑ ์ด์ƒ‰์ ์ธ ํƒ€์ž…์— ๋Œ€ํ•ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข€ ๋” ์ด์ƒ‰์ ์ธ ํƒ€์ž…์— ๋Œ€ํ•œ ๊ฒ€์ฆ:
* URL.
* ์ด๋ฉ”์ผ.
* Email.
* UUID.
* ...๋‹ค๋ฅธ ๊ฒƒ๋“ค.
* ...๊ทธ ์™ธ.
๋ชจ๋“  ๊ฒ€์ฆ์€ ๊ฒฌ๊ณ ํ•˜๋ฉด์„œ ์ž˜ ํ™•๋ฆฝ๋œ **Pydantic**์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ฒ€์ฆ์€ ์ž˜ ํ™•๋ฆฝ๋˜์–ด ์žˆ๊ณ  ๊ฒฌ๊ณ ํ•œ **Pydantic**์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
### ๋ณด์•ˆ๊ณผ ์ธ์ฆ
### ๋ณด์•ˆ๊ณผ ์ธ์ฆ { #security-and-authentication }
๋ณด์•ˆ๊ณผ ์ธ์ฆ์ด ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ์˜ ํƒ€ํ˜‘์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณด์•ˆ๊ณผ ์ธ์ฆ์ด ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ํƒ€ํ˜‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š”, ๋ชจ๋“  ๋ณด์•ˆ ์Šคํ‚ค๋งˆ๊ฐ€ OpenAPI์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์„ ํฌํ•จํ•ด OpenAPI์— ์ •์˜๋œ ๋ชจ๋“  ๋ณด์•ˆ ์Šคํ‚ค๋งˆ:
* HTTP Basic.
* **OAuth2** (**JWT tokens** ๋˜ํ•œ ํฌํ•จ). [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=\_blank}์— ์žˆ๋Š” ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
* **OAuth2**(**JWT tokens** ๋˜ํ•œ ํฌํ•จ). [JWT๋ฅผ ์‚ฌ์šฉํ•œ OAuth2](tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
* ๋‹ค์Œ์— ๋“ค์–ด ์žˆ๋Š” API ํ‚ค:
* ํ—ค๋”.
* ๋งค๊ฐœ๋ณ€์ˆ˜.
* ์ฟ ํ‚ค ๋ฐ ๊ทธ ์™ธ.
* ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜.
* ์ฟ ํ‚ค ๋“ฑ.
์ถ”๊ฐ€์ ์œผ๋กœ (**์„ธ์…˜ ์ฟ ํ‚ค**๋ฅผ ํฌํ•จํ•œ) ๋ชจ๋“  ๋ณด์•ˆ ๊ธฐ๋Šฅ์€ Starlette์— ์žˆ์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€๋กœ Starlette์˜ ๋ชจ๋“  ๋ณด์•ˆ ๊ธฐ๋Šฅ(**์„ธ์…˜ ์ฟ ํ‚ค** ํฌํ•จ)๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋‘ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์™€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ์Šคํ…œ, ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ, ๊ด€๊ณ„ํ˜• ๋ฐ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋‘ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ์™€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ์Šคํ…œ, ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ, ๊ด€๊ณ„ํ˜• ๋ฐ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### ์˜์กด์„ฑ ์ฃผ์ž…
### ์˜์กด์„ฑ ์ฃผ์ž… { #dependency-injection }
FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ๊ฐ„ํŽธํ•˜์ง€๋งŒ, ์—„์ฒญ๋‚œ <abbr title='"์ปดํฌ๋„ŒํŠธ", "์ž์›", "์„œ๋น„์Šค", "์ œ๊ณต์ž"๋กœ๋„ ์•Œ๋ ค์ง„'><strong>์˜์กด์„ฑ ์ฃผ์ž…</strong></abbr>์‹œ์Šคํ…œ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๊ฐ•๋ ฅํ•œ <abbr title='๋˜ํ•œ ๋‹ค์Œ์œผ๋กœ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค: "์ปดํฌ๋„ŒํŠธ", "์ž์›", "์„œ๋น„์Šค", "์ œ๊ณต์ž"'><strong>Dependency Injection</strong></abbr> ์‹œ์Šคํ…œ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
* ์˜์กด์„ฑ์€ ์˜์กด์„ฑ์„ ๊ฐ€์งˆ์ˆ˜๋„ ์žˆ์–ด, ์ด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์˜ ๊ณ„์ธต์ด๋‚˜ **์˜์กด์„ฑ์˜ "๊ทธ๋ž˜ํ”„"**๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.
* ๋ชจ๋“  ๊ฒƒ์ด ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด **์ž๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค**.
* ๋ชจ๋“  ์˜์กด์„ฑ์€ ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”๊ตฌํ•˜์—ฌ ์ž๋™ ๋ฌธ์„œํ™”์™€ **๊ฒฝ๋กœ ์ž‘๋™ ์ œ์•ฝ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**.
* ์˜์กด์„ฑ์—์„œ ์ •์˜๋œ _๊ฒฝ๋กœ ์ž‘๋™_ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ **์ž๋™ ๊ฒ€์ฆ**์ด ์ด๋ฃจ์–ด ์ง‘๋‹ˆ๋‹ค.
* ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์‹œ์Šคํ…œ, **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ**, ๋“ฑ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
* ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ”„๋ก ํŠธ์—”๋“œ ๋“ฑ๊ณผ ๊ด€๋ จ๋˜์–ด **ํƒ€ํ˜‘ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค**. ํ•˜์ง€๋งŒ ๊ทธ ๋ชจ๋“  ๊ฒƒ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
* ์˜์กด์„ฑ๋„ ์˜์กด์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด, ์˜์กด์„ฑ์˜ ๊ณ„์ธต ๋˜๋Š” **์˜์กด์„ฑ์˜ "๊ทธ๋ž˜ํ”„"**๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
* ๋ชจ๋“  ๊ฒƒ์ด ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด **์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค**.
* ๋ชจ๋“  ์˜์กด์„ฑ์€ ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, **๊ฒฝ๋กœ ์ฒ˜๋ฆฌ** ์ œ์•ฝ๊ณผ ์ž๋™ ๋ฌธ์„œํ™”๋ฅผ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์˜์กด์„ฑ์— ์ •์˜๋œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ **์ž๋™ ๊ฒ€์ฆ**์„ ํ•ฉ๋‹ˆ๋‹ค.
* ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์‹œ์Šคํ…œ, **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ** ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
* ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ”„๋ก ํŠธ์—”๋“œ ๋“ฑ๊ณผ **ํƒ€ํ˜‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. ํ•˜์ง€๋งŒ ๋ชจ๋‘์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### ์ œํ•œ ์—†๋Š” "ํ”Œ๋Ÿฌ๊ทธ์ธ"
### ์ œํ•œ ์—†๋Š” "ํ”Œ๋Ÿฌ๊ทธ์ธ" { #unlimited-plug-ins }
๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ์ž„ํฌํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š”, ๊ทธ๊ฒƒ๋“ค์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž„ํฌํŠธํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์–ด๋А ํ†ตํ•ฉ๋„ (์˜์กด์„ฑ๊ณผ ํ•จ๊ป˜) ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด, *๊ฒฝ๋กœ ์ž‘๋™*์— ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ์™€ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ 2์ค„์˜ ์ฝ”๋“œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•  "ํ”Œ๋Ÿฌ๊ทธ์ธ"์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ํ†ตํ•ฉ์ด๋“ (์˜์กด์„ฑ๊ณผ ํ•จ๊ป˜) ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์–ด, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ์™€ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด 2์ค„์˜ ์ฝ”๋“œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ "ํ”Œ๋Ÿฌ๊ทธ์ธ"์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ
### ํ…Œ์ŠคํŠธ๋จ { #tested }
* 100% <abbr title="์ž๋™์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋œ ์ฝ”๋“œ์˜ ์–‘">ํ…Œ์ŠคํŠธ ๋ฒ”์œ„</abbr>.
* 100% <abbr title="ํŒŒ์ด์ฌ์˜ ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜, ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ ํŽธ์ง‘๊ธฐ์™€ ์™ธ๋ถ€ ๋„๊ตฌ๋Š” ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋” ๋‚˜์€ ์ง€์›์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค">ํƒ€์ž…์ด ๋ช…์‹œ๋œ</abbr> ์ฝ”๋“œ ๋ฒ ์ด์Šค.
* ์ƒ์šฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ ์‚ฌ์šฉ.
* 100% <abbr title="์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘">test coverage</abbr>.
* 100% <abbr title="Python ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ์ด๋ฅผ ํ†ตํ•ด ํŽธ์ง‘๊ธฐ์™€ ์™ธ๋ถ€ ๋„๊ตฌ๊ฐ€ ๋” ๋‚˜์€ ์ง€์›์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค">type annotated</abbr> ์ฝ”๋“œ ๋ฒ ์ด์Šค.
* ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
## Starlette ๊ธฐ๋Šฅ
## Starlette ๊ธฐ๋Šฅ { #starlette-features }
**FastAPI**๋Š” <a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ, ์ด์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์—ฌ๋Ÿฌ๋ถ„์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์–ด๋–ค ์ถ”๊ฐ€์ ์ธ Starlette ์ฝ”๋“œ๋„ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
**FastAPI**๋Š” <a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a>์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Starlette ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
`FastAPI`๋Š” ์‹ค์ œ๋กœ `Starlette`์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ Starlette์„ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
`FastAPI`๋Š” ์‹ค์ œ๋กœ `Starlette`์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Starlette์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ **Starlette**์˜ ๊ธฐ๋Šฅ ๋Œ€๋ถ€๋ถ„์„ ์–ป๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(FastAPI๊ฐ€ ๋‹จ์ˆœํžˆ Starlette๋ฅผ ๊ฐ•ํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค):
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **Starlette**์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(FastAPI๋Š” Starlette์— ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๋”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค):
* ์•„์ฃผ ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ. ์ด๋Š” <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">**NodeJS**์™€ **Go**์™€ ๋™๋“ฑํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ ํŒŒ์ด์ฌ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค</a>.
* ์ •๋ง ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ. <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">**NodeJS**์™€ **Go**์— ๋ฒ„๊ธˆ๊ฐ€๋Š”, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค</a>.
* **WebSocket** ์ง€์›.
* ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—….
* ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ ์ด๋ฒคํŠธ.
* ํ”„๋กœ์„ธ์Šค ๋‚ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—….
* ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์ด๋ฒคํŠธ.
* HTTPX ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ.
* **CORS**, GZip, ์ •์  ํŒŒ์ผ, ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต.
* **์„ธ์…˜๊ณผ ์ฟ ํ‚ค** ์ง€์›.
* 100% ํ…Œ์ŠคํŠธ ๋ฒ”์œ„.
* 100% ํƒ€์ž…์ด ๋ช…์‹œ๋œ ์ฝ”๋“œ ๋ฒ ์ด์Šค.
* 100% test coverage.
* 100% type annotated codebase.
## Pydantic ๊ธฐ๋Šฅ
## Pydantic ๊ธฐ๋Šฅ { #pydantic-features }
**FastAPI**๋Š” <a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a>์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ Pydantic๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋А ์ถ”๊ฐ€์ ์ธ Pydantic ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„์ด ๊ฐ€์ง€๊ณ  ์žˆ๋“  ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
**FastAPI**๋Š” <a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a>๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Pydantic ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š”, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•œ <abbr title="Object-Relational Mapper">ORM</abbr>, <abbr title="Object-Document Mapper">ODM</abbr>์„ ํฌํ•จํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•œ <abbr title="Object-Relational Mapper - ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํผ">ORM</abbr>, <abbr title="Object-Document Mapper - ๊ฐ์ฒด-๋ฌธ์„œ ๋งคํผ">ODM</abbr>๊ณผ ๊ฐ™์€, Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž๋™์œผ๋กœ ๊ฒ€์ฆ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๊ฒฝ์šฐ์—์„œ ์š”์ฒญ์„ ํ†ตํ•ด ์–ป์€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ, **์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ** ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž๋™์œผ๋กœ ๊ฒ€์ฆ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๊ฒฝ์šฐ ์š”์ฒญ์—์„œ ์–ป์€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ **์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ** ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ, ๋งŽ์€ ๊ฒฝ์šฐ์—์„œ ์—ฌ๋Ÿฌ๋ถ„์€ **์ง์ ‘ ํด๋ผ์ด์–ธํŠธ๋กœ** ๊ทธ์ € ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ, ๋งŽ์€ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์–ป์€ ๊ฐ์ฒด๋ฅผ **์ง์ ‘ ํด๋ผ์ด์–ธํŠธ๋กœ** ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด (๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด FastAPI๊ฐ€ Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ์žˆ๊ธฐ์—) **Pydantic**์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด(๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด FastAPI๊ฐ€ Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ์—) **Pydantic**์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
* **์–ด๋ ต์ง€ ์•Š์€ ์–ธ์–ด**:
* ์ƒˆ๋กœ์šด ์Šคํ‚ค๋งˆ ์ •์˜ ๋งˆ์ดํฌ๋กœ ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
* ์—ฌ๋Ÿฌ๋ถ„์ด ํŒŒ์ด์ฌ ํƒ€์ž…์„ ์•ˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ Pydantic์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•„๋Š” ๊ฒ๋‹ˆ๋‹ค.
* ์—ฌ๋Ÿฌ๋ถ„์˜ **<abbr title="ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ, ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค">IDE</abbr>/<abbr title="์ฝ”๋“œ ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ">๋ฆฐํ„ฐ</abbr>/๋‡Œ**์™€ ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค:
* Pydantic ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœ ์—ฌ๋Ÿฌ๋ถ„์ด ์ •์˜ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋™ ์™„์„ฑ, ๋ฆฐํŒ…, mypy ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง๊ด€๊นŒ์ง€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒ€์ฆ๋œ ๋ฐ์ดํ„ฐ์™€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
* **No brainfuck**:
* ์ƒˆ๋กœ์šด ์Šคํ‚ค๋งˆ ์ •์˜ ๋งˆ์ดํฌ๋กœ ์–ธ์–ด๋ฅผ ๋ฐฐ์šธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
* Python ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด Pydantic ์‚ฌ์šฉ๋ฒ•๋„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ์—ฌ๋Ÿฌ๋ถ„์˜ **<abbr title="Integrated Development Environment - ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ: ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค">IDE</abbr>/<abbr title="์ฝ”๋“œ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ">linter</abbr>/๋‡Œ**์™€ ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค:
* pydantic ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ •์˜ํ•œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์ผ ๋ฟ์ด๋ฏ€๋กœ, ์ž๋™ ์™„์„ฑ, ๋ฆฐํŒ…, mypy, ๊ทธ๋ฆฌ๊ณ  ์ง๊ด€๊นŒ์ง€๋„ ๊ฒ€์ฆ๋œ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
* **๋ณต์žกํ•œ ๊ตฌ์กฐ**๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค:
* ๊ณ„์ธต์ ์ธ Pydantic ๋ชจ๋ธ, ํŒŒ์ด์ฌ `typing`์˜ `List`์™€ `Dict`, ๊ทธ ์™ธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
* ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ฆ์ž๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์‰ฝ๊ฒŒ ์ •์˜ ๋ฐ ํ™•์ธํ•˜๋ฉฐ JSON ์Šคํ‚ค๋งˆ๋กœ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.
* ์—ฌ๋Ÿฌ๋ถ„์€ ๊นŠ๊ฒŒ **์ค‘์ฒฉ๋œ JSON** ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ์ฒด ๋ชจ๋‘ ๊ฒ€์ฆํ•˜๊ณ  ์„ค๋ช…์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* **ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ**:
* Pydantic์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ๊ฒ€์ฆ์ž ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ๋ถ™์€ ๋ชจ๋ธ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ฆ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* 100% ํ…Œ์ŠคํŠธ ๋ฒ”์œ„.
* ๊ณ„์ธต์ ์ธ Pydantic ๋ชจ๋ธ, Python `typing`์˜ `List`์™€ `Dict` ๋“ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
* ๊ทธ๋ฆฌ๊ณ  validator๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์‰ฝ๊ฒŒ ์ •์˜ํ•˜๊ณ , ๊ฒ€์‚ฌํ•˜๊ณ , JSON Schema๋กœ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
* ๊นŠ๊ฒŒ **์ค‘์ฒฉ๋œ JSON** ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋ชจ๋‘ ๊ฒ€์ฆํ•˜๊ณ  ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* **ํ™•์žฅ ๊ฐ€๋Šฅ**:
* Pydantic์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ฑฐ๋‚˜, validator decorator๊ฐ€ ๋ถ™์€ ๋ชจ๋ธ ๋ฉ”์„œ๋“œ๋กœ ๊ฒ€์ฆ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* 100% test coverage.

199
docs/ko/docs/help-fastapi.md

@ -1,4 +1,4 @@
# FastAPI ์ง€์› - ๋„์›€ ๋ฐ›๊ธฐ
# FastAPI ์ง€์› - ๋„์›€ ๋ฐ›๊ธฐ { #help-fastapi-get-help }
**FastAPI** ๊ฐ€ ๋งˆ์Œ์— ๋“œ์‹œ๋‚˜์š”?
@ -10,9 +10,9 @@ FastAPI, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž, ๊ฐœ๋ฐœ์ž๋ฅผ ์‘์›ํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
๋˜ํ•œ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ๋ช‡ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๋‰ด์Šค๋ ˆํ„ฐ ๊ตฌ๋…
## ๋‰ด์Šค๋ ˆํ„ฐ ๊ตฌ๋… { #subscribe-to-the-newsletter }
[**FastAPI and friends** ๋‰ด์Šค๋ ˆํ„ฐ](newsletter.md){.internal-link target=\_blank}๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
(์ž์ฃผ ๋ฐœ์†ก๋˜์ง€ ์•Š๋Š”) [**FastAPI and friends** ๋‰ด์Šค๋ ˆํ„ฐ](newsletter.md){.internal-link target=_blank}๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* FastAPI and friends์— ๋Œ€ํ•œ ๋‰ด์Šค ๐Ÿš€
* ๊ฐ€์ด๋“œ ๐Ÿ“
@ -20,65 +20,65 @@ FastAPI, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž, ๊ฐœ๋ฐœ์ž๋ฅผ ์‘์›ํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
* ํš๊ธฐ์ ์ธ ๋ณ€ํ™” ๐Ÿšจ
* ํŒ๊ณผ ์š”๋ น โœ…
## ํŠธ์œ„ํ„ฐ์—์„œ FastAPI ํŒ”๋กœ์šฐํ•˜๊ธฐ
## X(Twitter)์—์„œ FastAPI ํŒ”๋กœ์šฐํ•˜๊ธฐ { #follow-fastapi-on-x-twitter }
<a href="https://x.com/fastapi" class="external-link" target="_blank">**X (Twitter)**์˜ @fastapi๋ฅผ ํŒ”๋กœ์šฐ</a>ํ•˜์—ฌ **FastAPI** ์— ๋Œ€ํ•œ ์ตœ์‹  ๋‰ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿฆ
## Star **FastAPI** in GitHub
## GitHub์—์„œ **FastAPI**์— Star ์ฃผ๊ธฐ { #star-fastapi-in-github }
GitHub์—์„œ FastAPI์— "star"๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ star ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. โญ๏ธ
์Šคํƒ€๋ฅผ ๋Š˜๋ฆผ์œผ๋กœ์จ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ์ข€ ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## GitHub ์ €์žฅ์†Œ์—์„œ ๋ฆด๋ฆฌ์ฆˆ ํ™•์ธ
## ๋ฆด๋ฆฌ์ฆˆ ํ™•์ธ์„ ์œ„ํ•ด GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository-for-releases }
GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ watch ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€
GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€
์—ฌ๊ธฐ์„œ "Releases only"์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ "Releases only"๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒํ•˜๋ฉด, **FastAPI** ์˜ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„ ๋“ฑ์˜ ์ƒˆ๋กœ์šด ์ž๋ฃŒ (์ตœ์‹  ๋ฒ„์ „)์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค (์ด๋ฉ”์ผ) ํ†ต์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒํ•˜๋ฉด, **FastAPI** ์˜ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„ ๋“ฑ์˜ ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์ฆˆ(์ƒˆ ๋ฒ„์ „)๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค (์ด๋ฉ”์ผ) ํ†ต์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๊ฐœ๋ฐœ์ž์™€์˜ ์—ฐ๊ฒฐ
## ๊ฐœ๋ฐœ์ž์™€์˜ ์—ฐ๊ฒฐ { #connect-with-the-author }
<a href="https://tiangolo.com" class="external-link" target="_blank">๊ฐœ๋ฐœ์ž(Sebastiรกn Ramรญrez / `tiangolo`)</a>์™€ ์—ฐ๋ฝ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž(์ž‘์„ฑ์ž)์ธ <a href="https://tiangolo.com" class="external-link" target="_blank">์ €(Sebastiรกn Ramรญrez / `tiangolo`)</a>์™€ ์—ฐ๋ฝ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://github.com/tiangolo" class="external-link" target="_blank">**GitHub**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ.</a>.
* ๋‹น์‹ ์—๊ฒŒ ๋„์›€์ด ๋  ์ €์˜ ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
* <a href="https://github.com/tiangolo" class="external-link" target="_blank">**GitHub**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ</a>.
* ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋„์›€์ด ๋  ์ €์˜ ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
* ์ƒˆ๋กœ์šด ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ํ™•์ธํ•˜๋ ค๋ฉด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค.
* <a href="https://x.com/tiangolo" class="external-link" target="_blank">**X (Twitter)**</a> ๋˜๋Š” <a href="https://fosstodon.org/@tiangolo" class="external-link" target="_blank">Mastodon</a>์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ.
* FastAPI์˜ ์‚ฌ์šฉ ์šฉ๋„๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š” (๊ทธ๊ฒƒ์„ ๋“ฃ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค).
* ๋ฐœํ‘œ๋‚˜ ์ƒˆ๋กœ์šด ํˆด ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค.
* <a href="https://x.com/fastapi" class="external-link" target="_blank">**X (Twitter)**์˜ @fastapi๋ฅผ ํŒ”๋กœ์šฐ</a> (๋ณ„๋„ ๊ณ„์ •์—์„œ) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">**LinkedIn**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ.</a>.
* ์ƒˆ๋กœ์šด ํˆด์˜ ๋ฐœํ‘œ๋‚˜ ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค. (๋‹จ, X (Twitter)๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ๐Ÿคทโ€โ™‚).
* <a href="https://x.com/fastapi" class="external-link" target="_blank">X(Twitter)์—์„œ @fastapi๋ฅผ ํŒ”๋กœ์šฐ</a> (๋ณ„๋„ ๊ณ„์ •์—์„œ) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">**LinkedIn**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ</a>.
* ์ƒˆ๋กœ์šด ํˆด์˜ ๋ฐœํ‘œ๋‚˜ ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค (๋‹จ, X (Twitter)๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ๐Ÿคทโ€โ™‚).
* <a href="https://dev.to/tiangolo" class="external-link" target="_blank">**Dev.to**</a> ๋˜๋Š” <a href="https://medium.com/@tiangolo" class="external-link" target="_blank">**Medium**</a>์—์„œ ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ณด์‹ญ์‹œ์˜ค (๋˜๋Š” ํŒ”๋กœ์šฐ).
* ๋‹ค๋ฅธ ๊ธฐ์‚ฌ๋‚˜ ์•„์ด๋””์–ด๋“ค์„ ์ฝ๊ณ , ์ œ๊ฐ€ ๋งŒ๋“ค์–ด์™”๋˜ ํˆด์— ๋Œ€ํ•ด์„œ๋„ ์ฝ์œผ์‹ญ์‹œ์˜ค.
* ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค.
* ๋‹ค๋ฅธ ์•„์ด๋””์–ด์™€ ๊ธฐ์‚ฌ๋“ค์„ ์ฝ๊ณ , ์ œ๊ฐ€ ๋งŒ๋“ค์–ด์™”๋˜ ํˆด์— ๋Œ€ํ•ด์„œ๋„ ์ฝ์œผ์‹ญ์‹œ์˜ค.
* ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ๊ฒŒ์‹œํ•  ๋•Œ ์ฝ๊ธฐ ์œ„ํ•ด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค.
## **FastAPI**์— ๋Œ€ํ•œ ํŠธ์œ—
## **FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—ํ•˜๊ธฐ { #tweet-about-fastapi }
<a href="https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi" class="external-link" target="_blank">**FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—</a> ํ•˜๊ณ  FastAPI๊ฐ€ ๋งˆ์Œ์— ๋“œ๋Š” ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”. ๐ŸŽ‰
<a href="https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi" class="external-link" target="_blank">**FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—</a> ํ•˜๊ณ  ์ €์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ FastAPI๊ฐ€ ๋งˆ์Œ์— ๋“œ๋Š” ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”. ๐ŸŽ‰
**FastAPI**๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ์ ์ด ๋งˆ์Œ์— ๋“ค์—ˆ๋Š”์ง€, ์–ด๋–ค ํ”„๋กœ์ ํŠธ/ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
## FastAPI์— ํˆฌํ‘œํ•˜๊ธฐ
## FastAPI์— ํˆฌํ‘œํ•˜๊ธฐ { #vote-for-fastapi }
* <a href="https://www.slant.co/options/34241/~fastapi-review" class="external-link" target="_blank">Slant์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค</a>.
* <a href="https://alternativeto.net/software/fastapi/about/" class="external-link" target="_blank">AlternativeTo์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค</a>.
* <a href="https://stackshare.io/pypi-fastapi" class="external-link" target="_blank">StackShare์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค</a>.
* <a href="https://stackshare.io/pypi-fastapi" class="external-link" target="_blank">StackShare์—์„œ **FastAPI**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ‘œ์‹œํ•˜์„ธ์š”</a>.
## GitHub์˜ ์ด์Šˆ๋กœ ๋‹ค๋ฅธ์‚ฌ๋žŒ ๋•๊ธฐ
## GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ { #help-others-with-questions-in-github }
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered" class="external-link" target="_blank">GitHub ๋””์Šค์ปค์…˜</a>
* <a href="https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+" class="external-link" target="_blank">GitHub ์ด์Šˆ</a>
* <a href="https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered" class="external-link" target="_blank">GitHub Discussions</a>
* <a href="https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+" class="external-link" target="_blank">GitHub Issues</a>
๋งŽ์€ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ์•Œ๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
๋งŒ์•ฝ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ๋ฌธ์ œ๋ฅผ ๋„์™€์ค€๋‹ค๋ฉด, ๊ณต์‹์ ์ธ [FastAPI ์ „๋ฌธ๊ฐ€](fastapi-people.md#fastapi-experts){.internal-link target=\_blank} ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰
๋งŒ์•ฝ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์„ ๋„์™€์ค€๋‹ค๋ฉด, ๊ณต์‹์ ์ธ [FastAPI ์ „๋ฌธ๊ฐ€](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰
๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€: ์นœ์ ˆํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ขŒ์ ˆ๊ฐ์„ ์•ˆ๊ณ  ์˜ค๋ฉฐ, ๋งŽ์€ ๊ฒฝ์šฐ ์ตœ์„ ์˜ ๋ฐฉ์‹์œผ๋กœ ์งˆ๋ฌธํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๋Œ€ํ•œ ์นœ์ ˆํ•˜๊ฒŒ ๋Œ€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์„ธ์š”. ๐Ÿค—
@ -86,183 +86,170 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ watch ๋ฒ„
---
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ (๋””์Šค์ปค์…˜ ๋˜๋Š” ์ด์Šˆ์—์„œ) ํ•ด๊ฒฐ์„ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ(๋””์Šค์ปค์…˜ ๋˜๋Š” ์ด์Šˆ์—์„œ) ํ•ด๊ฒฐ์„ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
### ์งˆ๋ฌธ ์ดํ•ดํ•˜๊ธฐ
### ์งˆ๋ฌธ ์ดํ•ดํ•˜๊ธฐ { #understand-the-question }
* ์งˆ๋ฌธํ•˜๋Š” ์‚ฌ๋žŒ์ด ๊ฐ€์ง„ **๋ชฉ์ **๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
* ์งˆ๋ฌธ (๋Œ€๋ถ€๋ถ„์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค)์ด **๋ช…ํ™•**ํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ ์งˆ๋ฌธ(๋Œ€๋ถ€๋ถ„์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค)์ด **๋ช…ํ™•**ํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”.
* ๋งŽ์€ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ •ํ•œ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ํ•˜์ง€๋งŒ, ๋” **์ข‹์€** ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋ฉด ๋” ๋‚˜์€ **๋Œ€์•ˆ์ ์ธ ํ•ด๊ฒฐ์ฑ…**์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๋งŽ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์ƒํ•œ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ํ•˜์ง€๋งŒ, ๋” **์ข‹์€** ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋ฉด ๋” ๋‚˜์€ **๋Œ€์•ˆ์ ์ธ ํ•ด๊ฒฐ์ฑ…**์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์งˆ๋ฌธ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋” **์ž์„ธํ•œ ์ •๋ณด**๋ฅผ ์š”์ฒญํ•˜์„ธ์š”.
### ๋ฌธ์ œ ์žฌํ˜„ํ•˜๊ธฐ
### ๋ฌธ์ œ ์žฌํ˜„ํ•˜๊ธฐ { #reproduce-the-problem }
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์งˆ๋ฌธ์€ ์งˆ๋ฌธ์ž์˜ **์›๋ณธ ์ฝ”๋“œ**์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์งˆ๋ฌธ์—์„œ๋Š” ์งˆ๋ฌธ์ž์˜ **์›๋ณธ ์ฝ”๋“œ**์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŽ์€ ๊ฒฝ์šฐ, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋งŒ ๋ณต์‚ฌํ•ด์„œ ์˜ฌ๋ฆฌ์ง€๋งŒ, ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” **๋ฌธ์ œ๋ฅผ ์žฌํ˜„**ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
* ์งˆ๋ฌธ์ž์—๊ฒŒ <a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ</a>๋ฅผ ์ œ๊ณตํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ **๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ**ํ•˜์—ฌ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ณ , ๋™์ผํ•œ ์˜ค๋ฅ˜๋‚˜ ๋™์ž‘์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์งˆ๋ฌธ์ž์—๊ฒŒ <a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ</a>๋ฅผ ์ œ๊ณตํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ **๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ**ํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ณ , ์งˆ๋ฌธ์ž๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜๋‚˜ ๋™์ž‘์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๋„ˆ๊ทธ๋Ÿฌ์šด ๋งˆ์Œ์ด ๋“ ๋‹ค๋ฉด, ๋ฌธ์ œ ์„ค๋ช…๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ **์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด**๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋จผ์ € ์งˆ๋ฌธ์„ ๋ช…ํ™•ํžˆ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
* ๋„ˆ๊ทธ๋Ÿฌ์šด ๋งˆ์Œ์ด ๋“ ๋‹ค๋ฉด, ๋ฌธ์ œ ์„ค๋ช…๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ **์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด**๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋จผ์ € ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
### ํ•ด๊ฒฐ์ฑ… ์ œ์•ˆํ•˜๊ธฐ
### ํ•ด๊ฒฐ์ฑ… ์ œ์•ˆํ•˜๊ธฐ { #suggest-solutions }
* ์งˆ๋ฌธ์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•œ ํ›„์—๋Š” ๊ฐ€๋Šฅํ•œ **๋‹ต๋ณ€**์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๋งŽ์€ ๊ฒฝ์šฐ, ์งˆ๋ฌธ์ž์˜ **๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€**๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์‹œ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
* ๋งŽ์€ ๊ฒฝ์šฐ, ์งˆ๋ฌธ์ž์˜ **๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€**๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์‹œ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
### ํ•ด๊ฒฐ ์š”์ฒญํ•˜๊ธฐ
### ์ข…๋ฃŒ ์š”์ฒญํ•˜๊ธฐ { #ask-to-close }
์งˆ๋ฌธ์ž๊ฐ€ ๋‹ต๋ณ€์„ ํ™•์ธํ•˜๊ณ  ๋‚˜๋ฉด, ๋‹น์‹ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค, **๋‹น์‹ ์€ ์˜์›…์ž…๋‹ˆ๋‹ค**! ๐Ÿฆธ
์งˆ๋ฌธ์ž๊ฐ€ ๋‹ต๋ณ€์„ ํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค, **์—ฌ๋Ÿฌ๋ถ„์€ ์˜์›…์ž…๋‹ˆ๋‹ค**! ๐Ÿฆธ
* ์ด์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๋ฉด, ์งˆ๋ฌธ์ž์—๊ฒŒ ๋‹ค์Œ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* GitHub ๋””์Šค์ปค์…˜์—์„œ: ๋Œ“๊ธ€์„ **๋‹ต๋ณ€**์œผ๋กœ ํ‘œ์‹œํ•˜๋„๋ก ์š”์ฒญํ•˜์„ธ์š”.
* GitHub ์ด์Šˆ์—์„œ: ์ด์Šˆ๋ฅผ **๋‹ซ์•„๋‹ฌ๋ผ๊ณ ** ์š”์ฒญํ•˜์„ธ์š”.
* GitHub Discussions์—์„œ: ๋Œ“๊ธ€์„ **๋‹ต๋ณ€**์œผ๋กœ ํ‘œ์‹œํ•˜๋„๋ก ์š”์ฒญํ•˜์„ธ์š”.
* GitHub Issues์—์„œ: ์ด์Šˆ๋ฅผ **๋‹ซ์•„๋‹ฌ๋ผ๊ณ ** ์š”์ฒญํ•˜์„ธ์š”.
## GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ
## GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository }
GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ watch ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€
GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€
"Releases only" ๋Œ€์‹  "Watching"์„ ์„ ํƒํ•˜๋ฉด, ์ƒˆ๋กœ์šด ์ด์Šˆ๋‚˜ ์งˆ๋ฌธ์ด ์ƒ์„ฑ๋  ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํŠน์ •ํ•˜๊ฒŒ ์ƒˆ๋กœ์šด ์ด์Šˆ, ๋””์Šค์ปค์…˜, PR ๋“ฑ๋งŒ ์•Œ๋ฆผ ๋ฐ›๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
"Releases only" ๋Œ€์‹  "Watching"์„ ์„ ํƒํ•˜๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ƒˆ ์ด์Šˆ๋‚˜ ์งˆ๋ฌธ์„ ๋งŒ๋“ค ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒˆ ์ด์Šˆ, ๋””์Šค์ปค์…˜, PR ๋“ฑ๋งŒ ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฐ ์ด์Šˆ๋“ค์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฐ ์งˆ๋ฌธ๋“ค์„ ํ•ด๊ฒฐํ•˜๋„๋ก ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ์ด์Šˆ ์ƒ์„ฑํ•˜๊ธฐ
## ์งˆ๋ฌธํ•˜๊ธฐ { #ask-questions }
GitHub ์ €์žฅ์†Œ์— <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">์ƒˆ๋กœ์šด ์ด์Šˆ ์ƒ์„ฑ</a>์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, ์˜ˆ๋ฅผ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
GitHub ์ €์žฅ์†Œ์—์„œ <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">์ƒˆ ์งˆ๋ฌธ์„ ์ƒ์„ฑ</a>ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* **์งˆ๋ฌธ**์„ ํ•˜๊ฑฐ๋‚˜ **๋ฌธ์ œ**์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค.
* ์ƒˆ๋กœ์šด **๊ธฐ๋Šฅ**์„ ์ œ์•ˆ ํ•ฉ๋‹ˆ๋‹ค.
**์ฐธ๊ณ **: ๋งŒ์•ฝ ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋„์™€๋‹ฌ๋ผ๊ณ  ๋ถ€ํƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜‰
**์ฐธ๊ณ **: ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด, ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ๋„์™€๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜‰
## Pull Requests ๋ฆฌ๋ทฐํ•˜๊ธฐ
## Pull Request ๋ฆฌ๋ทฐํ•˜๊ธฐ { #review-pull-requests }
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ pull request๋ฅผ ๋ฆฌ๋ทฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งŒ๋“  pull request๋ฅผ ๋ฆฌ๋ทฐํ•˜๋Š” ๋ฐ ์ €๋ฅผ ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์‹œ ํ•œ๋ฒˆ ๋งํ•˜์ง€๋งŒ, ์ตœ๋Œ€ํ•œ ์นœ์ ˆํ•˜๊ฒŒ ๋ฆฌ๋ทฐํ•ด ์ฃผ์„ธ์š”. ๐Ÿค—
---
Pull Rrquest๋ฅผ ๋ฆฌ๋ทฐํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๊ณผ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
Pull request๋ฅผ ๋ฆฌ๋ทฐํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๊ณผ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
### ๋ฌธ์ œ ์ดํ•ดํ•˜๊ธฐ
### ๋ฌธ์ œ ์ดํ•ดํ•˜๊ธฐ { #understand-the-problem }
* ๋จผ์ €, ํ•ด๋‹น pull request๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” **๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š”์ง€** ํ™•์ธํ•˜์„ธ์š”. GitHub ๋””์Šค์ปค์…˜ ๋˜๋Š” ์ด์Šˆ์—์„œ ๋” ๊ธด ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๋จผ์ €, ํ•ด๋‹น pull request๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” **๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š”์ง€** ํ™•์ธํ•˜์„ธ์š”. GitHub Discussion ๋˜๋Š” ์ด์Šˆ์—์„œ ๋” ๊ธด ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
* Pull request๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. **๋‹ค๋ฅธ ๋ฐฉ์‹**์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ทธ ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜ ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* Pull request๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ๋„ ํฝ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ **๋‹ค๋ฅธ ๋ฐฉ์‹**์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๊ทธ ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜ ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### ์Šคํƒ€์ผ์— ๋„ˆ๋ฌด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ธฐ
### ์Šคํƒ€์ผ์— ๋„ˆ๋ฌด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ธฐ { #dont-worry-about-style }
* ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์Šคํƒ€์ผ ๊ฐ™์€ ๊ฒƒ์— ๋„ˆ๋ฌด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ง์ ‘ ์ปค๋ฐ‹์„ ์ˆ˜์ •ํ•˜์—ฌ squash and merge๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์Šคํƒ€์ผ ๊ฐ™์€ ๊ฒƒ์— ๋„ˆ๋ฌด ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”. ์ €๋Š” ์ปค๋ฐ‹์„ ์ˆ˜๋™์œผ๋กœ ์กฐ์ •ํ•ด์„œ squash and merge๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ทœ์น™๋„ ๊ฑฑ์ •ํ•  ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ž๋™ํ™”๋œ ๋„๊ตฌ๋“ค์ด ์ด๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์Šคํƒ€์ผ์ด๋‚˜ ์ผ๊ด€์„ฑ ๊ด€๋ จ ์š”์ฒญ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ œ๊ฐ€ ์ง์ ‘ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ ์ปค๋ฐ‹์œผ๋กœ ์ˆ˜์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์Šคํƒ€์ผ์ด๋‚˜ ์ผ๊ด€์„ฑ ๊ด€๋ จ ํ•„์š” ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด, ์ œ๊ฐ€ ์ง์ ‘ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์œ„์— ์ปค๋ฐ‹์œผ๋กœ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
### ์ฝ”๋“œ ํ™•์ธํ•˜๊ธฐ
### ์ฝ”๋“œ ํ™•์ธํ•˜๊ธฐ { #check-the-code }
* ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ , **๋…ผ๋ฆฌ์ ์œผ๋กœ ํƒ€๋‹น**ํ•œ์ง€ ํ™•์ธํ•œ ํ›„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
* ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฝ์–ด์„œ ๋ง์ด ๋˜๋Š”์ง€ ๋ณด๊ณ , **๋กœ์ปฌ์—์„œ ์‹คํ–‰**ํ•ด ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ, ํ™•์ธํ–ˆ๋‹ค๊ณ  **๋Œ“๊ธ€**์„ ๋‚จ๊ฒจ ์ฃผ์„ธ์š”. ๊ทธ๋ž˜์•ผ ์ œ๊ฐ€ ๊ฒ€ํ† ํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋‹ค๊ณ  **๋Œ“๊ธ€**๋กœ ๋‚จ๊ฒจ ์ฃผ์„ธ์š”. ๊ทธ๋ž˜์•ผ ์ œ๊ฐ€ ์ •๋ง๋กœ ํ™•์ธํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// info
/// info | ์ •๋ณด
๋ถˆํ–‰ํžˆ๋„, ์ œ๊ฐ€ ๋‹จ์ˆœํžˆ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šน์ธ๋งŒ์œผ๋กœ PR์„ ์‹ ๋ขฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
3๊ฐœ, 5๊ฐœ ์ด์ƒ์˜ ์Šน์ธ์ด ๋‹ฌ๋ฆฐ PR์ด ์‹ค์ œ๋กœ๋Š” ๊นจ์ ธ ์žˆ๊ฑฐ๋‚˜, ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ์ฃผ์žฅํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…
์—ฌ๋Ÿฌ ๋ฒˆ, ์„ค๋ช…์ด ๊ทธ๋Ÿด๋“ฏํ•ด์„œ์ธ์ง€ 3๊ฐœ, 5๊ฐœ ์ด์ƒ์˜ ์Šน์ธ์ด ๋‹ฌ๋ฆฐ PR์ด ์žˆ์—ˆ์ง€๋งŒ, ์ œ๊ฐ€ ํ™•์ธํ•ด๋ณด๋ฉด ์‹ค์ œ๋กœ๋Š” ๊นจ์ ธ ์žˆ๊ฑฐ๋‚˜, ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ์ฃผ์žฅํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…
๋”ฐ๋ผ์„œ, ์ •๋ง๋กœ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์‹คํ–‰ํ•œ ๋’ค, ๋Œ“๊ธ€๋กœ ํ™•์ธ ๋‚ด์šฉ์„ ๋‚จ๊ฒจ ์ฃผ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
///
* PR์„ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋„ˆ๋ฌด ๊นŒ๋‹ค๋กœ์šธ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ๊ด€์ ์ธ ๊ฒฌํ•ด๊ฐ€ ๋งŽ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ์ €๋„ ์ œ ๊ฒฌํ•ด๊ฐ€ ์žˆ์„ ๊ฑฐ์˜ˆ์š” ๐Ÿ™ˆ). ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
* PR์„ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋„ˆ๋ฌด ๊นŒ๋‹ค๋กœ์šธ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ๊ด€์ ์ธ ๊ฒฌํ•ด๊ฐ€ ๋งŽ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ €๋„ ์ œ ๊ฒฌํ•ด๊ฐ€ ์žˆ์„ ๊ฑฐ์˜ˆ์š” ๐Ÿ™ˆ). ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
### ํ…Œ์ŠคํŠธ
### ํ…Œ์ŠคํŠธ { #tests }
* PR์— **ํ…Œ์ŠคํŠธ**๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์„ธ์š”.
* PR์„ ์ ์šฉํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๊ฐ€ **์‹คํŒจ**ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๐Ÿšจ
* PR ์ „์—๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ **์‹คํŒจ**ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๐Ÿšจ
* PR์„ ์ ์šฉํ•œ ํ›„ ํ…Œ์ŠคํŠธ๊ฐ€ **ํ†ต๊ณผ**ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. โœ…
* ๊ทธ๋Ÿฐ ๋‹ค์Œ PR ํ›„์—๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ **ํ†ต๊ณผ**ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. โœ…
* ๋งŽ์€ PR์—๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก **์ƒ๊ธฐ**์‹œ์ผœ์ค„ ์ˆ˜๋„ ์žˆ๊ณ , ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ **์ œ์•ˆ**ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š” ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ๊ทธ ๋ถ€๋ถ„์„ ๋งŽ์ด ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๋งŽ์€ PR์—๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก **์ƒ๊ธฐ**์‹œ์ผœ์ค„ ์ˆ˜๋„ ์žˆ๊ณ , ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ **์ œ์•ˆ**ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๋งŽ์ด ๋“œ๋Š” ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ๊ทธ ๋ถ€๋ถ„์„ ๋งŽ์ด ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๊ทธ๋ฆฌ๊ณ  ์‹œ๋„ํ•œ ๋‚ด์šฉ์„ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ์ œ๊ฐ€ ํ™•์ธํ–ˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
## Pull Request๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค
## Pull Request ๋งŒ๋“ค๊ธฐ { #create-a-pull-request }
Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค์ฝ”๋“œ์— [์ปจํŠธ๋ฆฌ๋ทฐํŠธ](contributing.md){.internal-link target=\_blank} ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.internal-link target=_blank}ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* ๋ฌธ์„œ์—์„œ ๋ฐœ๊ฒฌํ•œ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ.
* FastAPI ๊ด€๋ จ ๋ฌธ์„œ, ๋น„๋””์˜ค ๋˜๋Š” ํŒŸ์บ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ•˜์—ฌ <a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">์ด ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ</a> ๊ณต์œ ํ•  ๋•Œ.
* FastAPI์— ๋Œ€ํ•œ ๊ธ€, ๋น„๋””์˜ค, ํŒŸ์บ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด <a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">์ด ํŒŒ์ผ์„ ํŽธ์ง‘</a>ํ•˜์—ฌ ๊ณต์œ ํ•  ๋•Œ.
* ํ•ด๋‹น ์„น์…˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* ๋‹น์‹ ์˜ ์–ธ์–ด๋กœ [๋ฌธ์„œ ๋ฒˆ์—ญํ•˜๋Š”๋ฐ](contributing.md#translations){.internal-link target=\_blank} ๊ธฐ์—ฌํ•  ๋•Œ.
* ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ธ์–ด๋กœ [๋ฌธ์„œ ๋ฒˆ์—ญ์—](contributing.md#translations){.internal-link target=_blank} ๋„์›€์„ ์ค„ ๋•Œ.
* ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ๋ฒˆ์—ญ์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ๋„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์ƒˆ๋กœ์šด ๋ฌธ์„œ์˜ ์„น์…˜์„ ์ œ์•ˆํ•  ๋•Œ.
* ๊ธฐ์กด ๋ฌธ์ œ/๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ.
* ์ƒˆ๋กœ์šด ๋ฌธ์„œ ์„น์…˜์„ ์ œ์•ˆํ•  ๋•Œ.
* ๊ธฐ์กด ์ด์Šˆ/๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ.
* ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* ์ƒˆ๋กœ์šด feature๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ.
* ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ.
* ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* ๊ด€๋ จ ๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* ๊ด€๋ จ ๋ฌธ์„œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
## FastAPI ์œ ์ง€ ๊ด€๋ฆฌ์— ๋„์›€ ์ฃผ๊ธฐ
## FastAPI ์œ ์ง€ ๊ด€๋ฆฌ ๋•๊ธฐ { #help-maintain-fastapi }
**FastAPI**์˜ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋„์™€์ฃผ์„ธ์š”! ๐Ÿค“
**FastAPI** ์œ ์ง€๋ฅผ ๋„์™€์ฃผ์„ธ์š”! ๐Ÿค“
ํ•  ์ผ์ด ๋งŽ๊ณ , ๊ทธ ์ค‘ ๋Œ€๋ถ€๋ถ„์€ **์—ฌ๋Ÿฌ๋ถ„**์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•  ์ผ์ด ๋งŽ๊ณ , ๊ทธ์ค‘ ๋Œ€๋ถ€๋ถ„์€ **์—ฌ๋Ÿฌ๋ถ„**์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์ž‘์—…์€:
* [GitHub์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์— ๋„์›€ ์ฃผ๊ธฐ](#github_1){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
* [Pull Request ๋ฆฌ๋ทฐํ•˜๊ธฐ](#pull-requests){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
* [GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ](#help-others-with-questions-in-github){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
* [Pull Request ๋ฆฌ๋ทฐํ•˜๊ธฐ](#review-pull-requests){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
์ด ๋‘ ์ž‘์—…์ด **๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจ**ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด FastAPI ์œ ์ง€ ๊ด€๋ฆฌ์˜ ์ฃผ์š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
์ด ๋‘ ์ž‘์—…์ด **๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจ**ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด FastAPI๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
์ด ์ž‘์—…์„ ๋„์™€์ฃผ์‹ ๋‹ค๋ฉด, **FastAPI ์œ ์ง€ ๊ด€๋ฆฌ์— ๋„์›€์„ ์ฃผ๋Š” ๊ฒƒ**์ด๋ฉฐ ๊ทธ๊ฒƒ์ด **๋” ๋น ๋ฅด๊ณ  ๋” ์ž˜ ๋ฐœ์ „ํ•˜๋Š” ๊ฒƒ**์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿš€
์ด ์ž‘์—…์„ ๋„์™€์ฃผ์‹ ๋‹ค๋ฉด, **FastAPI ์œ ์ง€๋ฅผ ๋•๋Š” ๊ฒƒ**์ด๋ฉฐ FastAPI๊ฐ€ **๋” ๋น ๋ฅด๊ณ  ๋” ์ž˜ ๋ฐœ์ „ํ•˜๋Š” ๊ฒƒ**์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿš€
## ์ฑ„ํŒ…์— ์ฐธ์—ฌํ•˜์‹ญ์‹œ์˜ค
## ์ฑ„ํŒ…์— ์ฐธ์—ฌํ•˜๊ธฐ { #join-the-chat }
๐Ÿ‘ฅ <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">๋””์Šค์ฝ”๋“œ ์ฑ„ํŒ… ์„œ๋ฒ„</a> ๐Ÿ‘ฅ ์— ๊ฐ€์ž…ํ•˜๊ณ  FastAPI ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์–ด์šธ๋ฆฌ์„ธ์š”.
๐Ÿ‘ฅ <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">Discord ์ฑ„ํŒ… ์„œ๋ฒ„</a> ๐Ÿ‘ฅ ์— ์ฐธ์—ฌํ•ด์„œ FastAPI ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์–ด์šธ๋ฆฌ์„ธ์š”.
/// tip
/// tip | ํŒ
์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub ๋””์Šค์ปค์…˜</a> ์—์„œ ์งˆ๋ฌธํ•˜์‹ญ์‹œ์˜ค, [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank} ์˜ ๋„์›€์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
์งˆ๋ฌธ์€ <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Discussions</a>์—์„œ ํ•˜์„ธ์š”. [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๋กœ๋ถ€ํ„ฐ ๋„์›€์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋†’์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋Œ€ํ™”์—์„œ๋งŒ ์ฑ„ํŒ…์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
์ฑ„ํŒ…์€ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋Œ€ํ™”๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
///
### ์งˆ๋ฌธ์„ ์œ„ํ•ด ์ฑ„ํŒ…์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค
### ์งˆ๋ฌธ์„ ์œ„ํ•ด ์ฑ„ํŒ…์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š” { #dont-use-the-chat-for-questions }
์ฑ„ํŒ…์€ ๋” ๋งŽ์€ "์ž์œ ๋กœ์šด ๋Œ€ํ™”"๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์ด๋‚˜ ๋Œ€๋‹ตํ•˜๊ธฐ ์–ด๋ ค์šด ์งˆ๋ฌธ์„ ์‰ฝ๊ฒŒ ์งˆ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋‹ต๋ณ€์„ ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฑ„ํŒ…์€ ๋” ๋งŽ์€ "์ž์œ ๋กœ์šด ๋Œ€ํ™”"๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์ด๋‚˜ ๋‹ตํ•˜๊ธฐ ์–ด๋ ค์šด ์งˆ๋ฌธ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด ๋‹ต๋ณ€์„ ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
GitHub ์ด์Šˆ์—์„œ์˜ ํ…œํ”Œ๋ฆฟ์€ ์˜ฌ๋ฐ”๋ฅธ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•˜๋„๋ก ์•ˆ๋‚ดํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ์ข‹์€ ๋‹ต๋ณ€์„ ์–ป๊ฑฐ๋‚˜ ์งˆ๋ฌธํ•˜๊ธฐ ์ „์— ์Šค์Šค๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์—์„œ๋Š” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ๋”๋ผ๋„ ํ•ญ์ƒ ๋ชจ๋“  ๊ฒƒ์— ๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…
GitHub์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ์ด ์˜ฌ๋ฐ”๋ฅธ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•˜๋„๋ก ์•ˆ๋‚ดํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ์ข‹์€ ๋‹ต๋ณ€์„ ์–ป๊ฑฐ๋‚˜, ์งˆ๋ฌธํ•˜๊ธฐ ์ „์— ์Šค์Šค๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์—์„œ๋Š” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ๋”๋ผ๋„ ์ œ๊ฐ€ ํ•ญ์ƒ ๋ชจ๋“  ๊ฒƒ์— ๋‹ตํ•˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ๋Š” ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…
์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ์˜ ๋Œ€ํ™” ๋˜ํ•œ GitHub์—์„œ ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€ํ™” ์ค‘์— ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub ์ด์Šˆ์— ์žˆ๋Š” ๊ฒƒ๋งŒ [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ, GitHub ์ด์Šˆ์—์„œ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ์˜ ๋Œ€ํ™” ๋˜ํ•œ GitHub๋งŒํผ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ๋Œ€ํ™” ์†์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์— ์žˆ๋Š” ๊ฒƒ๋งŒ [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์ •๋˜๋ฏ€๋กœ, GitHub์—์„œ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—๋Š” ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฑฐ์˜ ํ•ญ์ƒ ๋Œ€ํ™” ์ƒ๋Œ€๋ฅผ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„
๋ฐ˜๋ฉด, ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—๋Š” ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๊ฑฐ์˜ ํ•ญ์ƒ ๋Œ€ํ™” ์ƒ๋Œ€๋ฅผ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„
## ๊ฐœ๋ฐœ์ž ์Šคํฐ์„œ๊ฐ€ ๋˜์‹ญ์‹œ์˜ค
## ๊ฐœ๋ฐœ์ž ์Šคํฐ์„œ ๋˜๊ธฐ { #sponsor-the-author }
<a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub ์Šคํฐ์„œ</a> ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฒฝ์ œ์ ์œผ๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•˜๋‹ค๋Š” ๋ง๋กœ ์ปคํ”ผ๋ฅผ โ˜•๏ธ ํ•œ์ž” ์‚ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„
๋˜ํ•œ FastAPI์˜ ์‹ค๋ฒ„ ๋˜๋Š” ๊ณจ๋“œ ์Šคํฐ์„œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ…๐ŸŽ‰
## FastAPI๋ฅผ ๊ฐ•ํ™”ํ•˜๋Š” ๋„๊ตฌ์˜ ์Šคํฐ์„œ๊ฐ€ ๋˜์‹ญ์‹œ์˜ค
๋ฌธ์„œ์—์„œ ๋ณด์•˜๋“ฏ์ด, FastAPI๋Š” Starlette๊ณผ Pydantic ๋ผ๋Š” ๊ฑฐ์ธ์˜ ์–ด๊นจ์— ํƒ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์˜ ์Šคํฐ์„œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
* <a href="https://github.com/sponsors/samuelcolvin" class="external-link" target="_blank">Samuel Colvin (Pydantic)</a>
* <a href="https://github.com/sponsors/encode" class="external-link" target="_blank">Encode (Starlette, Uvicorn)</a>
์—ฌ๋Ÿฌ๋ถ„์˜ **์ œํ’ˆ/ํšŒ์‚ฌ**๊ฐ€ **FastAPI**์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ , FastAPI ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์•Œ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub sponsors</a>๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž(์ €)๋ฅผ ์Šคํฐ์„œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์–ด์— ๋”ฐ๋ผ ๋ฌธ์„œ์— ๋ฐฐ์ง€ ๊ฐ™์€ ์ถ”๊ฐ€ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ
---

82
docs/ko/docs/history-design-future.md

@ -1,81 +1,79 @@
# ์—ญ์‚ฌ, ๋””์ž์ธ ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜
# ์—ญ์‚ฌ, ๋””์ž์ธ ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜ { #history-design-and-future }
์–ด๋А ๋‚ , [ํ•œ FastAPI ์‚ฌ์šฉ์ž](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920)๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค:
์–ผ๋งˆ ์ „, <a href="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920" class="external-link" target="_blank">ํ•œ **FastAPI** ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค</a>:
> ์ด ํ”„๋กœ์ ํŠธ์˜ ์—ญ์‚ฌ๋ฅผ ์•Œ๋ ค ์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”? ๋ช‡ ์ฃผ ๋งŒ์— ๋ฉ‹์ง„ ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ ๊ฒƒ ๊ฐ™์•„์š”. [...]
> ์ด ํ”„๋กœ์ ํŠธ์˜ ์—ญ์‚ฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? ๋ช‡ ์ฃผ ๋งŒ์— ์•„๋ฌด ๋ฐ์„œ๋„ ๊ฐ‘์ž๊ธฐ ๋‚˜ํƒ€๋‚˜ ์—„์ฒญ๋‚˜๊ฒŒ ์ข‹์•„์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋„ค์š” [...]
์—ฌ๊ธฐ์„œ ๊ทธ ์—ญ์‚ฌ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
---
## ๋Œ€์•ˆ { #alternatives }
## ๋Œ€์•ˆ
์ €๋Š” ์—ฌ๋Ÿฌ ํ•ด ๋™์•ˆ ๋ณต์žกํ•œ ์š”๊ตฌ์‚ฌํ•ญ(๋จธ์‹ ๋Ÿฌ๋‹, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ, ๋น„๋™๊ธฐ ์ž‘์—…, NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ)์„ ๊ฐ€์ง„ API๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ ํŒ€์„ ์ด๋Œ์–ด ์™”์Šต๋‹ˆ๋‹ค.
์ €๋Š” ์—ฌ๋Ÿฌ ํ•ด ๋™์•ˆ ๋จธ์‹ ๋Ÿฌ๋‹, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ, ๋น„๋™๊ธฐ ์ž‘์—…, NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ๋ณต์žกํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ API๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ํŒ€์„ ์ด๋Œ์–ด ์™”์Šต๋‹ˆ๋‹ค.
๊ทธ ๊ณผ์ •์—์„œ ๋งŽ์€ ๋Œ€์•ˆ์„ ์กฐ์‚ฌํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๊ณ , ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์—์„œ ๋งŽ์€ ๋Œ€์•ˆ์„ ์กฐ์‚ฌํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๋ฉฐ, ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. **FastAPI**์˜ ์—ญ์‚ฌ๋Š” ๊ทธ ์ด์ „์— ๋‚˜์™”๋˜ ์—ฌ๋Ÿฌ ๋„๊ตฌ์˜ ์—ญ์‚ฌ์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**์˜ ์—ญ์‚ฌ๋Š” ์ƒ๋‹น ๋ถ€๋ถ„ ๊ทธ ์ด์ „์— ์žˆ๋˜ ๋„๊ตฌ๋“ค์˜ ์—ญ์‚ฌ์ž…๋‹ˆ๋‹ค.
[๋Œ€์•ˆ](alternatives.md){.internal-link target=_blank} ์„น์…˜์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ:
> **FastAPI**๋Š” ์ด์ „์— ๋‚˜์™”๋˜ ๋งŽ์€ ๋„๊ตฌ๋“ค์˜ ๋…ธ๋ ฅ ์—†์ด๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
>
> ์ด์ „์— ๊ฐœ๋ฐœ๋œ ์—ฌ๋Ÿฌ ๋„๊ตฌ๋“ค์ด ์ด ํ”„๋กœ์ ํŠธ์— ์˜๊ฐ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
>
> ์ €๋Š” ์˜ค๋žซ๋™์•ˆ ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” **FastAPI**๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ, ๋„๊ตฌ๋“ค์„ ์กฐํ•ฉํ•ด ํ•ด๊ฒฐํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค.
>
> ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋„๊ตฌ๋“ค๋กœ๋ถ€ํ„ฐ ์ตœ๊ณ ์˜ ์•„์ด๋””์–ด๋“ค์„ ๋ชจ์œผ๊ณ , ์ด๋ฅผ ์ตœ์ ์˜ ๋ฐฉ์‹์œผ๋กœ ์กฐํ•ฉํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” :term:Python 3.6+ ํƒ€์ž… ํžŒํŠธ <type hints>์™€ ๊ฐ™์€, ์ด์ „์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์–ธ์–ด ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
<blockquote markdown="1">
---
**FastAPI**๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด์ „์— ํ•ด์˜จ ์ž‘์—…์ด ์—†์—ˆ๋‹ค๋ฉด ์กด์žฌํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
## ์กฐ์‚ฌ
๊ทธ ์ „์— ๋งŒ๋“ค์–ด์ง„ ๋งŽ์€ ๋„๊ตฌ๋“ค์ด ์ด๊ฒƒ์˜ ํƒ„์ƒ์— ์˜๊ฐ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•ด ๋ณด๋ฉฐ ๋‹ค์–‘ํ•œ ๋„๊ตฌ์—์„œ ๋ฐฐ์šด ์ ๋“ค์„ ๋ชจ์•„ ์ €์™€ ๊ฐœ๋ฐœํŒ€์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
์ €๋Š” ์—ฌ๋Ÿฌ ํ•ด ๋™์•ˆ ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” **FastAPI**๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ, ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํ‘œ์ค€ :term:Python ํƒ€์ž… ํžŒํŠธ <type hints>์— ๊ธฐ๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๋ผ๋Š” ์ ์ด ๋ช…ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์–ด๋А ์‹œ์ ์—๋Š”, ์ด์ „ ๋„๊ตฌ๋“ค์˜ ์ตœ๊ณ ์˜ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ ธ์™€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์„ ์˜ ๋ฐฉ์‹์œผ๋กœ ์กฐํ•ฉํ•˜๊ณ , ์ด์ „์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜๋˜ ์–ธ์–ด ๊ธฐ๋Šฅ(Python 3.6+ type hints)์„ ์‚ฌ์šฉํ•ด ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ ์™ธ์—๋Š” ๋‹ค๋ฅธ ์„ ํƒ์ง€๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ‘œ์ค€์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์ ‘๊ทผ๋ฒ•์ด๋ผ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
</blockquote>
๊ทธ๋ž˜์„œ **FastAPI**์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋ช‡ ๋‹ฌ ๋™์•ˆ OpenAPI, JSON Schema, OAuth2 ๋ช…์„ธ๋ฅผ ์—ฐ๊ตฌํ•˜๋ฉฐ ์ด๋“ค์˜ ๊ด€๊ณ„์™€ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„, ์ฐจ์ด์ ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.
## ์กฐ์‚ฌ { #investigation }
---
์ด์ „์˜ ๋ชจ๋“  ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•ด ๋ณด๋ฉด์„œ, ๊ฐ ๋„๊ตฌ๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šธ ๊ธฐํšŒ๋ฅผ ์–ป์—ˆ๊ณ , ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ ธ์™€ ์ œ๊ฐ€ ์ผํ•ด์˜จ ๊ฐœ๋ฐœ ํŒ€๋“ค๊ณผ ์ € ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ฐพ์€ ๋ฐฉ์‹์œผ๋กœ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
## ๋””์ž์ธ
์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ƒ์ ์œผ๋กœ๋Š” ํ‘œ์ค€ Python ํƒ€์ž… ํžŒํŠธ์— ๊ธฐ๋ฐ˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ๋ถ„๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ํ›„, **FastAPI** ์‚ฌ์šฉ์ž๊ฐ€ ๋  ๊ฐœ๋ฐœ์ž๋กœ์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž "API"๋ฅผ ๋””์ž์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ๊ฐ€์žฅ ์ข‹์€ ์ ‘๊ทผ๋ฒ•์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
[Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools)์— ๋”ฐ๋ฅด๋ฉด ์•ฝ 80%์˜ Python ๊ฐœ๋ฐœ์ž๊ฐ€ PyCharm, VS Code, Jedi ๊ธฐ๋ฐ˜ ํŽธ์ง‘๊ธฐ ๋“ฑ์—์„œ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ์•„์ด๋””์–ด๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ **FastAPI**์˜ ์ฝ”๋”ฉ์„ ์‹œ์ž‘ํ•˜๊ธฐ๋„ ์ „์—, OpenAPI, JSON Schema, OAuth2 ๋“ฑ๊ณผ ๊ฐ™์€ ๋ช…์„ธ๋ฅผ ๋ช‡ ๋‹ฌ ๋™์•ˆ ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์˜ ๊ด€๊ณ„, ๊ฒน์น˜๋Š” ๋ถ€๋ถ„, ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€์Šต๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋„ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, **FastAPI**์˜ ์ด์ ์€ ๊ฑฐ์˜ ๋ชจ๋“  ํŽธ์ง‘๊ธฐ์—์„œ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๋””์ž์ธ { #design }
์ด ๊ณผ์ •์„ ํ†ตํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋ชจ๋“  ๊ณณ์—์„œ ์ž๋™ ์™„์„ฑ, ํƒ€์ž… ๊ฒ€์‚ฌ, ์—๋Ÿฌ ํ™•์ธ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜๋Š” ์ตœ์ ์˜ ๋ฐฉ์‹์„ ์ฐพ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ์—๋Š” (FastAPI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ์„œ) ์‚ฌ์šฉ์ž๋กœ์„œ ๊ฐ–๊ณ  ์‹ถ์—ˆ๋˜ ๊ฐœ๋ฐœ์ž "API"๋ฅผ ๋””์ž์ธํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ์ผ์Šต๋‹ˆ๋‹ค.
์ด ๋ชจ๋“  ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Python ํŽธ์ง‘๊ธฐ๋“ค: PyCharm, VS Code, Jedi ๊ธฐ๋ฐ˜ ํŽธ์ง‘๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ์•„์ด๋””์–ด๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
---
์•ฝ 80%์˜ ์‚ฌ์šฉ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ์ตœ๊ทผ <a href="https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools" class="external-link" target="_blank">Python Developer Survey</a>์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
## ํ•„์š”์กฐ๊ฑด
์ฆ‰, **FastAPI**๋Š” Python ๊ฐœ๋ฐœ์ž์˜ 80%๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋“ค๋กœ ํŠน๋ณ„ํžˆ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋„ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ ๋ชจ๋“  ์ด์ ์€ ์‚ฌ์‹ค์ƒ ๋ชจ๋“  ํŽธ์ง‘๊ธฐ์—์„œ ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ํ…Œ์ŠคํŠธํ•œ ํ›„, [Pydantic](https://docs.pydantic.dev/)์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์ฝ”๋“œ ์ค‘๋ณต์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์ด ์ค„์ด๊ณ , ์–ด๋””์„œ๋‚˜ ์ž๋™ ์™„์„ฑ, ํƒ€์ž… ๋ฐ ์—๋Ÿฌ ๊ฒ€์‚ฌ ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ดํ›„ ์ €๋Š” **Pydantic**์ด JSON Schema์™€ ์™„๋ฒฝํžˆ ํ˜ธํ™˜๋˜๋„๋ก ๊ฐœ์„ ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์„ ์–ธ์„ ์ง€์›ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ์˜ ์ž๋™ ์™„์„ฑ๊ณผ ํƒ€์ž… ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ง์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ํ•„์š”์กฐ๊ฑด์ด์—ˆ๋˜ [Starlette](https://www.starlette.dev/)์—๋„ ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
## ํ•„์š”์กฐ๊ฑด { #requirements }
---
์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ํ…Œ์ŠคํŠธํ•œ ํ›„, ์žฅ์  ๋•Œ๋ฌธ์— <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">**Pydantic**</a>์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
## ๊ฐœ๋ฐœ
๊ทธ ํ›„, JSON Schema๋ฅผ ์™„์ „ํžˆ ์ค€์ˆ˜ํ•˜๋„๋ก ํ•˜๊ณ , ์ œ์•ฝ ์กฐ๊ฑด ์„ ์–ธ์„ ์ •์˜ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํŽธ์ง‘๊ธฐ ์ง€์›(ํƒ€์ž… ๊ฒ€์‚ฌ, ์ž๋™ ์™„์„ฑ)์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ฆˆ์Œ์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ค€๋น„๊ฐ€ ์ด๋ฏธ ์™„๋ฃŒ๋œ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„๊ฐ€ ์ •์˜๋˜์—ˆ๊ณ , ํ•„์š”์กฐ๊ฑด๊ณผ ๋„๊ตฌ๊ฐ€ ์ค€๋น„๋˜์—ˆ์œผ๋ฉฐ, ํ‘œ์ค€๊ณผ ๋ช…์„ธ์— ๋Œ€ํ•œ ์ง€์‹๋„ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ, ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ํ•„์š”์กฐ๊ฑด์ธ <a href="https://www.starlette.dev/" class="external-link" target="_blank">**Starlette**</a>์—๋„ ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
---
## ๊ฐœ๋ฐœ { #development }
## ๋ฏธ๋ž˜
**FastAPI** ์ž์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ์ฏค์—๋Š”, ๋Œ€๋ถ€๋ถ„์˜ ์กฐ๊ฐ๋“ค์ด ์ด๋ฏธ ๊ฐ–์ถฐ์ ธ ์žˆ์—ˆ๊ณ , ๋””์ž์ธ์€ ์ •์˜๋˜์–ด ์žˆ์—ˆ์œผ๋ฉฐ, ํ•„์š”์กฐ๊ฑด๊ณผ ๋„๊ตฌ๋Š” ์ค€๋น„๋˜์–ด ์žˆ์—ˆ๊ณ , ํ‘œ์ค€๊ณผ ๋ช…์„ธ์— ๋Œ€ํ•œ ์ง€์‹๋„ ๋ช…ํ™•ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.
ํ˜„์‹œ์ ์—์„œ **FastAPI**๊ฐ€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ช…๋ฐฑํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
## ๋ฏธ๋ž˜ { #future }
์—ฌ๋Ÿฌ ์šฉ๋„์— ๋” ์ ํ•ฉํ•œ ๋„๊ตฌ๋กœ์„œ ๊ธฐ์กด ๋Œ€์•ˆ๋ณด๋‹ค ์„ ํ˜ธ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฏธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์™€ ํŒ€๋“ค์ด **FastAPI**์— ์˜์กดํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค (์ €์™€ ์ œ ํŒ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค).
์ด ์‹œ์ ์—๋Š”, **FastAPI**๊ฐ€ ๊ทธ ์•„์ด๋””์–ด์™€ ํ•จ๊ป˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์ด๋ฏธ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐœ์„ ํ•ด์•ผ ํ•  ์ ๊ณผ ์ถ”๊ฐ€ํ•  ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋” ์ž˜ ๋งž๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ๋Œ€์•ˆ๋“ค๋ณด๋‹ค ์„ ํƒ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŽ์€ ๊ฐœ๋ฐœ์ž์™€ ํŒ€์ด ์ด๋ฏธ ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด **FastAPI**์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ €์™€ ์ œ ํŒ€๋„ ํฌํ•จํ•ด์„œ์š”).
ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ, ์•ž์œผ๋กœ ๋‚˜์˜ฌ ๊ฐœ์„  ์‚ฌํ•ญ๊ณผ ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**์˜ ๋ฏธ๋ž˜๋Š” ๋ฐ์Šต๋‹ˆ๋‹ค.
**FastAPI**๋Š” ๋ฐ์€ ๋ฏธ๋ž˜๋กœ ๋‚˜์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  [์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€](help-fastapi.md){.internal-link target=_blank}์€ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค.

Loadingโ€ฆ
Cancel
Save