]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md` (#5657)
authorHyeonJeong Yeo <84669195+nearnear@users.noreply.github.com>
Mon, 22 Jan 2024 19:50:44 +0000 (04:50 +0900)
committerGitHub <noreply@github.com>
Mon, 22 Jan 2024 19:50:44 +0000 (14:50 -0500)
docs/ko/docs/deployment/docker.md [new file with mode: 0644]

diff --git a/docs/ko/docs/deployment/docker.md b/docs/ko/docs/deployment/docker.md
new file mode 100644 (file)
index 0000000..587b445
--- /dev/null
@@ -0,0 +1,698 @@
+# μ»¨ν…Œμ΄λ„ˆμ˜ FastAPI - λ„컀
+
+FastAPI μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•  λ•Œ μΌλ°˜μ μΈ μ ‘κ·Ό λ°©λ²•은 **λ¦¬λˆ…μŠ€ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄ λ°©λ²•은 μ£Όλ‘œ <a href="https://www.docker.com/" class="external-link" target="_blank">**도컀**</a>λ₯Ό μ‚¬μš©ν•΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. κ·ΈλŸ° λ‹€μŒ ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό λͺ‡κ°€μ§€ λ°©λ²•μœΌλ‘œ λ°°ν¬ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ¦¬λˆ…μŠ€ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜λŠ” λ°μ—λŠ” **λ³΄μ•ˆ**, **반볡 κ°€λŠ₯μ„±**, **λ‹¨μˆœν•¨** λ“±μ˜ μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.
+
+!!! νŒ
+    μ‹œκ°„에 μ«“κΈ°κ³  μžˆκ³  μ΄λ―Έ μ΄λŸ°κ²ƒλ“€μ„ μ•Œκ³  μžˆλ‹€λ©΄ [`Dockerfile`πŸ‘‡](#build-a-docker-image-for-fastapi)둜 μ ν”„ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+<details>
+<summary>λ„μ»€νŒŒμΌ λ―Έλ¦¬λ³΄κΈ° πŸ‘€</summary>
+
+```Dockerfile
+FROM python:3.9
+
+WORKDIR /code
+
+COPY ./requirements.txt /code/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+COPY ./app /code/app
+
+CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
+
+# If running behind a proxy like Nginx or Traefik add --proxy-headers
+# CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"]
+```
+
+</details>
+
+## μ»¨ν…Œμ΄λ„ˆλž€
+
+μ»¨ν…Œμ΄λ„ˆ(주둜 λ¦¬λˆ…μŠ€ μ»¨ν…Œμ΄λ„ˆ)λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ˜μ‘΄μ„±κ³Ό ν•„μš”ν•œ νŒŒμΌλ“€μ„ λͺ¨λ‘ νŒ¨ν‚€μ§•ν•˜λŠ” λ§€μš° **κ°€λ²Όμš΄** λ°©λ²•μž…λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆλŠ” κ°™μ€ μ‹œμŠ€ν…œμ— μžˆλŠ” λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆ(λ‹€λ₯Έ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ μš”μ†Œλ“€)와 λ…λ¦½μ μœΌλ‘œ μœ μ§€λ©λ‹ˆλ‹€.
+
+λ¦¬λˆ…μŠ€ μ»¨ν…Œμ΄λ„ˆλŠ” ν˜ΈμŠ€νŠΈ(λ¨Έμ‹ , κ°€μƒ λ¨Έμ‹ , ν΄λΌμš°λ“œ μ„œλ²„ λ“±)와 κ°™μ€ λ¦¬λˆ…μŠ€ μ»€λ„μ„ μ‚¬μš©ν•΄ μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λ§μ€ λ¦¬λˆ…μŠ€ μ»¨ν…Œμ΄λ„ˆκ°€ (전체 μš΄μ˜μ²΄μ œλ₯Ό λͺ¨λ°©ν•˜λŠ” λ‹€λ₯Έ κ°€μƒ λ¨Έμ‹ κ³Ό λΉ„κ΅ν–ˆμ„ λ•Œ) λ§€μš° κ°€λ³λ‹€λŠ” κ²ƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
+
+이 λ°©λ²•을 ν†΅ν•΄, μ»¨ν…Œμ΄λ„ˆλŠ” μ§μ ‘ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λŠ” κ²ƒκ³Ό λΉ„μŠ·ν•œ μ •λ„μ˜ **적은 μžμ›**을 μ†ŒλΉ„ν•©λ‹ˆλ‹€ (가상 λ¨Έμ‹ μ€ ν›¨μ”¬ λ§Žμ€ μžμ›μ„ μ†ŒλΉ„ν•  κ²ƒμž…λ‹ˆλ‹€).
+
+μ»¨ν…Œμ΄λ„ˆλŠ” λ˜ν•œ κ·Έλ“€λ§Œμ˜ **λ…λ¦½λœ** μ‹€ν–‰ ν”„λ‘œμ„ΈμŠ€ (일반적으둜 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ‘œ μΆ©λΆ„ν•©λ‹ˆλ‹€), νŒŒμΌ μ‹œμŠ€ν…œ, κ·Έλ¦¬κ³  λ„€νŠΈμ›Œν¬λ₯Ό κ°€μ§€λ―€λ‘œ λ°°ν¬, λ³΄μ•ˆ, κ°œλ°œ λ° κΈ°νƒ€ κ³Όμ •을 λ‹¨μˆœν™” ν•©λ‹ˆλ‹€.
+
+## μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λž€
+
+**μ»¨ν…Œμ΄λ„ˆ**λŠ” **μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**λ₯Ό μ‹€ν–‰ν•œ κ²ƒ μž…λ‹ˆλ‹€.
+
+μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λž€ μ»¨ν…Œμ΄λ„ˆμ— ν•„μš”ν•œ λͺ¨λ“  νŒŒμΌ, ν™˜κ²½ λ³€μˆ˜ κ·Έλ¦¬κ³  λ””ν΄νŠΈ λͺ…λ Ή/ν”„λ‘œκ·Έλž¨μ˜ **정적** λ²„μ „μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ **정적**μ΄λž€ λ§μ€ μ»¨ν…Œμ΄λ„ˆ **이미지**κ°€ μž‘λ™λ˜κ±°λ‚˜ μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ©°, λ‹¨μ§€ νŒ¨ν‚€μ§€ νŒŒμΌκ³Ό λ©”타 λ°μ΄ν„°λΌλŠ” κ²ƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
+
+μ €μž₯된 μ •적 μ»¨ν…μΈ μΈ **μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**와 λŒ€μ‘°λ˜κ²Œ, **μ»¨ν…Œμ΄λ„ˆ**λž€ λ³΄ν†΅ μ‹€ν–‰λ  μˆ˜ μžˆλŠ” μž‘동 μΈμŠ€ν„΄μŠ€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
+
+**μ»¨ν…Œμ΄λ„ˆ**κ°€ (**μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**둜 λΆ€ν„°) μ‹œμž‘λ˜κ³  μ‹€ν–‰λ˜λ©΄, μ»¨ν…Œμ΄λ„ˆλŠ” νŒŒμΌμ΄λ‚˜ ν™˜κ²½ λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ λ³€κ²½ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ³€ν™”λŠ” μ˜€μ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œλ§Œ μ‘΄μž¬ν•˜λ©°, κ·Έ κΈ°λ°˜μ΄ λ˜λŠ” μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€μ—λŠ” μ§€μ†λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ (즉 λ””μŠ€ν¬μ—λŠ” μ €μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€).
+
+μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λŠ” **ν”„λ‘œκ·Έλž¨** νŒŒμΌκ³Ό μ»¨ν…μΈ , μ¦‰ `python`κ³Ό μ–΄λ–€ νŒŒμΌ `main.py`에 λΉ„ꡐ할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+그리고 (**μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**와 λŒ€λΉ„ν•΄μ„œ) **μ»¨ν…Œμ΄λ„ˆ**λŠ” μ΄λ―Έμ§€μ˜ μ‹€μ œ μ‹€ν–‰ μΈμŠ€ν„΄μŠ€λ‘œ **ν”„λ‘œμ„ΈμŠ€**에 λΉ„ꡐ할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μ‹€, μ»¨ν…Œμ΄λ„ˆλŠ” **ν”„λ‘œμ„ΈμŠ€ λŸ¬λ‹**이 μžˆμ„ λ•Œλ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€ (그리고 λ³΄ν†΅ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ μž…λ‹ˆλ‹€). μ»¨ν…Œμ΄λ„ˆλŠ” λ‚΄λΆ€μ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ—†μœΌλ©΄ μ’…λ£Œλ©λ‹ˆλ‹€.
+
+## μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€
+
+λ„μ»€λŠ” **μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**와 **μ»¨ν…Œμ΄λ„ˆ**λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ”λ° μ£Όμš” λ„ꡬ μ€‘ ν•˜λ‚˜κ°€ λ˜μ–΄μ™”μŠ΅λ‹ˆλ‹€.
+
+그리고 <a href="https://hub.docker.com/" class="external-link" target="_blank">도컀 ν—ˆλΈŒ</a>에 λ‹€μ–‘ν•œ λ„ꡬ, ν™˜κ²½, λ°μ΄ν„°λ² μ΄μŠ€, κ·Έλ¦¬κ³  μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ— λŒ€ν•΄ λ―Έλ¦¬ λ§Œλ“€μ–΄μ§„ **곡식 μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**κ°€ κ³΅κ°œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
+
+예λ₯Ό λ“€μ–΄, κ³΅μ‹ <a href="https://hub.docker.com/_/python" class="external-link" target="_blank">파이썬 μ΄λ―Έμ§€</a>κ°€ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ˜ν•œ λ‹€λ₯Έ λŒ€μƒ, μ˜ˆλ₯Ό λ“€λ©΄ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μœ„ν•œ μ΄λ―Έμ§€λ“€λ„ μžˆμŠ΅λ‹ˆλ‹€:
+
+* <a href="https://hub.docker.com/_/postgres" class="external-link" target="_blank">PostgreSQL</a>
+* <a href="https://hub.docker.com/_/mysql" class="external-link" target="_blank">MySQL</a>
+* <a href="https://hub.docker.com/_/mongo" class="external-link" target="_blank">MongoDB</a>
+* <a href="https://hub.docker.com/_/redis" class="external-link" target="_blank">Redis</a> λ“±
+
+미리 λ§Œλ“€μ–΄μ§„ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό μ‚¬μš©ν•˜λ©΄ μ„œλ‘œ λ‹€λ₯Έ λ„ꡬ듀을 **κ²°ν•©**ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—, **곡식 μ΄λ―Έμ§€λ“€**을 μ‚¬μš©ν•˜κ³  ν™˜κ²½ λ³€μˆ˜λ₯Ό ν†΅ν•΄ μ„€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이런 λ°©λ²•μœΌλ‘œ λŒ€λΆ€λΆ„μ˜ κ²½μš°μ— μ»¨ν…Œμ΄λ„ˆμ™€ λ„컀에 λŒ€ν•΄ λ°°μšΈ μˆ˜ μžˆμœΌλ©° λ‹€μ–‘ν•œ λ„ꡬ와 μš”μ†Œλ“€μ— λŒ€ν•œ μ§€μ‹μ„ μž¬μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ”°λΌμ„œ, μ„œλ‘œ λ‹€λ₯Έ **닀쀑 μ»¨ν…Œμ΄λ„ˆ**λ₯Ό μƒμ„±ν•œ λ‹€μŒ μ΄λ“€μ„ μ—°κ²°ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€, νŒŒμ΄μ¬ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜, λ¦¬μ•‘트 ν”„λ‘ νŠΈμ—”λ“œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” μ›Ή μ„œλ²„에 λŒ€ν•œ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“€μ–΄ μ΄λ“€μ˜ λ‚΄λΆ€ λ„€νŠΈμ›Œν¬λ‘œ κ° μ»¨ν…Œμ΄λ„ˆλ₯Ό μ—°κ²°ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ κ΄€λ¦¬ μ‹œμŠ€ν…œ(λ„μ»€λ‚˜ μΏ λ²„λ„€ν‹°μŠ€)은 μ΄λŸ¬ν•œ λ„€νŠΈμ›Œν‚Ή νŠΉμ„±μ„ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
+
+## μ»¨ν…Œμ΄λ„ˆμ™€ ν”„λ‘œμ„ΈμŠ€
+
+**μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**λŠ” λ³΄ν†΅ **μ»¨ν…Œμ΄λ„ˆ**λ₯Ό μ‹œμž‘ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λ©”타데이터와 λ””ν΄νŠΈ μ»€λ§¨λ“œ/ν”„λ‘œκ·Έλž¨κ³Ό κ·Έ ν”„λ‘œκ·Έλž¨μ— μ „λ‹¬ν•˜κΈ° μœ„ν•œ νŒŒλΌλ―Έν„°λ“€μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. μ΄λŠ” μ»€λ§¨λ“œ λΌμΈμ—μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ ν•„μš”ν•œ κ°’λ“€κ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€.
+
+**μ»¨ν…Œμ΄λ„ˆ**κ°€ μ‹œμž‘λ˜λ©΄, ν•΄λ‹Ή μ»€λ§¨λ“œ/ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ©λ‹ˆλ‹€ (κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ μ»€λ§¨λ“œ/ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ„둝 μ˜€λ²„λΌμ΄λ“œ ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€).
+
+μ»¨ν…Œμ΄λ„ˆλŠ” **메인 ν”„λ‘œμ„ΈμŠ€**(μ»€λ§¨λ“œ λ˜λŠ” ν”„λ‘œκ·Έλž¨)이 μ‹€ν–‰λ˜λŠ” λ™μ•ˆ μ‹€ν–‰λ©λ‹ˆλ‹€.
+
+μ»¨ν…Œμ΄λ„ˆλŠ” μΌλ°˜μ μœΌλ‘œ **단일 ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€κ³  μžˆμ§€λ§Œ, λ©”인 ν”„λ‘œμ„ΈμŠ€μ˜ μ„œλΈŒ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œμž‘ν•˜λŠ” κ²ƒλ„ κ°€λŠ₯ν•˜λ©°, μ΄ λ°©λ²•μœΌλ‘œ ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆμ— **닀쀑 ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§ˆ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+κ·ΈλŸ¬λ‚˜ **μ΅œμ†Œν•œ ν•˜λ‚˜μ˜ μ‹€ν–‰μ€‘인 ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€μ§€ μ•Šκ³ μ„œλŠ” μ‹€ν–‰μ€‘인 μ»¨ν…Œμ΄λ„ˆλ₯Ό κ°€μ§ˆ μˆ˜ μ—†μŠ΅λ‹ˆλ‹€. λ§Œμ•½ λ©”인 ν”„λ‘œμ„ΈμŠ€κ°€ μ€‘λ‹¨λ˜λ©΄, μ»¨ν…Œμ΄λ„ˆλ„ μ€‘λ‹¨λ©λ‹ˆλ‹€.
+
+## FastAPIλ₯Ό μœ„ν•œ λ„컀 μ΄λ―Έμ§€ λΉŒλ“œν•˜κΈ°
+
+이제 λ¬΄μ–Έκ°€λ₯Ό λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€! πŸš€
+
+**곡식 νŒŒμ΄μ¬** μ΄λ―Έμ§€μ— κΈ°λ°˜ν•˜μ—¬, FastAPIλ₯Ό μœ„ν•œ **도컀 μ΄λ―Έμ§€**λ₯Ό **맨 μ²˜μŒλΆ€ν„°** μƒμ„±ν•˜λŠ” λ°©λ²•을 λ³΄μ΄κ² μŠ΅λ‹ˆλ‹€.
+
+**λŒ€λΆ€λΆ„μ˜ κ²½μš°**에 λ‹€μŒκ³Ό κ°™μ€ κ²ƒλ“€μ„ ν•˜κ²Œ λ©λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€λ©΄:
+
+* **μΏ λ²„λ„€ν‹°μŠ€** λ˜λŠ” μœ μ‚¬ν•œ λ„ꡬ μ‚¬μš©ν•˜κΈ°
+* **라즈베리 νŒŒμ΄**둜 μ‹€ν–‰ν•˜κΈ°
+* μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό μ‹€ν–‰ν•  ν΄λΌμš°λ“œ μ„œλΉ„μŠ€ μ‚¬μš©ν•˜κΈ° λ“±
+
+### μš”ꡬ νŒ¨ν‚€μ§€
+
+μΌλ°˜μ μœΌλ‘œλŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ • νŒŒμΌμ„ μœ„ν•œ **νŒ¨ν‚€μ§€ μš”ꡬ μ‘°κ±΄**이 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+κ·Έ μš”ꡬ μ‘°κ±΄μ„ **μ„€μΉ˜**ν•˜λŠ” λ°©λ²•은 μ—¬λŸ¬λΆ„이 μ‚¬μš©ν•˜λŠ” λ„ꡬ에 λ”°λΌ λ‹€λ₯Ό κ²ƒμž…λ‹ˆλ‹€.
+
+κ°€μž₯ μΌλ°˜μ μΈ λ°©λ²•은 νŒ¨ν‚€μ§€ μ΄λ¦„κ³Ό λ²„전이 μ€„ λ³„λ‘œ κΈ°λ‘λœ `requirements.txt` νŒŒμΌμ„ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.
+
+λ²„μ „μ˜ λ²”μœ„λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•΄μ„œλŠ” [FastAPI λ²„전듀에 λŒ€ν•˜μ—¬](./versions.md){.internal-link target=_blank}에 μ“°μ—¬μ§„ κ²ƒκ³Ό κ°™μ€ μ•„이디어λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
+
+예λ₯Ό λ“€μ–΄, `requirements.txt` νŒŒμΌμ€ λ‹€μŒκ³Ό κ°™μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+```
+fastapi>=0.68.0,<0.69.0
+pydantic>=1.8.0,<2.0.0
+uvicorn>=0.15.0,<0.16.0
+```
+
+그리고 μΌλ°˜μ μœΌλ‘œ νŒ¨ν‚€μ§€ μ’…속성은 `pip`둜 μ„€μΉ˜ν•©λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄:
+
+<div class="termy">
+
+```console
+$ pip install -r requirements.txt
+---> 100%
+Successfully installed fastapi pydantic uvicorn
+```
+
+</div>
+
+!!! μ •보
+    νŒ¨ν‚€μ§€ μ’…속성을 μ •μ˜ν•˜κ³  μ„€μΉ˜ν•˜κΈ° μœ„ν•œ λ°©λ²•κ³Ό λ„κ΅¬λŠ” λ‹€μ–‘ν•©λ‹ˆλ‹€.
+
+    λ‚˜μ€‘에 μ•„λž˜ μ„Έμ…˜μ—μ„œ Poetryλ₯Ό μ‚¬μš©ν•œ μ˜ˆμ‹œλ₯Ό λ³΄μ΄κ² μŠ΅λ‹ˆλ‹€. πŸ‘‡
+
+### **FastAPI** μ½”λ“œ μƒμ„±ν•˜κΈ°
+
+* `app` λ””렉터리λ₯Ό μƒμ„±ν•˜κ³  μ΄λ™ν•©λ‹ˆλ‹€.
+* λΉˆ νŒŒμΌ `__init__.py`을 μƒμ„±ν•©λ‹ˆλ‹€.
+* λ‹€μŒκ³Ό κ°™μ€ `main.py`을 μƒμ„±ν•©λ‹ˆλ‹€:
+
+```Python
+from typing import Union
+
+from fastapi import FastAPI
+
+app = FastAPI()
+
+
+@app.get("/")
+def read_root():
+    return {"Hello": "World"}
+
+
+@app.get("/items/{item_id}")
+def read_item(item_id: int, q: Union[str, None] = None):
+    return {"item_id": item_id, "q": q}
+```
+
+### λ„μ»€νŒŒμΌ
+
+이제 κ°™μ€ ν”„λ‘œμ νŠΈ λ””렉터리에 λ‹€μŒκ³Ό κ°™μ€ νŒŒμΌ `Dockerfile`을 μƒμ„±ν•©λ‹ˆλ‹€:
+
+```{ .dockerfile .annotate }
+# (1)
+FROM python:3.9
+
+# (2)
+WORKDIR /code
+
+# (3)
+COPY ./requirements.txt /code/requirements.txt
+
+# (4)
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+# (5)
+COPY ./app /code/app
+
+# (6)
+CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
+```
+
+1. κ³΅μ‹ νŒŒμ΄μ¬ λ² μ΄μŠ€ μ΄λ―Έμ§€μ—μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€.
+
+2. ν˜„μž¬ μ›Œν‚Ή λ””렉터리λ₯Ό `/code`둜 μ„€μ •ν•©λ‹ˆλ‹€.
+
+    μ—¬κΈ°μ— `requirements.txt` νŒŒμΌκ³Ό `app` λ””렉터리λ₯Ό μœ„μΉ˜μ‹œν‚¬ κ²ƒμž…λ‹ˆλ‹€.
+
+3. μš”ꡬ μ‘°κ±΄κ³Ό νŒŒμΌμ„ `/code` λ””λ ‰ν„°λ¦¬λ‘œ λ³΅μ‚¬ν•©λ‹ˆλ‹€.
+
+    μ²˜μŒμ—λŠ” **였직** μš”ꡬ μ‘°κ±΄μ΄ ν•„μš”ν•œ νŒŒμΌλ§Œ λ³΅μ‚¬ν•˜κ³ , μ΄μ™Έμ˜ μ½”λ“œλŠ” κ·ΈλŒ€λ‘œ λ‘‘λ‹ˆλ‹€.
+
+    μ΄ νŒŒμΌμ΄ **자주 λ°”λ€Œμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—**, λ„μ»€λŠ” νŒŒμΌμ„ νƒμ§€ν•˜μ—¬ μ΄ λ‹¨κ³„μ˜ **μΊμ‹œ**λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ λ‹¨κ³„μ—μ„œλ„ μΊμ‹œλ₯Ό μ‚¬μš©ν•  μˆ˜ μžˆλ„둝 ν•©λ‹ˆλ‹€.
+
+4. μš”ꡬ μ‘°κ±΄ νŒŒμΌμ— μžˆλŠ” νŒ¨ν‚€μ§€ μ’…속성을 μ„€μΉ˜ν•©λ‹ˆλ‹€.
+
+    `--no-cache-dir` μ˜΅μ…˜μ€ `pip`μ—κ²Œ λ‹€μš΄λ‘œλ“œν•œ νŒ¨ν‚€μ§€λ“€μ„ λ‘œμ»¬ ν™˜κ²½μ— μ €μž₯ν•˜μ§€ μ•Šλ„둝 μ „λ‹¬ν•©λ‹ˆλ‹€. μ΄λŠ” λ§ˆμΉ˜ κ°™μ€ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜κΈ° μœ„ν•΄ μ˜€μ§ `pip`만 λ‹€μ‹œ μ‹€ν–‰ν•˜λ©΄ λ  κ²ƒ κ°™μ§€λ§Œ, μ»¨ν…Œμ΄λ„ˆλ‘œ μž‘μ—…ν•˜λŠ” κ²½μš° κ·Έλ ‡μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
+
+    !!! λ…ΈνŠΈ
+        `--no-cache-dir` λŠ” μ˜€μ§ `pip`와 κ΄€λ ¨λ˜μ–΄ μžˆμœΌλ©°, λ„μ»€λ‚˜ μ»¨ν…Œμ΄λ„ˆμ™€λŠ” λ¬΄κ΄€ν•©λ‹ˆλ‹€.
+
+    `--upgrade` μ˜΅μ…˜μ€ `pip`μ—κ²Œ μ„€μΉ˜λœ νŒ¨ν‚€μ§€λ“€μ„ μ—…λ°μ΄νŠΈν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
+
+    μ΄μ „ λ‹¨κ³„μ—μ„œ νŒŒμΌμ„ λ³΅μ‚¬ν•œ κ²ƒμ΄ **도컀 μΊμ‹œ**에 μ˜ν•΄ νƒμ§€λ˜κΈ° λ•Œλ¬Έμ—, μ΄ λ‹¨κ³„μ—μ„œλ„ κ°€λŠ₯ν•œ ν•œ **도컀 μΊμ‹œ**λ₯Ό μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.
+
+    μ΄ λ‹¨κ³„μ—μ„œ μΊμ‹œλ₯Ό μ‚¬μš©ν•˜λ©΄ **맀번** λͺ¨λ“  μ’…속성을 λ‹€μš΄λ‘œλ“œ λ°›κ³  μ„€μΉ˜ν•  ν•„μš”κ°€ μ—†μ–΄, κ°œλ°œ κ³Όμ •μ—μ„œ μ΄λ―Έμ§€λ₯Ό μ§€μ†μ μœΌλ‘œ μƒμ„±ν•˜λŠ” λ°μ— λ“œλŠ” **μ‹œκ°„**을 λ§Žμ΄ **μ ˆμ•½**ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+5. `/code` λ””렉터리에 `./app` λ””렉터리λ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€.
+
+    **자주 λ³€κ²½λ˜λŠ”** λͺ¨λ“  μ½”λ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆκΈ° λ•Œλ¬Έμ—, λ„컀 **μΊμ‹œ**λŠ” μ΄ λ‹¨κ³„λ‚˜ **μ΄ν›„μ˜ λ‹¨κ³„μ—μ„œ** μž˜ μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
+
+    κ·ΈλŸ¬λ―€λ‘œ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€ λΉŒλ“œ μ‹œκ°„을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ `Dockerfile`의 **거의 λ λΆ€λΆ„**에 μž…λ ₯ν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€.
+
+6. `uvicorn` μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ **μ»€λ§¨λ“œ**λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
+
+    `CMD`λŠ” λ¬Έμžμ—΄ λ¦¬μŠ€νŠΈλ₯Ό μž…λ ₯λ°›κ³ , κ° λ¬Έμžμ—΄μ€ μ»€λ§¨λ“œ λΌμΈμ˜ κ° μ€„에 μž…λ ₯ν•  λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
+
+    μ΄ μ»€λ§¨λ“œλŠ” **ν˜„μž¬ μ›Œν‚Ή λ””렉터리**μ—μ„œ μ‹€ν–‰λ˜λ©°, μ΄λŠ” μœ„μ—μ„œ `WORKDIR /code`둜 μ„€μ •ν•œ `/code` λ””렉터리와 κ°™μŠ΅λ‹ˆλ‹€.
+
+    ν”„λ‘œκ·Έλž¨μ΄ `/code`μ—μ„œ μ‹œμž‘ν•˜κ³  κ·Έ μ†μ— `./app` λ””렉터리가 μ—¬λŸ¬λΆ„μ˜ μ½”λ“œμ™€ ν•¨κ»˜ λ“€μ–΄μžˆκΈ° λ•Œλ¬Έμ—, **Uvicorn**은 μ΄λ₯Ό λ³΄κ³  `app`을 `app.main`μœΌλ‘œλΆ€ν„° **뢈러 μ˜¬** κ²ƒμž…λ‹ˆλ‹€.
+
+!!! νŒ
+    κ° μ½”λ“œ λΌμΈμ„ μ½”λ“œμ˜ μˆ«μž λ²„블을 ν΄λ¦­ν•˜μ—¬ λ¦¬λ·°ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. πŸ‘†
+
+이제 μ—¬λŸ¬λΆ„은 λ‹€μŒκ³Ό κ°™μ€ λ””렉터리 κ΅¬μ‘°λ₯Ό κ°€μ§€κ³  μžˆμ„ κ²ƒμž…λ‹ˆλ‹€:
+
+```
+.
+β”œβ”€β”€ app
+β”‚Β Β  β”œβ”€β”€ __init__.py
+β”‚   β””── main.py
+β”œβ”€β”€ Dockerfile
+└── requirements.txt
+```
+
+#### TLS μ’…λ£Œ ν”„λ‘μ‹œμ˜ λ°°ν›„
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„이 μ»¨ν…Œμ΄λ„ˆλ₯Ό Nginx λ˜λŠ” Traefikκ³Ό κ°™μ€ TLS μ’…λ£Œ ν”„λ‘μ‹œ (λ‘œλ“œ λ°ΈλŸ°μ„œ) λ’€μ—μ„œ μ‹€ν–‰ν•˜κ³  μžˆλ‹€λ©΄, `--proxy-headers` μ˜΅μ…˜μ„ λ”ν•˜λŠ” κ²ƒμ΄ μ’‹μŠ΅λ‹ˆλ‹€. μ΄ μ˜΅μ…˜μ€ Uvicornμ—κ²Œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ HTTPS λ“±μ˜ λ’€μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆμœΌλ―€λ‘œ ν”„λ‘μ‹œμ—μ„œ μ „솑된 ν—€λ”λ₯Ό μ‹ λ’°ν•  μˆ˜ μžˆλ‹€κ³  μ•Œλ¦½λ‹ˆλ‹€.
+
+```Dockerfile
+CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
+```
+
+#### λ„컀 μΊμ‹œ
+
+이 `Dockerfile`μ—λŠ” μ€‘μš”ν•œ νŠΈλ¦­μ΄ μžˆλŠ”λ°, μ²˜μŒμ—λŠ” **μ˜μ‘΄μ„±μ΄ μžˆλŠ” νŒŒμΌλ§Œ** λ³΅μ‚¬ν•˜κ³ , λ‚˜λ¨Έμ§€ μ½”λ“œλŠ” κ·ΈλŒ€λ‘œ λ‘‘λ‹ˆλ‹€. μ™œ μ΄λŸ° λ°©λ²•을 μ¨μ•Όν•˜λŠ”μ§€ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.
+
+```Dockerfile
+COPY ./requirements.txt /code/requirements.txt
+```
+
+도컀와 λ‹€λ₯Έ λ„ꡬ듀은 μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό **μ¦κ°€ν•˜λŠ” λ°©μ‹μœΌλ‘œ λΉŒλ“œ**ν•©λ‹ˆλ‹€. `Dockerfile`의 λ§¨ μœ— λΆ€λΆ„λΆ€ν„° μ‹œμž‘ν•΄, λ ˆμ΄μ–΄ μœ„에 μƒˆλ‘œμš΄ λ ˆμ΄μ–΄λ₯Ό λ”ν•˜λŠ” λ°©μ‹μœΌλ‘œ, `Dockerfile`의 κ° μ§€μ‹œ μ‚¬ν•­μœΌλ‘œ λΆ€ν„° μƒμ„±λœ μ–΄λ–€ νŒŒμΌμ΄λ“   λ”ν•΄κ°‘λ‹ˆλ‹€.
+
+도컀 κ·Έλ¦¬κ³  μ΄μ™€ μœ μ‚¬ν•œ λ„ꡬ듀은 μ΄λ―Έμ§€ μƒμ„± μ‹œμ— **λ‚΄λΆ€ μΊμ‹œ**λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ§Œμ•½ μ–΄λ–€ νŒŒμΌμ΄ λ§ˆμ§€λ§‰μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό λΉŒλ“œν•œ λ•Œλ‘œλΆ€ν„° λ°”λ€Œμ§€ μ•Šμ•˜λ‹€λ©΄, νŒŒμΌμ„ λ‹€μ‹œ λ³΅μ‚¬ν•˜μ—¬ μƒˆλ‘œμš΄ λ ˆμ΄μ–΄λ₯Ό μ²˜μŒλΆ€ν„° μƒμ„±ν•˜λŠ” κ²ƒμ΄ μ•„λ‹ˆλΌ, λ§ˆμ§€λ§‰μ— μƒμ„±ν–ˆλ˜ **같은 λ ˆμ΄μ–΄λ₯Ό μž¬μ‚¬μš©**ν•©λ‹ˆλ‹€.
+
+단지 νŒŒμΌ λ³΅μ‚¬λ₯Ό μ§€μ–‘ν•˜λŠ” κ²ƒμœΌλ‘œ νš¨μœ¨μ΄ λ§Žμ΄ ν–₯μƒλ˜λŠ” κ²ƒμ€ μ•„λ‹ˆμ§€λ§Œ, κ·Έ λ‹¨κ³„μ—μ„œ μΊμ‹œλ₯Ό μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ—, **λ‹€μŒ λ‹¨κ³„μ—μ„œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ μΊμ‹œλ₯Ό μ‚¬μš©**ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό κ°™μ€ μ˜μ‘΄μ„±μ„ μ„€μΉ˜ν•˜λŠ” μ§€μ‹œ μ‚¬ν•­μ„ μœ„ν•œ μΊμ‹œλ₯Ό μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+```Dockerfile
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+```
+
+νŒ¨ν‚€μ§€λ₯Ό ν¬ν•¨ν•˜λŠ” νŒŒμΌμ€ **자주 λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€**. λ”°λΌμ„œ ν•΄λ‹Ή νŒŒμΌλ§Œ λ³΅μ‚¬ν•˜λ―€λ‘œμ„œ, λ„μ»€λŠ” κ·Έ λ‹¨κ³„μ˜ **μΊμ‹œλ₯Ό μ‚¬μš©**ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+κ·Έ λ‹€μŒμœΌλ‘œ, λ„μ»€λŠ” **λ‹€μŒ λ‹¨κ³„μ—μ„œ** μ˜μ‘΄μ„±μ„ λ‹€μš΄λ‘œλ“œν•˜κ³  μ„€μΉ˜ν•˜λŠ” **μΊμ‹œλ₯Ό μ‚¬μš©**ν•  μˆ˜ μžˆκ²Œ λ©λ‹ˆλ‹€. λ°”λ‘œ μ΄ κ³Όμ •μ—μ„œ μš°λ¦¬λŠ” **λ§Žμ€ μ‹œκ°„을 μ ˆμ•½**ν•˜κ²Œ λ©λ‹ˆλ‹€. βœ¨ ...그리고 κΈ°λ‹€λ¦¬λŠ” μ§€λ£¨ν•¨λ„ ν”Όν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. πŸ˜ͺπŸ˜†
+
+νŒ¨ν‚€μ§€ μ˜μ‘΄μ„±μ„ λ‹€μš΄λ‘œλ“œ λ°›κ³  μ„€μΉ˜ν•˜λŠ” λ°μ΄λŠ” **수 λΆ„이 κ±Έλ¦΄ μˆ˜ μžˆμ§€λ§Œ**, **μΊμ‹œ**λ₯Ό μ‚¬μš©ν•˜λ©΄ μ΅œλŒ€ **수 μ΄ˆλ§Œμ—** λλ‚Ό μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ˜ν•œ μ—¬λŸ¬λΆ„이 κ°œλ°œ κ³Όμ •μ—μ„œ μ½”λ“œμ˜ λ³€κ²½ μ‚¬ν•­μ΄ λ°˜μ˜λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό κ³„μ†ν•΄μ„œ λΉŒλ“œν•˜λ©΄, μ ˆμ•½λœ μ‹œκ°„은 μΆ•μ λ˜μ–΄ λ”μš± μ»€μ§ˆ κ²ƒμž…λ‹ˆλ‹€.
+
+그리고 λ‚˜μ„œ `Dockerfile`의 κ±°μ˜ λ λΆ€λΆ„μ—μ„œ, λͺ¨λ“  μ½”λ“œλ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€. μ΄κ²ƒμ΄ **κ°€μž₯ λΉˆλ²ˆν•˜κ²Œ λ³€κ²½**λ˜λŠ” λΆ€λΆ„이며, λŒ€λΆ€λΆ„μ˜ κ²½μš°μ— μ΄ λ‹€μŒ λ‹¨κ³„μ—μ„œλŠ” μΊμ‹œλ₯Ό μ‚¬μš©ν•  μˆ˜ μ—†κΈ° λ•Œλ¬Έμ— κ°€μž₯ λ§ˆμ§€λ§‰μ— λ‘‘λ‹ˆλ‹€.
+
+```Dockerfile
+COPY ./app /code/app
+```
+
+### λ„컀 μ΄λ―Έμ§€ μƒμ„±ν•˜κΈ°
+
+이제 λͺ¨λ“  νŒŒμΌμ΄ μ œμžλ¦¬μ— μžˆμœΌλ‹ˆ, μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό λΉŒλ“œν•©λ‹ˆλ‹€.
+
+* (μ—¬λŸ¬λΆ„μ˜ `Dockerfile`κ³Ό `app` λ””렉터리가 μœ„μΉ˜ν•œ) ν”„λ‘œμ νŠΈ λ””λ ‰ν„°λ¦¬λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
+* FastAPI μ΄λ―Έμ§€λ₯Ό λΉŒλ“œν•©λ‹ˆλ‹€:
+
+<div class="termy">
+
+```console
+$ docker build -t myimage .
+
+---> 100%
+```
+
+</div>
+
+!!! νŒ
+    λ§¨ λμ— μžˆλŠ” `.` μ— μ£Όλͺ©ν•©μ‹œλ‹€. μ΄λŠ” `./`와 λ™λ“±ν•˜λ©°, λ„μ»€μ—κ²Œ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό λΉŒλ“œν•˜κΈ° μœ„ν•œ λ””렉터리λ₯Ό μ•Œλ €μ€λ‹ˆλ‹€.
+
+    μ΄ κ²½μš°μ—λŠ” ν˜„μž¬ λ””렉터리(`.`)와 κ°™μŠ΅λ‹ˆλ‹€.
+
+### λ„컀 μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ν•˜κΈ°
+
+* μ—¬λŸ¬λΆ„μ˜ μ΄λ―Έμ§€μ— κΈ°λ°˜ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€:
+
+<div class="termy">
+
+```console
+$ docker run -d --name mycontainer -p 80:80 myimage
+```
+
+</div>
+
+## μ²΄ν¬ν•˜κΈ°
+
+μ—¬λŸ¬λΆ„μ˜ λ„컀 μ»¨ν…Œμ΄λ„ˆ URLμ—μ„œ μ‹€ν–‰ μ‚¬ν•­μ„ μ²΄ν¬ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄: <a href="http://192.168.99.100/items/5?q=somequery" class="external-link" target="_blank">http://192.168.99.100/items/5?q=somequery</a> λ˜λŠ” <a href="http://127.0.0.1/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1/items/5?q=somequery</a> (λ˜λŠ” λ™μΌν•˜κ²Œ, μ—¬λŸ¬λΆ„μ˜ λ„컀 ν˜ΈμŠ€νŠΈλ₯Ό μ΄μš©ν•΄μ„œ μ²΄ν¬ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€).
+
+μ•„λž˜μ™€ λΉ„μŠ·ν•œ κ²ƒμ„ λ³΄κ²Œ λ  κ²ƒμž…λ‹ˆλ‹€:
+
+```JSON
+{"item_id": 5, "q": "somequery"}
+```
+
+## μΈν„°λž™ν‹°λΈŒ API λ¬Έμ„œ
+
+이제 μ—¬λŸ¬λΆ„은 <a href="http://192.168.99.100/docs" class="external-link" target="_blank">http://192.168.99.100/docs</a> λ˜λŠ” <a href="http://127.0.0.1/docs" class="external-link" target="_blank">http://127.0.0.1/docs</a>둜 μ΄λ™ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€(λ˜λŠ”, μ—¬λŸ¬λΆ„μ˜ λ„컀 ν˜ΈμŠ€νŠΈλ₯Ό μ΄μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€).
+
+μ—¬λŸ¬λΆ„μ€ μžλ™μœΌλ‘œ μƒμ„±λœ μΈν„°λž™ν‹°λΈŒ API(<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>μ—μ„œ μ œκ³΅λœ)λ₯Ό λ³Ό μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
+
+## λŒ€μ•ˆ API λ¬Έμ„œ
+
+λ˜ν•œ μ—¬λŸ¬λΆ„은 <a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> λ˜λŠ” <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a>으둜 μ΄λ™ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€(λ˜λŠ”, μ—¬λŸ¬λΆ„μ˜ λ„컀 ν˜ΈμŠ€νŠΈλ₯Ό μ΄μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€).
+
+μ—¬λŸ¬λΆ„μ€ μžλ™μœΌλ‘œ μƒμ„±λœ λŒ€μ•ˆ λ¬Έμ„œ(<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>μ—μ„œ μ œκ³΅λœ)λ₯Ό λ³Ό μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
+
+## λ‹¨μΌ νŒŒμΌ FastAPI둜 λ„컀 μ΄λ―Έμ§€ μƒμ„±ν•˜κΈ°
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„μ˜ FastAPIκ°€ ν•˜λ‚˜μ˜ νŒŒμΌμ΄λΌλ©΄, μ˜ˆλ₯Ό λ“€μ–΄ `./app` λ””렉터리 μ—†μ΄ `main.py` νŒŒμΌλ§ŒμœΌλ‘œ μ΄λ£¨μ–΄μ Έ μžˆλ‹€λ©΄, νŒŒμΌ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό μœ μ‚¬ν•  κ²ƒμž…λ‹ˆλ‹€:
+
+```
+.
+β”œβ”€β”€ Dockerfile
+β”œβ”€β”€ main.py
+└── requirements.txt
+```
+
+그러면 μ—¬λŸ¬λΆ„듀은 `Dockerfile` λ‚΄μ— μžˆλŠ” νŒŒμΌμ„ λ³΅μ‚¬ν•˜κΈ° μœ„ν•΄ κ·Έμ € μƒμ‘ν•˜λŠ” κ²½λ‘œλ₯Ό λ°”κΎΈκΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€:
+
+```{ .dockerfile .annotate hl_lines="10  13" }
+FROM python:3.9
+
+WORKDIR /code
+
+COPY ./requirements.txt /code/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+# (1)
+COPY ./main.py /code/
+
+# (2)
+CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
+```
+
+1. `main.py` νŒŒμΌμ„ `/code` λ””λ ‰ν„°λ¦¬λ‘œ κ³§λ°”λ‘œ λ³΅μ‚¬ν•©λ‹ˆλ‹€(`./app` λ””λ ‰ν„°λ¦¬λŠ” κ³ λ €ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€).
+
+2. Uvicorn을 μ‹€ν–‰ν•΄ `app` κ°μ²΄λ₯Ό (`app.main` λŒ€μ‹ ) `main`으둜 λΆ€ν„° λΆˆλŸ¬μ˜€λ„둝 ν•©λ‹ˆλ‹€.
+
+κ·Έ λ‹€μŒ Uvicorn μ»€λ§¨λ“œλ₯Ό μ‘°μ •ν•΄μ„œ FastAPI κ°μ²΄λ₯Ό λΆˆλŸ¬μ˜€λŠ”λ° `app.main` λŒ€μ‹ μ— μƒˆλ‘œμš΄ λͺ¨λ“ˆ `main`을 μ‚¬μš©ν•˜λ„둝 ν•©λ‹ˆλ‹€.
+
+## λ°°ν¬ κ°œλ…
+
+이제 μ»¨ν…Œμ΄λ„ˆμ˜ μΈ‘λ©΄μ—μ„œ [배포 κ°œλ…](./concepts.md){.internal-link target=_blank}μ—μ„œ λ‹€λ£¨μ—ˆλ˜ κ²ƒκ³Ό κ°™μ€ λ°°ν¬ κ°œλ…μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
+
+μ»¨ν…Œμ΄λ„ˆλŠ” μ£Όλ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉŒλ“œν•˜κ³  λ°°ν¬ν•˜κΈ° μœ„ν•œ κ³Όμ •을 λ‹¨μˆœν™”ν•˜λŠ” λ„κ΅¬μ΄μ§€λ§Œ, **배포 κ°œλ…**에 λŒ€ν•œ νŠΉμ •ν•œ μ ‘근법을 κ°•μš”ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•œ λ°°ν¬ μ „λž΅μ—λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.
+
+**쒋은 μ†Œμ‹**은 μ„œλ‘œ λ‹€λ₯Έ μ „λž΅λ“€μ„ ν¬κ΄„ν•˜λŠ” λ°°ν¬ κ°œλ…μ΄ μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€. πŸŽ‰
+
+μ»¨ν…Œμ΄λ„ˆ μΈ‘λ©΄μ—μ„œ **배포 κ°œλ…**을 λ¦¬λ·°ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€:
+
+* HTTPS
+* κ΅¬λ™ν•˜κΈ°
+* μž¬μ‹œμž‘
+* λ³΅μ œ (μ‹€ν–‰ μ€‘인 ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜)
+* λ©”λͺ¨λ¦¬
+* μ‹œμž‘ν•˜κΈ° μ „ λ‹¨κ³„λ“€
+
+## HTTPS
+
+λ§Œμ•½ μš°λ¦¬κ°€ FastAPI μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ **μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**μ—λ§Œ μ§‘μ€‘ν•œλ‹€λ©΄ (그리고 λ‚˜μ€‘에 μ‹€ν–‰λ  **μ»¨ν…Œμ΄λ„ˆ**에), HTTPSλŠ” μΌλ°˜μ μœΌλ‘œ λ‹€λ₯Έ λ„ꡬ에 μ˜ν•΄ **μ™ΈλΆ€μ μœΌλ‘œ** λ‹€λ£¨μ–΄μ§ˆ κ²ƒ μž…λ‹ˆλ‹€.
+
+**HTTPS**와 **μΈμ¦μ„œ**의 **μžλ™** μ·¨λ“μ„ λ‹€λ£¨λŠ” κ²ƒμ€ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆκ°€ λ  μˆ˜ μžˆλŠ”λ°, μ˜ˆλ₯Ό λ“€μ–΄ <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
+
+!!! νŒ
+    Traefik은 λ„컀, μΏ λ²„λ„€ν‹°μŠ€, κ·Έλ¦¬κ³  λ‹€λ₯Έ λ„ꡬ와 ν†΅ν•©λ˜μ–΄ μžˆμ–΄ μ—¬λŸ¬λΆ„μ˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό ν¬ν•¨ν•˜λŠ” HTTPSλ₯Ό μ…‹μ—…ν•˜κ³  μ„€μ •ν•˜λŠ” κ²ƒμ΄ λ§€μš° μ‰½μŠ΅λ‹ˆλ‹€.
+
+λŒ€μ•ˆμ μœΌλ‘œ, HTTPSλŠ” ν΄λΌμš°λ“œ μ œκ³΅μžμ— μ˜ν•΄ μ„œλΉ„μŠ€μ˜ μΌν™˜μœΌλ‘œ λ‹€λ£¨μ–΄μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ (μ΄λ•Œλ„ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ—¬μ „νžˆ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰λ  κ²ƒμž…λ‹ˆλ‹€).
+
+## κ΅¬λ™κ³Ό μž¬μ‹œμž‘
+
+μ—¬λŸ¬λΆ„μ˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό **μ‹œμž‘ν•˜κ³  μ‹€ν–‰ν•˜λŠ”** λ°μ— μΌλ°˜μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” λ„κ΅¬λŠ” λ”°λ‘œ μžˆμŠ΅λ‹ˆλ‹€.
+
+μ΄λŠ” **도컀** μžμ²΄μΌ μˆ˜λ„ μžˆκ³ , **도컀 μ»΄ν¬μ¦ˆ**, **μΏ λ²„λ„€ν‹°μŠ€**, **ν΄λΌμš°λ“œ μ„œλΉ„μŠ€** λ“±μ΄ λ  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λŒ€λΆ€λΆ„ (λ˜λŠ” μ „체) κ²½μš°μ—, μ»¨ν…Œμ΄λ„ˆλ₯Ό κ΅¬λ™ν•˜κ±°λ‚˜ κ³ μž₯μ‹œμ— μž¬μ‹œμž‘ν•˜λ„λ‘ ν•˜λŠ” κ°„λ‹¨ν•œ μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄, λ„μ»€μ—μ„œλŠ”, μ»€λ§¨λ“œ λΌμΈ μ˜΅μ…˜ `--restart` μž…λ‹ˆλ‹€.
+
+μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ μ„œλŠ”, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬λ™ν•˜κ³  μž¬μ‹œμž‘ν•˜λŠ” κ²ƒμ΄ λ§€μš° λ²ˆκ±°λ‘­κ³  μ–΄λ €μšΈ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ **μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄** λŒ€λΆ€λΆ„μ˜ κ²½μš°μ— μ΄λŸ° κΈ°λŠ₯은 κΈ°λ³Έμ μœΌλ‘œ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. βœ¨
+
+## λ³΅μ œ - ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„이 **μΏ λ²„λ„€ν‹°μŠ€**와 λ¨Έμ‹  <abbr title="A group of machines that are configured to be connected and work together in some way.">ν΄λŸ¬μŠ€ν„°</abbr>, λ„컀 μŠ€μ™ λͺ¨λ“œ, λ…Έλ§ˆλ“œ, λ˜λŠ” λ‹€λ₯Έ μ—¬λŸ¬ λ¨Έμ‹  μœ„에 λΆ„μ‚° μ»¨ν…Œμ΄λ„ˆλ₯Ό κ΄€λ¦¬ν•˜λŠ” λ³΅μž‘ν•œ μ‹œμŠ€ν…œμ„ λ‹€λ£¨κ³  μžˆλ‹€λ©΄, μ—¬λŸ¬λΆ„은 κ° μ»¨ν…Œμ΄λ„ˆμ—μ„œ (μ›Œμ»€μ™€ ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” Gunicorn κ°™μ€) **ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €** λŒ€μ‹  **ν΄λŸ¬μŠ€ν„° λ ˆλ²¨**μ—μ„œ **볡제λ₯Ό λ‹€λ£¨**κ³  μ‹Άμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+μΏ λ²„λ„€ν‹°μŠ€μ™€ κ°™μ€ λΆ„μ‚° μ»¨ν…Œμ΄λ„ˆ κ΄€λ¦¬ μ‹œμŠ€ν…œ μ€‘ μΌλΆ€λŠ” μΌλ°˜μ μœΌλ‘œ λ“€μ–΄μ˜€λŠ” μš”청에 λŒ€ν•œ **λ‘œλ“œ λ°ΈλŸ°μ‹±**을 μ§€μ›ν•˜λ©΄μ„œ **μ»¨ν…Œμ΄λ„ˆ λ³΅μ œ**λ₯Ό λ‹€λ£¨λŠ” ν†΅ν•©λœ λ°©λ²•을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ‘ **ν΄λŸ¬μŠ€ν„° λ ˆλ²¨**μ—μ„œ λ§μ΄μ£ .
+
+이런 κ²½μš°μ—, μ—¬λŸ¬λΆ„은 [μœ„μ—μ„œ λ¬˜μ‚¬λœ κ²ƒ](#dockerfile)처럼 **μ²˜μŒλΆ€ν„° λ„컀 μ΄λ―Έμ§€λ₯Ό** λΉŒλ“œν•΄μ„œ, μ˜μ‘΄μ„±μ„ μ„€μΉ˜ν•˜κ³ , Uvicorn μ›Œμ»€λ₯Ό κ΄€λ¦¬ν•˜λŠ” Gunicorn λŒ€μ‹  **단일 Uvicorn ν”„λ‘œμ„ΈμŠ€**λ₯Ό μ‹€ν–‰ν•˜κ³  μ‹Άμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+### λ‘œλ“œ λ°ΈλŸ°μ„œ
+
+μ»¨ν…Œμ΄λ„ˆλ‘œ μž‘μ—…ν•  λ•Œ, μ—¬λŸ¬λΆ„은 μΌλ°˜μ μœΌλ‘œ **메인 ν¬νŠΈμ˜ μƒν™©μ„ κ°μ§€ν•˜λŠ”** μš”μ†Œλ₯Ό κ°€μ§€κ³  μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” **HTTPS**λ₯Ό λ‹€λ£¨λŠ” **TLS μ’…λ£Œ ν”„λ‘μ‹œ**와 κ°™μ€ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμΌ μˆ˜λ„ μžˆκ³ , μœ μ‚¬ν•œ λ‹€λ₯Έ λ„ꡬ일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+이 μš”μ†Œκ°€ μš”μ²­λ“€μ˜ **λ‘œλ“œ**λ₯Ό μ½μ–΄λ“€μ΄κ³  κ° μ›Œμ»€μ—κ²Œ (λ°”λΌκ±΄λŒ€) **κ· ν˜•μ μœΌλ‘œ** λΆ„λ°°ν•œλ‹€λ©΄, μ΄ μš”μ†ŒλŠ” μΌλ°˜μ μœΌλ‘œ **λ‘œλ“œ λ°ΈλŸ°μ„œ**라고 λΆˆλ¦½λ‹ˆλ‹€.
+
+!!! νŒ
+    HTTPSλ₯Ό μœ„ν•΄ μ‚¬μš©λœ **TLS μ’…λ£Œ ν”„λ‘μ‹œ** μš”μ†Œ λ˜ν•œ **λ‘œλ“œ λ°ΈλŸ°μ„œ**κ°€ λ  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ˜ν•œ μ»¨ν…Œμ΄λ„ˆλ‘œ μž‘μ—…ν•  λ•Œ, μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œ κ²ƒκ³Ό λ™μΌν•œ μ‹œμŠ€ν…œμ€ μ΄λ―Έ ν•΄λ‹Ή **λ‘œλ“œ λ°ΈλŸ°μ„œ**둜 λΆ€ν„° μ—¬λŸ¬λΆ„μ˜ μ•±μ— ν•΄λ‹Ήν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ‘œ **λ„€νŠΈμ›Œν¬ ν†΅μ‹ **(예λ₯Ό λ“€μ–΄, HTTP μš”μ²­)을 μ „μ†‘ν•˜λŠ” λ‚΄λΆ€μ μΈ λ„ꡬλ₯Ό κ°€μ§€κ³  μžˆμ„ κ²ƒμž…λ‹ˆλ‹€ (μ—¬κΈ°μ„œλ„ λ‘œλ“œ λ°ΈλŸ°μ„œλŠ” **TLS μ’…λ£Œ ν”„λ‘μ‹œ**일 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€).
+
+### ν•˜λ‚˜μ˜ λ‘œλ“œ λ°ΈλŸ°μ„œ - λ‹€μ€‘ μ›Œμ»€ μ»¨ν…Œμ΄λ„ˆ
+
+**μΏ λ²„λ„€ν‹°μŠ€**λ‚˜ λ˜λŠ” λ‹€λ₯Έ λΆ„μ‚° μ»¨ν…Œμ΄λ„ˆ κ΄€λ¦¬ μ‹œμŠ€ν…œμœΌλ‘œ μž‘μ—…ν•  λ•Œ, μ‹œμŠ€ν…œ λ‚΄λΆ€μ˜ λ„€νŠΈμ›Œν‚Ή λ©”μ»€λ‹ˆμ¦˜μ„ μ΄μš©ν•¨μœΌλ‘œμ¨ λ©”인 **포트**λ₯Ό κ°μ§€ν•˜κ³  μžˆλŠ” λ‹¨μΌ **λ‘œλ“œ λ°ΈλŸ°μ„œ**λŠ” μ—¬λŸ¬λΆ„μ˜ μ•±μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” **μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆ**에 ν†΅μ‹ (μš”μ²­λ“€)을 μ „솑할 μˆ˜ μžˆκ²Œ λ©λ‹ˆλ‹€.
+
+μ—¬λŸ¬λΆ„μ˜ μ•±μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” κ°κ°μ˜ μ»¨ν…Œμ΄λ„ˆλŠ” μΌλ°˜μ μœΌλ‘œ **ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€**만 κ°€μ§ˆ κ²ƒμž…λ‹ˆλ‹€ (예λ₯Ό λ“€μ–΄, FastAPI μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‹€ν–‰λ˜λŠ” ν•˜λ‚˜μ˜ Uvicorn ν”„λ‘œμ„ΈμŠ€μ²˜λŸΌ). μ΄ μ»¨ν…Œμ΄λ„ˆλ“€μ€ λͺ¨λ‘ κ°™μ€ κ²ƒμ„ μ‹€ν–‰ν•˜λŠ” μ μ—μ„œ **λ™μΌν•œ μ»¨ν…Œμ΄λ„ˆ**μ΄μ§€λ§Œ, ν”„λ‘œμ„ΈμŠ€, λ©”λͺ¨λ¦¬ λ“±μ€ κ³΅μœ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄ λ°©μ‹μœΌλ‘œ μ—¬λŸ¬λΆ„은 CPU의 **μ„œλ‘œ λ‹€λ₯Έ μ½”μ–΄λ“€** λ˜λŠ” **μ„œλ‘œ λ‹€λ₯Έ λ¨Έμ‹ λ“€**을 **병렬화**ν•˜λŠ” μ΄μ μ„ μ–»μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ˜ν•œ **λ‘œλ“œ λ°ΈλŸ°μ„œ**κ°€ μžˆλŠ” λΆ„μ‚° μ»¨ν…Œμ΄λ„ˆ μ‹œμŠ€ν…œμ€ μ—¬λŸ¬λΆ„μ˜ μ•±μ— μžˆλŠ” μ»¨ν…Œμ΄λ„ˆ κ°κ°μ— **μ°¨λ‘€λŒ€λ‘œ μš”청을 λΆ„μ‚°**μ‹œν‚¬ κ²ƒ μž…λ‹ˆλ‹€. λ”°λΌμ„œ κ° μš”청은 μ—¬λŸ¬λΆ„μ˜ μ•±μ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬κ°œμ˜ **볡제된 μ»¨ν…Œμ΄λ„ˆλ“€** μ€‘ ν•˜λ‚˜μ— μ˜ν•΄ λ‹€λ£¨μ–΄μ§ˆ κ²ƒ μž…λ‹ˆλ‹€.
+
+그리고 μΌλ°˜μ μœΌλ‘œ **λ‘œλ“œ λ°ΈλŸ°μ„œ**λŠ” μ—¬λŸ¬λΆ„μ˜ ν΄λŸ¬μŠ€ν„°μ— μžˆλŠ” *λ‹€λ₯Έ* μ•±μœΌλ‘œ κ°€λŠ” μš”청듀도 λ‹€λ£° μˆ˜ μžˆμœΌλ©° (예λ₯Ό λ“€μ–΄, λ‹€λ₯Έ λ„λ©”μΈμœΌλ‘œ κ°€κ±°λ‚˜ λ‹€λ₯Έ URL κ²½λ‘œ μ ‘두사λ₯Ό κ°€μ§€λŠ” κ²½μš°), μ΄ ν†΅μ‹ λ“€μ„ ν΄λŸ¬μŠ€ν„°μ— μžˆλŠ” *λ°”λ‘œ κ·Έ λ‹€λ₯Έ* μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μ œλŒ€λ‘œ μ „솑할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+### λ‹¨μΌ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ§€λŠ” μ»¨ν…Œμ΄λ„ˆ
+
+이 μ‹œλ‚˜λ¦¬μ˜€μ˜ κ²½μš°, μ—¬λŸ¬λΆ„은 μ΄λ―Έ ν΄λŸ¬μŠ€ν„° λ ˆλ²¨μ—μ„œ λ³΅μ œλ₯Ό λ‹€λ£¨κ³  μžˆμ„ κ²ƒμ΄λ―€λ‘œ **μ»¨ν…Œμ΄λ„ˆ λ‹Ή λ‹¨μΌ (Uvicorn) ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€κ³ μž ν•  κ²ƒμž…λ‹ˆλ‹€.
+
+λ”°λΌμ„œ, μ—¬λŸ¬λΆ„은 Gunicorn μ΄λ‚˜ Uvicorn μ›Œμ»€, λ˜λŠ” Uvicorn μ›Œμ»€λ₯Ό μ‚¬μš©ν•˜λŠ” Uvicorn λ§€λ‹ˆμ €μ™€ κ°™μ€ ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €λ₯Ό κ°€μ§€κ³  μ‹Άμ–΄ν•˜μ§€ **μ•Šμ„** κ²ƒμž…λ‹ˆλ‹€. μ—¬λŸ¬λΆ„은 μ»¨ν…Œμ΄λ„ˆ λ‹Ή **단일 Uvicorn ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€κ³  μ‹Άμ–΄ν•  κ²ƒμž…λ‹ˆλ‹€ (κ·ΈλŸ¬λ‚˜ μ•„λ§ˆλ„ λ‹€μ€‘ μ»¨ν…Œμ΄λ„ˆλ₯Ό κ°€μ§ˆ κ²ƒμž…λ‹ˆλ‹€).
+
+이미 μ—¬λŸ¬λΆ„이 ν΄λŸ¬μŠ€ν„° μ‹œμŠ€ν…œμ„ κ΄€λ¦¬ν•˜κ³  μžˆμœΌλ―€λ‘œ, (Uvicorn μ›Œμ»€λ₯Ό κ΄€λ¦¬ν•˜λŠ” Gunicorn μ΄λ‚˜ Uvicorn μ²˜λŸΌ) μ»¨ν…Œμ΄λ„ˆ λ‚΄μ— λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €λ₯Ό κ°€μ§€λŠ” κ²ƒμ€ **λΆˆν•„μš”ν•œ λ³΅μž‘μ„±**만 λ”ν•˜κ²Œ λ  κ²ƒμž…λ‹ˆλ‹€.
+
+### λ‹€μ€‘ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ§€λŠ” μ»¨ν…Œμ΄λ„ˆμ™€ νŠΉμˆ˜ν•œ κ²½μš°λ“€
+
+λ‹Ήμ—°ν•œ λ§μ΄μ§€λ§Œ, μ—¬λŸ¬λΆ„이 λ‚΄λΆ€μ μœΌλ‘œ **Uvicorn μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λ“€**λ₯Ό μ‹œμž‘ν•˜λŠ” **Gunicorn ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €**λ₯Ό κ°€μ§€λŠ” λ‹¨μΌ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ›ν•˜λŠ” **νŠΉμˆ˜ν•œ κ²½μš°**도 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+그런 κ²½μš°μ—, μ—¬λŸ¬λΆ„듀은 **Gunicorn**을 ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €λ‘œ ν¬ν•¨ν•˜λŠ” **곡식 λ„컀 μ΄λ―Έμ§€**λ₯Ό μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄ ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €λŠ” λ‹€μ€‘ **Uvicorn μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λ“€**을 μ‹€ν–‰ν•˜λ©°, λ””ν΄νŠΈ μ„ΈνŒ…μœΌλ‘œ ν˜„μž¬ CPU μ½”어에 κΈ°λ°˜ν•˜μ—¬ μžλ™μœΌλ‘œ μ›Œμ»€ κ°œμˆ˜λ₯Ό μ‘°μ •ν•©λ‹ˆλ‹€. μ΄ μ‚¬ν•­μ— λŒ€ν•΄μ„œλŠ” μ•„λž˜μ˜ [Gunicornκ³Ό ν•¨κ»˜ν•˜λŠ” κ³΅μ‹ λ„컀 μ΄λ―Έμ§€ - Uvicorn](#official-docker-image-with-gunicorn-uvicorn)μ—μ„œ λ” λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.
+
+이런 κ²½μš°μ— ν•΄λ‹Ήν•˜λŠ” λͺ‡κ°€μ§€ μ˜ˆμ‹œκ°€ μžˆμŠ΅λ‹ˆλ‹€:
+
+#### λ‹¨μˆœν•œ μ•±
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ **μΆ©λΆ„νžˆ λ‹¨μˆœ**ν•΄μ„œ (적어도 μ•„직은) ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜λ₯Ό νŒŒμΈ-튠 ν•  ν•„μš”κ°€ μ—†κ±°λ‚˜ ν΄λŸ¬μŠ€ν„°κ°€ μ•„λ‹Œ **단일 μ„œλ²„**μ—μ„œ μ‹€ν–‰ν•˜κ³  μžˆλ‹€λ©΄, μ—¬λŸ¬λΆ„은 μ»¨ν…Œμ΄λ„ˆ λ‚΄μ— ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ (곡식 λ„컀 μ΄λ―Έμ§€μ—μ„œ) μžλ™μœΌλ‘œ μ„€μ •λ˜λŠ” λ””ν΄νŠΈ κ°’을 μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+#### λ„컀 κ΅¬μ„±
+
+μ—¬λŸ¬λΆ„μ€ **도컀 μ»΄ν¬μ¦ˆ**둜 (ν΄λŸ¬μŠ€ν„°κ°€ μ•„λ‹Œ) **단일 μ„œλ²„λ‘œ** λ°°ν¬ν•  μˆ˜ μžˆμœΌλ©°, μ΄ κ²½μš°μ— κ³΅μœ λœ λ„€νŠΈμ›Œν¬μ™€ **λ‘œλ“œ λ°ΈλŸ°μ‹±**을 ν¬ν•¨ν•˜λŠ” (도컀 μ»΄ν¬μ¦ˆλ‘œ) μ»¨ν…Œμ΄λ„ˆμ˜ λ³΅μ œλ₯Ό κ΄€λ¦¬ν•˜λŠ” λ‹¨μˆœν•œ λ°©λ²•이 μ—†μ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
+
+κ·Έλ ‡λ‹€λ©΄ μ—¬λŸ¬λΆ„은 **ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €**와 ν•¨κ»˜ λ‚΄λΆ€μ— **λͺ‡κ°œμ˜ μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λ“€**을 μ‹œμž‘ν•˜λŠ” **단일 μ»¨ν…Œμ΄λ„ˆ**λ₯Ό ν•„μš”λ‘œ ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+#### Prometheus와 λ‹€λ₯Έ μ΄μœ λ“€
+
+μ—¬λŸ¬λΆ„μ€ **단일 ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€λŠ” **닀쀑 μ»¨ν…Œμ΄λ„ˆ** λŒ€μ‹  **닀쀑 ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€λŠ” **단일 μ»¨ν…Œμ΄λ„ˆ**λ₯Ό μ±„νƒν•˜λŠ” **λ‹€λ₯Έ μ΄μœ **κ°€ μžˆμ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+예λ₯Ό λ“€μ–΄ (μ—¬λŸ¬λΆ„μ˜ μž₯치 μ„€μ •에 λ”°λΌ) Prometheus μ΅μŠ€ν¬ν„°μ™€ κ°™μ΄ κ°™μ€ μ»¨ν…Œμ΄λ„ˆμ— λ“€μ–΄μ˜€λŠ” **각 μš”청에 λŒ€ν•΄** μ ‘κ·ΌκΆŒν•œμ„ κ°€μ§€λŠ” λ„ꡬλ₯Ό μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이 κ²½μš°μ— μ—¬λŸ¬λΆ„이 **μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆλ“€**을 κ°€μ§€κ³  μžˆλ‹€λ©΄, Prometheusκ°€ **λ©”νŠΈλ¦­μ„ μ½μ–΄ λ“€μΌ λ•Œ**, λ””ν΄νŠΈλ‘œ **맀번 ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆ**(νŠΉμ • λ¦¬ν€˜μŠ€νŠΈλ₯Ό κ΄€λ¦¬ν•˜λŠ” λ°”λ‘œ κ·Έ μ»¨ν…Œμ΄λ„ˆ)둜 λΆ€ν„° μ½μ–΄λ“€μΌ κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  λ³΅μ œλœ μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•΄ **μΆ•μ λœ λ©”νŠΈλ¦­λ“€**을 μ½μ–΄λ“€μ΄λŠ” κ²ƒκ³Ό λŒ€λΉ„λ©λ‹ˆλ‹€.
+
+κ·Έλ ‡λ‹€λ©΄ μ΄ κ²½μš°μ—λŠ” **닀쀑 ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€λŠ” **ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆ**λ₯Ό λ‘μ–΄μ„œ κ°™μ€ μ»¨ν…Œμ΄λ„ˆμ—μ„œ λͺ¨λ“  λ‚΄λΆ€ ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ Prometheus λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” λ‘œμ»¬ λ„ꡬ(예λ₯Ό λ“€μ–΄ Prometheus μ΅μŠ€ν¬ν„° κ°™μ€)λ₯Ό λ‘μ–΄μ„œ μ΄ λ©”그릭듀을 ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆμ— λ‚΄μ—μ„œ κ³΅μœ ν•˜λŠ” λ°©λ²•이 λ” λ‹¨μˆœν•  κ²ƒμž…λ‹ˆλ‹€.
+
+---
+
+μš”μ μ€, μ΄ μ€‘μ˜ **μ–΄λŠκ²ƒλ„** μ—¬λŸ¬λΆ„듀이 λ°˜λ“œμ‹œ λ”°λΌμ•Όν•˜λŠ” **ν™•μ •λœ μ‚¬μ‹€**이 μ•„λ‹ˆλΌλŠ” κ²ƒμž…λ‹ˆλ‹€. μ—¬λŸ¬λΆ„은 μ΄ μ•„이디어듀을 **μ—¬λŸ¬λΆ„μ˜ κ³ μœ ν•œ μ΄μš© μ‚¬λ‘€λ₯Ό ν‰κ°€**ν•˜λŠ”λ° μ‚¬μš©ν•˜κ³ , μ—¬λŸ¬λΆ„μ˜ μ‹œμŠ€ν…œμ— κ°€μž₯ μ ν•©ν•œ μ ‘근법이 μ–΄λ–€ κ²ƒμΈμ§€ κ²°μ •ν•˜λ©°, λ‹€μŒμ˜ κ°œλ…λ“€μ„ κ΄€λ¦¬ν•˜λŠ” λ°©λ²•을 ν™•인할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+* λ³΄μ•ˆ - HTTPS
+* κ΅¬λ™ν•˜κΈ°
+* μž¬μ‹œμž‘
+* λ³΅μ œ (μ‹€ν–‰ μ€‘인 ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜)
+* λ©”λͺ¨λ¦¬
+* μ‹œμž‘ν•˜κΈ° μ „ λ‹¨κ³„λ“€
+
+## λ©”λͺ¨λ¦¬
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„이 **μ»¨ν…Œμ΄λ„ˆ λ‹Ή λ‹¨μΌ ν”„λ‘œμ„ΈμŠ€**λ₯Ό μ‹€ν–‰ν•œλ‹€λ©΄, μ—¬λŸ¬λΆ„은 κ° μ»¨ν…Œμ΄λ„ˆ(볡제된 κ²½μš°μ—λŠ” μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆλ“€)에 λŒ€ν•΄ μž˜ μ •μ˜λ˜κ³ , μ•ˆμ •적이며, μ œν•œλœ μš©λŸ‰μ˜ λ©”λͺ¨λ¦¬ μ†ŒλΉ„λŸ‰μ„ κ°€μ§€κ³  μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+그러면 μ—¬λŸ¬λΆ„μ˜ μ»¨ν…Œμ΄λ„ˆ κ΄€λ¦¬ μ‹œμŠ€ν…œ(예λ₯Ό λ“€μ–΄ **μΏ λ²„λ„€ν‹°μŠ€**) μ„€μ •μ—μ„œ μ•žμ„œ μ •μ˜λœ κ²ƒκ³Ό κ°™μ€ λ©”λͺ¨λ¦¬ μ œν•œκ³Ό μš”ꡬ사항을 μ„€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ° λ°©λ²•μœΌλ‘œ **κ°€μš© λ¨Έμ‹ **이 ν•„μš”λ‘œν•˜λŠ” λ©”λͺ¨λ¦¬μ™€ ν΄λŸ¬μŠ€ν„°μ— μžˆλŠ” κ°€μš© λ¨Έμ‹ λ“€μ„ μ—Όλ‘μ— λ‘κ³  **μ»¨ν…Œμ΄λ„ˆλ₯Ό λ³΅μ œ**ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ **λ‹¨μˆœ**ν•˜λ‹€λ©΄, μ΄κ²ƒμ€ **λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ„** κ²ƒμ΄κ³ , κ³ μ •λœ λ©”λͺ¨λ¦¬ μ œν•œμ„ κ΅¬μ²΄ν™”ν•  ν•„μš”λ„ μ—†μ„ κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬λŸ¬λΆ„μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ (예λ₯Ό λ“€μ–΄ **λ¨Έμ‹  λŸ¬λ‹** λͺ¨λΈκ°™μ΄) **λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ†Œμš”ν•œλ‹€λ©΄**, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ–Όλ§ˆλ‚˜ λ§Žμ€ μ–‘μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ ν™•μΈν•˜κ³  **각 λ¨Έμ‹ μ—μ„œ** μ‚¬μš©ν•˜λŠ” **μ»¨ν…Œμ΄λ„ˆμ˜ μˆ˜**λ₯Ό μ‘°μ •ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€ (그리고 ν•„μš”μ— λ”°λΌ μ—¬λŸ¬λΆ„μ˜ ν΄λŸ¬μŠ€ν„°μ— λ¨Έμ‹ μ„ μΆ”κ°€ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€).
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„이 **μ»¨ν…Œμ΄λ„ˆ λ‹Ή μ—¬λŸ¬κ°œμ˜ ν”„λ‘œμ„ΈμŠ€**λ₯Ό μ‹€ν–‰ν•œλ‹€λ©΄ (예λ₯Ό λ“€μ–΄ κ³΅μ‹ λ„컀 μ΄λ―Έμ§€ μ²˜λŸΌ), μ—¬λŸ¬λΆ„은 μ‹œμž‘λœ ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜κ°€ κ°€μš©ν•œ κ²ƒ λ³΄λ‹€ **더 λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ†ŒλΉ„**ν•˜μ§€ μ•ŠλŠ”μ§€ ν™•인해야 ν•©λ‹ˆλ‹€.
+
+## μ‹œμž‘ν•˜κΈ° μ „ λ‹¨κ³„λ“€κ³Ό μ»¨ν…Œμ΄λ„ˆ
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„이 μ»¨ν…Œμ΄λ„ˆ(예λ₯Ό λ“€μ–΄ λ„컀, μΏ λ²„λ„€ν‹°μŠ€)λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, μ—¬λŸ¬λΆ„이 μ ‘κ·Όν•  μˆ˜ μžˆλŠ” μ£Όμš” λ°©λ²•은 ν¬κ²Œ λ‘κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.
+
+### λ‹€μ€‘ μ»¨ν…Œμ΄λ„ˆ
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„이 **μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆ**λ₯Ό κ°€μ§€κ³  μžˆλ‹€λ©΄, μ•„λ§ˆλ„ κ°κ°μ˜ μ»¨ν…Œμ΄λ„ˆλŠ” **ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€**λ₯Ό κ°€μ§€κ³  μžˆμ„ κ²ƒμž…λ‹ˆλ‹€(예λ₯Ό λ“€μ–΄, **μΏ λ²„λ„€ν‹°μŠ€** ν΄λŸ¬μŠ€ν„°μ—μ„œ). κ·ΈλŸ¬λ©΄ μ—¬λŸ¬λΆ„은 λ³΅μ œλœ μ›Œμ»€ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜κΈ° **이전에**, ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆμ— μžˆλŠ” **μ΄μ „μ˜ λ‹¨κ³„듀을** μˆ˜ν–‰ν•˜λŠ” λ‹¨μΌ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ§€λŠ” **λ³„λ„μ˜ μ»¨ν…Œμ΄λ„ˆλ“€**을 κ°€μ§€κ³  μ‹Άμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+!!! μ •보
+    λ§Œμ•½ μ—¬λŸ¬λΆ„이 μΏ λ²„λ„€ν‹°μŠ€λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄, μ•„λ§ˆλ„ μ΄λŠ” <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init Container</a>일 κ²ƒμž…λ‹ˆλ‹€.
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„μ˜ μ΄μš© μ‚¬λ‘€μ—μ„œ μ΄μ „ λ‹¨κ³„듀을 **λ³‘λ ¬μ μœΌλ‘œ μ—¬λŸ¬λ²ˆ** μˆ˜ν–‰ν•˜λŠ”λ°μ— λ¬Έμ œκ°€ μ—†λ‹€λ©΄ (예λ₯Ό λ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€ μ΄μ „을 μ‹€ν–‰ν•˜μ§€ μ•Šκ³  λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ€€λΉ„λ˜μ—ˆλŠ”μ§€ ν™•μΈλ§Œ ν•˜λŠ” κ²½μš°), λ©”인 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œμž‘ν•˜κΈ° μ „에 μ΄ λ‹¨κ³„듀을 κ° μ»¨ν…Œμ΄λ„ˆμ— λ„£μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+### λ‹¨μΌ μ»¨ν…Œμ΄λ„ˆ
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„μ˜ μ…‹μ—…이 **닀쀑 ν”„λ‘œμ„ΈμŠ€**(λ˜λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€)λ₯Ό μ‹œμž‘ν•˜λŠ” **ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆ**λ₯Ό κ°€μ§€λŠ” λ‹¨μˆœν•œ μ…‹μ—…이라면, μ‚¬μ „ λ‹¨κ³„듀을 μ•±μ„ ν¬ν•¨ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œμž‘ν•˜κΈ° μ§μ „에 κ°™μ€ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. κ³΅μ‹ λ„컀 μ΄λ―Έμ§€λŠ” μ΄λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ μ§€μ›ν•©λ‹ˆλ‹€.
+
+## Gunicornκ³Ό ν•¨κ»˜ν•˜λŠ” κ³΅μ‹ λ„컀 μ΄λ―Έμ§€ - Uvicorn
+
+μ•ž μ±•ν„°μ—μ„œ μžμ„Έν•˜κ²Œ μ„€λͺ…λœ κ²ƒ μ²˜λŸΌ, Uvicorn μ›Œμ»€μ™€ κ°™μ΄ μ‹€ν–‰λ˜λŠ” Gunicorn을 ν¬ν•¨ν•˜λŠ” κ³΅μ‹ λ„컀 μ΄λ―Έμ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€: [μ„œλ²„ μ›Œμ»€ - Uvicornκ³Ό ν•¨κ»˜ν•˜λŠ” Gunicorn](./server-workers.md){.internal-link target=_blank}.
+
+이 μ΄λ―Έμ§€λŠ” μ£Όλ‘œ μœ„μ—μ„œ μ„€λͺ…λœ μƒν™©μ—μ„œ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€: [닀쀑 ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ§€λŠ” μ»¨ν…Œμ΄λ„ˆμ™€ νŠΉμˆ˜ν•œ κ²½μš°λ“€](#containers-with-multiple-processes-and-special-cases).
+
+* <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
+
+!!! κ²½κ³ 
+    μ—¬λŸ¬λΆ„이 μ΄ λ² μ΄μŠ€ μ΄λ―Έμ§€ λ˜λŠ” λ‹€λ₯Έ μœ μ‚¬ν•œ μ΄λ―Έμ§€λ₯Ό ν•„μš”λ‘œ ν•˜μ§€ **μ•Šμ„** λ†’은 κ°€λŠ₯성이 μžˆμœΌλ©°, [μœ„μ—μ„œ μ„€λͺ…λœ κ²ƒμ²˜λŸΌ: FastAPIλ₯Ό μœ„ν•œ λ„컀 μ΄λ―Έμ§€ λΉŒλ“œν•˜κΈ°](#build-a-docker-image-for-fastapi) μ²˜μŒλΆ€ν„° μ΄λ―Έμ§€λ₯Ό λΉŒλ“œν•˜λŠ” κ²ƒμ΄ λ” λ‚˜μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+이 μ΄λ―Έμ§€λŠ” κ°€λŠ₯ν•œ CPU μ½”어에 κΈ°λ°˜ν•œ **λͺ‡κ°œμ˜ μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€**λ₯Ό μ„€μ •ν•˜λŠ” **μžλ™-νŠœλ‹** λ©”μ»€λ‹ˆμ¦˜μ„ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
+
+이 μ΄λ―Έμ§€λŠ” **λ―Όκ°ν•œ λ””ν΄νŠΈ** κ°’을 κ°€μ§€κ³  μžˆμ§€λ§Œ, μ—¬λŸ¬λΆ„듀은 μ—¬μ „νžˆ **ν™˜κ²½ λ³€μˆ˜** λ˜λŠ” μ„€μ • νŒŒμΌμ„ ν†΅ν•΄ μ„€μ •값을 μˆ˜μ •ν•˜κ³  μ—…λ°μ΄νŠΈ ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ˜ν•œ μŠ€ν¬λ¦½νŠΈλ₯Ό ν†΅ν•΄ <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker#pre_start_path" class="external-link" target="_blank">**μ‹œμž‘ν•˜κΈ° μ „ μ‚¬μ „ λ‹¨κ³„**</a>λ₯Ό μ‹€ν–‰ν•˜λŠ” κ²ƒμ„ μ§€μ›ν•©λ‹ˆλ‹€.
+
+!!! νŒ
+    λͺ¨λ“  μ„€μ •κ³Ό μ˜΅μ…˜μ„ λ³΄λ €λ©΄, λ„컀 μ΄λ―Έμ§€ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
+
+### κ³΅μ‹ λ„컀 μ΄λ―Έμ§€μ— μžˆλŠ” ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜
+
+이 μ΄λ―Έμ§€μ— μžˆλŠ” **ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜**λŠ” κ°€μš©ν•œ CPU **μ½”μ–΄λ“€**둜 λΆ€ν„° **μžλ™μœΌλ‘œ κ³„μ‚°**λ©λ‹ˆλ‹€.
+
+이것이 μ˜λ―Έν•˜λŠ” λ°”λŠ” μ΄λ―Έμ§€κ°€ CPUλ‘œλΆ€ν„° **μ΅œλŒ€ν•œμ˜ μ„±λŠ₯**을 **μ₯μ–΄μ§œλ‚Έλ‹€**λŠ” κ²ƒμž…λ‹ˆλ‹€.
+
+μ—¬λŸ¬λΆ„μ€ μ΄ μ„€μ • κ°’을 **ν™˜κ²½ λ³€μˆ˜**λ‚˜ κΈ°νƒ€ λ°©λ²•λ“€λ‘œ μ‘°μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+κ·ΈλŸ¬λ‚˜ ν”„λ‘œμ„ΈμŠ€μ˜ κ°œμˆ˜κ°€ μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λ˜κ³  μžˆλŠ” CPU에 μ˜μ‘΄ν•œλ‹€λŠ” κ²ƒμ€ λ˜ν•œ **μ†Œμš”λ˜λŠ” λ©”λͺ¨λ¦¬μ˜ ν¬κΈ°** λ˜ν•œ μ΄μ— μ˜μ‘΄ν•œλ‹€λŠ” κ²ƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
+
+κ·Έλ ‡κΈ° λ•Œλ¬Έμ—, λ§Œμ•½ μ—¬λŸ¬λΆ„μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μš”κ΅¬ν•˜κ³  (예λ₯Ό λ“€μ–΄ λ¨Έμ‹ λŸ¬λ‹ λͺ¨λΈμ²˜λŸΌ), μ—¬λŸ¬λΆ„μ˜ μ„œλ²„κ°€ CPU μ½”μ–΄ μˆ˜λŠ” λ§Žμ§€λ§Œ **적은 λ©”λͺ¨λ¦¬**λ₯Ό κ°€μ§€κ³  μžˆλ‹€λ©΄, μ—¬λŸ¬λΆ„μ˜ μ»¨ν…Œμ΄λ„ˆλŠ” κ°€μš©ν•œ λ©”λͺ¨λ¦¬λ³΄λ‹€ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λ €κ³  μ‹œλ„ν•  μˆ˜ μžˆμœΌλ©°, κ²°κ΅­ νΌν¬λ¨ΌμŠ€λ₯Ό ν¬κ²Œ λ–¨μ–΄λœ¨λ¦΄ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€(심지어 κ³ μž₯이 λ‚  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€). πŸš¨
+
+### `Dockerfile` μƒμ„±ν•˜κΈ°
+
+이 μ΄λ―Έμ§€μ— κΈ°λ°˜ν•΄ `Dockerfile`을 μƒμ„±ν•˜λŠ” λ°©λ²•은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:
+
+```Dockerfile
+FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
+
+COPY ./requirements.txt /app/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
+
+COPY ./app /app
+```
+
+### λ” ν° μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„이 [닀쀑 νŒŒμΌμ„ κ°€μ§€λŠ” λ” ν° μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜](../tutorial/bigger-applications.md){.internal-link target=_blank}을 μƒμ„±ν•˜λŠ” μ„Ήμ…˜μ„ λ”°λžλ‹€λ©΄, μ—¬λŸ¬λΆ„μ˜ `Dockerfile`은 λŒ€μ‹  μ΄λ ‡κ²Œ μƒκ²Όμ„ κ²ƒμž…λ‹ˆλ‹€:
+
+```Dockerfile hl_lines="7"
+FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
+
+COPY ./requirements.txt /app/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
+
+COPY ./app /app/app
+```
+
+### μ–Έμ œ μ‚¬μš©ν• κΉŒ
+
+μ—¬λŸ¬λΆ„λ“€μ΄ **μΏ λ²„λ„€ν‹°μŠ€**(λ˜λŠ” μœ μ‚¬ν•œ λ‹€λ₯Έ λ„ꡬ) μ‚¬μš©ν•˜κ±°λ‚˜ ν΄λŸ¬μŠ€ν„° λ ˆλ²¨μ—μ„œ λ‹€μ€‘ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ΄μš©ν•΄ μ΄λ―Έ **사본**을 μ„€μ •ν•˜κ³  μžˆλ‹€λ©΄, κ³΅μ‹ λ² μ΄μŠ€ μ΄λ―Έμ§€(λ˜λŠ” μœ μ‚¬ν•œ λ‹€λ₯Έ μ΄λ―Έμ§€)λ₯Ό μ‚¬μš©ν•˜μ§€ **μ•ŠλŠ”** κ²ƒ μ’‹μŠ΅λ‹ˆλ‹€. κ·ΈλŸ° κ²½μš°μ— μ—¬λŸ¬λΆ„은 λ‹€μŒμ— μ„€λͺ…λœ κ²ƒ μ²˜λŸΌ **μ²˜μŒλΆ€ν„° μ΄λ―Έμ§€λ₯Ό λΉŒλ“œν•˜λŠ” κ²ƒ**이 λ” λ‚«μŠ΅λ‹ˆλ‹€: [FastAPIλ₯Ό μœ„ν•œ λ„컀 μ΄λ―Έμ§€ λΉŒλ“œν•˜κΈ°](#build-a-docker-image-for-fastapi).
+
+이 μ΄λ―Έμ§€λŠ” μœ„μ˜ [닀쀑 ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ§€λŠ” μ»¨ν…Œμ΄λ„ˆμ™€ νŠΉμˆ˜ν•œ κ²½μš°λ“€](#containers-with-multiple-processes-and-special-cases)μ—μ„œ μ„€λͺ…λœ νŠΉμˆ˜ν•œ κ²½μš°μ— λŒ€ν•΄μ„œλ§Œ μ£Όλ‘œ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄, λ§Œμ•½ μ—¬λŸ¬λΆ„μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ **μΆ©λΆ„νžˆ λ‹¨μˆœ**ν•΄μ„œ CPU에 κΈ°λ°˜ν•œ λ””ν΄νŠΈ ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜λ₯Ό μ„€μ •ν•˜λŠ” κ²ƒμ΄ μž˜ μž‘λ™ν•œλ‹€λ©΄, ν΄λŸ¬μŠ€ν„° λ ˆλ²¨μ—μ„œ μˆ˜λ™μœΌλ‘œ μ‚¬λ³Έμ„ μ„€μ •ν•  ν•„μš”κ°€ μ—†μ„ κ²ƒμ΄κ³ , μ—¬λŸ¬λΆ„μ˜ μ•±μ—μ„œ ν•˜λ‚˜ μ΄μƒμ˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜μ§€λ„ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. λ˜λŠ” λ§Œμ•½μ— μ—¬λŸ¬λΆ„이 **도컀 μ»΄ν¬μ¦ˆ**둜 λ°°ν¬ν•˜κ±°λ‚˜, λ‹¨μΌ μ„œλ²„μ—μ„œ μ‹€ν–‰ν•˜κ±°λ‚˜ ν•˜λŠ” κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.
+
+## μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€ λ°°ν¬ν•˜κΈ°
+
+μ»¨ν…Œμ΄λ„ˆ (도컀) μ΄λ―Έμ§€λ₯Ό μ™„μ„±ν•œ λ’€μ— μ΄λ₯Ό λ°°ν¬ν•˜λŠ” λ°©λ²•μ—λŠ” μ—¬λŸ¬κ°€μ§€ λ°©λ²•이 μžˆμŠ΅λ‹ˆλ‹€.
+
+예λ₯Ό λ“€μ–΄:
+
+* λ‹¨μΌ μ„œλ²„μ—μ„œ **도컀 μ»΄ν¬μ¦ˆ**둜 λ°°ν¬ν•˜κΈ°
+* **μΏ λ²„λ„€ν‹°μŠ€** ν΄λŸ¬μŠ€ν„°λ‘œ λ°°ν¬ν•˜κΈ°
+* λ„컀 μŠ€μ™ λͺ¨λ“œ ν΄λŸ¬μŠ€ν„°λ‘œ λ°°ν¬ν•˜κΈ°
+* λ…Έλ§ˆλ“œ κ°™μ€ λ‹€λ₯Έ λ„κ΅¬λ‘œ λ°°ν¬ν•˜κΈ°
+* μ—¬λŸ¬λΆ„μ˜ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό λ°°ν¬ν•΄μ£ΌλŠ” ν΄λΌμš°λ“œ μ„œλΉ„μŠ€λ‘œ λ°°ν¬ν•˜κΈ°
+
+## Poetry의 λ„컀 μ΄λ―Έμ§€
+
+λ§Œμ•½ μ—¬λŸ¬λΆ„듀이 ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ <a href="https://python-poetry.org/" class="external-link" target="_blank">Poetry</a>λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, λ„μ»€μ˜ λ©€ν‹°-μŠ€ν…Œμ΄μ§€ λΉŒλ”©μ„ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+```{ .dockerfile .annotate }
+# (1)
+FROM python:3.9 as requirements-stage
+
+# (2)
+WORKDIR /tmp
+
+# (3)
+RUN pip install poetry
+
+# (4)
+COPY ./pyproject.toml ./poetry.lock* /tmp/
+
+# (5)
+RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
+
+# (6)
+FROM python:3.9
+
+# (7)
+WORKDIR /code
+
+# (8)
+COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
+
+# (9)
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+# (10)
+COPY ./app /code/app
+
+# (11)
+CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
+```
+
+1. μ²« μŠ€ν…Œμ΄μ§€λ‘œ, `requirements-stage`라고 μ΄λ¦„ λΆ™μ˜€μŠ΅λ‹ˆλ‹€.
+
+2. `/tmp`λ₯Ό ν˜„μž¬μ˜ μ›Œν‚Ή λ””λ ‰ν„°λ¦¬λ‘œ μ„€μ •ν•©λ‹ˆλ‹€.
+
+    μ΄ μœ„μΉ˜μ— μš°λ¦¬λŠ” `requirements.txt` νŒŒμΌμ„ μƒμ„±ν•  κ²ƒμž…λ‹ˆλ‹€.
+
+3. μ΄ λ„컀 μŠ€ν…Œμ΄μ§€μ—μ„œ Poetryλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.
+
+4. νŒŒμΌ `pyproject.toml`와 `poetry.lock`λ₯Ό `/tmp` λ””λ ‰ν„°λ¦¬λ‘œ λ³΅μ‚¬ν•©λ‹ˆλ‹€.
+
+    `./poetry.lock*` (`*`둜 λλ‚˜λŠ”) νŒŒμΌμ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—, νŒŒμΌμ΄ μ•„직 μ‚¬μš©κ°€λŠ₯ν•˜μ§€ μ•Šλ”라도 κ³ μž₯λ‚˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.
+
+5. `requirements.txt` νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.
+
+6. μ΄κ²ƒμ΄ λ§ˆμ§€λ§‰ μŠ€ν…Œμ΄μ§€λ‘œ, μ—¬κΈ°μ— μœ„μΉ˜ν•œ λͺ¨λ“  κ²ƒμ΄ λ§ˆμ§€λ§‰ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€μ— ν¬ν•¨λ  κ²ƒμž…λ‹ˆλ‹€.
+
+7. ν˜„μž¬μ˜ μ›Œν‚Ή λ””렉터리λ₯Ό `/code`둜 μ„€μ •ν•©λ‹ˆλ‹€.
+
+8. νŒŒμΌ `requirements.txt`λ₯Ό `/code` λ””λ ‰ν„°λ¦¬λ‘œ λ³΅μ‚¬ν•©λ‹ˆλ‹€.
+
+    μ΄ νŒŒμΌμ€ μ˜€μ§ μ΄μ „μ˜ λ„컀 μŠ€ν…Œμ΄μ§€μ—λ§Œ μ‘΄μž¬ν•˜λ©°, λ•Œλ¬Έμ— λ³΅μ‚¬ν•˜κΈ° μœ„ν•΄μ„œ `--from-requirements-stage` μ˜΅μ…˜μ΄ ν•„μš”ν•©λ‹ˆλ‹€.
+
+9. μƒμ„±λœ `requirements.txt` νŒŒμΌμ— νŒ¨ν‚€μ§€ μ˜μ‘΄μ„±μ„ μ„€μΉ˜ν•©λ‹ˆλ‹€.
+
+10. `app` λ””렉터리λ₯Ό `/code` λ””λ ‰ν„°λ¦¬λ‘œ λ³΅μ‚¬ν•©λ‹ˆλ‹€.
+
+11. `uvicorn` μ»€λ§¨λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬, `app.main`μ—μ„œ λΆˆλŸ¬μ˜¨ `app` κ°μ²΄λ₯Ό μ‚¬μš©ν•˜λ„둝 ν•©λ‹ˆλ‹€.
+
+!!! νŒ
+    λ²„λΈ” μˆ«μžλ₯Ό ν΄λ¦­ν•΄ κ° μ€„이 ν•˜λŠ” μΌμ„ μ•Œμ•„λ³Ό μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+**도컀 μŠ€ν…Œμ΄μ§€**λž€ `Dockefile`의 μΌλΆ€λ‘œμ„œ λ‚˜μ€‘에 μ‚¬μš©ν•˜κΈ° μœ„ν•œ νŒŒμΌλ“€μ„ μƒμ„±ν•˜κΈ° μœ„ν•œ **μΌμ‹œμ μΈ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€**둜 μž‘λ™ν•©λ‹ˆλ‹€.
+
+첫 μŠ€ν…Œμ΄μ§€λŠ” μ˜€μ§ **Poetryλ₯Ό μ„€μΉ˜**ν•˜κ³  Poetry의 `pyproject.toml` νŒŒμΌλ‘œλΆ€ν„° ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„±μ„ μœ„ν•œ **`requirements.txt`λ₯Ό μƒμ„±**ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
+
+이 `requirements.txt` νŒŒμΌμ€ **λ‹€μŒ μŠ€ν…Œμ΄μ§€**μ—μ„œ `pip`둜 μ‚¬μš©λ  κ²ƒμž…λ‹ˆλ‹€.
+
+λ§ˆμ§€λ§‰ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€μ—λŠ” **였직 λ§ˆμ§€λ§‰ μŠ€ν…Œμ΄μ§€λ§Œ** λ³΄μ‘΄λ©λ‹ˆλ‹€. μ΄μ „ μŠ€ν…Œμ΄μ§€(λ“€)은 λ²„λ €μ§‘λ‹ˆλ‹€.
+
+Poetryλ₯Ό μ‚¬μš©ν•  λ•Œ **도컀 λ©€ν‹°-μŠ€ν…Œμ΄μ§€ λΉŒλ“œ**λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄ μ’‹μ€λ°,  μ—¬λŸ¬λΆ„λ“€μ˜ ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„±μ„ μ„€μΉ˜ν•˜κΈ° μœ„ν•΄ λ§ˆμ§€λ§‰ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€μ— **였직** `requirements.txt` νŒŒμΌλ§Œ ν•„μš”ν•˜μ§€, Poetry와 κ·Έ μ˜μ‘΄μ„±μ€ μžˆμ„ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
+
+이 λ‹€μŒ (λ˜ν•œ λ§ˆμ§€λ§‰) μŠ€ν…Œμ΄μ§€μ—μ„œ μ—¬λŸ¬λΆ„듀은 μ΄μ „에 μ„€λͺ…λœ κ²ƒκ³Ό λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ λ°©μ‹μœΌλ‘œ μ΄λ―Έμ§€λ₯Ό λΉŒλ“œν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+### TLS μ’…λ£Œ ν”„λ‘μ‹œμ˜ λ°°ν›„ - Poetry
+
+이전에 μ–ΈκΈ‰ν•œ κ²ƒκ³Ό κ°™μ΄, λ§Œμ•½ μ—¬λŸ¬λΆ„이 μ»¨ν…Œμ΄λ„ˆλ₯Ό Nginx λ˜λŠ” Traefikκ³Ό κ°™μ€ TLS μ’…λ£Œ ν”„λ‘μ‹œ (λ‘œλ“œ λ°ΈλŸ°μ„œ) λ’€μ—μ„œ μ‹€ν–‰ν•˜κ³  μžˆλ‹€λ©΄, μ»€λ§¨λ“œμ— `--proxy-headers` μ˜΅μ…˜μ„ μΆ”κ°€ν•©λ‹ˆλ‹€:
+
+```Dockerfile
+CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
+```
+
+## μš”μ•½
+
+μ»¨ν…Œμ΄λ„ˆ μ‹œμŠ€ν…œ(예λ₯Ό λ“€μ–΄ **도컀**λ‚˜ **μΏ λ²„λ„€ν‹°μŠ€**)을 μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  **배포 κ°œλ…**을 λ‹€λ£¨λŠ” κ²ƒμ€ κ½€ κ°„λ‹¨ν•©λ‹ˆλ‹€:
+
+* HTTPS
+* κ΅¬λ™ν•˜κΈ°
+* μž¬μ‹œμž‘
+* λ³΅μ œ (μ‹€ν–‰ μ€‘인 ν”„λ‘œμ„ΈμŠ€ κ°œμˆ˜)
+* λ©”λͺ¨λ¦¬
+* μ‹œμž‘ν•˜κΈ° μ „ λ‹¨κ³„λ“€
+
+λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—μ„œ μ—¬λŸ¬λΆ„은 μ–΄λ–€ λ² μ΄μŠ€ μ΄λ―Έμ§€λ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  κ³΅μ‹ νŒŒμ΄μ¬ λ„컀 μ΄λ―Έμ§€μ— κΈ°λ°˜ν•΄ **μ²˜μŒλΆ€ν„° μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ₯Ό λΉŒλ“œ**ν•  κ²ƒμž…λ‹ˆλ‹€.
+
+`Dockerfile`에 μžˆλŠ” μ§€μ‹œ μ‚¬ν•­μ„ **μˆœμ„œλŒ€λ‘œ** λ‹€λ£¨κ³  **도컀 μΊμ‹œ**λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ μ—¬λŸ¬λΆ„은 **λΉŒλ“œ μ‹œκ°„을 μ΅œμ†Œν™”**ν•  μˆ˜ μžˆμœΌλ©°, μ΄λ‘œμ¨ μƒμ‚°μ„±μ„ μ΅œλŒ€ν™”ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€ (그리고 μ§€λ£¨ν•¨μ„ ν”Όν•  μˆ˜ μžˆμ£ ) πŸ˜Ž
+
+νŠΉλ³„ν•œ κ²½μš°μ—λŠ”, FastAPIλ₯Ό μœ„ν•œ κ³΅μ‹ λ„컀 μ΄λ―Έμ§€λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. πŸ€“