Browse Source

๐ŸŒ Update translations for ko (update-outdated)

pull/15170/head
github-actions[bot] 4 months ago
committed by Yurii Motov
parent
commit
092d5db7ae
  1. 8
      docs/ko/docs/deployment/cloud.md
  2. 46
      docs/ko/docs/deployment/docker.md
  3. 4
      docs/ko/docs/deployment/fastapicloud.md
  4. 16
      docs/ko/docs/deployment/https.md
  5. 2
      docs/ko/docs/deployment/index.md
  6. 14
      docs/ko/docs/deployment/manually.md
  7. 22
      docs/ko/docs/deployment/server-workers.md
  8. 6
      docs/ko/docs/deployment/versions.md
  9. 2
      docs/ko/docs/how-to/authentication-error-status-code.md
  10. 2
      docs/ko/docs/how-to/conditional-openapi.md
  11. 4
      docs/ko/docs/how-to/configure-swagger-ui.md
  12. 12
      docs/ko/docs/how-to/custom-docs-ui-assets.md
  13. 4
      docs/ko/docs/how-to/extending-openapi.md
  14. 22
      docs/ko/docs/how-to/general.md
  15. 30
      docs/ko/docs/how-to/graphql.md
  16. 2
      docs/ko/docs/how-to/index.md
  17. 8
      docs/ko/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
  18. 6
      docs/ko/docs/how-to/testing-database.md

8
docs/ko/docs/deployment/cloud.md

@ -6,7 +6,7 @@
## FastAPI Cloud { #fastapi-cloud }
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
**[FastAPI Cloud](https://fastapicloud.com)**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๊ตฌ์ถ•**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
@ -16,9 +16,9 @@ FastAPI Cloud๋Š” *FastAPI and friends* ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ํ›„
## ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด - ํ›„์›์ž๋“ค { #cloud-providers-sponsors }
๋‹ค๋ฅธ ๋ช‡๋ช‡ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋“ค๋„ โœจ [**FastAPI๋ฅผ ํ›„์›ํ•ฉ๋‹ˆ๋‹ค**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} โœจ. ๐Ÿ™‡
๋‹ค๋ฅธ ๋ช‡๋ช‡ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋“ค๋„ โœจ [**FastAPI๋ฅผ ํ›„์›ํ•ฉ๋‹ˆ๋‹ค**](../help-fastapi.md#sponsor-the-author) โœจ. ๐Ÿ™‡
๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์ด๋“ค๋„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a>
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a>
* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi)
* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi)

46
docs/ko/docs/deployment/docker.md

@ -1,6 +1,6 @@
# ์ปจํ…Œ์ด๋„ˆ์˜ FastAPI - ๋„์ปค { #fastapi-in-containers-docker }
FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ **๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker**</a>๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ **๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต [**Docker**](https://www.docker.com/)๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **๋ณด์•ˆ**, **์žฌํ˜„ ๊ฐ€๋Šฅ์„ฑ**, **๋‹จ์ˆœํ•จ** ๋“ฑ ์—ฌ๋Ÿฌ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
@ -60,16 +60,16 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
Docker๋Š” **์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**์™€ **์ปจํ…Œ์ด๋„ˆ**๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ <a href="https://hub.docker.com/" class="external-link" target="_blank">Docker Hub</a>์—๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ, ํ™˜๊ฒฝ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ **๊ณต์‹ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ [Docker Hub](https://hub.docker.com/)์—๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ, ํ™˜๊ฒฝ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ **๊ณต์‹ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์‹ <a href="https://hub.docker.com/_/python" class="external-link" target="_blank">Python Image</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์‹ [Python Image](https://hub.docker.com/_/python)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„์˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด:
* <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> ๋“ฑ
* [PostgreSQL](https://hub.docker.com/_/postgres)
* [MySQL](https://hub.docker.com/_/mysql)
* [MongoDB](https://hub.docker.com/_/mongo)
* [Redis](https://hub.docker.com/_/redis) ๋“ฑ
๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ **๊ฒฐํ•ฉ**ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‹œํ—˜ํ•ด ๋ณผ ๋•Œ๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ **๊ณต์‹ ์ด๋ฏธ์ง€**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
@ -111,7 +111,7 @@ Docker๋‚˜ Kubernetes ๊ฐ™์€ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—๋Š” ์ด๋Ÿฌํ•œ
๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ํŒจํ‚ค์ง€ ์ด๋ฆ„๊ณผ ๋ฒ„์ „์„ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ ์–ด ๋‘” `requirements.txt` ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” [FastAPI ๋ฒ„์ „๋“ค์— ๋Œ€ํ•˜์—ฌ](versions.md){.internal-link target=_blank}์—์„œ ์ฝ์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” [FastAPI ๋ฒ„์ „๋“ค์— ๋Œ€ํ•˜์—ฌ](versions.md)์—์„œ ์ฝ์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด `requirements.txt`๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
@ -238,7 +238,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
#### `CMD` ์‚ฌ์šฉํ•˜๊ธฐ - Exec Form { #use-cmd-exec-form }
Docker ์ง€์‹œ์–ด <a href="https://docs.docker.com/reference/dockerfile/#cmd" class="external-link" target="_blank">`CMD`</a>๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
Docker ์ง€์‹œ์–ด [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd)๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
โœ… **Exec** form:
@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
CMD fastapi run app/main.py --port 80
```
FastAPI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ(graceful shutdown)๋˜๊ณ  [lifespan ์ด๋ฒคํŠธ](../advanced/events.md){.internal-link target=_blank}๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ํ•˜๋ ค๋ฉด, ํ•ญ์ƒ **exec** form์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
FastAPI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ(graceful shutdown)๋˜๊ณ  [lifespan ์ด๋ฒคํŠธ](../advanced/events.md)๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ํ•˜๋ ค๋ฉด, ํ•ญ์ƒ **exec** form์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.docker.com/reference/dockerfile/#shell-and-exec-form" class="external-link" target="_blank">shell and exec form์— ๋Œ€ํ•œ Docker ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์ž์„ธํ•œ ๋‚ด์šฉ์€ [shell and exec form์— ๋Œ€ํ•œ Docker ๋ฌธ์„œ](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์ด๋Š” `docker compose`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฝค ๋ˆˆ์— ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๊ธฐ์ˆ ์ ์ธ ์ƒ์„ธ ๋‚ด์šฉ์€ Docker Compose FAQ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: <a href="https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop" class="external-link" target="_blank">Why do my services take 10 seconds to recreate or stop?</a>.
์ด๋Š” `docker compose`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฝค ๋ˆˆ์— ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๊ธฐ์ˆ ์ ์ธ ์ƒ์„ธ ๋‚ด์šฉ์€ Docker Compose FAQ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: [Why do my services take 10 seconds to recreate or stop?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
#### ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ { #directory-structure }
@ -305,7 +305,7 @@ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
ํŒจํ‚ค์ง€ ์˜์กด์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜๋Š” ๋ฐ์—๋Š” **๋ช‡ ๋ถ„**์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, **์บ์‹œ**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์•„์•ผ **๋ช‡ ์ดˆ**๋ฉด ๋๋‚ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐœ๋ฐœ ์ค‘์— ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ณ„์† ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ด๋ ‡๊ฒŒ ์ ˆ์•ฝ๋˜๋Š” ์‹œ๊ฐ„์€ ๋ˆ„์ ๋˜์–ด ์ƒ๋‹นํžˆ ์ปค์ง‘๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐœ๋ฐœ ์ค‘์— ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ณ„์† ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ด๋ ‡๊ฒŒ ์ ˆ์•ฝ๋˜๋Š” ์‹œ๊ฐ„์€ ๋ˆ„์ค‘๋˜์–ด ์ƒ๋‹นํžˆ ์ปค์ง‘๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ `Dockerfile`์˜ ๋๋ถ€๋ถ„ ๊ทผ์ฒ˜์—์„œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ **๊ฐ€์žฅ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š”** ๋ถ€๋ถ„์ด๋ฏ€๋กœ, ๊ฑฐ์˜ ํ•ญ์ƒ ์ด ๋‹จ๊ณ„ ์ดํ›„์—๋Š” ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋๋ถ€๋ถ„์— ๋‘ก๋‹ˆ๋‹ค.
@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
## ํ™•์ธํ•˜๊ธฐ { #check-it }
Docker ์ปจํ…Œ์ด๋„ˆ์˜ 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>(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
Docker ์ปจํ…Œ์ด๋„ˆ์˜ URL์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ๋˜๋Š” [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery)(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:
@ -362,17 +362,17 @@ Docker ์ปจํ…Œ์ด๋„ˆ์˜ URL์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค
## ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ API ๋ฌธ์„œ { #interactive-api-docs }
์ด์ œ <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>(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ [http://192.168.99.100/docs](http://192.168.99.100/docs) ๋˜๋Š” [http://127.0.0.1/docs](http://127.0.0.1/docs)(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ API ๋ฌธ์„œ(<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ API ๋ฌธ์„œ([Swagger UI](https://github.com/swagger-api/swagger-ui) ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
## ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs }
๋˜ํ•œ <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>(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ [http://192.168.99.100/redoc](http://192.168.99.100/redoc) ๋˜๋Š” [http://127.0.0.1/redoc](http://127.0.0.1/redoc)(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€์•ˆ ์ž๋™ ๋ฌธ์„œ(<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๋Œ€์•ˆ ์ž๋™ ๋ฌธ์„œ([ReDoc](https://github.com/Rebilly/ReDoc) ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@ -413,7 +413,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
## ๋ฐฐํฌ ๊ฐœ๋… { #deployment-concepts }
์ปจํ…Œ์ด๋„ˆ ๊ด€์ ์—์„œ ๊ฐ™์€ [๋ฐฐํฌ ๊ฐœ๋…](concepts.md){.internal-link target=_blank}๋“ค์„ ๋‹ค์‹œ ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค.
์ปจํ…Œ์ด๋„ˆ ๊ด€์ ์—์„œ ๊ฐ™์€ [๋ฐฐํฌ ๊ฐœ๋…](concepts.md)๋“ค์„ ๋‹ค์‹œ ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค.
์ปจํ…Œ์ด๋„ˆ๋Š” ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ** ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋„๊ตฌ์ด์ง€๋งŒ, ์ด๋Ÿฌํ•œ **๋ฐฐํฌ ๊ฐœ๋…**์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํŠน์ • ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐ•์ œํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ, ๊ฐ€๋Šฅํ•œ ์ „๋žต์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
@ -432,7 +432,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**(๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ์‹คํ–‰ ์ค‘์ธ **์ปจํ…Œ์ด๋„ˆ**)์—๋งŒ ์ง‘์ค‘ํ•œ๋‹ค๋ฉด, HTTPS๋Š” ๋ณดํ†ต ๋‹ค๋ฅธ ๋„๊ตฌ์— ์˜ํ•ด **์™ธ๋ถ€์ ์œผ๋กœ** ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ **HTTPS**์™€ **์ธ์ฆ์„œ**์˜ **์ž๋™** ํš๋“์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด [Traefik](https://traefik.io/)์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ **HTTPS**์™€ **์ธ์ฆ์„œ**์˜ **์ž๋™** ํš๋“์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
/// info | ์ •๋ณด
Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init Container</a>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
///
@ -570,7 +570,7 @@ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ <a href="https://kubernetes.io/d
### ๋ฒ ์ด์Šค ๋„์ปค ์ด๋ฏธ์ง€ { #base-docker-image }
๊ณผ๊ฑฐ์—๋Š” ๊ณต์‹ FastAPI Docker ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>. ํ•˜์ง€๋งŒ ์ด์ œ๋Š” deprecated๋˜์—ˆ์Šต๋‹ˆ๋‹ค. โ›”๏ธ
๊ณผ๊ฑฐ์—๋Š” ๊ณต์‹ FastAPI Docker ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). ํ•˜์ง€๋งŒ ์ด์ œ๋Š” deprecated๋˜์—ˆ์Šต๋‹ˆ๋‹ค. โ›”๏ธ
์•„๋งˆ๋„ ์ด ๋ฒ ์ด์Šค ๋„์ปค ์ด๋ฏธ์ง€(๋˜๋Š” ์œ ์‚ฌํ•œ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€)๋Š” **์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”** ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
@ -600,7 +600,7 @@ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ <a href="https://kubernetes.io/d
## `uv`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„์ปค ์ด๋ฏธ์ง€ { #docker-image-with-uv }
ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, <a href="https://docs.astral.sh/uv/guides/integration/docker/" class="external-link" target="_blank">uv Docker guide</a>๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, [uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/)๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ์š”์•ฝ { #recap }

4
docs/ko/docs/deployment/fastapicloud.md

@ -1,6 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
**ํ•œ ๋ฒˆ์˜ ๋ช…๋ น**์œผ๋กœ FastAPI ์•ฑ์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€
**ํ•œ ๋ฒˆ์˜ ๋ช…๋ น**์œผ๋กœ FastAPI ์•ฑ์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€
## ๋กœ๊ทธ์ธํ•˜๊ธฐ { #login }
@ -40,7 +40,7 @@ Deploying to FastAPI Cloud...
## FastAPI Cloud ์†Œ๊ฐœ { #about-fastapi-cloud }
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ €์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
**[FastAPI Cloud](https://fastapicloud.com)**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ €์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๊ตฌ์ถ•**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

16
docs/ko/docs/deployment/https.md

@ -10,7 +10,7 @@ HTTPS๋Š” ๊ทธ๋ƒฅ โ€œ์ผœ์ ธ ์žˆ๊ฑฐ๋‚˜โ€ ์•„๋‹ˆ๋ฉด โ€œ๊บผ์ ธ ์žˆ๋Š”โ€ ๊ฒƒ์ด๋ผ
///
์†Œ๋น„์ž ๊ด€์ ์—์„œ **HTTPS์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๋ ค๋ฉด** <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
์†Œ๋น„์ž ๊ด€์ ์—์„œ **HTTPS์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๋ ค๋ฉด** [https://howhttps.works/](https://howhttps.works/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
์ด์ œ **๊ฐœ๋ฐœ์ž ๊ด€์ **์—์„œ HTTPS๋ฅผ ์ƒ๊ฐํ•  ๋•Œ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
@ -28,13 +28,13 @@ HTTPS๋Š” ๊ทธ๋ƒฅ โ€œ์ผœ์ ธ ์žˆ๊ฑฐ๋‚˜โ€ ์•„๋‹ˆ๋ฉด โ€œ๊บผ์ ธ ์žˆ๋Š”โ€ ๊ฒƒ์ด๋ผ
* **๊ธฐ๋ณธ์ ์œผ๋กœ** ์ด๋Š” IP ์ฃผ์†Œ ํ•˜๋‚˜๋‹น **HTTPS ์ธ์ฆ์„œ ํ•˜๋‚˜๋งŒ** ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
* ์„œ๋ฒ„๊ฐ€ ์•„๋ฌด๋ฆฌ ํฌ๋“ , ๊ทธ ์œ„์— ์˜ฌ๋ฆฐ ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋ฌด๋ฆฌ ์ž‘๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.
* ํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•œ **ํ•ด๊ฒฐ์ฑ…**์ด ์žˆ์Šต๋‹ˆ๋‹ค.
* **TLS** ํ”„๋กœํ† ์ฝœ(HTTP ์ด์ „, TCP ๋ ˆ๋ฒจ์—์„œ ์•”ํ˜ธํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ **ํ™•์žฅ** ์ค‘์— **<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Server Name Indication - ์„œ๋ฒ„ ์ด๋ฆ„ ํ‘œ์‹œ">SNI</abbr></a>**๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
* **TLS** ํ”„๋กœํ† ์ฝœ(HTTP ์ด์ „, TCP ๋ ˆ๋ฒจ์—์„œ ์•”ํ˜ธํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ **ํ™•์žฅ** ์ค‘์— **[<abbr title="Server Name Indication - ์„œ๋ฒ„ ์ด๋ฆ„ ํ‘œ์‹œ">SNI</abbr>](https://en.wikipedia.org/wiki/Server_Name_Indication)**๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
* ์ด SNI ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹จ์ผ ์„œ๋ฒ„(**๋‹จ์ผ IP ์ฃผ์†Œ**)์—์„œ **์—ฌ๋Ÿฌ HTTPS ์ธ์ฆ์„œ**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  **์—ฌ๋Ÿฌ HTTPS ๋„๋ฉ”์ธ/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜**์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„์—์„œ **๊ณต๊ฐœ IP ์ฃผ์†Œ**๋กœ ๋ฆฌ์Šค๋‹ํ•˜๋Š” **ํ•˜๋‚˜์˜** ์ปดํฌ๋„ŒํŠธ(ํ”„๋กœ๊ทธ๋žจ)๊ฐ€ ์„œ๋ฒ„์— ์žˆ๋Š” **๋ชจ๋“  HTTPS ์ธ์ฆ์„œ**์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* ๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ์–ป์€ **์ดํ›„์—๋„**, ํ†ต์‹  ํ”„๋กœํ† ์ฝœ ์ž์ฒด๋Š” **์—ฌ์ „ํžˆ HTTP**์ž…๋‹ˆ๋‹ค.
* **HTTP ํ”„๋กœํ† ์ฝœ**๋กœ ์ „์†ก๋˜๋”๋ผ๋„, ๋‚ด์šฉ์€ **์•”ํ˜ธํ™”**๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„(๋จธ์‹ , ํ˜ธ์ŠคํŠธ ๋“ฑ)์—๋Š” **ํ”„๋กœ๊ทธ๋žจ/HTTP ์„œ๋ฒ„ ํ•˜๋‚˜**๋ฅผ ์‹คํ–‰ํ•ด **HTTPS ๊ด€๋ จ ๋ถ€๋ถ„ ์ „์ฒด**๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค: **์•”ํ˜ธํ™”๋œ HTTPS ์š”์ฒญ**์„ ๋ฐ›๊ณ , ๋ณตํ˜ธํ™”๋œ **HTTP ์š”์ฒญ**์„ ๊ฐ™์€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ์‹ค์ œ HTTP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ด ๊ฒฝ์šฐ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **HTTP ์‘๋‹ต**์„ ๋ฐ›์•„ ์ ์ ˆํ•œ **HTTPS ์ธ์ฆ์„œ**๋กœ **์•”ํ˜ธํ™”**ํ•œ ๋’ค **HTTPS**๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์„œ๋ฒ„๋ฅผ ํ”ํžˆ **<a href="https://en.wikipedia.org/wiki/TLS_termination_proxy" class="external-link" target="_blank">TLS Termination Proxy</a>**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„(๋จธ์‹ , ํ˜ธ์ŠคํŠธ ๋“ฑ)์—๋Š” **ํ”„๋กœ๊ทธ๋žจ/HTTP ์„œ๋ฒ„ ํ•˜๋‚˜**๋ฅผ ์‹คํ–‰ํ•ด **HTTPS ๊ด€๋ จ ๋ถ€๋ถ„ ์ „์ฒด**๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค: **์•”ํ˜ธํ™”๋œ HTTPS ์š”์ฒญ**์„ ๋ฐ›๊ณ , ๋ณตํ˜ธํ™”๋œ **HTTP ์š”์ฒญ**์„ ๊ฐ™์€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ์‹ค์ œ HTTP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ด ๊ฒฝ์šฐ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **HTTP ์‘๋‹ต**์„ ๋ฐ›์•„ ์ ์ ˆํ•œ **HTTPS ์ธ์ฆ์„œ**๋กœ **์•”ํ˜ธํ™”**ํ•œ ๋’ค **HTTPS**๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์„œ๋ฒ„๋ฅผ ํ”ํžˆ **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
TLS Termination Proxy๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
@ -49,7 +49,7 @@ Let's Encrypt ์ด์ „์—๋Š” ์ด๋Ÿฌํ•œ **HTTPS ์ธ์ฆ์„œ**๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”
์ธ์ฆ์„œ๋ฅผ ํš๋“ํ•˜๋Š” ๊ณผ์ •์€ ๋ฒˆ๊ฑฐ๋กญ๊ณ , ๊ฝค ๋งŽ์€ ์„œ๋ฅ˜ ์ž‘์—…์ด ํ•„์š”ํ–ˆ์œผ๋ฉฐ, ์ธ์ฆ์„œ๋„ ์ƒ๋‹นํžˆ ๋น„์ŒŒ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ ํ›„ **<a href="https://letsencrypt.org/" class="external-link" target="_blank">Let's Encrypt</a>**๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ ํ›„ **[Let's Encrypt](https://letsencrypt.org/)**๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
์ด๋Š” Linux Foundation์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ ์•”ํ˜ธํ•™์  ๋ณด์•ˆ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” **HTTPS ์ธ์ฆ์„œ**๋ฅผ **๋ฌด๋ฃŒ๋กœ**, ์ž๋™ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋“ค์€ ์ˆ˜๋ช…์ด ์งง๊ณ (์•ฝ 3๊ฐœ์›”) ๊ทธ๋ž˜์„œ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง์€ ๋งŒํผ **์‹ค์ œ๋กœ ๋ณด์•ˆ์ด ๋” ์ข‹์•„์ง€๊ธฐ๋„** ํ•ฉ๋‹ˆ๋‹ค.
@ -200,9 +200,9 @@ TLS Termination Proxy๋Š” ํ•ฉ์˜๋œ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•ด **์š”์ฒญ์„ ๋ณตํ˜ธํ™”*
ํ”„๋ก์‹œ ํ—ค๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" class="external-link" target="_blank">X-Forwarded-For</a>
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto" class="external-link" target="_blank">X-Forwarded-Proto</a>
* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host" class="external-link" target="_blank">X-Forwarded-Host</a>
* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
///
@ -218,7 +218,7 @@ TLS Termination Proxy๋Š” ํ•ฉ์˜๋œ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•ด **์š”์ฒญ์„ ๋ณตํ˜ธํ™”*
/// tip | ํŒ
์ด์— ๋Œ€ํ•ด์„œ๋Š” [ํ”„๋ก์‹œ ๋’ค์—์„œ ์‹คํ–‰ํ•˜๊ธฐ - ํ”„๋ก์‹œ ์ „๋‹ฌ ํ—ค๋” ํ™œ์„ฑํ™”](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} ๋ฌธ์„œ์—์„œ ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์— ๋Œ€ํ•ด์„œ๋Š” [ํ”„๋ก์‹œ ๋’ค์—์„œ ์‹คํ–‰ํ•˜๊ธฐ - ํ”„๋ก์‹œ ์ „๋‹ฌ ํ—ค๋” ํ™œ์„ฑํ™”](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) ๋ฌธ์„œ์—์„œ ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
///

2
docs/ko/docs/deployment/index.md

@ -16,7 +16,7 @@
์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์กฐํ•ฉํ•ด ์ง์ ‘ **์„œ๋ฒ„๋ฅผ ๋ฐฐํฌ**ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ž‘์—…์˜ ์ผ๋ถ€๋ฅผ ๋Œ€์‹ ํ•ด ์ฃผ๋Š” **ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์„ ํƒ์ง€๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, FastAPI ๋’ค์— ์žˆ๋Š” ์ €ํฌ ํŒ€์€ FastAPI๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋ฉด์„œ, FastAPI ์•ฑ์„ ํด๋ผ์šฐ๋“œ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„์†Œํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก <a href="https://fastapicloud.com" class="external-link" target="_blank">**FastAPI Cloud**</a>๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, FastAPI ๋’ค์— ์žˆ๋Š” ์ €ํฌ ํŒ€์€ FastAPI๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋ฉด์„œ, FastAPI ์•ฑ์„ ํด๋ผ์šฐ๋“œ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„์†Œํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก [**FastAPI Cloud**](https://fastapicloud.com)๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
**FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์•„๋งˆ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ฐœ๋…์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค).

14
docs/ko/docs/deployment/manually.md

@ -52,11 +52,11 @@ FastAPI๋Š” <abbr title="Asynchronous Server Gateway Interface - ๋น„๋™๊ธฐ ์„œ๋ฒ„
๋‹ค์Œ์„ ํฌํ•จํ•ด ์—ฌ๋Ÿฌ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>: ๊ณ ์„ฑ๋Šฅ ASGI ์„œ๋ฒ„.
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: HTTP/2 ๋ฐ Trio ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜๋˜๋Š” ASGI ์„œ๋ฒ„.
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: Django Channels๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ASGI ์„œ๋ฒ„.
* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>: Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ Rust HTTP ์„œ๋ฒ„.
* <a href="https://unit.nginx.org/howto/fastapi/" class="external-link" target="_blank">NGINX Unit</a>: NGINX Unit์€ ๊ฐ€๋ณ๊ณ  ๋‹ค์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค.
* [Uvicorn](https://www.uvicorn.dev/): ๊ณ ์„ฑ๋Šฅ ASGI ์„œ๋ฒ„.
* [Hypercorn](https://hypercorn.readthedocs.io/): HTTP/2 ๋ฐ Trio ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜๋˜๋Š” ASGI ์„œ๋ฒ„.
* [Daphne](https://github.com/django/daphne): Django Channels๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ASGI ์„œ๋ฒ„.
* [Granian](https://github.com/emmett-framework/granian): Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ Rust HTTP ์„œ๋ฒ„.
* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit์€ ๊ฐ€๋ณ๊ณ  ๋‹ค์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค.
## ์„œ๋ฒ„ ๋จธ์‹ ๊ณผ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ { #server-machine-and-server-program }
@ -74,7 +74,7 @@ FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์ธ Uvicorn์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, `
ํ•˜์ง€๋งŒ ASGI ์„œ๋ฒ„๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜์„ธ์š”.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜์„ธ์š”.
์˜ˆ๋ฅผ ๋“ค์–ด Uvicorn์„ ์„ค์น˜ํ•˜๋ ค๋ฉด:
@ -94,7 +94,7 @@ $ pip install "uvicorn[standard]"
`standard`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด Uvicorn์ด ๊ถŒ์žฅ๋˜๋Š” ์ถ”๊ฐ€ ์˜์กด์„ฑ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—๋Š” `asyncio`๋ฅผ ๊ณ ์„ฑ๋Šฅ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋“œ๋กญ์ธ ๋Œ€์ฒด์žฌ์ธ `uvloop`๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ํฐ ๋™์‹œ์„ฑ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—๋Š” `uvloop`๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” `asyncio`๋ฅผ ๊ณ ์„ฑ๋Šฅ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋“œ๋กญ์ธ ๋Œ€์ฒด์žฌ๋กœ, ํฐ ๋™์‹œ์„ฑ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
`pip install "fastapi[standard]"` ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด `uvicorn[standard]`๋„ ํ•จ๊ป˜ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

22
docs/ko/docs/deployment/server-workers.md

@ -13,13 +13,13 @@
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ๋Š” **๋‹ค์ค‘ ์ฝ”์–ด**๋ฅผ ํ™œ์šฉํ•˜๊ณ  ๋” ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก **ํ”„๋กœ์„ธ์Šค ๋ณต์ œ**๋ฅผ ํ•˜๊ณ  ์‹ถ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
์ด์ „ ์žฅ์˜ [๋ฐฐํฌ ๊ฐœ๋…๋“ค](concepts.md){.internal-link target=_blank}์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋žต์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ „ ์žฅ์˜ [๋ฐฐํฌ ๊ฐœ๋…๋“ค](concepts.md)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋žต์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” `fastapi` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ `uvicorn` ๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์„œ, **์›Œ์ปค ํ”„๋กœ์„ธ์Šค**์™€ ํ•จ๊ป˜ **Uvicorn**์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
/// info | ์ •๋ณด
Docker๋‚˜ Kubernetes ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md){.internal-link target=_blank}์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
Docker๋‚˜ Kubernetes ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md)์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ **Kubernetes**์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์›Œ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ๋Œ€์‹  **์ปจํ…Œ์ด๋„ˆ๋‹น ๋‹จ์ผ Uvicorn ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜**๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ์ง€๋งŒ, ํ•ด๋‹น ๋‚ด์šฉ์€ ๊ทธ ์žฅ์˜ ๋’ค์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
@ -63,16 +63,16 @@ $ <font color="#4E9A06">fastapi</font> run --workers 4 <u style="text-decoration
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started parent process <b>[</b><font color="#34E2E2"><b>27365</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27368</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27369</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27370</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27367</b></font><b>]</b>
<span style="background-color="#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27370</b></font><b>]</b>
<span style="background-color="#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27367</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> Waiting for application startup.
<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> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<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> Waiting for application startup.
<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.
<span style="background-color="#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color="#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
```
</div>
@ -126,7 +126,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
## ์ปจํ…Œ์ด๋„ˆ์™€ ๋„์ปค { #containers-and-docker }
๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md){.internal-link target=_blank}์—์„œ๋Š” ๋‹ค๋ฅธ **๋ฐฐํฌ ๊ฐœ๋…๋“ค**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ „๋žต์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md)์—์„œ๋Š” ๋‹ค๋ฅธ **๋ฐฐํฌ ๊ฐœ๋…๋“ค**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ „๋žต์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‹จ์ผ Uvicorn ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, **์ฒ˜์Œ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ๋นŒ๋“œ**ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ„๋‹จํ•œ ๊ณผ์ •์ด๋ฉฐ, **Kubernetes** ๊ฐ™์€ ๋ถ„์‚ฐ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ๋•Œ ์•„๋งˆ๋„ ์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

6
docs/ko/docs/deployment/versions.md

@ -4,7 +4,7 @@
์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ž์ฃผ ์ถ”๊ฐ€๋˜๊ณ , ๋ฒ„๊ทธ๊ฐ€ ๊ทœ์น™์ ์œผ๋กœ ์ˆ˜์ •๋˜๋ฉฐ, ์ฝ”๋“œ๋Š” ๊ณ„์†ํ•ด์„œ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํ˜„์žฌ ๋ฒ„์ „์ด ์•„์ง `0.x.x`์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ๋ฒ„์ „์ด ์ž ์žฌ์ ์œผ๋กœ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง€๋Š” ๋ณ€๊ฒฝ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” <a href="https://semver.org/" class="external-link" target="_blank">Semantic Versioning</a> ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํ˜„์žฌ ๋ฒ„์ „์ด ์•„์ง `0.x.x`์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ๋ฒ„์ „์ด ์ž ์žฌ์ ์œผ๋กœ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง€๋Š” ๋ณ€๊ฒฝ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” [Semantic Versioning](https://semver.org/) ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
์ง€๊ธˆ ๋ฐ”๋กœ **FastAPI**๋กœ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ํ•œ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ํ•ด์˜ค์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‹ค๋งŒ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
@ -34,7 +34,7 @@ fastapi[standard]>=0.112.0,<0.113.0
## ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „๋“ค { #available-versions }
์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „(์˜ˆ: ํ˜„์žฌ ์ตœ์‹  ๋ฒ„์ „์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด)์€ [๋ฆด๋ฆฌ์Šค ๋…ธํŠธ](../release-notes.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „(์˜ˆ: ํ˜„์žฌ ์ตœ์‹  ๋ฒ„์ „์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด)์€ [๋ฆด๋ฆฌ์Šค ๋…ธํŠธ](../release-notes.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๋ฒ„์ „๋“ค์— ๋Œ€ํ•ด { #about-versions }
@ -66,7 +66,7 @@ fastapi>=0.45.0,<0.46.0
์•ฑ์— ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
**FastAPI**์—์„œ๋Š” ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(Starlette ๋•๋ถ„์—). ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”: [ํ…Œ์ŠคํŠธ](../tutorial/testing.md){.internal-link target=_blank}
**FastAPI**์—์„œ๋Š” ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(Starlette ๋•๋ถ„์—). ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”: [ํ…Œ์ŠคํŠธ](../tutorial/testing.md)
ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ–์ถ˜ ๋’ค์—๋Š” **FastAPI** ๋ฒ„์ „์„ ๋” ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

2
docs/ko/docs/how-to/authentication-error-status-code.md

@ -2,7 +2,7 @@
FastAPI ๋ฒ„์ „ `0.122.0` ์ด์ „์—๋Š”, ํ†ตํ•ฉ ๋ณด์•ˆ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์ธ์ฆ ์‹คํŒจ ํ›„ ํด๋ผ์ด์–ธํŠธ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ HTTP ์ƒํƒœ ์ฝ”๋“œ `403 Forbidden`์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
FastAPI ๋ฒ„์ „ `0.122.0`๋ถ€ํ„ฐ๋Š” ๋” ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ `401 Unauthorized`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, HTTP ๋ช…์„ธ์ธ <a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>, <a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>๋ฅผ ๋”ฐ๋ผ ์‘๋‹ต์— ํ•ฉ๋ฆฌ์ ์ธ `WWW-Authenticate` ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
FastAPI ๋ฒ„์ „ `0.122.0`๋ถ€ํ„ฐ๋Š” ๋” ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ `401 Unauthorized`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, HTTP ๋ช…์„ธ์ธ [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized)๋ฅผ ๋”ฐ๋ผ ์‘๋‹ต์— ํ•ฉ๋ฆฌ์ ์ธ `WWW-Authenticate` ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด์ „ ๋™์ž‘์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋ณด์•ˆ ํด๋ž˜์Šค์—์„œ `make_not_authenticated_error` ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์ด์ „ ๋™์ž‘์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2
docs/ko/docs/how-to/conditional-openapi.md

@ -10,7 +10,7 @@
์ฝ”๋“œ์— ๋ณด์•ˆ ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ฒฐํ•จ์€ ์—ฌ์ „ํžˆ ์กด์žฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฌธ์„œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ํ”„๋กœ๋•์…˜์—์„œ ๋””๋ฒ„๊น…์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ <a href="https://en.wikipedia.org/wiki/Security_through_obscurity" class="external-link" target="_blank">Security through obscurity</a>์˜ ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์„œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ํ”„๋กœ๋•์…˜์—์„œ ๋””๋ฒ„๊น…์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ [์€ํ๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ](https://en.wikipedia.org/wiki/Security_through_obscurity)์˜ ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
API๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:

4
docs/ko/docs/how-to/configure-swagger-ui.md

@ -1,6 +1,6 @@
# Swagger UI ๊ตฌ์„ฑ { #configure-swagger-ui }
์ถ”๊ฐ€์ ์ธ <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜</a>๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€์ ์ธ [Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ์„ฑ์„ ํ•˜๋ ค๋ฉด, `FastAPI()` ์•ฑ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋˜๋Š” `get_swagger_ui_html()` ํ•จ์ˆ˜์— `swagger_ui_parameters` ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค.
@ -50,7 +50,7 @@ FastAPI๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ๋งค
## ๊ธฐํƒ€ Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜ { #other-swagger-ui-parameters }
์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ตฌ์„ฑ ์˜ต์…˜์„ ํ™•์ธํ•˜๋ ค๋ฉด, Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ณต์‹ <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์„œ</a>๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ตฌ์„ฑ ์˜ต์…˜์„ ํ™•์ธํ•˜๋ ค๋ฉด, ๊ณต์‹ [Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์„œ](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
## JavaScript ์ „์šฉ ์„ค์ • { #javascript-only-settings }

12
docs/ko/docs/how-to/custom-docs-ui-assets.md

@ -54,7 +54,7 @@ Swagger UI๊ฐ€ ์ด ๊ณผ์ •์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด ์ฃผ์ง€๋งŒ, ์ด๋ฅผ
### ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #test-it }
์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด, ์ƒˆ CDN์—์„œ ์—์…‹์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด, ์ƒˆ CDN์—์„œ ์—์…‹์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๋ฌธ์„œ์šฉ JavaScript์™€ CSS ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๊ธฐ { #self-hosting-javascript-and-css-for-docs }
@ -93,12 +93,12 @@ JavaScript์™€ CSS๋ฅผ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜คํ”„๋ผ์ธ
**Swagger UI**๋Š” ๋‹ค์Œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
* <a href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js" class="external-link" target="_blank">`swagger-ui-bundle.js`</a>
* <a href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css" class="external-link" target="_blank">`swagger-ui.css`</a>
* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js)
* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css)
**ReDoc**์€ ๋‹ค์Œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
* <a href="https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js" class="external-link" target="_blank">`redoc.standalone.js`</a>
* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js)
์ดํ›„ ํŒŒ์ผ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
@ -122,7 +122,7 @@ JavaScript์™€ CSS๋ฅผ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜คํ”„๋ผ์ธ
### ์ •์  ํŒŒ์ผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #test-the-static-files }
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  <a href="http://127.0.0.1:8000/static/redoc.standalone.js" class="external-link" target="_blank">http://127.0.0.1:8000/static/redoc.standalone.js</a>๋กœ ์ด๋™ํ•˜์„ธ์š”.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js)๋กœ ์ด๋™ํ•˜์„ธ์š”.
**ReDoc**์šฉ ๋งค์šฐ ๊ธด JavaScript ํŒŒ์ผ์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
@ -180,6 +180,6 @@ Swagger UI๊ฐ€ ์ด ๊ณผ์ •์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด ์ฃผ์ง€๋งŒ, ์ด๋ฅผ
### ์ •์  ํŒŒ์ผ UI ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #test-static-files-ui }
์ด์ œ WiFi ์—ฐ๊ฒฐ์„ ๋Š๊ณ  <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด ๋ณด์„ธ์š”.
์ด์ œ WiFi ์—ฐ๊ฒฐ์„ ๋Š๊ณ  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด ๋ณด์„ธ์š”.
์ธํ„ฐ๋„ท์ด ์—†์–ด๋„ API ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ , API์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4
docs/ko/docs/how-to/extending-openapi.md

@ -37,7 +37,7 @@
์œ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ๋™์ผํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด OpenAPI ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฐ ๋ถ€๋ถ„์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, <a href="https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo" class="external-link" target="_blank">์ปค์Šคํ…€ ๋กœ๊ณ ๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ReDoc์˜ OpenAPI ํ™•์žฅ</a>์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, [์ปค์Šคํ…€ ๋กœ๊ณ ๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ReDoc์˜ OpenAPI ํ™•์žฅ](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo)์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
### ์ผ๋ฐ˜์ ์ธ **FastAPI** { #normal-fastapi }
@ -75,6 +75,6 @@
### ํ™•์ธํ•˜๊ธฐ { #check-it }
<a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ์ด๋™ํ•˜๋ฉด ์ปค์Šคํ…€ ๋กœ๊ณ (์ด ์˜ˆ์‹œ์—์„œ๋Š” **FastAPI** ๋กœ๊ณ )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ์ด๋™ํ•˜๋ฉด ์ปค์Šคํ…€ ๋กœ๊ณ (์ด ์˜ˆ์‹œ์—์„œ๋Š” **FastAPI** ๋กœ๊ณ )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
<img src="/img/tutorial/extending-openapi/image01.png">

22
docs/ko/docs/how-to/general.md

@ -4,36 +4,40 @@
## ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง - ๋ณด์•ˆ { #filter-data-security }
๋ฐ˜ํ™˜ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด, [ํŠœํ† ๋ฆฌ์–ผ - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž…](../tutorial/response-model.md){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
๋ฐ˜ํ™˜ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด, [ํŠœํ† ๋ฆฌ์–ผ - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž…](../tutorial/response-model.md) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## ์‘๋‹ต ์„ฑ๋Šฅ ์ตœ์ ํ™” - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž… { #optimize-response-performance-response-model-return-type }
JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ๋ฐ˜ํ™˜ ํƒ€์ž… ๋˜๋Š” ์‘๋‹ต ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด Pydantic์ด Python์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  Rust ์ธก์—์„œ JSON ์ง๋ ฌํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [ํŠœํ† ๋ฆฌ์–ผ - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž…](../tutorial/response-model.md) ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
## ๋ฌธ์„œํ™” ํƒœ๊ทธ - OpenAPI { #documentation-tags-openapi }
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์—์„œ ์ด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ํƒœ๊ทธ](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์—์„œ ์ด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ํƒœ๊ทธ](../tutorial/path-operation-configuration.md#tags) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## ๋ฌธ์„œํ™” ์š”์•ฝ ๋ฐ ์„ค๋ช… - OpenAPI { #documentation-summary-and-description-openapi }
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์š”์•ฝ๊ณผ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์— ํ‘œ์‹œํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์š”์•ฝ ๋ฐ ์„ค๋ช…](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์š”์•ฝ๊ณผ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์— ํ‘œ์‹œํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์š”์•ฝ ๋ฐ ์„ค๋ช…](../tutorial/path-operation-configuration.md#summary-and-description) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## ๋ฌธ์„œํ™” ์‘๋‹ต ์„ค๋ช… - OpenAPI { #documentation-response-description-openapi }
๋ฌธ์„œ UI์— ํ‘œ์‹œ๋˜๋Š” ์‘๋‹ต์˜ ์„ค๋ช…์„ ์ •์˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์‘๋‹ต ์„ค๋ช…](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
๋ฌธ์„œ UI์— ํ‘œ์‹œ๋˜๋Š” ์‘๋‹ต์˜ ์„ค๋ช…์„ ์ •์˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์‘๋‹ต ์„ค๋ช…](../tutorial/path-operation-configuration.md#response-description) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## ๋ฌธ์„œํ™” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์ง€์› ์ค‘๋‹จํ•˜๊ธฐ - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ์ง€์› ์ค‘๋‹จ(deprecate)์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ , ๋ฌธ์„œ UI์— ๋ณด์—ฌ์ฃผ๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์ง€์› ์ค‘๋‹จ](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ์ง€์› ์ค‘๋‹จ(deprecate)์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ , ๋ฌธ์„œ UI์— ๋ณด์—ฌ์ฃผ๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์ง€์› ์ค‘๋‹จ](../tutorial/path-operation-configuration.md#deprecate-a-path-operation) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## ์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  JSON ํ˜ธํ™˜์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ { #convert-any-data-to-json-compatible }
์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  JSON ํ˜ธํ™˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - JSON ํ˜ธํ™˜ ์ธ์ฝ”๋”](../tutorial/encoder.md){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  JSON ํ˜ธํ™˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - JSON ํ˜ธํ™˜ ์ธ์ฝ”๋”](../tutorial/encoder.md) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## OpenAPI ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ - ๋ฌธ์„œ { #openapi-metadata-docs }
๋ผ์ด์„ ์Šค, ๋ฒ„์ „, ์—ฐ๋ฝ์ฒ˜ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด OpenAPI ์Šคํ‚ค๋งˆ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
๋ผ์ด์„ ์Šค, ๋ฒ„์ „, ์—ฐ๋ฝ์ฒ˜ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด OpenAPI ์Šคํ‚ค๋งˆ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## OpenAPI ์‚ฌ์šฉ์ž ์ •์˜ URL { #openapi-custom-url }
OpenAPI URL์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ(๋˜๋Š” ์ œ๊ฑฐ)ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#openapi-url){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
OpenAPI URL์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ(๋˜๋Š” ์ œ๊ฑฐ)ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#openapi-url) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
## OpenAPI ๋ฌธ์„œ URL { #openapi-docs-urls }
์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” URL์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#docs-urls){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” URL์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#docs-urls) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

30
docs/ko/docs/how-to/graphql.md

@ -18,18 +18,18 @@
๋‹ค์Œ์€ **ASGI** ์ง€์›์ด ์žˆ๋Š” **GraphQL** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ž…๋‹ˆ๋‹ค. **FastAPI**์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a> ๐Ÿ“
* <a href="https://strawberry.rocks/docs/integrations/fastapi" class="external-link" target="_blank">FastAPI์šฉ ๋ฌธ์„œ</a> ์ œ๊ณต
* <a href="https://ariadnegraphql.org/" class="external-link" target="_blank">Ariadne</a>
* <a href="https://ariadnegraphql.org/docs/fastapi-integration" class="external-link" target="_blank">FastAPI์šฉ ๋ฌธ์„œ</a> ์ œ๊ณต
* <a href="https://tartiflette.io/" class="external-link" target="_blank">Tartiflette</a>
* ASGI ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด <a href="https://tartiflette.github.io/tartiflette-asgi/" class="external-link" target="_blank">Tartiflette ASGI</a> ์‚ฌ์šฉ
* <a href="https://graphene-python.org/" class="external-link" target="_blank">Graphene</a>
* <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a> ์‚ฌ์šฉ
* [Strawberry](https://strawberry.rocks/) ๐Ÿ“
* [FastAPI์šฉ ๋ฌธ์„œ](https://strawberry.rocks/docs/integrations/fastapi) ์ œ๊ณต
* [Ariadne](https://ariadnegraphql.org/)
* [FastAPI์šฉ ๋ฌธ์„œ](https://ariadnegraphql.org/docs/fastapi-integration) ์ œ๊ณต
* [Tartiflette](https://tartiflette.io/)
* ASGI ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) ์‚ฌ์šฉ
* [Graphene](https://graphene-python.org/)
* [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ์‚ฌ์šฉ
## Strawberry๋กœ GraphQL ์‚ฌ์šฉํ•˜๊ธฐ { #graphql-with-strawberry }
**GraphQL**๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, <a href="https://strawberry.rocks/" class="external-link" target="_blank">**Strawberry**</a>๋ฅผ **๊ถŒ์žฅ**ํ•ฉ๋‹ˆ๋‹ค. **FastAPI**์˜ ์„ค๊ณ„์™€ ๊ฐ€์žฅ ๊ฐ€๊น๊ณ , ๋ชจ๋“  ๊ฒƒ์ด **type annotations**์— ๊ธฐ๋ฐ˜ํ•ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
**GraphQL**๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, [**Strawberry**](https://strawberry.rocks/)๋ฅผ **๊ถŒ์žฅ**ํ•ฉ๋‹ˆ๋‹ค. **FastAPI**์˜ ์„ค๊ณ„์™€ ๊ฐ€์žฅ ๊ฐ€๊น๊ณ , ๋ชจ๋“  ๊ฒƒ์ด **type annotations**์— ๊ธฐ๋ฐ˜ํ•ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ œ๊ฒŒ ๋ฌป๋Š”๋‹ค๋ฉด ์•„๋งˆ **Strawberry**๋ฅผ ๋จผ์ € ์‹œ๋„ํ•ด ๋ณด๋ผ๊ณ  ์ œ์•ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
@ -37,24 +37,24 @@
{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
<a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry ๋ฌธ์„œ</a>์—์„œ Strawberry์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[Strawberry ๋ฌธ์„œ](https://strawberry.rocks/)์—์„œ Strawberry์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ <a href="https://strawberry.rocks/docs/integrations/fastapi" class="external-link" target="_blank">FastAPI์—์„œ Strawberry ์‚ฌ์šฉ</a>์— ๋Œ€ํ•œ ๋ฌธ์„œ๋„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
๋˜ํ•œ [FastAPI์—์„œ Strawberry ์‚ฌ์šฉ](https://strawberry.rocks/docs/integrations/fastapi)์— ๋Œ€ํ•œ ๋ฌธ์„œ๋„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
## Starlette์˜ ์˜ˆ์ „ `GraphQLApp` { #older-graphqlapp-from-starlette }
์ด์ „ ๋ฒ„์ „์˜ Starlette์—๋Š” <a href="https://graphene-python.org/" class="external-link" target="_blank">Graphene</a>๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ `GraphQLApp` ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด์ „ ๋ฒ„์ „์˜ Starlette์—๋Š” [Graphene](https://graphene-python.org/)๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ `GraphQLApp` ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ Starlette์—์„œ deprecated ๋˜์—ˆ์ง€๋งŒ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  **๊ฑฐ์˜ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค**๋ฅผ ๊ฐ€์ง„ <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a>๋กœ ์‰ฝ๊ฒŒ **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ Starlette์—์„œ deprecated ๋˜์—ˆ์ง€๋งŒ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  **๊ฑฐ์˜ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค**๋ฅผ ๊ฐ€์ง„ [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3)๋กœ ์‰ฝ๊ฒŒ **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
GraphQL์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ปค์Šคํ…€ ํด๋ž˜์Šค์™€ ํƒ€์ž… ๋Œ€์‹  type annotations์— ๊ธฐ๋ฐ˜ํ•œ <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a>๋ฅผ ์—ฌ์ „ํžˆ ํ™•์ธํ•ด ๋ณด์‹œ๊ธธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
GraphQL์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ปค์Šคํ…€ ํด๋ž˜์Šค์™€ ํƒ€์ž… ๋Œ€์‹  type annotations์— ๊ธฐ๋ฐ˜ํ•œ [Strawberry](https://strawberry.rocks/)๋ฅผ ์—ฌ์ „ํžˆ ํ™•์ธํ•ด ๋ณด์‹œ๊ธธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
///
## ๋” ์•Œ์•„๋ณด๊ธฐ { #learn-more }
<a href="https://graphql.org/" class="external-link" target="_blank">๊ณต์‹ GraphQL ๋ฌธ์„œ</a>์—์„œ **GraphQL**์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[๊ณต์‹ GraphQL ๋ฌธ์„œ](https://graphql.org/)์—์„œ **GraphQL**์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ํ•ด๋‹น ๋งํฌ์—์„œ ๋” ์ž์„ธํžˆ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2
docs/ko/docs/how-to/index.md

@ -8,6 +8,6 @@
/// tip | ํŒ
**FastAPI๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ํ•™์Šต**ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(๊ถŒ์žฅ), ๋Œ€์‹  [ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../tutorial/index.md){.internal-link target=_blank}๋ฅผ ์žฅ๋ณ„๋กœ ์ฝ์–ด๋ณด์„ธ์š”.
**FastAPI๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ํ•™์Šต**ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(๊ถŒ์žฅ), ๋Œ€์‹  [ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../tutorial/index.md)๋ฅผ ์žฅ๋ณ„๋กœ ์ฝ์–ด๋ณด์„ธ์š”.
///

8
docs/ko/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md

@ -10,7 +10,7 @@ FastAPI 0.126.0 ๋ฒ„์ „์—์„œ๋Š” Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์ง€๋งŒ, `pydantic
/// warning | ๊ฒฝ๊ณ 
Pydantic ํŒ€์€ **Python 3.14**๋ถ€ํ„ฐ ์ตœ์‹  Python ๋ฒ„์ „์—์„œ Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
Pydantic ํŒ€์€ ์ตœ์‹  Python ๋ฒ„์ „์—์„œ Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์œผ๋ฉฐ, ์‹œ์ž‘ ๋ฒ„์ „์€ **Python 3.14**์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—๋Š” `pydantic.v1`๋„ ํฌํ•จ๋˜๋ฉฐ, Python 3.14 ์ด์ƒ์—์„œ๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@ -22,7 +22,7 @@ Pydantic v1์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ž˜๋œ FastAPI ์•ฑ์ด ์žˆ๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ๋Š” ์ด
## ๊ณต์‹ ๊ฐ€์ด๋“œ { #official-guide }
Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ <a href="https://docs.pydantic.dev/latest/migration/" class="external-link" target="_blank">๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ [๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ](https://docs.pydantic.dev/latest/migration/)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—๋Š” ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€, ๊ฒ€์ฆ์ด ์ด์ œ ์–ด๋–ป๊ฒŒ ๋” ์ •ํ™•ํ•˜๊ณ  ์—„๊ฒฉํ•ด์กŒ๋Š”์ง€, ๊ฐ€๋Šฅํ•œ ์ฃผ์˜์‚ฌํ•ญ ๋“ฑ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
@ -30,7 +30,7 @@ Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ <a href="https://docs.pydantic.dev/lates
## ํ…Œ์ŠคํŠธ { #tests }
์•ฑ์— ๋Œ€ํ•œ [ํ…Œ์ŠคํŠธ](../tutorial/testing.md){.internal-link target=_blank}๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ง€์†์  ํ†ตํ•ฉ(CI)์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
์•ฑ์— ๋Œ€ํ•œ [ํ…Œ์ŠคํŠธ](../tutorial/testing.md)๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ง€์†์  ํ†ตํ•ฉ(CI)์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ๋„ ๋ชจ๋“  ๊ฒƒ์ด ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๊ณ„์† ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -38,7 +38,7 @@ Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ <a href="https://docs.pydantic.dev/lates
๋งŽ์€ ๊ฒฝ์šฐ, ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์—†์ด ์ผ๋ฐ˜์ ์ธ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด Pydantic v1์—์„œ Pydantic v2๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ • ๋Œ€๋ถ€๋ถ„์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ™์€ Pydantic ํŒ€์ด ์ œ๊ณตํ•˜๋Š” <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ™์€ Pydantic ํŒ€์ด ์ œ๊ณตํ•˜๋Š” [`bump-pydantic`](https://github.com/pydantic/bump-pydantic)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋„๊ตฌ๋Š” ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์„ ์ž๋™์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

6
docs/ko/docs/how-to/testing-database.md

@ -1,7 +1,7 @@
# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #testing-a-database }
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, SQL, SQLModel์— ๋Œ€ํ•ด์„œ๋Š” <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ๋ฌธ์„œ</a>์—์„œ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, SQL, SQLModel์— ๋Œ€ํ•ด์„œ๋Š” [SQLModel ๋ฌธ์„œ](https://sqlmodel.tiangolo.com/)์—์„œ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
<a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">FastAPI์—์„œ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฏธ๋‹ˆ ํŠœํ† ๋ฆฌ์–ผ</a>๋„ ์žˆ์Šต๋‹ˆ๋‹ค. โœจ
[FastAPI์—์„œ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฏธ๋‹ˆ ํŠœํ† ๋ฆฌ์–ผ](https://sqlmodel.tiangolo.com/tutorial/fastapi/)๋„ ์žˆ์Šต๋‹ˆ๋‹ค. โœจ
ํ•ด๋‹น ํŠœํ† ๋ฆฌ์–ผ์—๋Š” <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/" class="external-link" target="_blank">SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ŠคํŠธ</a>์— ๋Œ€ํ•œ ์„น์…˜๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž
ํ•ด๋‹น ํŠœํ† ๋ฆฌ์–ผ์—๋Š” [SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ŠคํŠธ](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/)์— ๋Œ€ํ•œ ์„น์…˜๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž

Loadingโ€ฆ
Cancel
Save