Browse Source

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

pull/15170/head
github-actions[bot] 4 months ago
committed by Yurii Motov
parent
commit
da64149b36
  1. 18
      docs/ko/docs/_llm-test.md
  2. 50
      docs/ko/docs/alternatives.md
  3. 24
      docs/ko/docs/async.md
  4. 2
      docs/ko/docs/benchmarks.md
  5. 10
      docs/ko/docs/environment-variables.md
  6. 71
      docs/ko/docs/fastapi-cli.md
  7. 26
      docs/ko/docs/features.md
  8. 58
      docs/ko/docs/help-fastapi.md
  9. 14
      docs/ko/docs/history-design-future.md
  10. 122
      docs/ko/docs/index.md
  11. 2
      docs/ko/docs/project-generation.md
  12. 6
      docs/ko/docs/python-types.md
  13. 8
      docs/ko/docs/tutorial/background-tasks.md
  14. 47
      docs/ko/docs/tutorial/bigger-applications.md
  15. 2
      docs/ko/docs/tutorial/body-nested-models.md
  16. 6
      docs/ko/docs/tutorial/body-updates.md
  17. 10
      docs/ko/docs/tutorial/body.md
  18. 8
      docs/ko/docs/tutorial/cors.md
  19. 2
      docs/ko/docs/tutorial/debugging.md
  20. 4
      docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
  21. 32
      docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
  22. 6
      docs/ko/docs/tutorial/dependencies/global-dependencies.md
  23. 4
      docs/ko/docs/tutorial/dependencies/index.md
  24. 4
      docs/ko/docs/tutorial/encoder.md
  25. 4
      docs/ko/docs/tutorial/extra-data-types.md
  26. 6
      docs/ko/docs/tutorial/extra-models.md
  27. 75
      docs/ko/docs/tutorial/first-steps.md
  28. 2
      docs/ko/docs/tutorial/handling-errors.md
  29. 12
      docs/ko/docs/tutorial/index.md
  30. 14
      docs/ko/docs/tutorial/middleware.md
  31. 2
      docs/ko/docs/tutorial/path-operation-configuration.md
  32. 6
      docs/ko/docs/tutorial/path-params-numeric-validations.md
  33. 20
      docs/ko/docs/tutorial/path-params.md
  34. 4
      docs/ko/docs/tutorial/query-params-str-validations.md
  35. 2
      docs/ko/docs/tutorial/query-params.md
  36. 12
      docs/ko/docs/tutorial/request-files.md
  37. 4
      docs/ko/docs/tutorial/request-form-models.md
  38. 8
      docs/ko/docs/tutorial/request-forms-and-files.md
  39. 8
      docs/ko/docs/tutorial/request-forms.md
  40. 9
      docs/ko/docs/tutorial/response-model.md
  41. 6
      docs/ko/docs/tutorial/response-status-code.md
  42. 10
      docs/ko/docs/tutorial/schema-extra-example.md
  43. 10
      docs/ko/docs/tutorial/security/first-steps.md
  44. 10
      docs/ko/docs/tutorial/security/oauth2-jwt.md
  45. 2
      docs/ko/docs/tutorial/security/simple-oauth2.md
  46. 22
      docs/ko/docs/tutorial/sql-databases.md
  47. 4
      docs/ko/docs/tutorial/static-files.md
  48. 20
      docs/ko/docs/tutorial/testing.md
  49. 26
      docs/ko/docs/virtual-environments.md

18
docs/ko/docs/_llm-test.md

@ -11,7 +11,7 @@
* ๋ฒˆ์—ญ์—์„œ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. * ๋ฒˆ์—ญ์—์„œ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
* ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ, ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ, ๋˜๋Š” ์˜์–ด ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. * ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ, ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ, ๋˜๋Š” ์˜์–ด ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฒˆ์—ญ์—์„œ ๋‚จ์•„ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•ด ์ข‹์€ ๋ฒˆ์—ญ์ด ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. * ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฒˆ์—ญ์—์„œ ๋‚จ์•„ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•ด ์ข‹์€ ๋ฒˆ์—ญ์ด ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
* ์ข‹์€ ๋ฒˆ์—ญ์„ ๋‘” ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๊ฒฐ๊ณผ๋Š” LLM์ด ๋” ์ด์ƒ ๋ฒˆ์—ญ์— ๋ณ€๊ฒฝ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์™€ ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์„ ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค(๋•Œ๋•Œ๋กœ ๋ช‡ ๊ฐ€์ง€ seemingly random ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLM์€ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ</a>์ž…๋‹ˆ๋‹ค). * ์ข‹์€ ๋ฒˆ์—ญ์„ ๋‘” ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๊ฒฐ๊ณผ๋Š” LLM์ด ๋” ์ด์ƒ ๋ฒˆ์—ญ์— ๋ณ€๊ฒฝ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์™€ ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์„ ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค(๋•Œ๋•Œ๋กœ ๋ช‡ ๊ฐ€์ง€ seemingly random ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” [LLM์€ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ](https://doublespeak.chat/#/handbook#deterministic-output)์ž…๋‹ˆ๋‹ค).
ํ…Œ์ŠคํŠธ: ํ…Œ์ŠคํŠธ:
@ -169,15 +169,15 @@ works(foo="bar") # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
๋งํฌ ํ…์ŠคํŠธ๋Š” ๋ฒˆ์—ญ๋˜์–ด์•ผ ํ•˜๊ณ , ๋งํฌ ์ฃผ์†Œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค: ๋งํฌ ํ…์ŠคํŠธ๋Š” ๋ฒˆ์—ญ๋˜์–ด์•ผ ํ•˜๊ณ , ๋งํฌ ์ฃผ์†Œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค:
* [์œ„์˜ ์ œ๋ชฉ์œผ๋กœ ๊ฐ€๋Š” ๋งํฌ](#code-snippets) * [์œ„์˜ ์ œ๋ชฉ์œผ๋กœ ๊ฐ€๋Š” ๋งํฌ](#code-snippets)
* [๋‚ด๋ถ€ ๋งํฌ](index.md#installation){.internal-link target=_blank} * [๋‚ด๋ถ€ ๋งํฌ](index.md#installation)
* <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">์™ธ๋ถ€ ๋งํฌ</a> * [์™ธ๋ถ€ ๋งํฌ](https://sqlmodel.tiangolo.com/)
* <a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">์Šคํƒ€์ผ๋กœ ๊ฐ€๋Š” ๋งํฌ</a> * [์Šคํƒ€์ผ๋กœ ๊ฐ€๋Š” ๋งํฌ](https://fastapi.tiangolo.com/css/styles.css)
* <a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€๋Š” ๋งํฌ</a> * [์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€๋Š” ๋งํฌ](https://fastapi.tiangolo.com/js/logic.js)
* <a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">์ด๋ฏธ์ง€๋กœ ๊ฐ€๋Š” ๋งํฌ</a> * [์ด๋ฏธ์ง€๋กœ ๊ฐ€๋Š” ๋งํฌ](https://fastapi.tiangolo.com/img/foo.jpg)
๋งํฌ ํ…์ŠคํŠธ๋Š” ๋ฒˆ์—ญ๋˜์–ด์•ผ ํ•˜๊ณ , ๋งํฌ ์ฃผ์†Œ๋Š” ๋ฒˆ์—ญ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค: ๋งํฌ ํ…์ŠคํŠธ๋Š” ๋ฒˆ์—ญ๋˜์–ด์•ผ ํ•˜๊ณ , ๋งํฌ ์ฃผ์†Œ๋Š” ๋ฒˆ์—ญ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค:
* <a href="https://fastapi.tiangolo.com/ko/" class="external-link" target="_blank">FastAPI ๋งํฌ</a> * [FastAPI ๋งํฌ](https://fastapi.tiangolo.com/ko/)
//// ////
@ -259,8 +259,8 @@ works(foo="bar") # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
* ์—ฌ๋Ÿฌ๋ถ„ * ์—ฌ๋Ÿฌ๋ถ„
* ์—ฌ๋Ÿฌ๋ถ„์˜ * ์—ฌ๋Ÿฌ๋ถ„์˜
* ์˜ˆ: (e.g.) * ์˜ˆ:
* ๋“ฑ (etc.) * ๋“ฑ
* `foo`๋กœ์„œ์˜ `int` * `foo`๋กœ์„œ์˜ `int`
* `bar`๋กœ์„œ์˜ `str` * `bar`๋กœ์„œ์˜ `str`

50
docs/ko/docs/alternatives.md

@ -14,7 +14,7 @@
## ์ด์ „ ๋„๊ตฌ๋“ค { #previous-tools } ## ์ด์ „ ๋„๊ตฌ๋“ค { #previous-tools }
### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a> { #django } ### [Django](https://www.djangoproject.com/) { #django }
๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Python framework์ด๋ฉฐ ๋„๋ฆฌ ์‹ ๋ขฐ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Instagram ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Python framework์ด๋ฉฐ ๋„๋ฆฌ ์‹ ๋ขฐ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Instagram ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@ -22,7 +22,7 @@
๋ฐฑ์—”๋“œ์—์„œ HTML์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์ง€, ํ˜„๋Œ€์ ์ธ ํ”„๋ŸฐํŠธ์—”๋“œ(์˜ˆ: React, Vue.js, Angular)๋‚˜ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ(์˜ˆ: <abbr title="Internet of Things - ์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท">IoT</abbr> ๊ธฐ๊ธฐ)์—์„œ ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ HTML์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์ง€, ํ˜„๋Œ€์ ์ธ ํ”„๋ŸฐํŠธ์—”๋“œ(์˜ˆ: React, Vue.js, Angular)๋‚˜ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ(์˜ˆ: <abbr title="Internet of Things - ์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท">IoT</abbr> ๊ธฐ๊ธฐ)์—์„œ ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a> { #django-rest-framework } ### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
Django REST framework๋Š” Django๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Web API๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์œ ์—ฐํ•œ toolkit์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , Django์˜ API ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Django REST framework๋Š” Django๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Web API๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์œ ์—ฐํ•œ toolkit์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , Django์˜ API ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
@ -42,7 +42,7 @@ Django REST Framework๋Š” Tom Christie๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. **FastAPI**์˜ ๊ธฐ
/// ///
### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a> { #flask } ### [Flask](https://flask.palletsprojects.com) { #flask }
Flask๋Š” "microframework"๋กœ, Django์— ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ†ตํ•ฉ์ด๋‚˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Flask๋Š” "microframework"๋กœ, Django์— ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ†ตํ•ฉ์ด๋‚˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@ -64,7 +64,7 @@ micro-framework๊ฐ€ ๋˜๊ธฐ. ํ•„์š”ํ•œ ๋„๊ตฌ์™€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์กฐํ•ฉํ• 
/// ///
### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a> { #requests } ### [Requests](https://requests.readthedocs.io) { #requests }
**FastAPI**๋Š” ์‹ค์ œ๋กœ **Requests**์˜ ๋Œ€์•ˆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‘˜์˜ ๋ฒ”์œ„๋Š” ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. **FastAPI**๋Š” ์‹ค์ œ๋กœ **Requests**์˜ ๋Œ€์•ˆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‘˜์˜ ๋ฒ”์œ„๋Š” ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
@ -106,7 +106,7 @@ def read_url():
/// ///
### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a> { #swagger-openapi } ### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi }
์ œ๊ฐ€ Django REST Framework์—์„œ ๊ฐ€์žฅ ์›ํ–ˆ๋˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ์ž๋™ API ๋ฌธ์„œํ™”์˜€์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ Django REST Framework์—์„œ ๊ฐ€์žฅ ์›ํ–ˆ๋˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ์ž๋™ API ๋ฌธ์„œํ™”์˜€์Šต๋‹ˆ๋‹ค.
@ -124,8 +124,8 @@ def read_url():
๋˜ํ•œ ํ‘œ์ค€ ๊ธฐ๋ฐ˜์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ: ๋˜ํ•œ ํ‘œ์ค€ ๊ธฐ๋ฐ˜์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ:
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> * [Swagger UI](https://github.com/swagger-api/swagger-ui)
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> * [ReDoc](https://github.com/Rebilly/ReDoc)
์ด ๋‘ ๊ฐ€์ง€๋Š” ๊ฝค ๋Œ€์ค‘์ ์ด๊ณ  ์•ˆ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ„๋‹จํžˆ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด OpenAPI๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ UI๊ฐ€ ์ˆ˜์‹ญ ๊ฐ€์ง€๋‚˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(**FastAPI**์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด ๋‘ ๊ฐ€์ง€๋Š” ๊ฝค ๋Œ€์ค‘์ ์ด๊ณ  ์•ˆ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ„๋‹จํžˆ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด OpenAPI๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ UI๊ฐ€ ์ˆ˜์‹ญ ๊ฐ€์ง€๋‚˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(**FastAPI**์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
@ -135,7 +135,7 @@ def read_url():
Flask REST framework๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ์ง€๋งŒ, ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์กฐ์‚ฌํ•ด ๋ณธ ๊ฒฐ๊ณผ, ์ƒ๋‹น์ˆ˜๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฐฉ์น˜๋˜์–ด ์žˆ์—ˆ๊ณ , ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ด์Šˆ ๋•Œ๋ฌธ์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. Flask REST framework๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ์ง€๋งŒ, ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์กฐ์‚ฌํ•ด ๋ณธ ๊ฒฐ๊ณผ, ์ƒ๋‹น์ˆ˜๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฐฉ์น˜๋˜์–ด ์žˆ์—ˆ๊ณ , ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ด์Šˆ ๋•Œ๋ฌธ์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> { #marshmallow } ### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
API ์‹œ์Šคํ…œ์— ํ•„์š”ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ "<dfn title="๋งˆ์ƒฌ๋ง, ๋ณ€ํ™˜์ด๋ผ๊ณ ๋„ ํ•จ">์ง๋ ฌํ™”</dfn>"์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ(Python)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ JSON ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, `datetime` ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. API ์‹œ์Šคํ…œ์— ํ•„์š”ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ "<dfn title="๋งˆ์ƒฌ๋ง, ๋ณ€ํ™˜์ด๋ผ๊ณ ๋„ ํ•จ">์ง๋ ฌํ™”</dfn>"์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ(Python)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ JSON ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, `datetime` ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
@ -153,7 +153,7 @@ API์— ๋˜ ํ•˜๋‚˜ ํฌ๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์ž…๋‹ˆ๋‹ค. ํŠน์ •
/// ///
### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> { #webargs } ### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs }
API์— ํ•„์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ํฐ ๊ธฐ๋Šฅ์€ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ <dfn title="์ฝ์–ด์„œ Python ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ">ํŒŒ์‹ฑ</dfn>ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. API์— ํ•„์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ํฐ ๊ธฐ๋Šฅ์€ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ <dfn title="์ฝ์–ด์„œ Python ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ">ํŒŒ์‹ฑ</dfn>ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
@ -175,7 +175,7 @@ Webargs๋Š” Marshmallow์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
/// ///
### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a> { #apispec } ### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec }
Marshmallow์™€ Webargs๋Š” plug-in ํ˜•ํƒœ๋กœ ๊ฒ€์ฆ, parsing, serialization์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Marshmallow์™€ Webargs๋Š” plug-in ํ˜•ํƒœ๋กœ ๊ฒ€์ฆ, parsing, serialization์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
@ -205,7 +205,7 @@ API๋ฅผ ์œ„ํ•œ ์—ด๋ฆฐ ํ‘œ์ค€์ธ OpenAPI๋ฅผ ์ง€์›ํ•˜๊ธฐ.
/// ///
### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a> { #flask-apispec } ### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec }
Flask plug-in์œผ๋กœ, Webargs, Marshmallow, APISpec์„ ๋ฌถ์–ด์ค๋‹ˆ๋‹ค. Flask plug-in์œผ๋กœ, Webargs, Marshmallow, APISpec์„ ๋ฌถ์–ด์ค๋‹ˆ๋‹ค.
@ -219,9 +219,9 @@ Flask + Flask-apispec + Marshmallow + Webargs ์กฐํ•ฉ์€ **FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ
์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ Flask full-stack generator๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ์ง€๊ธˆ๊นŒ์ง€ ์ €(๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์™ธ๋ถ€ ํŒ€)๊ฐ€ ์‚ฌ์šฉํ•ด ์˜จ ์ฃผ์š” stack์ž…๋‹ˆ๋‹ค: ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ Flask full-stack generator๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ์ง€๊ธˆ๊นŒ์ง€ ์ €(๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์™ธ๋ถ€ ํŒ€)๊ฐ€ ์‚ฌ์šฉํ•ด ์˜จ ์ฃผ์š” stack์ž…๋‹ˆ๋‹ค:
* <a href="https://github.com/tiangolo/full-stack" class="external-link" target="_blank">https://github.com/tiangolo/full-stack</a> * [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack)
* <a href="https://github.com/tiangolo/full-stack-flask-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchbase</a> * [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
* <a href="https://github.com/tiangolo/full-stack-flask-couchdb" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchdb</a> * [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
๊ทธ๋ฆฌ๊ณ  ์ด ๋™์ผํ•œ full-stack generator๋“ค์ด [**FastAPI** Project Generators](project-generation.md){.internal-link target=_blank}์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋™์ผํ•œ full-stack generator๋“ค์ด [**FastAPI** Project Generators](project-generation.md){.internal-link target=_blank}์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
@ -237,7 +237,7 @@ serialization๊ณผ validation์„ ์ •์˜ํ•˜๋Š” ๋™์ผํ•œ ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ OpenAPI sc
/// ///
### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (๊ทธ๋ฆฌ๊ณ  <a href="https://angular.io/" class="external-link" target="_blank">Angular</a>) { #nestjs-and-angular } ### [NestJS](https://nestjs.com/) (๊ทธ๋ฆฌ๊ณ  [Angular](https://angular.io/)) { #nestjs-and-angular }
์ด๊ฑด Python๋„ ์•„๋‹™๋‹ˆ๋‹ค. NestJS๋Š” Angular์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ JavaScript(TypeScript) NodeJS framework์ž…๋‹ˆ๋‹ค. ์ด๊ฑด Python๋„ ์•„๋‹™๋‹ˆ๋‹ค. NestJS๋Š” Angular์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ JavaScript(TypeScript) NodeJS framework์ž…๋‹ˆ๋‹ค.
@ -259,13 +259,13 @@ Python ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋›ฐ์–ด๋‚œ ์—๋””ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ.
/// ///
### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a> { #sanic } ### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic }
`asyncio` ๊ธฐ๋ฐ˜์˜ ๋งค์šฐ ๋น ๋ฅธ Python framework ์ค‘ ์ดˆ๊ธฐ ์‚ฌ๋ก€์˜€์Šต๋‹ˆ๋‹ค. Flask์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. `asyncio` ๊ธฐ๋ฐ˜์˜ ๋งค์šฐ ๋น ๋ฅธ Python framework ์ค‘ ์ดˆ๊ธฐ ์‚ฌ๋ก€์˜€์Šต๋‹ˆ๋‹ค. Flask์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
๊ธฐ๋ณธ Python `asyncio` ๋ฃจํ”„ ๋Œ€์‹  <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a>๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“  ์š”์ธ์ž…๋‹ˆ๋‹ค. [`uvloop`](https://github.com/MagicStack/uvloop)๋ฅผ ๊ธฐ๋ณธ Python `asyncio` ๋ฃจํ”„ ๋Œ€์‹  ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“  ์š”์ธ์ž…๋‹ˆ๋‹ค.
์ด๋Š” Uvicorn๊ณผ Starlette์— ๋ช…ํ™•ํžˆ ์˜๊ฐ์„ ์ฃผ์—ˆ๊ณ , ํ˜„์žฌ ๊ณต๊ฐœ benchmark์—์„œ๋Š” ์ด ๋‘˜์ด Sanic๋ณด๋‹ค ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” Uvicorn๊ณผ Starlette์— ๋ช…ํ™•ํžˆ ์˜๊ฐ์„ ์ฃผ์—ˆ๊ณ , ํ˜„์žฌ ๊ณต๊ฐœ benchmark์—์„œ๋Š” ์ด ๋‘˜์ด Sanic๋ณด๋‹ค ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.
@ -279,7 +279,7 @@ Python ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋›ฐ์–ด๋‚œ ์—๋””ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ.
/// ///
### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> { #falcon } ### [Falcon](https://falconframework.org/) { #falcon }
Falcon์€ ๋˜ ๋‹ค๋ฅธ ๊ณ ์„ฑ๋Šฅ Python framework๋กœ, ์ตœ์†Œํ•œ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ณ  Hug ๊ฐ™์€ ๋‹ค๋ฅธ framework์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. Falcon์€ ๋˜ ๋‹ค๋ฅธ ๊ณ ์„ฑ๋Šฅ Python framework๋กœ, ์ตœ์†Œํ•œ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ณ  Hug ๊ฐ™์€ ๋‹ค๋ฅธ framework์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
@ -297,7 +297,7 @@ Hug(= Falcon ๊ธฐ๋ฐ˜)๊ณผ ํ•จ๊ป˜, ํ•จ์ˆ˜์—์„œ `response` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ ์–ธ
/// ///
### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> { #molten } ### [Molten](https://moltenframework.com/) { #molten }
**FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•œ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ Molten์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฝค ๋น„์Šทํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ–๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค: **FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•œ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ Molten์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฝค ๋น„์Šทํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ–๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:
@ -321,7 +321,7 @@ Route๋Š” ํ•œ ๊ณณ์—์„œ ์„ ์–ธํ•˜๊ณ , ๋‹ค๋ฅธ ๊ณณ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ
/// ///
### <a href="https://github.com/hugapi/hug" class="external-link" target="_blank">Hug</a> { #hug } ### [Hug](https://github.com/hugapi/hug) { #hug }
Hug๋Š” Python type hints๋ฅผ ์‚ฌ์šฉํ•ด API ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ดˆ๊ธฐ framework ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๋„ ๊ฐ™์€ ๋ฐฉ์‹์„ ํ•˜๋„๋ก ์˜๊ฐ์„ ์ค€ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค. Hug๋Š” Python type hints๋ฅผ ์‚ฌ์šฉํ•ด API ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ดˆ๊ธฐ framework ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๋„ ๊ฐ™์€ ๋ฐฉ์‹์„ ํ•˜๋„๋ก ์˜๊ฐ์„ ์ค€ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค.
@ -337,7 +337,7 @@ OpenAPI๋‚˜ JSON Schema ๊ฐ™์€ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—
/// info | ์ •๋ณด /// info | ์ •๋ณด
Hug๋Š” Timothy Crosley๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Python ํŒŒ์ผ์—์„œ import๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ธ <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>์˜ ์ œ์ž‘์ž์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. Hug๋Š” Timothy Crosley๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Python ํŒŒ์ผ์—์„œ import๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ธ [`isort`](https://github.com/timothycrosley/isort)์˜ ์ œ์ž‘์ž์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
/// ///
@ -351,7 +351,7 @@ Hug๋Š” ํ—ค๋”์™€ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜์— `response` ํŒŒ๋ผ๋ฏธํ„ฐ
/// ///
### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (<= 0.5) { #apistar-0-5 } ### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 }
**FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์ง์ „์— **APIStar** ์„œ๋ฒ„๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐพ๊ณ  ์žˆ๋˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์—ˆ๊ณ  ์„ค๊ณ„๋„ ํ›Œ๋ฅญํ–ˆ์Šต๋‹ˆ๋‹ค. **FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์ง์ „์— **APIStar** ์„œ๋ฒ„๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐพ๊ณ  ์žˆ๋˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์—ˆ๊ณ  ์„ค๊ณ„๋„ ํ›Œ๋ฅญํ–ˆ์Šต๋‹ˆ๋‹ค.
@ -401,7 +401,7 @@ APIStar๋Š” Tom Christie๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๋งŒ๋“  ์‚ฌ๋žŒ๊ณผ ๋™์ผ
## **FastAPI**๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ { #used-by-fastapi } ## **FastAPI**๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ { #used-by-fastapi }
### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> { #pydantic } ### [Pydantic](https://docs.pydantic.dev/) { #pydantic }
Pydantic์€ Python type hints๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, serialization, ๋ฌธ์„œํ™”(JSON Schema ์‚ฌ์šฉ)๋ฅผ ์ •์˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Pydantic์€ Python type hints๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, serialization, ๋ฌธ์„œํ™”(JSON Schema ์‚ฌ์šฉ)๋ฅผ ์ •์˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
@ -417,7 +417,7 @@ Marshmallow์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ benchmark์—์„œ Marshmallow๋ณด
/// ///
### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette } ### [Starlette](https://www.starlette.dev/) { #starlette }
Starlette๋Š” ๊ฒฝ๋Ÿ‰ <dfn title="๋น„๋™๊ธฐ Python ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํ‘œ์ค€">ASGI</dfn> framework/toolkit์œผ๋กœ, ๊ณ ์„ฑ๋Šฅ asyncio ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. Starlette๋Š” ๊ฒฝ๋Ÿ‰ <dfn title="๋น„๋™๊ธฐ Python ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํ‘œ์ค€">ASGI</dfn> framework/toolkit์œผ๋กœ, ๊ณ ์„ฑ๋Šฅ asyncio ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.
@ -462,7 +462,7 @@ ASGI๋Š” Django ์ฝ”์–ด ํŒ€ ๋ฉค๋ฒ„๋“ค์ด ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒˆ๋กœ์šด "ํ‘œ์ค€"์ž…๋‹ˆ๋‹ค
/// ///
### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a> { #uvicorn } ### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn }
Uvicorn์€ uvloop๊ณผ httptools๋กœ ๊ตฌ์ถ•๋œ ์ดˆ๊ณ ์† ASGI ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. Uvicorn์€ uvloop๊ณผ httptools๋กœ ๊ตฌ์ถ•๋œ ์ดˆ๊ณ ์† ASGI ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

24
docs/ko/docs/async.md

@ -141,7 +141,7 @@ def results():
/// info | ์ •๋ณด /// info | ์ •๋ณด
์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. ๐ŸŽจ ์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). ๐ŸŽจ
/// ///
@ -207,7 +207,7 @@ def results():
/// info | ์ •๋ณด /// info | ์ •๋ณด
์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. ๐ŸŽจ ์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). ๐ŸŽจ
/// ///
@ -251,7 +251,7 @@ def results():
๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด **FastAPI**๋กœ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด **FastAPI**๋กœ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ์„ฑ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๋œ NodeJS ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์–ป๊ณ , C์— ๋” ๊ฐ€๊นŒ์šด ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go์™€ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(๋ชจ๋‘ Starlette ๋•๋ถ„์ž…๋‹ˆ๋‹ค)</a>. ๋˜ํ•œ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ์„ฑ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๋œ NodeJS ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์–ป๊ณ , C์— ๋” ๊ฐ€๊นŒ์šด ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go์™€ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [(๋ชจ๋‘ Starlette ๋•๋ถ„์ž…๋‹ˆ๋‹ค)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1).
### ๋™์‹œ์„ฑ์ด ๋ณ‘๋ ฌ์„ฑ๋ณด๋‹ค ๋” ๋‚˜์€๊ฐ€์š”? { #is-concurrency-better-than-parallelism } ### ๋™์‹œ์„ฑ์ด ๋ณ‘๋ ฌ์„ฑ๋ณด๋‹ค ๋” ๋‚˜์€๊ฐ€์š”? { #is-concurrency-better-than-parallelism }
@ -298,7 +298,7 @@ CPU bound ์ž‘์—…์˜ ํ”ํ•œ ์˜ˆ์‹œ๋Š” ๋ณต์žกํ•œ ์ˆ˜ํ•™ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค
์ด๊ฒƒ์€ ํŒŒ์ด์ฌ์ด **๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค**, ๋จธ์‹ ๋Ÿฌ๋‹, ํŠนํžˆ ๋”ฅ๋Ÿฌ๋‹์˜ ์ฃผ์š” ์–ธ์–ด๋ผ๋Š” ๋‹จ์ˆœํ•œ ์‚ฌ์‹ค๊ณผ ๋”ํ•ด์ ธ, FastAPI๋ฅผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค/๋จธ์‹ ๋Ÿฌ๋‹ ์›น API ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๊ทธ ์™ธ์—๋„ ๋งŽ์€ ๊ฒƒ๋“ค)์— ๋งค์šฐ ์ž˜ ๋งž๋Š” ์„ ํƒ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŒŒ์ด์ฌ์ด **๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค**, ๋จธ์‹ ๋Ÿฌ๋‹, ํŠนํžˆ ๋”ฅ๋Ÿฌ๋‹์˜ ์ฃผ์š” ์–ธ์–ด๋ผ๋Š” ๋‹จ์ˆœํ•œ ์‚ฌ์‹ค๊ณผ ๋”ํ•ด์ ธ, FastAPI๋ฅผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค/๋จธ์‹ ๋Ÿฌ๋‹ ์›น API ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๊ทธ ์™ธ์—๋„ ๋งŽ์€ ๊ฒƒ๋“ค)์— ๋งค์šฐ ์ž˜ ๋งž๋Š” ์„ ํƒ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
ํ”„๋กœ๋•์…˜์—์„œ ์ด ๋ณ‘๋ ฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด [๋ฐฐํฌ](deployment/index.md){.internal-link target=_blank} ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”. ํ”„๋กœ๋•์…˜์—์„œ ์ด ๋ณ‘๋ ฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด [๋ฐฐํฌ](deployment/index.md) ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
## `async`์™€ `await` { #async-and-await } ## `async`์™€ `await` { #async-and-await }
@ -363,13 +363,13 @@ async def read_burgers():
### ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ { #write-your-own-async-code } ### ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ { #write-your-own-async-code }
Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a>์™€ <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> ๋ชจ๋‘์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” [AnyIO](https://anyio.readthedocs.io/en/stable/)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ [asyncio](https://docs.python.org/3/library/asyncio-task.html)์™€ [Trio](https://trio.readthedocs.io/en/stable/) ๋ชจ๋‘์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
ํŠนํžˆ, ์ฝ”๋“œ์—์„œ ๋” ๊ณ ๊ธ‰ ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ๋™์‹œ์„ฑ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์ง์ ‘ <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์ฝ”๋“œ์—์„œ ๋” ๊ณ ๊ธ‰ ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ๋™์‹œ์„ฑ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์ง์ ‘ [AnyIO](https://anyio.readthedocs.io/en/stable/)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๊ทธ ์ด์ (์˜ˆ: *structured concurrency*)์„ ์–ป๊ธฐ ์œ„ํ•ด <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋กœ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๊ทธ ์ด์ (์˜ˆ: *structured concurrency*)์„ ์–ป๊ธฐ ์œ„ํ•ด [AnyIO](https://anyio.readthedocs.io/en/stable/)๋กœ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ €๋Š” AnyIO ์œ„์— ์–‡์€ ๋ ˆ์ด์–ด๋กœ ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ์กฐ๊ธˆ ๊ฐœ์„ ํ•˜๊ณ  ๋” ๋‚˜์€ **์ž๋™์™„์„ฑ**, **์ธ๋ผ์ธ ์˜ค๋ฅ˜** ๋“ฑ์„ ์–ป๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ **์ดํ•ด**ํ•˜๊ณ  **์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ**๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋•๋Š” ์นœ์ ˆํ•œ ์†Œ๊ฐœ์™€ ํŠœํ† ๋ฆฌ์–ผ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: <a href="https://asyncer.tiangolo.com/" class="external-link" target="_blank">Asyncer</a>. ํŠนํžˆ **async ์ฝ”๋“œ์™€ ์ผ๋ฐ˜**(blocking/๋™๊ธฐ) ์ฝ”๋“œ๋ฅผ **๊ฒฐํ•ฉ**ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” AnyIO ์œ„์— ์–‡์€ ๋ ˆ์ด์–ด๋กœ ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ์กฐ๊ธˆ ๊ฐœ์„ ํ•˜๊ณ  ๋” ๋‚˜์€ **์ž๋™์™„์„ฑ**, **์ธ๋ผ์ธ ์˜ค๋ฅ˜** ๋“ฑ์„ ์–ป๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ **์ดํ•ด**ํ•˜๊ณ  **์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ**๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋•๋Š” ์นœ์ ˆํ•œ ์†Œ๊ฐœ์™€ ํŠœํ† ๋ฆฌ์–ผ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: [Asyncer](https://asyncer.tiangolo.com/). ํŠนํžˆ **async ์ฝ”๋“œ์™€ ์ผ๋ฐ˜**(blocking/๋™๊ธฐ) ์ฝ”๋“œ๋ฅผ **๊ฒฐํ•ฉ**ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
### ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ํ˜•ํƒœ { #other-forms-of-asynchronous-code } ### ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ํ˜•ํƒœ { #other-forms-of-asynchronous-code }
@ -381,7 +381,7 @@ Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” <a href="https://anyio.readthedocs.io/en/sta
ํ•˜์ง€๋งŒ ๊ทธ ์ด์ „์—๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ด์ „์—๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
์ด์ „ ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ๋˜๋Š” <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•˜๊ณ , ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ๋˜๋Š” [Gevent](https://www.gevent.org/)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•˜๊ณ , ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
์ด์ „ ๋ฒ„์ „์˜ NodeJS/๋ธŒ๋ผ์šฐ์ € JavaScript์—์„œ๋Š” "callback"์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” "callback hell"๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์˜ NodeJS/๋ธŒ๋ผ์šฐ์ € JavaScript์—์„œ๋Š” "callback"์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” "callback hell"๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
@ -419,15 +419,15 @@ Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” <a href="https://anyio.readthedocs.io/en/sta
์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ async ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์žˆ๊ณ , ์•„์ฃผ ์ž‘์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ(์•ฝ 100 ๋‚˜๋…ธ์ดˆ)์„ ์œ„ํ•ด ๊ณ„์‚ฐ๋งŒ ํ•˜๋Š” ์‚ฌ์†Œํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ ์ผ๋ฐ˜ `def`๋กœ ์ •์˜ํ•˜๊ณค ํ–ˆ๋‹ค๋ฉด, **FastAPI**์—์„œ๋Š” ๊ทธ ํšจ๊ณผ๊ฐ€ ์ •๋ฐ˜๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ๋ธ”๋กœํ‚น <abbr title="Input/Output - ์ž…๋ ฅ/์ถœ๋ ฅ: ๋””์Šคํฌ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ .">I/O</abbr> ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ `async def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ async ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์žˆ๊ณ , ์•„์ฃผ ์ž‘์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ(์•ฝ 100 ๋‚˜๋…ธ์ดˆ)์„ ์œ„ํ•ด ๊ณ„์‚ฐ๋งŒ ํ•˜๋Š” ์‚ฌ์†Œํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ ์ผ๋ฐ˜ `def`๋กœ ์ •์˜ํ•˜๊ณค ํ–ˆ๋‹ค๋ฉด, **FastAPI**์—์„œ๋Š” ๊ทธ ํšจ๊ณผ๊ฐ€ ์ •๋ฐ˜๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ๋ธ”๋กœํ‚น <abbr title="Input/Output - ์ž…๋ ฅ/์ถœ๋ ฅ: ๋””์Šคํฌ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ .">I/O</abbr> ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ `async def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, **FastAPI**๋Š” ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค [์—ฌ์ „ํžˆ ๋” ๋น ๋ฅผ](index.md#performance){.internal-link target=_blank} ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ตœ์†Œํ•œ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿผ์—๋„ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, **FastAPI**๋Š” ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค [์—ฌ์ „ํžˆ ๋” ๋น ๋ฅผ](index.md#performance) ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ตœ์†Œํ•œ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค).
### ์˜์กด์„ฑ { #dependencies } ### ์˜์กด์„ฑ { #dependencies }
[์˜์กด์„ฑ](tutorial/dependencies/index.md){.internal-link target=_blank}์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด `async def` ๋Œ€์‹  ํ‘œ์ค€ `def` ํ•จ์ˆ˜๋ผ๋ฉด, ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. [์˜์กด์„ฑ](tutorial/dependencies/index.md)์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด `async def` ๋Œ€์‹  ํ‘œ์ค€ `def` ํ•จ์ˆ˜๋ผ๋ฉด, ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
### ํ•˜์œ„ ์˜์กด์„ฑ { #sub-dependencies } ### ํ•˜์œ„ ์˜์กด์„ฑ { #sub-dependencies }
์„œ๋กœ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜์กด์„ฑ๊ณผ [ํ•˜์œ„ ์˜์กด์„ฑ](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}์„ ํ•จ์ˆ˜ ์ •์˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” `async def`๋กœ, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ •์ƒ ๋™์ž‘ํ•˜๋ฉฐ, ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ๋“ค์€ "await"๋˜๋Š” ๋Œ€์‹  (์Šค๋ ˆ๋“œํ’€์—์„œ) ์™ธ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์„œ๋กœ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜์กด์„ฑ๊ณผ [ํ•˜์œ„ ์˜์กด์„ฑ](tutorial/dependencies/sub-dependencies.md)์„ ํ•จ์ˆ˜ ์ •์˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” `async def`๋กœ, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ •์ƒ ๋™์ž‘ํ•˜๋ฉฐ, ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ๋“ค์€ "await"๋˜๋Š” ๋Œ€์‹  (์Šค๋ ˆ๋“œํ’€์—์„œ) ์™ธ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
### ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ { #other-utility-functions } ### ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ { #other-utility-functions }

2
docs/ko/docs/benchmarks.md

@ -1,6 +1,6 @@
# ๋ฒค์น˜๋งˆํฌ { #benchmarks } # ๋ฒค์น˜๋งˆํฌ { #benchmarks }
๋…๋ฆฝ์ ์ธ TechEmpower ๋ฒค์น˜๋งˆํฌ์— ๋”ฐ๋ฅด๋ฉด **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Uvicorn์„ ์‚ฌ์šฉํ•˜์—ฌ <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜</a>๋กœ ์‹คํ–‰๋˜๋ฉฐ, Starlette์™€ Uvicorn ์ž์ฒด(๋‚ด๋ถ€์ ์œผ๋กœ FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ)๋ณด๋‹ค ์กฐ๊ธˆ ์•„๋ž˜์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋…๋ฆฝ์ ์ธ TechEmpower ๋ฒค์น˜๋งˆํฌ์— ๋”ฐ๋ฅด๋ฉด **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Uvicorn์„ ์‚ฌ์šฉํ•˜์—ฌ [์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7)๋กœ ์‹คํ–‰๋˜๋ฉฐ, Starlette์™€ Uvicorn ์ž์ฒด(๋‚ด๋ถ€์ ์œผ๋กœ FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ)๋ณด๋‹ค ์กฐ๊ธˆ ์•„๋ž˜์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋ฒค์น˜๋งˆํฌ์™€ ๋น„๊ต๋ฅผ ํ™•์ธํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒค์น˜๋งˆํฌ์™€ ๋น„๊ต๋ฅผ ํ™•์ธํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

10
docs/ko/docs/environment-variables.md

@ -65,7 +65,7 @@ print(f"Hello {name} from Python")
/// tip | ํŒ /// tip | ํŒ
<a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐ˜ํ™˜ํ•  ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐ˜ํ™˜ํ•  ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ `None`์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ `"World"`๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ `None`์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ `"World"`๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
@ -153,7 +153,7 @@ Hello World from Python
/// tip | ํŒ /// tip | ํŒ
<a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a> ์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [The Twelve-Factor App: Config](https://12factor.net/config) ์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -163,7 +163,7 @@ Hello World from Python
์ฆ‰, ํŒŒ์ด์ฌ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ ์ฝ์€ **๋ชจ๋“  ๊ฐ’**์€ **`str`**์ด ๋˜๊ณ , ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ์˜ ๋ณ€ํ™˜์ด๋‚˜ ๊ฒ€์ฆ์€ ์ฝ”๋“œ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํŒŒ์ด์ฌ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ ์ฝ์€ **๋ชจ๋“  ๊ฐ’**์€ **`str`**์ด ๋˜๊ณ , ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ์˜ ๋ณ€ํ™˜์ด๋‚˜ ๊ฒ€์ฆ์€ ์ฝ”๋“œ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
**์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ - ์„ค์ • ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜](./advanced/settings.md){.internal-link target=_blank} ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ - ์„ค์ • ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜](./advanced/settings.md) ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜ { #path-environment-variable } ## `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜ { #path-environment-variable }
@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python
//// ////
์ด ์ •๋ณด๋Š” [๊ฐ€์ƒ ํ™˜๊ฒฝ](virtual-environments.md){.internal-link target=_blank} ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๋•Œ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋Š” [๊ฐ€์ƒ ํ™˜๊ฒฝ](virtual-environments.md) ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๋•Œ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
## ๊ฒฐ๋ก  { #conclusion } ## ๊ฒฐ๋ก  { #conclusion }
์ด ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด **ํ™˜๊ฒฝ ๋ณ€์ˆ˜**๊ฐ€ ๋ฌด์—‡์ด๊ณ  ํŒŒ์ด์ฌ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜์…จ์„ ๊ฒ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด **ํ™˜๊ฒฝ ๋ณ€์ˆ˜**๊ฐ€ ๋ฌด์—‡์ด๊ณ  ํŒŒ์ด์ฌ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜์…จ์„ ๊ฒ๋‹ˆ๋‹ค.
๋˜ํ•œ <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ„ํ‚คํ”ผ๋””์•„</a>์—์„œ ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ [ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ„ํ‚คํ”ผ๋””์•„](https://en.wikipedia.org/wiki/Environment_variable)์—์„œ ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŽ์€ ๊ฒฝ์šฐ์—์„œ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•˜๊ณ  ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ๋ฐ”๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ณ„์† ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒฝ์šฐ์—์„œ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•˜๊ณ  ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ๋ฐ”๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ณ„์† ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

@ -1,15 +1,15 @@
# FastAPI CLI { #fastapi-cli } # FastAPI CLI { #fastapi-cli }
**FastAPI CLI**๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น™ํ•˜๊ณ , FastAPI ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. **FastAPI <abbr title="command line interface - ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค">CLI</abbr>**๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น™ํ•˜๊ณ , FastAPI ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
FastAPI๋ฅผ ์„ค์น˜ํ•  ๋•Œ(์˜ˆ: `pip install "fastapi[standard]"`), `fastapi-cli`๋ผ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด ํŒจํ‚ค์ง€๋Š” ํ„ฐ๋ฏธ๋„์—์„œ `fastapi` ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด(์˜ˆ: `pip install "fastapi[standard]"`) ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์ด ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์šฉ์œผ๋กœ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด `fastapi dev` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๊ฐœ๋ฐœ์šฉ์œผ๋กœ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด `fastapi dev` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
<div class="termy"> <div class="termy">
```console ```console
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u> $ <font color="#4E9A06">fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ๐Ÿš€ <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ๐Ÿš€
@ -46,13 +46,66 @@ $ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid
</div> </div>
`fastapi`๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์€ **FastAPI CLI**์ž…๋‹ˆ๋‹ค. /// tip | ํŒ
ํ”„๋กœ๋•์…˜์—์„œ๋Š” `fastapi dev` ๋Œ€์‹  `fastapi run`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€
///
๋‚ด๋ถ€์ ์œผ๋กœ **FastAPI CLI**๋Š” ๊ณ ์„ฑ๋Šฅ์˜, ํ”„๋กœ๋•์…˜์— ์ ํ•ฉํ•œ ASGI ์„œ๋ฒ„์ธ [Uvicorn](https://www.uvicorn.dev)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
`fastapi` CLI๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•  FastAPI ์•ฑ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. `main.py` ํŒŒ์ผ ์•ˆ์˜ `app`์ด๋ผ๋Š” ๊ฐ์ฒด(๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณ€ํ˜•)๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•  ์•ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
## `pyproject.toml`์—์„œ ์•ฑ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
`pyproject.toml` ํŒŒ์ผ์—์„œ ์•ฑ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```toml
[tool.fastapi]
entrypoint = "main:app"
```
์ด `entrypoint`๋Š” `fastapi` ๋ช…๋ น์–ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฑ์„ ์ž„ํฌํŠธํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค:
```python
from main import app
```
FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ๋ฐ›์•„ `FastAPI` ์ธ์Šคํ„ด์Šค(์ผ๋ฐ˜์ ์œผ๋กœ `app`์œผ๋กœ ์ด๋ฆ„์„ ๋ถ™์ž„)๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅธ ์ž„ํฌํŠธ ๊ณผ์ •์„ ๊ฒฐ์ •ํ•œ ๋‹ค์Œ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด:
```
.
โ”œโ”€โ”€ backend
โ”‚ย ย  โ”œโ”€โ”€ main.py
โ”‚ย ย  โ”œโ”€โ”€ __init__.py
```
`entrypoint`๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:
```toml
[tool.fastapi]
entrypoint = "backend.main:app"
```
์ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค:
```python
from backend.main import app
```
### ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ `fastapi dev` { #fastapi-dev-with-path }
`fastapi dev` ๋ช…๋ น์–ด์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉํ•  FastAPI ์•ฑ ๊ฐ์ฒด๋ฅผ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค:
```console
$ fastapi dev main.py
```
ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋Œ€์‹  `fastapi run`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€ ํ•˜์ง€๋งŒ ๋งค๋ฒˆ `fastapi` ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๋ถ€์ ์œผ๋กœ **FastAPI CLI**๋Š” ๊ณ ์„ฑ๋Šฅ์˜, ํ”„๋กœ๋•์…˜์— ์ ํ•ฉํ•œ ASGI ์„œ๋ฒ„์ธ <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž ๋˜ํ•œ [VS Code ํ™•์žฅ](editor-support.md)์ด๋‚˜ [FastAPI Cloud](https://fastapicloud.com) ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์—์„œ๋Š” ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, `pyproject.toml`์˜ `entrypoint`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
## `fastapi dev` { #fastapi-dev } ## `fastapi dev` { #fastapi-dev }
@ -62,7 +115,7 @@ FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ๋ฐ›์•„ `FastAPI`
## `fastapi run` { #fastapi-run } ## `fastapi run` { #fastapi-run }
`fastapi run`์„ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ FastAPI๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. `fastapi run`์„ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ FastAPI๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ **auto-reload**๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  IP ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” `0.0.0.0`์—์„œ ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ์ปดํ“จํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๊ณต๊ฐœ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ๋ณดํ†ต ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ **auto-reload**๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  IP ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” `0.0.0.0`์—์„œ ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ์ปดํ“จํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๊ณต๊ฐœ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ๋ณดํ†ต ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
@ -70,6 +123,6 @@ FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ๋ฐ›์•„ `FastAPI`
/// tip | ํŒ /// tip | ํŒ
์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ ๋ฌธ์„œ](deployment/index.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ ๋ฌธ์„œ](deployment/index.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///

26
docs/ko/docs/features.md

@ -6,8 +6,8 @@
### ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ { #based-on-open-standards } ### ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ { #based-on-open-standards }
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a>: <dfn title="๋˜ํ•œ ๋‹ค์Œ์œผ๋กœ๋„ ๋ถˆ๋ฆผ: ์—”๋“œํฌ์ธํŠธ, ๋ผ์šฐํŠธ">๊ฒฝ๋กœ</dfn> <dfn title="HTTP ๋ฉ”์†Œ๋“œ(POST, GET, PUT, DELETE ๋“ฑ)๋กœ๋„ ์•Œ๋ ค์ง">์ฒ˜๋ฆฌ</dfn>, ๋งค๊ฐœ๋ณ€์ˆ˜, ์š”์ฒญ ๋ณธ๋ฌธ, ๋ณด์•ˆ ๋“ฑ์˜ ์„ ์–ธ์„ ํฌํ•จํ•˜์—ฌ API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. * [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification): <dfn title="๋˜ํ•œ ๋‹ค์Œ์œผ๋กœ๋„ ๋ถˆ๋ฆผ: ์—”๋“œํฌ์ธํŠธ, ๋ผ์šฐํŠธ">๊ฒฝ๋กœ</dfn> <dfn title="HTTP ๋ฉ”์†Œ๋“œ(POST, GET, PUT, DELETE ๋“ฑ)๋กœ๋„ ์•Œ๋ ค์ง">์ฒ˜๋ฆฌ</dfn>, ๋งค๊ฐœ๋ณ€์ˆ˜, ์š”์ฒญ ๋ณธ๋ฌธ, ๋ณด์•ˆ ๋“ฑ์˜ ์„ ์–ธ์„ ํฌํ•จํ•˜์—ฌ API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
* <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a>๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œํ™”(OpenAPI ์ž์ฒด๊ฐ€ JSON Schema๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). * [**JSON Schema**](https://json-schema.org/)๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œํ™”(OpenAPI ์ž์ฒด๊ฐ€ JSON Schema๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
* ๋‹จ์ˆœํžˆ ๋– ์˜ฌ๋ ค์„œ ๋ง๋ถ™์ธ ๋ ˆ์ด์–ด๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ธ์‹ฌํ•œ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์นœ ๋’ค ์ด๋Ÿฌํ•œ ํ‘œ์ค€์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. * ๋‹จ์ˆœํžˆ ๋– ์˜ฌ๋ ค์„œ ๋ง๋ถ™์ธ ๋ ˆ์ด์–ด๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ธ์‹ฌํ•œ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์นœ ๋’ค ์ด๋Ÿฌํ•œ ํ‘œ์ค€์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
* ์ด๋Š” ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ž๋™ **ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ**์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. * ์ด๋Š” ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ž๋™ **ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ**์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
@ -15,19 +15,19 @@
๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ์™€ ํƒ์ƒ‰์šฉ ์›น ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ OpenAPI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ์— ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ์™€ ํƒ์ƒ‰์šฉ ์›น ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ OpenAPI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ์— ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
* ๋Œ€ํ™”ํ˜• ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * [**Swagger UI**](https://github.com/swagger-api/swagger-ui)๋กœ ๋Œ€ํ™”ํ˜• ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>์„ ์ด์šฉํ•œ ๋Œ€์ฒด API ๋ฌธ์„œํ™”. * [**ReDoc**](https://github.com/Rebilly/ReDoc)์„ ์ด์šฉํ•œ ๋Œ€์ฒด API ๋ฌธ์„œํ™”.
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
### ๊ทธ์ € ํ˜„๋Œ€ ํŒŒ์ด์ฌ { #just-modern-python } ### ๊ทธ์ € ํ˜„๋Œ€ ํŒŒ์ด์ฌ { #just-modern-python }
( Pydantic ๋•๋ถ„์—) ๋ชจ๋“  ๊ฒƒ์ด ํ‘œ์ค€ **Python ํƒ€์ž…** ์„ ์–ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋ฐฐ์šธ ๋ฌธ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ํ‘œ์ค€์ ์ธ ํ˜„๋Œ€ ํŒŒ์ด์ฌ์ž…๋‹ˆ๋‹ค. (Pydantic ๋•๋ถ„์—) ๋ชจ๋“  ๊ฒƒ์ด ํ‘œ์ค€ **Python ํƒ€์ž…** ์„ ์–ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋ฐฐ์šธ ๋ฌธ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ํ‘œ์ค€์ ์ธ ํ˜„๋Œ€ ํŒŒ์ด์ฌ์ž…๋‹ˆ๋‹ค.
Python ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ 2๋ถ„ ์ •๋„ ๋ณต์Šต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด(FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„), ๋‹ค์Œ์˜ ์งง์€ ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: [Python ํƒ€์ž…](python-types.md){.internal-link target=_blank}. Python ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ 2๋ถ„ ์ •๋„ ๋ณต์Šต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด(FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„), ๋‹ค์Œ์˜ ์งง์€ ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: [Python ํƒ€์ž…](python-types.md).
์—ฌ๋Ÿฌ๋ถ„์€ ํƒ€์ž…์ด ์žˆ๋Š” ํ‘œ์ค€ Python์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค: ์—ฌ๋Ÿฌ๋ถ„์€ ํƒ€์ž…์ด ์žˆ๋Š” ํ‘œ์ค€ Python์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:
@ -75,7 +75,7 @@ my_second_user: User = User(**second_user_data)
ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ๋„ ์ „์— ๋ชจ๋“  ๊ฒฐ์ •์€ ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ๋„ ์ „์— ๋ชจ๋“  ๊ฒฐ์ •์€ ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ "์ž๋™ ์™„์„ฑ"์ด๋ผ๋Š” ์ </a>์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ [๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ "์ž๋™ ์™„์„ฑ"์ด๋ผ๋Š” ์ ](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
**FastAPI** ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์ด๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ์€ ์–ด๋””์„œ๋‚˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. **FastAPI** ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์ด๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ์€ ์–ด๋””์„œ๋‚˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
@ -83,11 +83,11 @@ Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/
ํŽธ์ง‘๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ์–ด๋–ป๊ฒŒ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”: ํŽธ์ง‘๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ์–ด๋–ป๊ฒŒ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”:
* <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>์—์„œ: * [Visual Studio Code](https://code.visualstudio.com/)์—์„œ:
![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
* <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>์—์„œ: * [PyCharm](https://www.jetbrains.com/pycharm/)์—์„œ:
![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png)
@ -124,7 +124,7 @@ Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/
๋‹ค์Œ์„ ํฌํ•จํ•ด OpenAPI์— ์ •์˜๋œ ๋ชจ๋“  ๋ณด์•ˆ ์Šคํ‚ค๋งˆ: ๋‹ค์Œ์„ ํฌํ•จํ•ด OpenAPI์— ์ •์˜๋œ ๋ชจ๋“  ๋ณด์•ˆ ์Šคํ‚ค๋งˆ:
* HTTP Basic. * HTTP Basic.
* **OAuth2**(**JWT tokens** ๋˜ํ•œ ํฌํ•จ). [JWT๋ฅผ ์‚ฌ์šฉํ•œ OAuth2](tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”. * **OAuth2**(**JWT tokens** ๋˜ํ•œ ํฌํ•จ). [JWT๋ฅผ ์‚ฌ์šฉํ•œ OAuth2](tutorial/security/oauth2-jwt.md) ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
* ๋‹ค์Œ์— ๋“ค์–ด ์žˆ๋Š” API ํ‚ค: * ๋‹ค์Œ์— ๋“ค์–ด ์žˆ๋Š” API ํ‚ค:
* ํ—ค๋”. * ํ—ค๋”.
* ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜. * ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜.
@ -159,13 +159,13 @@ FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๊ฐ•๋ ฅํ•œ <dfn title='๋˜ํ•œ
## Starlette ๊ธฐ๋Šฅ { #starlette-features } ## Starlette ๊ธฐ๋Šฅ { #starlette-features }
**FastAPI**๋Š” <a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a>์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Starlette ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. **FastAPI**๋Š” [**Starlette**](https://www.starlette.dev/)์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Starlette ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
`FastAPI`๋Š” ์‹ค์ œ๋กœ `Starlette`์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Starlette์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. `FastAPI`๋Š” ์‹ค์ œ๋กœ `Starlette`์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Starlette์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
**FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **Starlette**์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(FastAPI๋Š” Starlette์— ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๋”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค): **FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **Starlette**์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(FastAPI๋Š” Starlette์— ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๋”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค):
* ์ •๋ง ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ. <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">**NodeJS**์™€ **Go**์— ๋ฒ„๊ธˆ๊ฐ€๋Š”, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค</a>. * ์ •๋ง ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ. [**NodeJS**์™€ **Go**์— ๋ฒ„๊ธˆ๊ฐ€๋Š”, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค](https://github.com/encode/starlette#performance).
* **WebSocket** ์ง€์›. * **WebSocket** ์ง€์›.
* ํ”„๋กœ์„ธ์Šค ๋‚ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…. * ํ”„๋กœ์„ธ์Šค ๋‚ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—….
* ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์ด๋ฒคํŠธ. * ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์ด๋ฒคํŠธ.
@ -177,7 +177,7 @@ FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๊ฐ•๋ ฅํ•œ <dfn title='๋˜ํ•œ
## Pydantic ๊ธฐ๋Šฅ { #pydantic-features } ## Pydantic ๊ธฐ๋Šฅ { #pydantic-features }
**FastAPI**๋Š” <a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a>๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Pydantic ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. **FastAPI**๋Š” [**Pydantic**](https://docs.pydantic.dev/)๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Pydantic ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•œ <abbr title="Object-Relational Mapper - ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํผ">ORM</abbr>, <abbr title="Object-Document Mapper - ๊ฐ์ฒด-๋ฌธ์„œ ๋งคํผ">ODM</abbr>๊ณผ ๊ฐ™์€, Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•œ <abbr title="Object-Relational Mapper - ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํผ">ORM</abbr>, <abbr title="Object-Document Mapper - ๊ฐ์ฒด-๋ฌธ์„œ ๋งคํผ">ODM</abbr>๊ณผ ๊ฐ™์€, Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

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

@ -12,7 +12,7 @@ FastAPI, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž, ๊ฐœ๋ฐœ์ž๋ฅผ ์‘์›ํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
## ๋‰ด์Šค๋ ˆํ„ฐ ๊ตฌ๋… { #subscribe-to-the-newsletter } ## ๋‰ด์Šค๋ ˆํ„ฐ ๊ตฌ๋… { #subscribe-to-the-newsletter }
(์ž์ฃผ ๋ฐœ์†ก๋˜์ง€ ์•Š๋Š”) [**FastAPI and friends** ๋‰ด์Šค๋ ˆํ„ฐ](newsletter.md){.internal-link target=_blank}๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: (์ž์ฃผ ๋ฐœ์†ก๋˜์ง€ ์•Š๋Š”) [**FastAPI and friends** ๋‰ด์Šค๋ ˆํ„ฐ](newsletter.md)๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* FastAPI and friends์— ๋Œ€ํ•œ ๋‰ด์Šค ๐Ÿš€ * FastAPI and friends์— ๋Œ€ํ•œ ๋‰ด์Šค ๐Ÿš€
* ๊ฐ€์ด๋“œ ๐Ÿ“ * ๊ฐ€์ด๋“œ ๐Ÿ“
@ -22,17 +22,17 @@ FastAPI, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž, ๊ฐœ๋ฐœ์ž๋ฅผ ์‘์›ํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
## X(Twitter)์—์„œ FastAPI ํŒ”๋กœ์šฐํ•˜๊ธฐ { #follow-fastapi-on-x-twitter } ## X(Twitter)์—์„œ FastAPI ํŒ”๋กœ์šฐํ•˜๊ธฐ { #follow-fastapi-on-x-twitter }
<a href="https://x.com/fastapi" class="external-link" target="_blank">**X (Twitter)**์˜ @fastapi๋ฅผ ํŒ”๋กœ์šฐ</a>ํ•˜์—ฌ **FastAPI** ์— ๋Œ€ํ•œ ์ตœ์‹  ๋‰ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿฆ [**X (Twitter)**์˜ @fastapi๋ฅผ ํŒ”๋กœ์šฐ](https://x.com/fastapi)ํ•˜์—ฌ **FastAPI** ์— ๋Œ€ํ•œ ์ตœ์‹  ๋‰ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿฆ
## GitHub์—์„œ **FastAPI**์— Star ์ฃผ๊ธฐ { #star-fastapi-in-github } ## GitHub์—์„œ **FastAPI**์— Star ์ฃผ๊ธฐ { #star-fastapi-in-github }
GitHub์—์„œ FastAPI์— "star"๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ star ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. โญ๏ธ GitHub์—์„œ FastAPI์— "star"๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ star ๋ฒ„ํŠผ์„ ํด๋ฆญ): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). โญ๏ธ
์Šคํƒ€๋ฅผ ๋Š˜๋ฆผ์œผ๋กœ์จ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ์ข€ ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€๋ฅผ ๋Š˜๋ฆผ์œผ๋กœ์จ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ์ข€ ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๋ฆด๋ฆฌ์ฆˆ ํ™•์ธ์„ ์œ„ํ•ด GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository-for-releases } ## ๋ฆด๋ฆฌ์ฆˆ ํ™•์ธ์„ ์œ„ํ•ด GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository-for-releases }
GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ๐Ÿ‘€
์—ฌ๊ธฐ์„œ "Releases only"๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "Releases only"๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -40,45 +40,45 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch"
## ๊ฐœ๋ฐœ์ž์™€์˜ ์—ฐ๊ฒฐ { #connect-with-the-author } ## ๊ฐœ๋ฐœ์ž์™€์˜ ์—ฐ๊ฒฐ { #connect-with-the-author }
๊ฐœ๋ฐœ์ž(์ž‘์„ฑ์ž)์ธ <a href="https://tiangolo.com" class="external-link" target="_blank">์ €(Sebastiรกn Ramรญrez / `tiangolo`)</a>์™€ ์—ฐ๋ฝ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž(์ž‘์„ฑ์ž)์ธ [์ €(Sebastiรกn Ramรญrez / `tiangolo`)](https://tiangolo.com)์™€ ์—ฐ๋ฝ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์—ฌ๋Ÿฌ๋ถ„์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://github.com/tiangolo" class="external-link" target="_blank">**GitHub**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ</a>. * [**GitHub**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ](https://github.com/tiangolo).
* ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋„์›€์ด ๋  ์ €์˜ ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. * ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋„์›€์ด ๋  ์ €์˜ ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
* ์ƒˆ๋กœ์šด ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ํ™•์ธํ•˜๋ ค๋ฉด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค. * ์ƒˆ๋กœ์šด ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ํ™•์ธํ•˜๋ ค๋ฉด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค.
* <a href="https://x.com/tiangolo" class="external-link" target="_blank">**X (Twitter)**</a> ๋˜๋Š” <a href="https://fosstodon.org/@tiangolo" class="external-link" target="_blank">Mastodon</a>์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ. * [**X (Twitter)**](https://x.com/tiangolo) ๋˜๋Š” [Mastodon](https://fosstodon.org/@tiangolo)์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ.
* FastAPI์˜ ์‚ฌ์šฉ ์šฉ๋„๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š” (๊ทธ๊ฒƒ์„ ๋“ฃ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค). * FastAPI์˜ ์‚ฌ์šฉ ์šฉ๋„๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š” (๊ทธ๊ฒƒ์„ ๋“ฃ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค).
* ๋ฐœํ‘œ๋‚˜ ์ƒˆ๋กœ์šด ํˆด ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค. * ๋ฐœํ‘œ๋‚˜ ์ƒˆ๋กœ์šด ํˆด ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค.
* <a href="https://x.com/fastapi" class="external-link" target="_blank">X(Twitter)์—์„œ @fastapi๋ฅผ ํŒ”๋กœ์šฐ</a> (๋ณ„๋„ ๊ณ„์ •์—์„œ) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * [X(Twitter)์—์„œ @fastapi๋ฅผ ํŒ”๋กœ์šฐ](https://x.com/fastapi) (๋ณ„๋„ ๊ณ„์ •์—์„œ) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">**LinkedIn**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ</a>. * [**LinkedIn**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ](https://www.linkedin.com/in/tiangolo/).
* ์ƒˆ๋กœ์šด ํˆด์˜ ๋ฐœํ‘œ๋‚˜ ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค (๋‹จ, X (Twitter)๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ๐Ÿคทโ€โ™‚). * ์ƒˆ๋กœ์šด ํˆด์˜ ๋ฐœํ‘œ๋‚˜ ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค (๋‹จ, X (Twitter)๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ๐Ÿคทโ€โ™‚).
* <a href="https://dev.to/tiangolo" class="external-link" target="_blank">**Dev.to**</a> ๋˜๋Š” <a href="https://medium.com/@tiangolo" class="external-link" target="_blank">**Medium**</a>์—์„œ ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ณด์‹ญ์‹œ์˜ค (๋˜๋Š” ํŒ”๋กœ์šฐ). * [**Dev.to**](https://dev.to/tiangolo) ๋˜๋Š” [**Medium**](https://medium.com/@tiangolo)์—์„œ ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ณด์‹ญ์‹œ์˜ค (๋˜๋Š” ํŒ”๋กœ์šฐ).
* ๋‹ค๋ฅธ ์•„์ด๋””์–ด์™€ ๊ธฐ์‚ฌ๋“ค์„ ์ฝ๊ณ , ์ œ๊ฐ€ ๋งŒ๋“ค์–ด์™”๋˜ ํˆด์— ๋Œ€ํ•ด์„œ๋„ ์ฝ์œผ์‹ญ์‹œ์˜ค. * ๋‹ค๋ฅธ ์•„์ด๋””์–ด์™€ ๊ธฐ์‚ฌ๋“ค์„ ์ฝ๊ณ , ์ œ๊ฐ€ ๋งŒ๋“ค์–ด์™”๋˜ ํˆด์— ๋Œ€ํ•ด์„œ๋„ ์ฝ์œผ์‹ญ์‹œ์˜ค.
* ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ๊ฒŒ์‹œํ•  ๋•Œ ์ฝ๊ธฐ ์œ„ํ•ด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค. * ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ๊ฒŒ์‹œํ•  ๋•Œ ์ฝ๊ธฐ ์œ„ํ•ด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค.
## **FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—ํ•˜๊ธฐ { #tweet-about-fastapi } ## **FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—ํ•˜๊ธฐ { #tweet-about-fastapi }
<a href="https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi" class="external-link" target="_blank">**FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—</a> ํ•˜๊ณ  ์ €์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ FastAPI๊ฐ€ ๋งˆ์Œ์— ๋“œ๋Š” ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”. ๐ŸŽ‰ [**FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) ํ•˜๊ณ  ์ €์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ FastAPI๊ฐ€ ๋งˆ์Œ์— ๋“œ๋Š” ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”. ๐ŸŽ‰
**FastAPI**๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ์ ์ด ๋งˆ์Œ์— ๋“ค์—ˆ๋Š”์ง€, ์–ด๋–ค ํ”„๋กœ์ ํŠธ/ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. **FastAPI**๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ์ ์ด ๋งˆ์Œ์— ๋“ค์—ˆ๋Š”์ง€, ์–ด๋–ค ํ”„๋กœ์ ํŠธ/ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
## FastAPI์— ํˆฌํ‘œํ•˜๊ธฐ { #vote-for-fastapi } ## FastAPI์— ํˆฌํ‘œํ•˜๊ธฐ { #vote-for-fastapi }
* <a href="https://www.slant.co/options/34241/~fastapi-review" class="external-link" target="_blank">Slant์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค</a>. * [Slant์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค](https://www.slant.co/options/34241/~fastapi-review).
* <a href="https://alternativeto.net/software/fastapi/about/" class="external-link" target="_blank">AlternativeTo์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค</a>. * [AlternativeTo์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค](https://alternativeto.net/software/fastapi/about/).
* <a href="https://stackshare.io/pypi-fastapi" class="external-link" target="_blank">StackShare์—์„œ **FastAPI**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ‘œ์‹œํ•˜์„ธ์š”</a>. * [StackShare์—์„œ **FastAPI**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ‘œ์‹œํ•˜์„ธ์š”](https://stackshare.io/pypi-fastapi).
## GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ { #help-others-with-questions-in-github } ## GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ { #help-others-with-questions-in-github }
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered" class="external-link" target="_blank">GitHub Discussions</a> * [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered)
* <a href="https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+" class="external-link" target="_blank">GitHub Issues</a> * [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+)
๋งŽ์€ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ์•Œ๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“ ๋งŽ์€ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ์•Œ๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
๋งŒ์•ฝ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์„ ๋„์™€์ค€๋‹ค๋ฉด, ๊ณต์‹์ ์ธ [FastAPI ์ „๋ฌธ๊ฐ€](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰ ๋งŒ์•ฝ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์„ ๋„์™€์ค€๋‹ค๋ฉด, ๊ณต์‹์ ์ธ [FastAPI ์ „๋ฌธ๊ฐ€](fastapi-people.md#fastapi-experts)๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰
๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€: ์นœ์ ˆํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ขŒ์ ˆ๊ฐ์„ ์•ˆ๊ณ  ์˜ค๋ฉฐ, ๋งŽ์€ ๊ฒฝ์šฐ ์ตœ์„ ์˜ ๋ฐฉ์‹์œผ๋กœ ์งˆ๋ฌธํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๋Œ€ํ•œ ์นœ์ ˆํ•˜๊ฒŒ ๋Œ€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์„ธ์š”. ๐Ÿค— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€: ์นœ์ ˆํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ขŒ์ ˆ๊ฐ์„ ์•ˆ๊ณ  ์˜ค๋ฉฐ, ๋งŽ์€ ๊ฒฝ์šฐ ์ตœ์„ ์˜ ๋ฐฉ์‹์œผ๋กœ ์งˆ๋ฌธํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๋Œ€ํ•œ ์นœ์ ˆํ•˜๊ฒŒ ๋Œ€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์„ธ์š”. ๐Ÿค—
@ -104,7 +104,7 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch"
๋งŽ์€ ๊ฒฝ์šฐ, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋งŒ ๋ณต์‚ฌํ•ด์„œ ์˜ฌ๋ฆฌ์ง€๋งŒ, ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” **๋ฌธ์ œ๋ฅผ ์žฌํ˜„**ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒฝ์šฐ, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋งŒ ๋ณต์‚ฌํ•ด์„œ ์˜ฌ๋ฆฌ์ง€๋งŒ, ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” **๋ฌธ์ œ๋ฅผ ์žฌํ˜„**ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
* ์งˆ๋ฌธ์ž์—๊ฒŒ <a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ</a>๋ฅผ ์ œ๊ณตํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ **๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ**ํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ณ , ์งˆ๋ฌธ์ž๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜๋‚˜ ๋™์ž‘์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ์งˆ๋ฌธ์ž์—๊ฒŒ [์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ](https://stackoverflow.com/help/minimal-reproducible-example)๋ฅผ ์ œ๊ณตํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ **๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ**ํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ณ , ์งˆ๋ฌธ์ž๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜๋‚˜ ๋™์ž‘์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๋„ˆ๊ทธ๋Ÿฌ์šด ๋งˆ์Œ์ด ๋“ ๋‹ค๋ฉด, ๋ฌธ์ œ ์„ค๋ช…๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ **์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด**๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋จผ์ € ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. * ๋„ˆ๊ทธ๋Ÿฌ์šด ๋งˆ์Œ์ด ๋“ ๋‹ค๋ฉด, ๋ฌธ์ œ ์„ค๋ช…๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ **์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด**๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋จผ์ € ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
@ -125,7 +125,7 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch"
## GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository } ## GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository }
GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ๐Ÿ‘€
"Releases only" ๋Œ€์‹  "Watching"์„ ์„ ํƒํ•˜๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ƒˆ ์ด์Šˆ๋‚˜ ์งˆ๋ฌธ์„ ๋งŒ๋“ค ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒˆ ์ด์Šˆ, ๋””์Šค์ปค์…˜, PR ๋“ฑ๋งŒ ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. "Releases only" ๋Œ€์‹  "Watching"์„ ์„ ํƒํ•˜๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ƒˆ ์ด์Šˆ๋‚˜ ์งˆ๋ฌธ์„ ๋งŒ๋“ค ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒˆ ์ด์Šˆ, ๋””์Šค์ปค์…˜, PR ๋“ฑ๋งŒ ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -133,7 +133,7 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch"
## ์งˆ๋ฌธํ•˜๊ธฐ { #ask-questions } ## ์งˆ๋ฌธํ•˜๊ธฐ { #ask-questions }
GitHub ์ €์žฅ์†Œ์—์„œ <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">์ƒˆ ์งˆ๋ฌธ์„ ์ƒ์„ฑ</a>ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: GitHub ์ €์žฅ์†Œ์—์„œ [์ƒˆ ์งˆ๋ฌธ์„ ์ƒ์„ฑ](https://github.com/fastapi/fastapi/discussions/new?category=questions)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* **์งˆ๋ฌธ**์„ ํ•˜๊ฑฐ๋‚˜ **๋ฌธ์ œ**์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค. * **์งˆ๋ฌธ**์„ ํ•˜๊ฑฐ๋‚˜ **๋ฌธ์ œ**์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค.
* ์ƒˆ๋กœ์šด **๊ธฐ๋Šฅ**์„ ์ œ์•ˆ ํ•ฉ๋‹ˆ๋‹ค. * ์ƒˆ๋กœ์šด **๊ธฐ๋Šฅ**์„ ์ œ์•ˆ ํ•ฉ๋‹ˆ๋‹ค.
@ -196,12 +196,12 @@ Pull request๋ฅผ ๋ฆฌ๋ทฐํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๊ณผ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™
## Pull Request ๋งŒ๋“ค๊ธฐ { #create-a-pull-request } ## Pull Request ๋งŒ๋“ค๊ธฐ { #create-a-pull-request }
Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.internal-link target=_blank}ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* ๋ฌธ์„œ์—์„œ ๋ฐœ๊ฒฌํ•œ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ. * ๋ฌธ์„œ์—์„œ ๋ฐœ๊ฒฌํ•œ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ.
* FastAPI์— ๋Œ€ํ•œ ๊ธ€, ๋น„๋””์˜ค, ํŒŸ์บ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด <a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">์ด ํŒŒ์ผ์„ ํŽธ์ง‘</a>ํ•˜์—ฌ ๊ณต์œ ํ•  ๋•Œ. * FastAPI์— ๋Œ€ํ•œ ๊ธ€, ๋น„๋””์˜ค, ํŒŸ์บ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด [์ด ํŒŒ์ผ์„ ํŽธ์ง‘](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml)ํ•˜์—ฌ ๊ณต์œ ํ•  ๋•Œ.
* ํ•ด๋‹น ์„น์…˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. * ํ•ด๋‹น ์„น์…˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ธ์–ด๋กœ [๋ฌธ์„œ ๋ฒˆ์—ญ์—](contributing.md#translations){.internal-link target=_blank} ๋„์›€์„ ์ค„ ๋•Œ. * ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ธ์–ด๋กœ [๋ฌธ์„œ ๋ฒˆ์—ญ์—](contributing.md#translations) ๋„์›€์„ ์ค„ ๋•Œ.
* ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ๋ฒˆ์—ญ์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ๋„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ๋ฒˆ์—ญ์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ๋„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์ƒˆ๋กœ์šด ๋ฌธ์„œ ์„น์…˜์„ ์ œ์•ˆํ•  ๋•Œ. * ์ƒˆ๋กœ์šด ๋ฌธ์„œ ์„น์…˜์„ ์ œ์•ˆํ•  ๋•Œ.
* ๊ธฐ์กด ์ด์Šˆ/๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ. * ๊ธฐ์กด ์ด์Šˆ/๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ.
@ -218,8 +218,8 @@ Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.intern
์ง€๊ธˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์ž‘์—…์€: ์ง€๊ธˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์ž‘์—…์€:
* [GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ](#help-others-with-questions-in-github){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”). * [GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ](#help-others-with-questions-in-github) (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
* [Pull Request ๋ฆฌ๋ทฐํ•˜๊ธฐ](#review-pull-requests){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”). * [Pull Request ๋ฆฌ๋ทฐํ•˜๊ธฐ](#review-pull-requests) (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
์ด ๋‘ ์ž‘์—…์ด **๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจ**ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด FastAPI๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ์ž‘์—…์ด **๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจ**ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด FastAPI๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
@ -227,11 +227,11 @@ Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.intern
## ์ฑ„ํŒ…์— ์ฐธ์—ฌํ•˜๊ธฐ { #join-the-chat } ## ์ฑ„ํŒ…์— ์ฐธ์—ฌํ•˜๊ธฐ { #join-the-chat }
๐Ÿ‘ฅ <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">Discord ์ฑ„ํŒ… ์„œ๋ฒ„</a> ๐Ÿ‘ฅ ์— ์ฐธ์—ฌํ•ด์„œ FastAPI ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์–ด์šธ๋ฆฌ์„ธ์š”. ๐Ÿ‘ฅ [Discord ์ฑ„ํŒ… ์„œ๋ฒ„](https://discord.gg/VQjSZaeJmf) ๐Ÿ‘ฅ ์— ์ฐธ์—ฌํ•ด์„œ FastAPI ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์–ด์šธ๋ฆฌ์„ธ์š”.
/// tip | ํŒ /// tip | ํŒ
์งˆ๋ฌธ์€ <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Discussions</a>์—์„œ ํ•˜์„ธ์š”. [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๋กœ๋ถ€ํ„ฐ ๋„์›€์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋†’์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์€ [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions)์—์„œ ํ•˜์„ธ์š”. [FastAPI Experts](fastapi-people.md#fastapi-experts)๋กœ๋ถ€ํ„ฐ ๋„์›€์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋†’์Šต๋‹ˆ๋‹ค.
์ฑ„ํŒ…์€ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋Œ€ํ™”๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ฑ„ํŒ…์€ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋Œ€ํ™”๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
@ -243,13 +243,13 @@ Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.intern
GitHub์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ์ด ์˜ฌ๋ฐ”๋ฅธ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•˜๋„๋ก ์•ˆ๋‚ดํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ์ข‹์€ ๋‹ต๋ณ€์„ ์–ป๊ฑฐ๋‚˜, ์งˆ๋ฌธํ•˜๊ธฐ ์ „์— ์Šค์Šค๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์—์„œ๋Š” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ๋”๋ผ๋„ ์ œ๊ฐ€ ํ•ญ์ƒ ๋ชจ๋“  ๊ฒƒ์— ๋‹ตํ•˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ๋Š” ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜… GitHub์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ์ด ์˜ฌ๋ฐ”๋ฅธ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•˜๋„๋ก ์•ˆ๋‚ดํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ์ข‹์€ ๋‹ต๋ณ€์„ ์–ป๊ฑฐ๋‚˜, ์งˆ๋ฌธํ•˜๊ธฐ ์ „์— ์Šค์Šค๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์—์„œ๋Š” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ๋”๋ผ๋„ ์ œ๊ฐ€ ํ•ญ์ƒ ๋ชจ๋“  ๊ฒƒ์— ๋‹ตํ•˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ๋Š” ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…
์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ์˜ ๋Œ€ํ™” ๋˜ํ•œ GitHub๋งŒํผ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ๋Œ€ํ™” ์†์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์— ์žˆ๋Š” ๊ฒƒ๋งŒ [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์ •๋˜๋ฏ€๋กœ, GitHub์—์„œ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ์˜ ๋Œ€ํ™” ๋˜ํ•œ GitHub๋งŒํผ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ๋Œ€ํ™” ์†์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์— ์žˆ๋Š” ๊ฒƒ๋งŒ [FastAPI Expert](fastapi-people.md#fastapi-experts)๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์ •๋˜๋ฏ€๋กœ, GitHub์—์„œ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—๋Š” ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๊ฑฐ์˜ ํ•ญ์ƒ ๋Œ€ํ™” ์ƒ๋Œ€๋ฅผ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„ ๋ฐ˜๋ฉด, ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—๋Š” ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๊ฑฐ์˜ ํ•ญ์ƒ ๋Œ€ํ™” ์ƒ๋Œ€๋ฅผ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„
## ๊ฐœ๋ฐœ์ž ์Šคํฐ์„œ ๋˜๊ธฐ { #sponsor-the-author } ## ๊ฐœ๋ฐœ์ž ์Šคํฐ์„œ ๋˜๊ธฐ { #sponsor-the-author }
์—ฌ๋Ÿฌ๋ถ„์˜ **์ œํ’ˆ/ํšŒ์‚ฌ**๊ฐ€ **FastAPI**์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ , FastAPI ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์•Œ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub sponsors</a>๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž(์ €)๋ฅผ ์Šคํฐ์„œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์–ด์— ๋”ฐ๋ผ ๋ฌธ์„œ์— ๋ฐฐ์ง€ ๊ฐ™์€ ์ถ”๊ฐ€ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ ์—ฌ๋Ÿฌ๋ถ„์˜ **์ œํ’ˆ/ํšŒ์‚ฌ**๊ฐ€ **FastAPI**์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ , FastAPI ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์•Œ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด [GitHub sponsors](https://github.com/sponsors/tiangolo)๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž(์ €)๋ฅผ ์Šคํฐ์„œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์–ด์— ๋”ฐ๋ผ ๋ฌธ์„œ์— ๋ฐฐ์ง€ ๊ฐ™์€ ์ถ”๊ฐ€ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ
--- ---

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

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

122
docs/ko/docs/index.md

@ -11,25 +11,25 @@
<em>FastAPI ํ”„๋ ˆ์ž„์›Œํฌ, ๊ณ ์„ฑ๋Šฅ, ๊ฐ„ํŽธํ•œ ํ•™์Šต, ๋น ๋ฅธ ์ฝ”๋“œ ์ž‘์„ฑ, ์ค€๋น„๋œ ํ”„๋กœ๋•์…˜</em> <em>FastAPI ํ”„๋ ˆ์ž„์›Œํฌ, ๊ณ ์„ฑ๋Šฅ, ๊ฐ„ํŽธํ•œ ํ•™์Šต, ๋น ๋ฅธ ์ฝ”๋“œ ์ž‘์„ฑ, ์ค€๋น„๋œ ํ”„๋กœ๋•์…˜</em>
</p> </p>
<p align="center"> <p align="center">
<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank"> <a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster">
<img src="https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master" alt="Test"> <img src="https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master" alt="Test">
</a> </a>
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi" target="_blank"> <a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi">
<img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg" alt="Coverage"> <img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg" alt="Coverage">
</a> </a>
<a href="https://pypi.org/project/fastapi" target="_blank"> <a href="https://pypi.org/project/fastapi">
<img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version"> <img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version">
</a> </a>
<a href="https://pypi.org/project/fastapi" target="_blank"> <a href="https://pypi.org/project/fastapi">
<img src="https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058" alt="Supported Python versions"> <img src="https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058" alt="Supported Python versions">
</a> </a>
</p> </p>
--- ---
**๋ฌธ์„œ**: <a href="https://fastapi.tiangolo.com/ko" target="_blank">https://fastapi.tiangolo.com</a> **๋ฌธ์„œ**: [https://fastapi.tiangolo.com/ko](https://fastapi.tiangolo.com/ko)
**์†Œ์Šค ์ฝ”๋“œ**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a> **์†Œ์Šค ์ฝ”๋“œ**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)
--- ---
@ -44,7 +44,7 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
* **์‰ฌ์›€**: ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฐ์šฐ๋„๋ก ์„ค๊ณ„. ์ ์€ ๋ฌธ์„œ ์ฝ๊ธฐ ์‹œ๊ฐ„. * **์‰ฌ์›€**: ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฐ์šฐ๋„๋ก ์„ค๊ณ„. ์ ์€ ๋ฌธ์„œ ์ฝ๊ธฐ ์‹œ๊ฐ„.
* **์งง์Œ**: ์ฝ”๋“œ ์ค‘๋ณต ์ตœ์†Œํ™”. ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ. ์ ์€ ๋ฒ„๊ทธ. * **์งง์Œ**: ์ฝ”๋“œ ์ค‘๋ณต ์ตœ์†Œํ™”. ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ. ์ ์€ ๋ฒ„๊ทธ.
* **๊ฒฌ๊ณ ํ•จ**: ์ค€๋น„๋œ ํ”„๋กœ๋•์…˜ ์šฉ ์ฝ”๋“œ๋ฅผ ์–ป์œผ์‹ญ์‹œ์˜ค. ์ž๋™ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ์™€ ํ•จ๊ป˜. * **๊ฒฌ๊ณ ํ•จ**: ์ค€๋น„๋œ ํ”„๋กœ๋•์…˜ ์šฉ ์ฝ”๋“œ๋ฅผ ์–ป์œผ์‹ญ์‹œ์˜ค. ์ž๋™ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ์™€ ํ•จ๊ป˜.
* **ํ‘œ์ค€ ๊ธฐ๋ฐ˜**: API์— ๋Œ€ํ•œ (์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š”) ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๊ธฐ๋ฐ˜: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (์ด์ „์— Swagger๋กœ ์•Œ๋ ค์กŒ๋˜) ๋ฐ <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>. * **ํ‘œ์ค€ ๊ธฐ๋ฐ˜**: API์— ๋Œ€ํ•œ (์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š”) ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๊ธฐ๋ฐ˜: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (์ด์ „์— Swagger๋กœ ์•Œ๋ ค์กŒ๋˜) ๋ฐ [JSON Schema](https://json-schema.org/).
<small>* ๋‚ด๋ถ€ ๊ฐœ๋ฐœํŒ€์˜ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•œ ํ…Œ์ŠคํŠธ์— ๊ทผ๊ฑฐํ•œ ์ธก์ •</small> <small>* ๋‚ด๋ถ€ ๊ฐœ๋ฐœํŒ€์˜ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•œ ํ…Œ์ŠคํŠธ์— ๊ทผ๊ฑฐํ•œ ์ธก์ •</small>
@ -55,51 +55,51 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
### ํ‚ค์Šคํ†ค ์Šคํฐ์„œ { #keystone-sponsor } ### ํ‚ค์Šคํ†ค ์Šคํฐ์„œ { #keystone-sponsor }
{% for sponsor in sponsors.keystone -%} {% for sponsor in sponsors.keystone -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> <a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor -%} {% endfor -%}
### ๊ณจ๋“œ ๋ฐ ์‹ค๋ฒ„ ์Šคํฐ์„œ { #gold-and-silver-sponsors } ### ๊ณจ๋“œ ๋ฐ ์‹ค๋ฒ„ ์Šคํฐ์„œ { #gold-and-silver-sponsors }
{% for sponsor in sponsors.gold -%} {% for sponsor in sponsors.gold -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> <a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor -%} {% endfor -%}
{%- for sponsor in sponsors.silver -%} {%- for sponsor in sponsors.silver -%}
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> <a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor %} {% endfor %}
<!-- /sponsors --> <!-- /sponsors -->
<a href="https://fastapi.tiangolo.com/ko/fastapi-people/#sponsors" class="external-link" target="_blank">๋‹ค๋ฅธ ์Šคํฐ์„œ</a> [๋‹ค๋ฅธ ์Šคํฐ์„œ](https://fastapi.tiangolo.com/ko/fastapi-people/#sponsors)
## ์˜๊ฒฌ๋“ค { #opinions } ## ์˜๊ฒฌ๋“ค { #opinions }
"_[...] ์ €๋Š” ์š”์ฆ˜ **FastAPI**๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. [...] ์‚ฌ์‹ค ์šฐ๋ฆฌ ํŒ€์˜ **๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ML ์„œ๋น„์Šค** ์ „๋ถ€๋ฅผ ๋ฐ”๊ฟ€ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ํ•ต์‹ฌ **Windows**์™€ ๋ช‡๋ช‡์˜ **Office** ์ œํ’ˆ๋“ค์ด ํ†ตํ•ฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._" "_[...] ์ €๋Š” ์š”์ฆ˜ **FastAPI**๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. [...] ์‚ฌ์‹ค ์šฐ๋ฆฌ ํŒ€์˜ **๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ML ์„œ๋น„์Šค** ์ „๋ถ€๋ฅผ ๋ฐ”๊ฟ€ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ํ•ต์‹ฌ **Windows**์™€ ๋ช‡๋ช‡์˜ **Office** ์ œํ’ˆ๋“ค์ด ํ†ตํ•ฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._"
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ</strong> <a href="https://github.com/fastapi/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div> <div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(ref)</small></a></div>
--- ---
"_**FastAPI** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ **์˜ˆ์ธก**์„ ์–ป๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” **REST** ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. [Ludwig์„ ์œ„ํ•ด]_" "_**FastAPI** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ **์˜ˆ์ธก**์„ ์–ป๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” **REST** ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. [Ludwig์„ ์œ„ํ•ด]_"
<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin ๊ทธ๋ฆฌ๊ณ  Sai Sumanth Miryala - <strong>์šฐ๋ฒ„</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div> <div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin ๊ทธ๋ฆฌ๊ณ  Sai Sumanth Miryala - <strong>์šฐ๋ฒ„</strong> <a href="https://eng.uber.com/ludwig-v0-2/"><small>(ref)</small></a></div>
--- ---
"_**Netflix**๋Š” ์šฐ๋ฆฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฐฐํฌํŒ์ธ **์œ„๊ธฐ ๊ด€๋ฆฌ** ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐœํ‘œํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค: ๋ฐ”๋กœ **Dispatch**์ž…๋‹ˆ๋‹ค! [**FastAPI**๋กœ ๋นŒ๋“œ]_" "_**Netflix**๋Š” ์šฐ๋ฆฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฐฐํฌํŒ์ธ **์œ„๊ธฐ ๊ด€๋ฆฌ** ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐœํ‘œํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค: ๋ฐ”๋กœ **Dispatch**์ž…๋‹ˆ๋‹ค! [**FastAPI**๋กœ ๋นŒ๋“œ]_"
<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>๋„ทํ”Œ๋ฆญ์Šค</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072" target="_blank"><small>(ref)</small></a></div> <div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>๋„ทํ”Œ๋ฆญ์Šค</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072"><small>(ref)</small></a></div>
--- ---
"_**FastAPI**๊ฐ€ ๋„ˆ๋ฌด ์ข‹์•„์„œ ๊ตฌ๋ฆ„ ์œ„๋ฅผ ๊ฑท๋Š”๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค!_" "_**FastAPI**๊ฐ€ ๋„ˆ๋ฌด ์ข‹์•„์„œ ๊ตฌ๋ฆ„ ์œ„๋ฅผ ๊ฑท๋Š”๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค!_"
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> ํŒŸ์บ์ŠคํŠธ ํ˜ธ์ŠคํŠธ</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div> <div style="text-align: right; margin-right: 10%;">Brian Okken - <strong>[Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832"><small>(ref)</small></a></div>
--- ---
"_์†”์งํžˆ, ๋‹น์‹ ์ด ๋งŒ๋“  ๊ฒƒ์€ ๋งค์šฐ ๊ฒฌ๊ณ ํ•˜๊ณ  ์„ธ๋ จ๋˜์–ด ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฉด์—์„œ **Hug**๊ฐ€ ์ด๋ ‡๊ฒŒ ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค - ๊ทธ๊ฑธ ๋งŒ๋“  ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ๋งŽ์€ ์˜๊ฐ์„ ์ค๋‹ˆ๋‹ค._" "_์†”์งํžˆ, ๋‹น์‹ ์ด ๋งŒ๋“  ๊ฒƒ์€ ๋งค์šฐ ๊ฒฌ๊ณ ํ•˜๊ณ  ์„ธ๋ จ๋˜์–ด ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฉด์—์„œ **Hug**๊ฐ€ ์ด๋ ‡๊ฒŒ ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค - ๊ทธ๊ฑธ ๋งŒ๋“  ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ๋งŽ์€ ์˜๊ฐ์„ ์ค๋‹ˆ๋‹ค._"
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> ์ œ์ž‘์ž</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div> <div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug">Hug</a> ์ œ์ž‘์ž</strong> <a href="https://news.ycombinator.com/item?id=19455465"><small>(ref)</small></a></div>
--- ---
@ -107,27 +107,27 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
"_์šฐ๋ฆฌ **API**๋ฅผ **FastAPI**๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค [...] ์•„๋งˆ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ข‹์•„ํ•˜์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค [...]_" "_์šฐ๋ฆฌ **API**๋ฅผ **FastAPI**๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค [...] ์•„๋งˆ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ข‹์•„ํ•˜์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค [...]_"
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> ์„ค๋ฆฝ์ž - <a href="https://spacy.io" target="_blank">spaCy</a> ์ œ์ž‘์ž</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div> <div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong>[Explosion AI](https://explosion.ai) ์„ค๋ฆฝ์ž - [spaCy](https://spacy.io) ์ œ์ž‘์ž</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680"><small>(ref)</small></a></div>
--- ---
"_ํ”„๋กœ๋•์…˜ Python API๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ €๋Š” **FastAPI**๋ฅผ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. **์•„๋ฆ„๋‹ต๊ฒŒ ์„ค๊ณ„**๋˜์—ˆ๊ณ , **์‚ฌ์šฉ์ด ๊ฐ„๋‹จ**ํ•˜๋ฉฐ, **ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚˜**๊ณ , ์šฐ๋ฆฌ์˜ API ์šฐ์„  ๊ฐœ๋ฐœ ์ „๋žต์—์„œ **ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ**๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ Virtual TAC Engineer ๊ฐ™์€ ๋งŽ์€ ์ž๋™ํ™”์™€ ์„œ๋น„์Šค๋ฅผ ์ด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._" "_ํ”„๋กœ๋•์…˜ Python API๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ €๋Š” **FastAPI**๋ฅผ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. **์•„๋ฆ„๋‹ต๊ฒŒ ์„ค๊ณ„**๋˜์—ˆ๊ณ , **์‚ฌ์šฉ์ด ๊ฐ„๋‹จ**ํ•˜๋ฉฐ, **ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚˜**๊ณ , ์šฐ๋ฆฌ์˜ API ์šฐ์„  ๊ฐœ๋ฐœ ์ „๋žต์—์„œ **ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ**๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ Virtual TAC Engineer ๊ฐ™์€ ๋งŽ์€ ์ž๋™ํ™”์™€ ์„œ๋น„์Šค๋ฅผ ์ด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._"
<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/" target="_blank"><small>(ref)</small></a></div> <div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/"><small>(ref)</small></a></div>
--- ---
## FastAPI ๋ฏธ๋‹ˆ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ { #fastapi-mini-documentary } ## FastAPI ๋ฏธ๋‹ˆ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ { #fastapi-mini-documentary }
2025๋…„ ๋ง์— ๊ณต๊ฐœ๋œ <a href="https://www.youtube.com/watch?v=mpR8ngthqiE" class="external-link" target="_blank">FastAPI ๋ฏธ๋‹ˆ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ์—์„œ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: 2025๋…„ ๋ง์— ๊ณต๊ฐœ๋œ [FastAPI ๋ฏธ๋‹ˆ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ](https://www.youtube.com/watch?v=mpR8ngthqiE)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ์—์„œ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
<a href="https://www.youtube.com/watch?v=mpR8ngthqiE" target="_blank"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a> <a href="https://www.youtube.com/watch?v=mpR8ngthqiE"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
## **Typer**, CLI๋ฅผ ์œ„ํ•œ FastAPI { #typer-the-fastapi-of-clis } ## **Typer**, CLI๋ฅผ ์œ„ํ•œ FastAPI { #typer-the-fastapi-of-clis }
<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a> <a href="https://typer.tiangolo.com"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
์›น API ๋Œ€์‹  ํ„ฐ๋ฏธ๋„์—์„œ ์‚ฌ์šฉํ•  <abbr title="Command Line Interface - ์ปค๋งจ๋“œ ๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค">CLI</abbr> ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด, <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>๋ฅผ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์›น API ๋Œ€์‹  ํ„ฐ๋ฏธ๋„์—์„œ ์‚ฌ์šฉํ•  <abbr title="Command Line Interface - ์ปค๋งจ๋“œ ๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค">CLI</abbr> ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด, [**Typer**](https://typer.tiangolo.com/)๋ฅผ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
**Typer**๋Š” FastAPI์˜ ๋™์ƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  **CLI๋ฅผ ์œ„ํ•œ FastAPI**๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. โŒจ๏ธ ๐Ÿš€ **Typer**๋Š” FastAPI์˜ ๋™์ƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  **CLI๋ฅผ ์œ„ํ•œ FastAPI**๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. โŒจ๏ธ ๐Ÿš€
@ -135,12 +135,12 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
FastAPI๋Š” ๊ฑฐ์ธ๋“ค์˜ ์–ด๊นจ ์œ„์— ์„œ ์žˆ์Šต๋‹ˆ๋‹ค: FastAPI๋Š” ๊ฑฐ์ธ๋“ค์˜ ์–ด๊นจ ์œ„์— ์„œ ์žˆ์Šต๋‹ˆ๋‹ค:
* ์›น ๋ถ€๋ถ„์„ ์œ„ํ•œ <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>. * [Starlette](https://www.starlette.dev/) โ€” ์›น ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
* ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์„ ์œ„ํ•œ <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>. * [Pydantic](https://docs.pydantic.dev/) โ€” ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
## ์„ค์น˜ { #installation } ## ์„ค์น˜ { #installation }
<a href="https://fastapi.tiangolo.com/ko/virtual-environments/" class="external-link" target="_blank">๊ฐ€์ƒ ํ™˜๊ฒฝ</a>์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ FastAPI๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”: [๊ฐ€์ƒ ํ™˜๊ฒฝ](https://fastapi.tiangolo.com/ko/virtual-environments/)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ FastAPI๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”:
<div class="termy"> <div class="termy">
@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None):
**Note**: **Note**:
์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, <a href="https://fastapi.tiangolo.com/ko/async/#in-a-hurry" target="_blank">๋ฌธ์„œ์—์„œ `async`์™€ `await`</a>์— ๊ด€ํ•œ _"๊ธ‰ํ•˜์„ธ์š”?"_ ์„น์…˜์„ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ["๊ธ‰ํ•˜์„ธ์š”?"](https://fastapi.tiangolo.com/ko/async/#in-a-hurry) ์„น์…˜์„ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
</details> </details>
@ -210,7 +210,7 @@ async def read_item(item_id: int, q: str | None = None):
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev main.py $ fastapi dev
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ FastAPI CLI - Development mode โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ FastAPI CLI - Development mode โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ โ”‚ โ”‚ โ”‚
@ -235,19 +235,19 @@ INFO: Application startup complete.
</div> </div>
<details markdown="1"> <details markdown="1">
<summary><code>fastapi dev main.py</code> ๋ช…๋ น์— ๊ด€ํ•˜์—ฌ...</summary> <summary><code>fastapi dev</code> ๋ช…๋ น์— ๊ด€ํ•˜์—ฌ...</summary>
`fastapi dev` ๋ช…๋ น์€ `main.py` ํŒŒ์ผ์„ ์ฝ๊ณ , ๊ทธ ์•ˆ์˜ **FastAPI** ์•ฑ์„ ๊ฐ์ง€ํ•œ ๋‹ค์Œ, <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>์„ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. `fastapi dev` ๋ช…๋ น์€ ์—ฌ๋Ÿฌ๋ถ„์˜ `main.py` ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ฝ๊ณ , ๊ทธ ์•ˆ์˜ **FastAPI** ์•ฑ์„ ๊ฐ์ง€ํ•œ ๋‹ค์Œ, [Uvicorn](https://www.uvicorn.dev)์„ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ `fastapi dev`๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด auto-reload๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ `fastapi dev`๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด auto-reload๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://fastapi.tiangolo.com/ko/fastapi-cli/" target="_blank">FastAPI CLI ๋ฌธ์„œ</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [FastAPI CLI ๋ฌธ์„œ](https://fastapi.tiangolo.com/ko/fastapi-cli/)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
</details> </details>
### ํ™•์ธํ•˜๊ธฐ { #check-it } ### ํ™•์ธํ•˜๊ธฐ { #check-it }
๋ธŒ๋ผ์šฐ์ €๋กœ <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a>๋ฅผ ์—ด์–ด๋ณด์‹ญ์‹œ์˜ค. ๋ธŒ๋ผ์šฐ์ €๋กœ [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery)๋ฅผ ์—ด์–ด๋ณด์‹ญ์‹œ์˜ค.
์•„๋ž˜์˜ JSON ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์•„๋ž˜์˜ JSON ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
@ -264,17 +264,17 @@ INFO: Application startup complete.
### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ { #interactive-api-docs } ### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ { #interactive-api-docs }
์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ๊ฐ€๋ณด์‹ญ์‹œ์˜ค. ์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ๊ฐ€๋ณด์‹ญ์‹œ์˜ค.
์ž๋™ ๋Œ€ํ™”ํ˜• 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) ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
### ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs } ### ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs }
๊ทธ๋ฆฌ๊ณ  ์ด์ œ <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ๊ฐ€๋ด…์‹œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ๊ฐ€๋ด…์‹œ๋‹ค.
๋‹ค๋ฅธ ์ž๋™ ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(<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) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@ -316,7 +316,7 @@ def update_item(item_id: int, item: Item):
### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ { #interactive-api-docs-upgrade } ### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ { #interactive-api-docs-upgrade }
์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
* ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ๋Š” ์ƒˆ ๋ณธ๋ฌธ์„ ํฌํ•จํ•ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค: * ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ๋Š” ์ƒˆ ๋ณธ๋ฌธ์„ ํฌํ•จํ•ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค:
@ -332,7 +332,7 @@ def update_item(item_id: int, item: Item):
### ๋Œ€์•ˆ API ๋ฌธ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ { #alternative-api-docs-upgrade } ### ๋Œ€์•ˆ API ๋ฌธ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ { #alternative-api-docs-upgrade }
๊ทธ๋ฆฌ๊ณ  ์ด์ œ, <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ, [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
* ๋Œ€์•ˆ ๋ฌธ์„œ ์—ญ์‹œ ์ƒˆ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณธ๋ฌธ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค: * ๋Œ€์•ˆ ๋ฌธ์„œ ์—ญ์‹œ ์ƒˆ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณธ๋ฌธ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค:
@ -433,7 +433,7 @@ item: Item
![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ๋ณด๋‹ค ์™„์ „ํ•œ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ, <a href="https://fastapi.tiangolo.com/ko/tutorial/">ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ</a>๋ฅผ ๋ณด์‹ญ์‹œ์˜ค. ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ๋ณด๋‹ค ์™„์ „ํ•œ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ, [ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](https://fastapi.tiangolo.com/ko/tutorial/)๋ฅผ ๋ณด์‹ญ์‹œ์˜ค.
**์Šคํฌ์ผ๋Ÿฌ ์ฃผ์˜**: ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ๋Š”: **์Šคํฌ์ผ๋Ÿฌ ์ฃผ์˜**: ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ๋Š”:
@ -442,7 +442,7 @@ item: Item
* ๊ฐ•๋ ฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด **<dfn title="๋‹ค๋ฅธ ๋ง๋กœ๋Š”: ์ปดํฌ๋„ŒํŠธ, ๋ฆฌ์†Œ์Šค, ํ”„๋กœ๋ฐ”์ด๋”, ์„œ๋น„์Šค, ์ธ์ ํ„ฐ๋ธ”">์˜์กด์„ฑ ์ฃผ์ž…</dfn>** ์‹œ์Šคํ…œ. * ๊ฐ•๋ ฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด **<dfn title="๋‹ค๋ฅธ ๋ง๋กœ๋Š”: ์ปดํฌ๋„ŒํŠธ, ๋ฆฌ์†Œ์Šค, ํ”„๋กœ๋ฐ”์ด๋”, ์„œ๋น„์Šค, ์ธ์ ํ„ฐ๋ธ”">์˜์กด์„ฑ ์ฃผ์ž…</dfn>** ์‹œ์Šคํ…œ.
* **OAuth2** ์ง€์›์„ ํฌํ•จํ•œ **JWT tokens** ๋ฐ **HTTP Basic**์„ ๊ฐ–๋Š” ๋ณด์•ˆ๊ณผ ์ธ์ฆ. * **OAuth2** ์ง€์›์„ ํฌํ•จํ•œ **JWT tokens** ๋ฐ **HTTP Basic**์„ ๊ฐ–๋Š” ๋ณด์•ˆ๊ณผ ์ธ์ฆ.
* (Pydantic ๋•๋ถ„์—) **๊นŠ์€ ์ค‘์ฒฉ JSON ๋ชจ๋ธ**์„ ์„ ์–ธํ•˜๋Š”๋ฐ ๋” ์ง„๋ณดํ•œ (ํ•˜์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‰ฌ์šด) ๊ธฐ์ˆ . * (Pydantic ๋•๋ถ„์—) **๊นŠ์€ ์ค‘์ฒฉ JSON ๋ชจ๋ธ**์„ ์„ ์–ธํ•˜๋Š”๋ฐ ๋” ์ง„๋ณดํ•œ (ํ•˜์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‰ฌ์šด) ๊ธฐ์ˆ .
* <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> ๋ฐ ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ **GraphQL** ํ†ตํ•ฉ. * [Strawberry](https://strawberry.rocks) ๋ฐ ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ **GraphQL** ํ†ตํ•ฉ.
* (Starlette ๋•๋ถ„์—) ๋งŽ์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ: * (Starlette ๋•๋ถ„์—) ๋งŽ์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ:
* **์›น ์†Œ์ผ“** * **์›น ์†Œ์ผ“**
* HTTPX ๋ฐ `pytest`์— ๊ธฐ๋ฐ˜ํ•œ ๊ทนํžˆ ์‰ฌ์šด ํ…Œ์ŠคํŠธ * HTTPX ๋ฐ `pytest`์— ๊ธฐ๋ฐ˜ํ•œ ๊ทนํžˆ ์‰ฌ์šด ํ…Œ์ŠคํŠธ
@ -452,24 +452,10 @@ item: Item
### ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional } ### ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional }
์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€ ์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€
์ด๋ฏธ **FastAPI Cloud** ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด(๋Œ€๊ธฐ์ž ๋ช…๋‹จ์—์„œ ์ดˆ๋Œ€ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰), ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ **FastAPI Cloud** ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด(๋Œ€๊ธฐ์ž ๋ช…๋‹จ์—์„œ ์ดˆ๋Œ€ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰), ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐฐํฌํ•˜๊ธฐ ์ „์—, ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”:
<div class="termy">
```console
$ fastapi login
You are logged in to FastAPI Cloud ๐Ÿš€
```
</div>
๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ์„ ๋ฐฐํฌํ•˜์„ธ์š”:
<div class="termy"> <div class="termy">
```console ```console
@ -488,7 +474,7 @@ Deploying to FastAPI Cloud...
#### FastAPI Cloud ์†Œ๊ฐœ { #about-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๋ฅผ **๋นŒ๋“œ**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๋นŒ๋“œ**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
@ -504,9 +490,9 @@ FastAPI๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ์–ด
## ์„ฑ๋Šฅ { #performance } ## ์„ฑ๋Šฅ { #performance }
๋…๋ฆฝ๋œ TechEmpower ๋ฒค์น˜๋งˆํฌ์—์„œ Uvicorn์—์„œ ์ž‘๋™ํ•˜๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜</a>๋กœ Starlette์™€ Uvicorn(FastAPI์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ)์—๋งŒ ๋ฐ‘๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (*) ๋…๋ฆฝ๋œ TechEmpower ๋ฒค์น˜๋งˆํฌ์—์„œ Uvicorn์—์„œ ์ž‘๋™ํ•˜๋Š” **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด [์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7)๋กœ Starlette์™€ Uvicorn(FastAPI์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ)์—๋งŒ ๋ฐ‘๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (*)
์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://fastapi.tiangolo.com/ko/benchmarks/" class="internal-link" target="_blank">๋ฒค์น˜๋งˆํฌ</a> ์„น์…˜์„ ๋ณด์‹ญ์‹œ์˜ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฒค์น˜๋งˆํฌ](https://fastapi.tiangolo.com/ko/benchmarks/) ์„น์…˜์„ ๋ณด์‹ญ์‹œ์˜ค.
## ์˜์กด์„ฑ { #dependencies } ## ์˜์กด์„ฑ { #dependencies }
@ -514,23 +500,23 @@ FastAPI๋Š” Pydantic๊ณผ Starlette์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
### `standard` ์˜์กด์„ฑ { #standard-dependencies } ### `standard` ์˜์กด์„ฑ { #standard-dependencies }
FastAPI๋ฅผ `pip install "fastapi[standard]"`๋กœ ์„ค์น˜ํ•˜๋ฉด `standard` ๊ทธ๋ฃน์˜ ์„ ํƒ์  ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. `pip install "fastapi[standard]"`๋กœ FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด `standard` ๊ทธ๋ฃน์˜ ์„ ํƒ์  ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
Pydantic์ด ์‚ฌ์šฉํ•˜๋Š”: Pydantic์ด ์‚ฌ์šฉํ•˜๋Š”:
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - ์ด๋ฉ”์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ. * [`email-validator`](https://github.com/JoshData/python-email-validator) - ์ด๋ฉ”์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ.
Starlette์ด ์‚ฌ์šฉํ•˜๋Š”: Starlette์ด ์‚ฌ์šฉํ•˜๋Š”:
* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - `TestClient`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”. * [`httpx`](https://www.python-httpx.org) - `TestClient`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”. * [`jinja2`](https://jinja.palletsprojects.com) - ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - `request.form()`๊ณผ ํ•จ๊ป˜ form <dfn title="HTTP ์š”์ฒญ์—์„œ ์˜จ ๋ฌธ์ž์—ด์„ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜">"ํŒŒ์‹ฑ"</dfn> ์ง€์›์„ ์›ํ•˜๋ฉด ํ•„์š”. * [`python-multipart`](https://github.com/Kludex/python-multipart) - `request.form()`๊ณผ ํ•จ๊ป˜ form <dfn title="HTTP ์š”์ฒญ์—์„œ ์˜จ ๋ฌธ์ž์—ด์„ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜">"ํŒŒ์‹ฑ"</dfn> ์ง€์›์„ ์›ํ•˜๋ฉด ํ•„์š”.
FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”: FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”:
* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณ ์„ฑ๋Šฅ ์„œ๋น™์— ํ•„์š”ํ•œ ์ผ๋ถ€ ์˜์กด์„ฑ(์˜ˆ: `uvloop`)์ด ํฌํ•จ๋œ `uvicorn[standard]`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. * [`uvicorn`](https://www.uvicorn.dev) - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณ ์„ฑ๋Šฅ ์„œ๋น™์— ํ•„์š”ํ•œ ์ผ๋ถ€ ์˜์กด์„ฑ(์˜ˆ: `uvloop`)์ด ํฌํ•จ๋œ `uvicorn[standard]`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
* `fastapi-cli[standard]` - `fastapi` ๋ช…๋ น์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. * `fastapi-cli[standard]` - `fastapi` ๋ช…๋ น์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ์—ฌ๊ธฐ์—๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” `fastapi-cloud-cli`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. * ์—ฌ๊ธฐ์—๋Š” [FastAPI Cloud](https://fastapicloud.com)์— FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” `fastapi-cloud-cli`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
### `standard` ์˜์กด์„ฑ ์—†์ด { #without-standard-dependencies } ### `standard` ์˜์กด์„ฑ ์—†์ด { #without-standard-dependencies }
@ -546,13 +532,13 @@ FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”:
์ถ”๊ฐ€ ์„ ํƒ์  Pydantic ์˜์กด์„ฑ: ์ถ”๊ฐ€ ์„ ํƒ์  Pydantic ์˜์กด์„ฑ:
* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - ์„ค์ • ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. * [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - ์„ค์ • ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - Pydantic์—์„œ ์‚ฌ์šฉํ•  ์ถ”๊ฐ€ ํƒ€์ž…์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. * [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - Pydantic์—์„œ ์‚ฌ์šฉํ•  ์ถ”๊ฐ€ ํƒ€์ž…์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ถ”๊ฐ€ ์„ ํƒ์  FastAPI ์˜์กด์„ฑ: ์ถ”๊ฐ€ ์„ ํƒ์  FastAPI ์˜์กด์„ฑ:
* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - `ORJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”. * [`orjson`](https://github.com/ijl/orjson) - `ORJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - `UJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”. * [`ujson`](https://github.com/esnme/ultrajson) - `UJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
## ๋ผ์ด์„ผ์Šค { #license } ## ๋ผ์ด์„ผ์Šค { #license }

2
docs/ko/docs/project-generation.md

@ -4,7 +4,7 @@
๋งŽ์€ ์ดˆ๊ธฐ ์„ค์ •, ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์ผ๋ถ€ API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ด๋ฏธ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ํ…œํ”Œ๋ฆฟ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ดˆ๊ธฐ ์„ค์ •, ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์ผ๋ถ€ API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ด๋ฏธ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ํ…œํ”Œ๋ฆฟ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
GitHub ์ €์žฅ์†Œ: <a href="https://github.com/tiangolo/full-stack-fastapi-template" class="external-link" target="_blank">Full Stack FastAPI ํ…œํ”Œ๋ฆฟ</a> GitHub ์ €์žฅ์†Œ: [Full Stack FastAPI ํ…œํ”Œ๋ฆฟ](https://github.com/tiangolo/full-stack-fastapi-template)
## Full Stack FastAPI ํ…œํ”Œ๋ฆฟ - ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ๊ธฐ๋Šฅ๋“ค { #full-stack-fastapi-template-technology-stack-and-features } ## Full Stack FastAPI ํ…œํ”Œ๋ฆฟ - ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ๊ธฐ๋Šฅ๋“ค { #full-stack-fastapi-template-technology-stack-and-features }

6
docs/ko/docs/python-types.md

@ -271,7 +271,7 @@ def some_function(data: Any):
## Pydantic ๋ชจ๋ธ { #pydantic-models } ## Pydantic ๋ชจ๋ธ { #pydantic-models }
<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. [Pydantic](https://docs.pydantic.dev/)์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
์†์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ์˜ "๋ชจ์–‘(shape)"์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ์˜ "๋ชจ์–‘(shape)"์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
@ -287,7 +287,7 @@ Pydantic ๊ณต์‹ ๋ฌธ์„œ์˜ ์˜ˆ์‹œ:
/// info | ์ •๋ณด /// info | ์ •๋ณด
<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”</a>. Pydantic์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”](https://docs.pydantic.dev/).
/// ///
@ -345,6 +345,6 @@ Pydantic ๊ณต์‹ ๋ฌธ์„œ์˜ ์˜ˆ์‹œ:
/// info | ์ •๋ณด /// info | ์ •๋ณด
์ž์Šต์„œ๋ฅผ ๋ชจ๋‘ ๋๋‚ด๊ณ  ํƒ€์ž…์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋Œ์•„์™”๋‹ค๋ฉด, ์ข‹์€ ์ž๋ฃŒ๋กœ <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">`mypy`์˜ "cheat sheet"</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์Šต์„œ๋ฅผ ๋ชจ๋‘ ๋๋‚ด๊ณ  ํƒ€์ž…์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋Œ์•„์™”๋‹ค๋ฉด, ์ข‹์€ ์ž๋ฃŒ๋กœ [`mypy`์˜ "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///

8
docs/ko/docs/tutorial/background-tasks.md

@ -63,7 +63,7 @@ FastAPI์—์„œ๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ *ํ›„์—* ์‹คํ–‰ํ•  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…
## ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ { #technical-details } ## ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ { #technical-details }
`BackgroundTasks` ํด๋ž˜์Šค๋Š” <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. `BackgroundTasks` ํด๋ž˜์Šค๋Š” [`starlette.background`](https://www.starlette.dev/background/)์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
FastAPI์— ์ง์ ‘ ์ž„ํฌํŠธ/ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ `fastapi`์—์„œ ์ž„ํฌํŠธํ•  ์ˆ˜ ์žˆ๊ณ , ์‹ค์ˆ˜๋กœ `starlette.background`์—์„œ ๋Œ€์•ˆ์ธ `BackgroundTask`(๋์— `s`๊ฐ€ ์—†์Œ)๋ฅผ ์ž„ํฌํŠธํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FastAPI์— ์ง์ ‘ ์ž„ํฌํŠธ/ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ `fastapi`์—์„œ ์ž„ํฌํŠธํ•  ์ˆ˜ ์žˆ๊ณ , ์‹ค์ˆ˜๋กœ `starlette.background`์—์„œ ๋Œ€์•ˆ์ธ `BackgroundTask`(๋์— `s`๊ฐ€ ์—†์Œ)๋ฅผ ์ž„ํฌํŠธํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -71,15 +71,15 @@ FastAPI์— ์ง์ ‘ ์ž„ํฌํŠธ/ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ `fastapi`์—์„œ ์ž„ํฌํŠธ
FastAPI์—์„œ `BackgroundTask`๋งŒ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํฌํ•จํ•˜๋Š” Starlette `Response`๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FastAPI์—์„œ `BackgroundTask`๋งŒ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํฌํ•จํ•˜๋Š” Starlette `Response`๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">Starlette์˜ Background Tasks ๊ณต์‹ ๋ฌธ์„œ</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ [Starlette์˜ Background Tasks ๊ณต์‹ ๋ฌธ์„œ](https://www.starlette.dev/background/)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ์ฃผ์˜์‚ฌํ•ญ { #caveat } ## ์ฃผ์˜์‚ฌํ•ญ { #caveat }
๋ฌด๊ฑฐ์šด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ, ๋ณ€์ˆ˜ ๋“ฑ์„ ๊ณต์œ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ) <a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a> ๊ฐ™์€ ๋” ํฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ, ๋ณ€์ˆ˜ ๋“ฑ์„ ๊ณต์œ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ) [Celery](https://docs.celeryq.dev) ๊ฐ™์€ ๋” ํฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋“ค์€ RabbitMQ๋‚˜ Redis ๊ฐ™์€ ๋ฉ”์‹œ์ง€/์ž‘์—… ํ ๊ด€๋ฆฌ์ž ๋“ฑ ๋” ๋ณต์žกํ•œ ์„ค์ •์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ, ํŠนํžˆ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ RabbitMQ๋‚˜ Redis ๊ฐ™์€ ๋ฉ”์‹œ์ง€/์ž‘์—… ํ ๊ด€๋ฆฌ์ž ๋“ฑ ๋” ๋ณต์žกํ•œ ์„ค์ •์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ, ํŠนํžˆ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋™์ผํ•œ **FastAPI** ์•ฑ์˜ ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜(๋˜๋Š” ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์ „์†ก์ฒ˜๋Ÿผ) ์ž‘์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, `BackgroundTasks`๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์ผํ•œ **FastAPI** ์•ฑ์˜ ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์ž‘์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…(์˜ˆ: ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์ „์†ก)์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, `BackgroundTasks`๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
## ์š”์•ฝ { #recap } ## ์š”์•ฝ { #recap }

47
docs/ko/docs/tutorial/bigger-applications.md

@ -123,7 +123,7 @@ from app.routers import items
์ด ์˜ˆ์‹œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ž„์˜๋กœ ๋งŒ๋“  ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ž„์˜๋กœ ๋งŒ๋“  ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์‹ค์ œ ์ƒํ™ฉ์—์„œ๋Š” ํ†ตํ•ฉ๋œ [Security ์œ ํ‹ธ๋ฆฌํ‹ฐ](security/index.md){.internal-link target=_blank}๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ์ƒํ™ฉ์—์„œ๋Š” ํ†ตํ•ฉ๋œ [Security ์œ ํ‹ธ๋ฆฌํ‹ฐ](security/index.md)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -169,7 +169,7 @@ async def read_item(item_id: str):
/// tip | ํŒ /// tip | ํŒ
[*path operation decorator์˜ dependencies*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, *path operation function*์— ์–ด๋–ค ๊ฐ’๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. [*path operation decorator์˜ dependencies*](dependencies/dependencies-in-path-operation-decorators.md)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, *path operation function*์— ์–ด๋–ค ๊ฐ’๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
/// ///
@ -185,8 +185,8 @@ async def read_item(item_id: str):
* ๋ชจ๋‘ ๋ฏธ๋ฆฌ ์ •์˜๋œ `responses`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. * ๋ชจ๋‘ ๋ฏธ๋ฆฌ ์ •์˜๋œ `responses`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
* ์ด ๋ชจ๋“  *path operations*๋Š” ์‹คํ–‰๋˜๊ธฐ ์ „์— `dependencies` ๋ชฉ๋ก์ด ํ‰๊ฐ€/์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. * ์ด ๋ชจ๋“  *path operations*๋Š” ์‹คํ–‰๋˜๊ธฐ ์ „์— `dependencies` ๋ชฉ๋ก์ด ํ‰๊ฐ€/์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
* ํŠน์ • *path operation*์— dependencies๋ฅผ ์ถ”๊ฐ€๋กœ ์„ ์–ธํ•˜๋ฉด **๊ทธ๊ฒƒ๋“ค๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค**. * ํŠน์ • *path operation*์— dependencies๋ฅผ ์ถ”๊ฐ€๋กœ ์„ ์–ธํ•˜๋ฉด **๊ทธ๊ฒƒ๋“ค๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค**.
* router dependencies๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— [decorator์˜ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ dependencies๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. * router dependencies๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— [decorator์˜ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ dependencies๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
* [`scopes`๊ฐ€ ์žˆ๋Š” `Security` dependencies](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * [`scopes`๊ฐ€ ์žˆ๋Š” `Security` dependencies](../advanced/security/oauth2-scopes.md)๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ /// tip | ํŒ
@ -303,7 +303,7 @@ from ...dependencies import get_token_header
ํ‰์†Œ์ฒ˜๋Ÿผ `FastAPI` ํด๋ž˜์Šค๋ฅผ importํ•˜๊ณ  ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ‰์†Œ์ฒ˜๋Ÿผ `FastAPI` ํด๋ž˜์Šค๋ฅผ importํ•˜๊ณ  ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐ `APIRouter`์˜ dependencies์™€ ๊ฒฐํ•ฉ๋  [global dependencies](dependencies/global-dependencies.md){.internal-link target=_blank}๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๋˜ํ•œ ๊ฐ `APIRouter`์˜ dependencies์™€ ๊ฒฐํ•ฉ๋  [global dependencies](dependencies/global-dependencies.md)๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *}
@ -353,7 +353,7 @@ from .routers import items, users
from app.routers import items, users from app.routers import items, users
``` ```
Python Packages์™€ Modules์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด <a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">Modules์— ๋Œ€ํ•œ Python ๊ณต์‹ ๋ฌธ์„œ</a>๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”. Python Packages์™€ Modules์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [Modules์— ๋Œ€ํ•œ Python ๊ณต์‹ ๋ฌธ์„œ](https://docs.python.org/3/tutorial/modules.html)๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
/// ///
@ -465,6 +465,37 @@ router๋ฅผ ํฌํ•จ(include)ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
/// ///
## `pyproject.toml`์—์„œ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-entrypoint-in-pyproject-toml }
FastAPI `app` ๊ฐ์ฒด๊ฐ€ `app/main.py`์— ์žˆ์œผ๋ฏ€๋กœ `pyproject.toml` ํŒŒ์ผ์—์„œ `entrypoint`๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```toml
[tool.fastapi]
entrypoint = "app.main:app"
```
์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด importํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค:
```python
from app.main import app
```
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด `fastapi` ๋ช…๋ น์–ด๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// Note | ์ฐธ๊ณ 
๋ช…๋ น์–ด์— ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
```console
$ fastapi dev app/main.py
```
ํ•˜์ง€๋งŒ `fastapi` ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์–ตํ•ด ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ [VS Code ํ™•์žฅ](../editor-support.md)์ด๋‚˜ [FastAPI Cloud](https://fastapicloud.com) ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์ด ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, `pyproject.toml`์˜ `entrypoint`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
///
## ์ž๋™ API ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ { #check-the-automatic-api-docs } ## ์ž๋™ API ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ { #check-the-automatic-api-docs }
์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜์„ธ์š”: ์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜์„ธ์š”:
@ -472,14 +503,14 @@ router๋ฅผ ํฌํ•จ(include)ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev app/main.py $ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
</div> </div>
๊ทธ๋ฆฌ๊ณ  <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”.
์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ(๋ฐ prefix)์™€ ์˜ฌ๋ฐ”๋ฅธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด, ๋ชจ๋“  submodule์˜ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ์ž๋™ API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ(๋ฐ prefix)์™€ ์˜ฌ๋ฐ”๋ฅธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด, ๋ชจ๋“  submodule์˜ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ์ž๋™ API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

2
docs/ko/docs/tutorial/body-nested-models.md

@ -96,7 +96,7 @@ Pydantic ๋ชจ๋ธ์˜ ๊ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ํƒ€์ž…์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
`str`, `int`, `float` ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋‹จ์ผ ํƒ€์ž…๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, `str`์„ ์ƒ์†ํ•˜๋Š” ๋” ๋ณต์žกํ•œ ๋‹จ์ผ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `str`, `int`, `float` ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋‹จ์ผ ํƒ€์ž…๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, `str`์„ ์ƒ์†ํ•˜๋Š” ๋” ๋ณต์žกํ•œ ๋‹จ์ผ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ต์…˜์„ ๋ณด๋ ค๋ฉด <a href="https://docs.pydantic.dev/latest/concepts/types/" class="external-link" target="_blank">Pydantic์˜ Type Overview</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค์Œ ์žฅ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ต์…˜์„ ๋ณด๋ ค๋ฉด [Pydantic์˜ Type Overview](https://docs.pydantic.dev/latest/concepts/types/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค์Œ ์žฅ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด `Image` ๋ชจ๋ธ์—๋Š” `url` ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ `str` ๋Œ€์‹  Pydantic์˜ `HttpUrl` ์ธ์Šคํ„ด์Šค๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์˜ˆ๋ฅผ ๋“ค์–ด `Image` ๋ชจ๋ธ์—๋Š” `url` ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ `str` ๋Œ€์‹  Pydantic์˜ `HttpUrl` ์ธ์Šคํ„ด์Šค๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

6
docs/ko/docs/tutorial/body-updates.md

@ -2,7 +2,7 @@
## `PUT`์œผ๋กœ ๊ต์ฒด ์—…๋ฐ์ดํŠธํ•˜๊ธฐ { #update-replacing-with-put } ## `PUT`์œผ๋กœ ๊ต์ฒด ์—…๋ฐ์ดํŠธํ•˜๊ธฐ { #update-replacing-with-put }
ํ•ญ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a> ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
`jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ ์‹œ). ์˜ˆ๋ฅผ ๋“ค์–ด `datetime`์„ `str`๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ ์‹œ). ์˜ˆ๋ฅผ ๋“ค์–ด `datetime`์„ `str`๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
@ -28,7 +28,7 @@
## `PATCH`๋กœ ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ { #partial-updates-with-patch } ## `PATCH`๋กœ ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ { #partial-updates-with-patch }
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> ์ž‘์—…์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ *๋ถ€๋ถ„์ ์œผ๋กœ* ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) ์ž‘์—…์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ *๋ถ€๋ถ„์ ์œผ๋กœ* ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ์—…๋ฐ์ดํŠธํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋‚ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—…๋ฐ์ดํŠธํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋‚ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
@ -95,6 +95,6 @@
๋”ฐ๋ผ์„œ ๋ชจ๋“  ์†์„ฑ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด, ๋ชจ๋“  ์†์„ฑ์ด optional๋กœ ํ‘œ์‹œ๋œ(๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ฑฐ๋‚˜ `None`์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š”) ๋ชจ๋ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์†์„ฑ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด, ๋ชจ๋“  ์†์„ฑ์ด optional๋กœ ํ‘œ์‹œ๋œ(๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ฑฐ๋‚˜ `None`์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š”) ๋ชจ๋ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
**์—…๋ฐ์ดํŠธ**๋ฅผ ์œ„ํ•œ โ€œ๋ชจ๋“  ๊ฐ’์ด optional์ธโ€ ๋ชจ๋ธ๊ณผ, **์ƒ์„ฑ**์„ ์œ„ํ•œ โ€œํ•„์ˆ˜ ๊ฐ’์ด ์žˆ๋Š”โ€ ๋ชจ๋ธ์„ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด [์ถ”๊ฐ€ ๋ชจ๋ธ](extra-models.md){.internal-link target=_blank}์— ์„ค๋ช…๋œ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **์—…๋ฐ์ดํŠธ**๋ฅผ ์œ„ํ•œ โ€œ๋ชจ๋“  ๊ฐ’์ด optional์ธโ€ ๋ชจ๋ธ๊ณผ, **์ƒ์„ฑ**์„ ์œ„ํ•œ โ€œํ•„์ˆ˜ ๊ฐ’์ด ์žˆ๋Š”โ€ ๋ชจ๋ธ์„ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด [์ถ”๊ฐ€ ๋ชจ๋ธ](extra-models.md)์— ์„ค๋ช…๋œ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///

10
docs/ko/docs/tutorial/body.md

@ -6,7 +6,7 @@
์—ฌ๋Ÿฌ๋ถ„์˜ API๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ **์‘๋‹ต** ๋ณธ๋ฌธ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ญ์ƒ **์š”์ฒญ ๋ณธ๋ฌธ**์„ ๋ณด๋‚ผ ํ•„์š”๋Š” ์—†๊ณ , ๋•Œ๋กœ๋Š” (์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜) ์–ด๋–ค ๊ฒฝ๋กœ๋งŒ ์š”์ฒญํ•˜๊ณ  ๋ณธ๋ฌธ์€ ๋ณด๋‚ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ API๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ **์‘๋‹ต** ๋ณธ๋ฌธ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ญ์ƒ **์š”์ฒญ ๋ณธ๋ฌธ**์„ ๋ณด๋‚ผ ํ•„์š”๋Š” ์—†๊ณ , ๋•Œ๋กœ๋Š” (์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜) ์–ด๋–ค ๊ฒฝ๋กœ๋งŒ ์š”์ฒญํ•˜๊ณ  ๋ณธ๋ฌธ์€ ๋ณด๋‚ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
**์š”์ฒญ** ๋ณธ๋ฌธ์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  ๊ฐ•๋ ฅํ•จ๊ณผ ์ด์ ์„ ๊ฐ–์ถ˜ <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. **์š”์ฒญ** ๋ณธ๋ฌธ์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  ๊ฐ•๋ ฅํ•จ๊ณผ ์ด์ ์„ ๊ฐ–์ถ˜ [Pydantic](https://docs.pydantic.dev/) ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
/// info | ์ •๋ณด /// info | ์ •๋ณด
@ -73,7 +73,7 @@
* ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์ •ํ™•ํžˆ ์–ด๋–ค ๊ฒƒ์ด ๊ทธ๋ฆฌ๊ณ  ์–ด๋””์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋ชป ๋˜์—ˆ๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ์นœ์ ˆํ•˜๊ณ  ๋ช…๋ฃŒํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. * ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์ •ํ™•ํžˆ ์–ด๋–ค ๊ฒƒ์ด ๊ทธ๋ฆฌ๊ณ  ์–ด๋””์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋ชป ๋˜์—ˆ๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ์นœ์ ˆํ•˜๊ณ  ๋ช…๋ฃŒํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ๋งค๊ฐœ๋ณ€์ˆ˜ `item`์— ํฌํ•จ๋œ ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. * ๋งค๊ฐœ๋ณ€์ˆ˜ `item`์— ํฌํ•จ๋œ ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
* ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ `Item` ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๊ทธ์— ๋Œ€ํ•œ ํƒ€์ž…์— ๋Œ€ํ•œ ํŽธ์ง‘๊ธฐ ์ง€์›(์™„์„ฑ ๋“ฑ)์„ ๋˜ํ•œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ `Item` ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๊ทธ์— ๋Œ€ํ•œ ํƒ€์ž…์— ๋Œ€ํ•œ ํŽธ์ง‘๊ธฐ ์ง€์›(์™„์„ฑ ๋“ฑ)์„ ๋˜ํ•œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋ธ์„ ์œ„ํ•œ <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> ์ •์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋ธ์„ ์œ„ํ•œ [JSON Schema](https://json-schema.org) ์ •์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ์ด๋Ÿฌํ•œ ์Šคํ‚ค๋งˆ๋Š”, ์ƒ์„ฑ๋œ OpenAPI ์Šคํ‚ค๋งˆ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ, ์ž๋™ ๋ฌธ์„œํ™” <abbr title="User Interfaces - ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค">UIs</abbr>์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. * ์ด๋Ÿฌํ•œ ์Šคํ‚ค๋งˆ๋Š”, ์ƒ์„ฑ๋œ OpenAPI ์Šคํ‚ค๋งˆ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ, ์ž๋™ ๋ฌธ์„œํ™” <abbr title="User Interfaces - ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค">UIs</abbr>์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
## ์ž๋™ ๋ฌธ์„œํ™” { #automatic-docs } ## ์ž๋™ ๋ฌธ์„œํ™” { #automatic-docs }
@ -102,15 +102,15 @@
์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Pydantic ์ž์ฒด์—์„œ ๋ช‡๋ช‡ ๋ณ€๊ฒฝ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Pydantic ์ž์ฒด์—์„œ ๋ช‡๋ช‡ ๋ณ€๊ฒฝ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด์ „ ์Šคํฌ๋ฆฐ์ƒท์€ <a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a>๋ฅผ ์ฐ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „ ์Šคํฌ๋ฆฐ์ƒท์€ [Visual Studio Code](https://code.visualstudio.com)๋กœ ์ฐ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋˜‘๊ฐ™์€ ํŽธ์ง‘๊ธฐ ์ง€์›์„ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>์™€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŒŒ์ด์ฌ ํŽธ์ง‘๊ธฐ์—์„œ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ํ•˜์ง€๋งŒ ๋˜‘๊ฐ™์€ ํŽธ์ง‘๊ธฐ ์ง€์›์„ [PyCharm](https://www.jetbrains.com/pycharm/)์™€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŒŒ์ด์ฌ ํŽธ์ง‘๊ธฐ์—์„œ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
<img src="/img/tutorial/body/image05.png"> <img src="/img/tutorial/body/image05.png">
/// tip | ํŒ /// tip | ํŒ
๋งŒ์•ฝ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>๋ฅผ ํŽธ์ง‘๊ธฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ [PyCharm](https://www.jetbrains.com/pycharm/)๋ฅผ ํŽธ์ง‘๊ธฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์‚ฌํ•ญ์„ ํฌํ•จํ•ด Pydantic ๋ชจ๋ธ์— ๋Œ€ํ•œ ํŽธ์ง‘๊ธฐ ์ง€์›์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค: ๋‹ค์Œ ์‚ฌํ•ญ์„ ํฌํ•จํ•ด Pydantic ๋ชจ๋ธ์— ๋Œ€ํ•œ ํŽธ์ง‘๊ธฐ ์ง€์›์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค:

8
docs/ko/docs/tutorial/cors.md

@ -1,6 +1,6 @@
# CORS (๊ต์ฐจ-์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ) { #cors-cross-origin-resource-sharing } # CORS (๊ต์ฐจ-์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ) { #cors-cross-origin-resource-sharing }
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS ๋˜๋Š” "Cross-Origin Resource Sharing"</a>๋ž€, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ์— ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ํ•˜๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ , ๋ฐฑ์—”๋“œ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋‹ค๋ฅธ "์ถœ์ฒ˜(origin)"์— ์žˆ๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. [CORS ๋˜๋Š” "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)๋ž€, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ์— ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ํ•˜๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ , ๋ฐฑ์—”๋“œ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋‹ค๋ฅธ "์ถœ์ฒ˜(origin)"์— ์žˆ๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
## ์ถœ์ฒ˜ { #origin } ## ์ถœ์ฒ˜ { #origin }
@ -56,10 +56,10 @@
* `allow_origins` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š” ์ถœ์ฒ˜์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ: `['https://example.org', 'https://www.example.org']`. ๋ชจ๋“  ์ถœ์ฒ˜๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * `allow_origins` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š” ์ถœ์ฒ˜์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ: `['https://example.org', 'https://www.example.org']`. ๋ชจ๋“  ์ถœ์ฒ˜๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* `allow_origin_regex` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š” ์ถœ์ฒ˜์™€ ๋งค์นญํ•  ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์˜ˆ: `'https://.*\.example\.org'`. * `allow_origin_regex` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š” ์ถœ์ฒ˜์™€ ๋งค์นญํ•  ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์˜ˆ: `'https://.*\.example\.org'`.
* `allow_methods` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” HTTP ๋ฉ”์„œ๋“œ์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `['GET']`์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ‘œ์ค€ ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * `allow_methods` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” HTTP ๋ฉ”์„œ๋“œ์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `['GET']`์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ‘œ์ค€ ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* `allow_headers` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ง€์›๋˜์–ด์•ผ ํ•˜๋Š” HTTP ์š”์ฒญ ํ—ค๋”์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `[]`์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ—ค๋”๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `Accept`, `Accept-Language`, `Content-Language`, `Content-Type` ํ—ค๋”๋Š” <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">๋‹จ์ˆœ CORS ์š”์ฒญ</a>์— ๋Œ€ํ•ด ํ•ญ์ƒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. * `allow_headers` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ง€์›๋˜์–ด์•ผ ํ•˜๋Š” HTTP ์š”์ฒญ ํ—ค๋”์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `[]`์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ—ค๋”๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `Accept`, `Accept-Language`, `Content-Language`, `Content-Type` ํ—ค๋”๋Š” [๋‹จ์ˆœ CORS ์š”์ฒญ](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)์— ๋Œ€ํ•ด ํ•ญ์ƒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
* `allow_credentials` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ฟ ํ‚ค๋ฅผ ์ง€์›ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `False`์ž…๋‹ˆ๋‹ค. * `allow_credentials` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ฟ ํ‚ค๋ฅผ ์ง€์›ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `False`์ž…๋‹ˆ๋‹ค.
`allow_credentials`๊ฐ€ `True`๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ `allow_origins`, `allow_methods`, `allow_headers` ์ค‘ ์–ด๋А ๊ฒƒ๋„ `['*']`๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •</a>๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `allow_credentials`๊ฐ€ `True`๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ `allow_origins`, `allow_methods`, `allow_headers` ์ค‘ ์–ด๋А ๊ฒƒ๋„ `['*']`๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ [๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards)๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* `expose_headers` - ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์‘๋‹ต ํ—ค๋”๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `[]`์ž…๋‹ˆ๋‹ค. * `expose_headers` - ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์‘๋‹ต ํ—ค๋”๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `[]`์ž…๋‹ˆ๋‹ค.
* `max_age` - ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CORS ์‘๋‹ต์„ ์บ์‹œํ•˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `600`์ž…๋‹ˆ๋‹ค. * `max_age` - ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CORS ์‘๋‹ต์„ ์บ์‹œํ•˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `600`์ž…๋‹ˆ๋‹ค.
@ -78,7 +78,7 @@
## ๋” ๋งŽ์€ ์ •๋ณด { #more-info } ## ๋” ๋งŽ์€ ์ •๋ณด { #more-info }
<abbr title="Cross-Origin Resource Sharing - ๊ต์ฐจ-์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ">CORS</abbr>์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Mozilla CORS ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. <abbr title="Cross-Origin Resource Sharing - ๊ต์ฐจ-์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ">CORS</abbr>์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” [Mozilla CORS ๋ฌธ์„œ](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ

2
docs/ko/docs/tutorial/debugging.md

@ -74,7 +74,7 @@ from myapp import app
/// info | ์ •๋ณด /// info | ์ •๋ณด
์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">๊ณต์‹ Python ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณต์‹ Python ๋ฌธ์„œ](https://docs.python.org/3/library/__main__.html)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
/// ///

4
docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md

@ -32,7 +32,7 @@
์ด ์˜ˆ์‹œ์—์„œ `X-Key`์™€ `X-Token`์ด๋ผ๋Š” ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ `X-Key`์™€ `X-Token`์ด๋ผ๋Š” ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๋ณด์•ˆ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ํ†ตํ•ฉ๋œ [๋ณด์•ˆ ์œ ํ‹ธ๋ฆฌํ‹ฐ (๋‹ค์Œ ์ฑ•ํ„ฐ)](../security/index.md){.internal-link target=_blank}๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๋ณด์•ˆ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ํ†ตํ•ฉ๋œ [๋ณด์•ˆ ์œ ํ‹ธ๋ฆฌํ‹ฐ (๋‹ค์Œ ์ฑ•ํ„ฐ)](../security/index.md)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -62,7 +62,7 @@
## *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ชจ์Œ์— ๋Œ€ํ•œ ์˜์กด์„ฑ { #dependencies-for-a-group-of-path-operations } ## *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ชจ์Œ์— ๋Œ€ํ•œ ์˜์กด์„ฑ { #dependencies-for-a-group-of-path-operations }
๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md){.internal-link target=_blank})์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ชจ์Œ์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md))์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ชจ์Œ์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
## ์ „์—ญ ์˜์กด์„ฑ { #global-dependencies } ## ์ „์—ญ ์˜์กด์„ฑ { #global-dependencies }

32
docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md

@ -4,7 +4,7 @@ FastAPI๋Š” <dfn title='๋•Œ๋กœ๋Š” "exit code", "cleanup code", "teardown code", "
์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด `return` ๋Œ€์‹  `yield`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ถ”๊ฐ€๋กœ ์‹คํ–‰ํ•  ๋‹จ๊ณ„ (์ฝ”๋“œ)๋ฅผ ๊ทธ ๋’ค์— ์ž‘์„ฑํ•˜์„ธ์š”. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด `return` ๋Œ€์‹  `yield`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ถ”๊ฐ€๋กœ ์‹คํ–‰ํ•  ๋‹จ๊ณ„ (์ฝ”๋“œ)๋ฅผ ๊ทธ ๋’ค์— ์ž‘์„ฑํ•˜์„ธ์š”.
/// tip | ํŒ /// tip
๊ฐ ์˜์กด์„ฑ๋งˆ๋‹ค `yield`๋Š” ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์˜์กด์„ฑ๋งˆ๋‹ค `yield`๋Š” ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@ -14,8 +14,8 @@ FastAPI๋Š” <dfn title='๋•Œ๋กœ๋Š” "exit code", "cleanup code", "teardown code", "
๋‹ค์Œ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜: ๋‹ค์Œ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜:
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ๋˜๋Š” * [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ๋˜๋Š”
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a> * [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
๋Š” **FastAPI**์˜ ์˜์กด์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Š” **FastAPI**์˜ ์˜์กด์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -39,7 +39,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
{* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *} {* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *}
/// tip | ํŒ /// tip
`async` ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `async` ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -87,7 +87,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
ํŒŒ์ด์ฌ์˜ <a href="https://docs.python.org/3/library/contextlib.html" class="external-link" target="_blank">Context Managers</a> ๋•๋ถ„์— ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์˜ [Context Managers](https://docs.python.org/3/library/contextlib.html) ๋•๋ถ„์— ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
**FastAPI**๋Š” ์ด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. **FastAPI**๋Š” ์ด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
@ -101,7 +101,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
์˜ˆ๋ฅผ ๋“ค์–ด, `HTTPException` ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `HTTPException` ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ /// tip
์ด๋Š” ๋‹ค์†Œ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜* ๋“ฑ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ (`HTTPException` ํฌํ•จ)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์†Œ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜* ๋“ฑ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ (`HTTPException` ํฌํ•จ)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
@ -111,7 +111,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
{* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *}
์˜ˆ์™ธ๋ฅผ ์žก๊ณ  ๊ทธ์— ๊ธฐ๋ฐ˜ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, [์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. ์˜ˆ์™ธ๋ฅผ ์žก๊ณ  ๊ทธ์— ๊ธฐ๋ฐ˜ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, [์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ](../handling-errors.md#install-custom-exception-handlers)๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
## `yield`์™€ `except`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ { #dependencies-with-yield-and-except } ## `yield`์™€ `except`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ { #dependencies-with-yield-and-except }
@ -170,7 +170,7 @@ participant tasks as Background tasks
end end
``` ```
/// info | ์ •๋ณด /// info
ํด๋ผ์ด์–ธํŠธ์—๋Š” **ํ•˜๋‚˜์˜ ์‘๋‹ต**๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฅ˜ ์‘๋‹ต ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ๊ณ , *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ์ƒ์„ฑ๋œ ์‘๋‹ต์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—๋Š” **ํ•˜๋‚˜์˜ ์‘๋‹ต**๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฅ˜ ์‘๋‹ต ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ๊ณ , *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ์ƒ์„ฑ๋œ ์‘๋‹ต์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -178,7 +178,7 @@ participant tasks as Background tasks
/// ///
/// tip | ํŒ /// tip
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์˜ ์ฝ”๋“œ์—์„œ ์–ด๋–ค ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด `HTTPException`์„ ํฌํ•จํ•ด `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ˆ์™ธ(๋˜๋Š” ์ƒˆ ์˜ˆ์™ธ)๋ฅผ `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ๋‹ค์‹œ ๋ฐœ์ƒ์‹œ์ผœ, ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์˜ ์ฝ”๋“œ์—์„œ ์–ด๋–ค ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด `HTTPException`์„ ํฌํ•จํ•ด `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ˆ์™ธ(๋˜๋Š” ์ƒˆ ์˜ˆ์™ธ)๋ฅผ `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ๋‹ค์‹œ ๋ฐœ์ƒ์‹œ์ผœ, ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@ -233,14 +233,14 @@ participant operation as Path Operation
`yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ „ํ•ด ์™”์Šต๋‹ˆ๋‹ค. `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ „ํ•ด ์™”์Šต๋‹ˆ๋‹ค.
FastAPI์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ์˜ [๊ณ ๊ธ‰ ์˜์กด์„ฑ - `yield`, `HTTPException`, `except` ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}์—์„œ ๋” ์ž์„ธํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FastAPI์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ์˜ [๊ณ ๊ธ‰ ์˜์กด์„ฑ - `yield`, `HTTPException`, `except` ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)์—์„œ ๋” ์ž์„ธํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž { #context-managers } ## ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž { #context-managers }
### "์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž"๋ž€ { #what-are-context-managers } ### "์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž"๋ž€ { #what-are-context-managers }
"์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž"๋Š” Python์—์„œ `with` ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž"๋Š” Python์—์„œ `with` ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, <a href="https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files" class="external-link" target="_blank">`with`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค</a>: ์˜ˆ๋ฅผ ๋“ค์–ด, [with๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files):
```Python ```Python
with open("./somefile.txt") as f: with open("./somefile.txt") as f:
@ -256,7 +256,7 @@ with open("./somefile.txt") as f:
### `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž ์‚ฌ์šฉํ•˜๊ธฐ { #using-context-managers-in-dependencies-with-yield } ### `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž ์‚ฌ์šฉํ•˜๊ธฐ { #using-context-managers-in-dependencies-with-yield }
/// warning | ๊ฒฝ๊ณ  /// warning
์ด๊ฒƒ์€ ์–ด๋А ์ •๋„ "๊ณ ๊ธ‰" ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋А ์ •๋„ "๊ณ ๊ธ‰" ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
@ -264,19 +264,19 @@ with open("./somefile.txt") as f:
/// ///
Python์—์„œ๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <a href="https://docs.python.org/3/reference/datamodel.html#context-managers" class="external-link" target="_blank"> ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค: `__enter__()` and `__exit__()`</a>. Python์—์„œ๋Š” [๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ: `__enter__()`์™€ `__exit__()`๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ](https://docs.python.org/3/reference/datamodel.html#context-managers) ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**์˜ `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ ๋‚ด์—์„œ **FastAPI**์˜ `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ ๋‚ด์—์„œ
`with` ๋˜๋Š” `async with`๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: `with` ๋˜๋Š” `async with`๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *} {* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *}
/// tip | ํŒ /// tip
์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ๋˜๋Š” * [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ๋˜๋Š”
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a> * [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
์ด๋“ค์€ ๋‹จ์ผ `yield`๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๊พธ๋ฏธ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋‹จ์ผ `yield`๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๊พธ๋ฏธ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

6
docs/ko/docs/tutorial/dependencies/global-dependencies.md

@ -2,14 +2,14 @@
๋ช‡๋ช‡ ์œ ํ˜•์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ์œ ํ˜•์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ทธ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md)์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ทธ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:
{* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *}
๊ทธ๋ฆฌ๊ณ  [*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ์„น์…˜์˜ ๋ชจ๋“  ์•„์ด๋””์–ด๋Š” ์—ฌ์ „ํžˆ ์ ์šฉ๋˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋Š” ์•ฑ์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  [*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md) ์„น์…˜์˜ ๋ชจ๋“  ์•„์ด๋””์–ด๋Š” ์—ฌ์ „ํžˆ ์ ์šฉ๋˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
## *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์˜์กด์„ฑ { #dependencies-for-groups-of-path-operations } ## *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์˜์กด์„ฑ { #dependencies-for-groups-of-path-operations }
๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md){.internal-link target=_blank})์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md))์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4
docs/ko/docs/tutorial/dependencies/index.md

@ -57,7 +57,7 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „๋ถ€ํ„ฐ `Annotated`์— ๋Œ€ํ•œ ์ง€์›์„ (๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ
์˜›๋‚  ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋งž์ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜›๋‚  ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋งž์ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ํ•˜์„ธ์š”. `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../../deployment/versions.md#upgrading-the-fastapi-versions)๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ํ•˜์„ธ์š”.
/// ///
@ -152,7 +152,7 @@ commons: Annotated[dict, Depends(common_parameters)]
/// note | ์ฐธ๊ณ  /// note | ์ฐธ๊ณ 
์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด, [Async: *"In a hurry?"*](../../async.md#in-a-hurry){.internal-link target=_blank} ๋ฌธ์„œ์—์„œ `async`์™€ `await`์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด, [Async: *"In a hurry?"*](../../async.md#in-a-hurry) ๋ฌธ์„œ์—์„œ `async`์™€ `await`์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///

4
docs/ko/docs/tutorial/encoder.md

@ -12,7 +12,7 @@ JSON ํ˜ธํ™˜ ๊ฐ€๋Šฅ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์‹ ํ•˜๋Š” `fake_db` ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์กด
์˜ˆ๋ฅผ ๋“ค๋ฉด, `datetime` ๊ฐ์ฒด๋Š” JSON๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, `datetime` ๊ฐ์ฒด๋Š” JSON๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ `datetime` ๊ฐ์ฒด๋Š” <a href="https://en.wikipedia.org/wiki/ISO_8601" class="external-link" target="_blank">ISO ํ˜•์‹</a>์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” `str`๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `datetime` ๊ฐ์ฒด๋Š” [ISO ํ˜•์‹](https://en.wikipedia.org/wiki/ISO_8601)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” `str`๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Pydantic ๋ชจ๋ธ(์†์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด)์„ ๋ฐ›์ง€ ์•Š๊ณ , `dict`๋งŒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Pydantic ๋ชจ๋ธ(์†์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด)์„ ๋ฐ›์ง€ ์•Š๊ณ , `dict`๋งŒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
@ -24,7 +24,7 @@ Pydantic ๋ชจ๋ธ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ณ  JSON ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ๋ฐ˜ํ™˜
์ด ์˜ˆ์‹œ์—์„œ๋Š” Pydantic ๋ชจ๋ธ์„ `dict`๋กœ, `datetime`์„ `str`๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” Pydantic ๋ชจ๋ธ์„ `dict`๋กœ, `datetime`์„ `str`๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€์ธ <a href="https://docs.python.org/3/library/json.html#json.dumps" class="external-link" target="_blank">`json.dumps()`</a>๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€์ธ [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps)๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
JSON ํ˜•์‹(๋ฌธ์ž์—ด)์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํฐ `str`์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JSON๊ณผ ๋ชจ๋‘ ํ˜ธํ™˜๋˜๋Š” ๊ฐ’๊ณผ ํ•˜์œ„ ๊ฐ’์ด ์žˆ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(์˜ˆ: `dict`)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. JSON ํ˜•์‹(๋ฌธ์ž์—ด)์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํฐ `str`์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JSON๊ณผ ๋ชจ๋‘ ํ˜ธํ™˜๋˜๋Š” ๊ฐ’๊ณผ ํ•˜์œ„ ๊ฐ’์ด ์žˆ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(์˜ˆ: `dict`)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4
docs/ko/docs/tutorial/extra-data-types.md

@ -36,7 +36,7 @@
* `datetime.timedelta`: * `datetime.timedelta`:
* ํŒŒ์ด์ฌ์˜ `datetime.timedelta`. * ํŒŒ์ด์ฌ์˜ `datetime.timedelta`.
* ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ ์ „์ฒด ์ดˆ(seconds)์˜ `float`๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. * ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ ์ „์ฒด ์ดˆ(seconds)์˜ `float`๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
* Pydantic์€ "ISO 8601 time diff encoding"์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. <a href="https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers" class="external-link" target="_blank">๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”</a>. * Pydantic์€ "ISO 8601 time diff encoding"์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. [๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
* `frozenset`: * `frozenset`:
* ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ `set`์™€ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค: * ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ `set`์™€ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค:
* ์š”์ฒญ ์‹œ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฝ์–ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  `set`๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * ์š”์ฒญ ์‹œ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฝ์–ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  `set`๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
@ -49,7 +49,7 @@
* `Decimal`: * `Decimal`:
* ํ‘œ์ค€ ํŒŒ์ด์ฌ์˜ `Decimal`. * ํ‘œ์ค€ ํŒŒ์ด์ฌ์˜ `Decimal`.
* ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ `float`์™€ ๋™์ผํ•˜๊ฒŒ ๋‹ค๋ค„์ง‘๋‹ˆ๋‹ค. * ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ `float`์™€ ๋™์ผํ•˜๊ฒŒ ๋‹ค๋ค„์ง‘๋‹ˆ๋‹ค.
* ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ์œ ํšจํ•œ Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: <a href="https://docs.pydantic.dev/latest/usage/types/types/" class="external-link" target="_blank">Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•</a>. * ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ์œ ํšจํ•œ Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•](https://docs.pydantic.dev/latest/usage/types/types/).
## ์˜ˆ์‹œ { #example } ## ์˜ˆ์‹œ { #example }

6
docs/ko/docs/tutorial/extra-models.md

@ -12,7 +12,7 @@
์ ˆ๋Œ€ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•ญ์ƒ ์ดํ›„์— ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ "์•ˆ์ „ํ•œ ํ•ด์‹œ(secure hash)"๋กœ ์ €์žฅํ•˜์„ธ์š”. ์ ˆ๋Œ€ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•ญ์ƒ ์ดํ›„์— ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ "์•ˆ์ „ํ•œ ํ•ด์‹œ(secure hash)"๋กœ ์ €์žฅํ•˜์„ธ์š”.
๋งŒ์•ฝ ์ด๊ฒŒ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, [๋ณด์•ˆ ์žฅ](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}์—์„œ "password hash"๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๊ฒŒ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, [๋ณด์•ˆ ์žฅ](security/simple-oauth2.md#password-hashing)์—์„œ "password hash"๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -162,11 +162,11 @@ UserInDB(
OpenAPI์—์„œ๋Š” ์ด๋ฅผ `anyOf`๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. OpenAPI์—์„œ๋Š” ์ด๋ฅผ `anyOf`๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ํ‘œ์ค€ Python ํƒ€์ž… ํžŒํŠธ์ธ <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์ด๋ฅผ ์œ„ํ•ด ํ‘œ์ค€ Python ํƒ€์ž… ํžŒํŠธ์ธ [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
/// note /// note
<a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a>์„ ์ •์˜ํ•  ๋•Œ๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋จผ์ € ํฌํ•จํ•˜๊ณ , ๋œ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๊ทธ ๋’ค์— ๋‚˜์—ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” `Union[PlaneItem, CarItem]`์—์„œ ๋” ๊ตฌ์ฒด์ ์ธ `PlaneItem`์ด `CarItem`๋ณด๋‹ค ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions)์„ ์ •์˜ํ•  ๋•Œ๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋จผ์ € ํฌํ•จํ•˜๊ณ , ๋œ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๊ทธ ๋’ค์— ๋‚˜์—ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” `Union[PlaneItem, CarItem]`์—์„œ ๋” ๊ตฌ์ฒด์ ์ธ `PlaneItem`์ด `CarItem`๋ณด๋‹ค ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
/// ///

75
docs/ko/docs/tutorial/first-steps.md

@ -11,7 +11,7 @@
<div class="termy"> <div class="termy">
```console ```console
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u> $ <font color="#4E9A06">fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ๐Ÿš€ <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ๐Ÿš€
@ -58,7 +58,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
### ํ™•์ธํ•˜๊ธฐ { #check-it } ### ํ™•์ธํ•˜๊ธฐ { #check-it }
๋ธŒ๋ผ์šฐ์ €๋กœ <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>๋ฅผ ์—ฌ์„ธ์š”. ๋ธŒ๋ผ์šฐ์ €๋กœ [http://127.0.0.1:8000](http://127.0.0.1:8000)๋ฅผ ์—ฌ์„ธ์š”.
์•„๋ž˜์™€ ๊ฐ™์€ JSON ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์•„๋ž˜์™€ ๊ฐ™์€ JSON ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
@ -68,17 +68,17 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ { #interactive-api-docs } ### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ { #interactive-api-docs }
์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค. ์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค.
์ž๋™ ๋Œ€ํ™”ํ˜• 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) ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
### ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs } ### ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs }
๊ทธ๋ฆฌ๊ณ  ์ด์ œ, <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ, [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค.
๋Œ€์•ˆ ์ž๋™ ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (<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) ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
@ -92,7 +92,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
#### API "์Šคํ‚ค๋งˆ" { #api-schema } #### API "์Šคํ‚ค๋งˆ" { #api-schema }
<a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a>๋Š” API์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ๊ทœ๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, [OpenAPI](https://github.com/OAI/OpenAPI-Specification)๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ API ์Šคํ‚ค๋งˆ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ๊ทœ๊ฒฉ์ž…๋‹ˆ๋‹ค.
์ด ์Šคํ‚ค๋งˆ ์ •์˜๋Š” API ๊ฒฝ๋กœ, ๊ฐ€๋Šฅํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํ‚ค๋งˆ ์ •์˜๋Š” API ๊ฒฝ๋กœ, ๊ฐ€๋Šฅํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
@ -110,7 +110,7 @@ OpenAPI๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ API์— ๋Œ€ํ•œ API ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ
๊ฐ€๊ณต๋˜์ง€ ์•Š์€ OpenAPI ์Šคํ‚ค๋งˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, FastAPI๋Š” ์ž๋™์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋“  API์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ JSON (์Šคํ‚ค๋งˆ)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๊ณต๋˜์ง€ ์•Š์€ OpenAPI ์Šคํ‚ค๋งˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, FastAPI๋Š” ์ž๋™์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋“  API์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ JSON (์Šคํ‚ค๋งˆ)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ์ง์ ‘ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: <a href="http://127.0.0.1:8000/openapi.json" class="external-link" target="_blank">http://127.0.0.1:8000/openapi.json</a>. ์—ฌ๊ธฐ์—์„œ ์ง์ ‘ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๋Š” JSON์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๋Š” JSON์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
@ -143,9 +143,58 @@ OpenAPI ์Šคํ‚ค๋งˆ๋Š” ํฌํ•จ๋œ ๋‘ ๊ฐœ์˜ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์‹œ์Šคํ…œ์„ ์ œ๊ณต
API์™€ ํ†ต์‹ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ, ๋ชจ๋ฐ”์ผ, IoT ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ)๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API์™€ ํ†ต์‹ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ, ๋ชจ๋ฐ”์ผ, IoT ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ)๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### `pyproject.toml`์— ์•ฑ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
๋‹ค์Œ๊ณผ ๊ฐ™์ด `pyproject.toml` ํŒŒ์ผ์—์„œ ์•ฑ์ด ์œ„์น˜ํ•œ ๊ณณ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```toml
[tool.fastapi]
entrypoint = "main:app"
```
ํ•ด๋‹น `entrypoint`๋Š” `fastapi` ๋ช…๋ น์–ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฑ์„ ์ž„ํฌํŠธํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค:
```python
from main import app
```
์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด:
```
.
โ”œโ”€โ”€ backend
โ”‚ย ย  โ”œโ”€โ”€ main.py
โ”‚ย ย  โ”œโ”€โ”€ __init__.py
```
๊ทธ๋Ÿผ `entrypoint`๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:
```toml
[tool.fastapi]
entrypoint = "backend.main:app"
```
์ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค:
```python
from backend.main import app
```
### `fastapi dev`์— ๊ฒฝ๋กœ ์ง€์ •ํ•˜๊ธฐ { #fastapi-dev-with-path }
`fastapi dev` ๋ช…๋ น์–ด์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉํ•  FastAPI app ๊ฐ์ฒด๋ฅผ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค:
```console
$ fastapi dev main.py
```
ํ•˜์ง€๋งŒ ๋งค๋ฒˆ `fastapi` ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด [VS Code ํ™•์žฅ](../editor-support.md)์ด๋‚˜ [FastAPI Cloud](https://fastapicloud.com)๊ฐ€ ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, `pyproject.toml`์˜ `entrypoint`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
### ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional } ### ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional }
์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋“ฑ๋กํ•˜๋Ÿฌ ๊ฐ€์„ธ์š”. ๐Ÿš€ ์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋“ฑ๋กํ•˜๋Ÿฌ ๊ฐ€์„ธ์š”. ๐Ÿš€
์ด๋ฏธ **FastAPI Cloud** ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด(๋Œ€๊ธฐ์ž ๋ช…๋‹จ์—์„œ ์ดˆ๋Œ€ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰), ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ **FastAPI Cloud** ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด(๋Œ€๊ธฐ์ž ๋ช…๋‹จ์—์„œ ์ดˆ๋Œ€ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰), ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -191,7 +240,7 @@ Deploying to FastAPI Cloud...
`FastAPI`๋Š” `Starlette`๋ฅผ ์ง์ ‘ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. `FastAPI`๋Š” `Starlette`๋ฅผ ์ง์ ‘ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
`FastAPI`๋กœ <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `FastAPI`๋กœ [Starlette](https://www.starlette.dev/)์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -336,7 +385,7 @@ URL "`/`"์— ๋Œ€ํ•œ `GET` ์ž‘๋™์„ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค **Fa
/// note | ์ฐธ๊ณ  /// note | ์ฐธ๊ณ 
์ฐจ์ด์ ์„ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด [Async: *"๋ฐ”์˜์‹  ๊ฒฝ์šฐ"*](../async.md#in-a-hurry){.internal-link target=_blank}๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ฐจ์ด์ ์„ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด [Async: *"๋ฐ”์˜์‹  ๊ฒฝ์šฐ"*](../async.md#in-a-hurry)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
/// ///
@ -352,11 +401,11 @@ JSON์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜๋Š” ๊ฐ์ฒด๋“ค๊ณผ ๋ชจ๋ธ๋“ค(ORM ๋“ฑ์„ ํฌํ•จํ•ด์„œ)
### 6 ๋‹จ๊ณ„: ๋ฐฐํฌํ•˜๊ธฐ { #step-6-deploy-it } ### 6 ๋‹จ๊ณ„: ๋ฐฐํฌํ•˜๊ธฐ { #step-6-deploy-it }
ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ **<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**์— ์•ฑ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค: `fastapi deploy`. ๐ŸŽ‰ ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ **[FastAPI Cloud](https://fastapicloud.com)**์— ์•ฑ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค: `fastapi deploy`. ๐ŸŽ‰
#### FastAPI Cloud ์†Œ๊ฐœ { #about-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๋ฅผ **๋นŒ๋“œ**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๋นŒ๋“œ**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

2
docs/ko/docs/tutorial/handling-errors.md

@ -81,7 +81,7 @@ HTTP ์˜ค๋ฅ˜์— ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์œ ์šฉํ•œ ์ƒํ™ฉ์ด
## ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์„ค์น˜ํ•˜๊ธฐ { #install-custom-exception-handlers } ## ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์„ค์น˜ํ•˜๊ธฐ { #install-custom-exception-handlers }
<a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">Starlette์˜ ๋™์ผํ•œ ์˜ˆ์™ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ</a>๋ฅผ ์‚ฌ์šฉํ•ด ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [Starlette์˜ ๋™์ผํ•œ ์˜ˆ์™ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ](https://www.starlette.dev/exceptions/)๋ฅผ ์‚ฌ์šฉํ•ด ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„(๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์ด `raise`ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ์˜ˆ์™ธ `UnicornException`์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„(๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์ด `raise`ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ์˜ˆ์™ธ `UnicornException`์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

12
docs/ko/docs/tutorial/index.md

@ -15,7 +15,7 @@
<div class="termy"> <div class="termy">
```console ```console
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u> $ <font color="#4E9A06">fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ๐Ÿš€ <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ๐Ÿš€
@ -62,7 +62,7 @@ $ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid
์ฒซ ๋‹จ๊ณ„๋Š” FastAPI๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋‹จ๊ณ„๋Š” FastAPI๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, **FastAPI๋ฅผ ์„ค์น˜**ํ•˜์„ธ์š”: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, **FastAPI๋ฅผ ์„ค์น˜**ํ•˜์„ธ์š”:
<div class="termy"> <div class="termy">
@ -76,7 +76,7 @@ $ pip install "fastapi[standard]"
/// note | ์ฐธ๊ณ  /// note | ์ฐธ๊ณ 
`pip install "fastapi[standard]"`๋กœ ์„ค์น˜ํ•˜๋ฉด `fastapi-cloud-cli`๋ฅผ ํฌํ•จํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์„ ํƒ์  standard ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `pip install "fastapi[standard]"`๋กœ ์„ค์น˜ํ•˜๋ฉด `fastapi-cloud-cli`๋ฅผ ํฌํ•จํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์„ ํƒ์  standard ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์„ ํƒ์  ์˜์กด์„ฑ์ด ํ•„์š” ์—†๋‹ค๋ฉด `pip install fastapi`๋กœ ๋Œ€์‹  ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ ํƒ์  ์˜์กด์„ฑ์ด ํ•„์š” ์—†๋‹ค๋ฉด `pip install fastapi`๋กœ ๋Œ€์‹  ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -84,6 +84,12 @@ standard ์˜์กด์„ฑ์€ ์„ค์น˜ํ•˜๋˜ `fastapi-cloud-cli` ์—†์ด ์„ค์น˜ํ•˜๋ ค๋ฉด `p
/// ///
/// tip | ํŒ
FastAPI๋Š” VS Code(๋ฐ Cursor)์šฉ [๊ณต์‹ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํƒ์ƒ‰๊ธฐ, ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ฒ€์ƒ‰, ํ…Œ์ŠคํŠธ์—์„œ์˜ CodeLens ํƒ์ƒ‰(ํ…Œ์ŠคํŠธ์—์„œ ์ •์˜๋กœ ๋ฐ”๋กœ ์ด๋™), FastAPI Cloud ๋ฐฐํฌ์™€ ๋กœ๊ทธ ๋“ฑ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์—๋””ํ„ฐ์—์„œ ๋ฐ”๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
///
## ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ { #advanced-user-guide } ## ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ { #advanced-user-guide }
์ด **์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ**๋ฅผ ์ฝ์€ ๋’ค์— ๋‚˜์ค‘์— ์ฝ์„ ์ˆ˜ ์žˆ๋Š” **๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ**๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด **์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ**๋ฅผ ์ฝ์€ ๋’ค์— ๋‚˜์ค‘์— ์ฝ์„ ์ˆ˜ ์žˆ๋Š” **๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ**๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

14
docs/ko/docs/tutorial/middleware.md

@ -1,10 +1,10 @@
# ๋ฏธ๋“ค์›จ์–ด { #middleware } # ๋ฏธ๋“ค์›จ์–ด { #middleware }
๋ฏธ๋“ค์›จ์–ด๋ฅผ **FastAPI** ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด๋ฅผ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"๋ฏธ๋“ค์›จ์–ด"๋Š” ํŠน์ • *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „, ๋ชจ๋“  **์š”์ฒญ**์— ๋Œ€ํ•ด์„œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  **์‘๋‹ต**์ด ๋ฐ˜ํ™˜๋˜๊ธฐ ์ „์—๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. "๋ฏธ๋“ค์›จ์–ด"๋Š” ํŠน์ • *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „, ๋ชจ๋“  **์š”์ฒญ**์— ๋Œ€ํ•ด์„œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  **์‘๋‹ต**์ด ๋ฐ˜ํ™˜๋˜๊ธฐ ์ „์—๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
* ๋ฏธ๋“ค์›จ์–ด๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์˜ค๋Š” ๊ฐ **์š”์ฒญ**์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. * ๋ฏธ๋“ค์›จ์–ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์˜ค๋Š” ๊ฐ **์š”์ฒญ**์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น **์š”์ฒญ**์— ๋Œ€ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น **์š”์ฒญ**์— ๋Œ€ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ **์š”์ฒญ**์„ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์–ด๋–ค *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€)์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. * ๊ทธ๋Ÿฐ ๋‹ค์Œ **์š”์ฒญ**์„ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์–ด๋–ค *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€)์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์–ด๋–ค *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€)์ด ์ƒ์„ฑํ•œ **์‘๋‹ต**์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. * ๊ทธ๋Ÿฐ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์–ด๋–ค *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€)์ด ์ƒ์„ฑํ•œ **์‘๋‹ต**์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
@ -15,7 +15,7 @@
`yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด, exit ์ฝ”๋“œ๋Š” ๋ฏธ๋“ค์›จ์–ด *ํ›„์—* ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด, exit ์ฝ”๋“œ๋Š” ๋ฏธ๋“ค์›จ์–ด *ํ›„์—* ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…(๋’ค์—์„œ ๋ณด๊ฒŒ ๋  [๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…](background-tasks.md){.internal-link target=_blank} ์„น์…˜์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค)์ด ์žˆ๋‹ค๋ฉด, ๋ชจ๋“  ๋ฏธ๋“ค์›จ์–ด *ํ›„์—* ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…(๋’ค์—์„œ ๋ณด๊ฒŒ ๋  [๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…](background-tasks.md) ์„น์…˜์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค)์ด ์žˆ๋‹ค๋ฉด, ๋ชจ๋“  ๋ฏธ๋“ค์›จ์–ด *ํ›„์—* ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
/// ///
@ -35,9 +35,9 @@
/// tip | ํŒ /// tip | ํŒ
์‚ฌ์šฉ์ž ์ •์˜ ๋…์  ํ—ค๋”๋Š” <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">`X-` ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉ</a>ํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์‚ฌ์šฉ์ž ์ •์˜ ๋…์  ํ—ค๋”๋Š” [`X-` ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)ํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”๊ฐ€ ์žˆ๋‹ค๋ฉด, <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starlette์˜ CORS ๋ฌธ์„œ</a>์— ๋ฌธ์„œํ™”๋œ `expose_headers` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด CORS ์„ค์ •([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank})์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”๊ฐ€ ์žˆ๋‹ค๋ฉด, [Starlette์˜ CORS ๋ฌธ์„œ](https://www.starlette.dev/middleware/#corsmiddleware)์— ๋ฌธ์„œํ™”๋œ `expose_headers` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด CORS ์„ค์ •([CORS (Cross-Origin Resource Sharing)](cors.md))์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
/// ///
@ -61,7 +61,7 @@
/// tip | ํŒ /// tip | ํŒ
์—ฌ๊ธฐ์„œ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋” ์ •ํ™•ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `time.time()` ๋Œ€์‹  <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a>๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“ ์—ฌ๊ธฐ์„œ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋” ์ •ํ™•ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `time.time()` ๋Œ€์‹  [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
/// ///
@ -90,6 +90,6 @@ app.add_middleware(MiddlewareB)
## ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด { #other-middlewares } ## ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด { #other-middlewares }
๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋‚˜์ค‘์— [์ˆ™๋ จ๋œ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ: ํ–ฅ์ƒ๋œ ๋ฏธ๋“ค์›จ์–ด](../advanced/middleware.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋‚˜์ค‘์— [์ˆ™๋ จ๋œ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ: ํ–ฅ์ƒ๋œ ๋ฏธ๋“ค์›จ์–ด](../advanced/middleware.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์„น์…˜์—์„œ ๋ฏธ๋“ค์›จ์–ด๋กœ <abbr title="Cross-Origin Resource Sharing - ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ">CORS</abbr>๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ ๋ฏธ๋“ค์›จ์–ด๋กœ <abbr title="Cross-Origin Resource Sharing - ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ">CORS</abbr>๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2
docs/ko/docs/tutorial/path-operation-configuration.md

@ -58,7 +58,7 @@
์„ค๋ช…์€ ๋ณดํ†ต ๊ธธ์–ด์ง€๊ณ  ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์„ค๋ช…์„ ํ•จ์ˆ˜ <dfn title="๋ฌธ์„œํ™”์— ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์ฒซ ํ‘œํ˜„์‹์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌธ์ž์—ด(์–ด๋–ค ๋ณ€์ˆ˜์—๋„ ํ• ๋‹น๋˜์ง€ ์•Š์Œ)">๋…์ŠคํŠธ๋ง</dfn>์— ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, **FastAPI**๋Š” ๊ทธ๊ณณ์—์„œ ์ด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…์€ ๋ณดํ†ต ๊ธธ์–ด์ง€๊ณ  ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์„ค๋ช…์„ ํ•จ์ˆ˜ <dfn title="๋ฌธ์„œํ™”์— ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์ฒซ ํ‘œํ˜„์‹์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌธ์ž์—ด(์–ด๋–ค ๋ณ€์ˆ˜์—๋„ ํ• ๋‹น๋˜์ง€ ์•Š์Œ)">๋…์ŠคํŠธ๋ง</dfn>์— ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, **FastAPI**๋Š” ๊ทธ๊ณณ์—์„œ ์ด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
๋…์ŠคํŠธ๋ง์—๋Š” <a href="https://en.wikipedia.org/wiki/Markdown" class="external-link" target="_blank">Markdown</a>์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, (๋…์ŠคํŠธ๋ง์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ) ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„๋˜๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋…์ŠคํŠธ๋ง์—๋Š” [Markdown](https://en.wikipedia.org/wiki/Markdown)์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, (๋…์ŠคํŠธ๋ง์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ) ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„๋˜๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
{* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *}

6
docs/ko/docs/tutorial/path-params-numeric-validations.md

@ -81,7 +81,7 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด
ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ `*`๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”. ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ `*`๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.
ํŒŒ์ด์ฌ์€ `*`์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋’ค๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ‚ค์›Œ๋“œ ์ธ์ž(ํ‚ค-๊ฐ’ ์Œ)๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•จ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” <abbr title="From: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด ์—†๋”๋ผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์€ `*`์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋’ค๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ‚ค์›Œ๋“œ ์ธ์ž(ํ‚ค-๊ฐ’ ์Œ)๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•จ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” <abbr title="์ถœ์ฒ˜: K-ey W-ord Arg-uments - ํ‚ค์›Œ๋“œ ์ธ์ž"><code>kwargs</code></abbr>๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด ์—†๋”๋ผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
{* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *} {* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
@ -112,11 +112,11 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด
์ˆซ์ž ๊ฒ€์ฆ์€ `float` ๊ฐ’์—๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ๊ฒ€์ฆ์€ `float` ๊ฐ’์—๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ <abbr title="greater than"><code>gt</code></abbr>๋ฅผ, <abbr title="greater than or equal"><code>ge</code></abbr>๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ’์ด `1`๋ณด๋‹ค ์ž‘๋”๋ผ๋„, ๋ฐ˜๋“œ์‹œ `0`๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ <abbr title="greater than - ๋ณด๋‹ค ํผ"><code>gt</code></abbr>๋ฅผ, <abbr title="greater than or equal - ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ"><code>ge</code></abbr>๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ’์ด `1`๋ณด๋‹ค ์ž‘๋”๋ผ๋„, ๋ฐ˜๋“œ์‹œ `0`๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, `0.5`๋Š” ์œ ํšจํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ `0.0` ๋˜๋Š” `0`์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, `0.5`๋Š” ์œ ํšจํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ `0.0` ๋˜๋Š” `0`์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
<abbr title="less than"><code>lt</code></abbr> ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. <abbr title="less than - ๋ณด๋‹ค ์ž‘์Œ"><code>lt</code></abbr> ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *} {* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *}

20
docs/ko/docs/tutorial/path-params.md

@ -6,7 +6,7 @@
๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ `item_id`์˜ ๊ฐ’์€ ํ•จ์ˆ˜์˜ `item_id` ์ธ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ `item_id`์˜ ๊ฐ’์€ ํ•จ์ˆ˜์˜ `item_id` ์ธ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๊ทธ๋ž˜์„œ ์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo)๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```JSON ```JSON
{"item_id":"foo"} {"item_id":"foo"}
@ -28,7 +28,7 @@
## ๋ฐ์ดํ„ฐ <dfn title="๋‹ค์Œ์œผ๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค: ์ง๋ ฌํ™”, ํŒŒ์‹ฑ, ๋งˆ์ƒฌ๋ง">๋ณ€ํ™˜</dfn> { #data-conversion } ## ๋ฐ์ดํ„ฐ <dfn title="๋‹ค์Œ์œผ๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค: ์ง๋ ฌํ™”, ํŒŒ์‹ฑ, ๋งˆ์ƒฌ๋ง">๋ณ€ํ™˜</dfn> { #data-conversion }
์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>์„ ์—ด๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3)์„ ์—ด๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```JSON ```JSON
{"item_id":3} {"item_id":3}
@ -44,7 +44,7 @@
## ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ { #data-validation } ## ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ { #data-validation }
ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo)๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```JSON ```JSON
{ {
@ -64,7 +64,7 @@
๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ `item_id`๊ฐ€ `int`๊ฐ€ ์•„๋‹Œ `"foo"` ๊ฐ’์„ ๊ฐ€์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ `item_id`๊ฐ€ `int`๊ฐ€ ์•„๋‹Œ `"foo"` ๊ฐ’์„ ๊ฐ€์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
`int` ๋Œ€์‹  `float`์„ ์ œ๊ณตํ•˜๋ฉด(์˜ˆ: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>) ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. `int` ๋Œ€์‹  `float`์„ ์ œ๊ณตํ•˜๋ฉด(์˜ˆ: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)) ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
/// check | ํ™•์ธ /// check | ํ™•์ธ
@ -78,7 +78,7 @@
## ๋ฌธ์„œํ™” { #documentation } ## ๋ฌธ์„œํ™” { #documentation }
๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋ฅผ ์—ด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž๋™ ๋Œ€ํ™”์‹ API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋ฅผ ์—ด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž๋™ ๋Œ€ํ™”์‹ API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
<img src="/img/tutorial/path-params/image01.png"> <img src="/img/tutorial/path-params/image01.png">
@ -92,9 +92,9 @@
## ํ‘œ์ค€ ๊ธฐ๋ฐ˜์˜ ์ด์ , ๋Œ€์ฒด ๋ฌธ์„œ { #standards-based-benefits-alternative-documentation } ## ํ‘œ์ค€ ๊ธฐ๋ฐ˜์˜ ์ด์ , ๋Œ€์ฒด ๋ฌธ์„œ { #standards-based-benefits-alternative-documentation }
๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ์Šคํ‚ค๋งˆ๋Š” <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md" class="external-link" target="_blank">OpenAPI</a> ํ‘œ์ค€์—์„œ ๋‚˜์˜จ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜๋˜๋Š” ๋„๊ตฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ์Šคํ‚ค๋งˆ๋Š” [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md) ํ‘œ์ค€์—์„œ ๋‚˜์˜จ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜๋˜๋Š” ๋„๊ตฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋•๋ถ„์— **FastAPI** ์ž์ฒด์—์„œ <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” (ReDoc์„ ์‚ฌ์šฉํ•˜๋Š”) ๋Œ€์ฒด API ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: ์ด ๋•๋ถ„์— **FastAPI** ์ž์ฒด์—์„œ [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” (ReDoc์„ ์‚ฌ์šฉํ•˜๋Š”) ๋Œ€์ฒด API ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
<img src="/img/tutorial/path-params/image02.png"> <img src="/img/tutorial/path-params/image02.png">
@ -102,7 +102,7 @@
## Pydantic { #pydantic } ## Pydantic { #pydantic }
๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์€ <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>์— ์˜ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ด๋กœ ์ธํ•œ ์ด์ ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ด€๋ฆฌ๋ฅผ ์ž˜ ๋ฐ›๊ณ  ์žˆ์Œ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์€ [Pydantic](https://docs.pydantic.dev/)์— ์˜ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ด๋กœ ์ธํ•œ ์ด์ ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ด€๋ฆฌ๋ฅผ ์ž˜ ๋ฐ›๊ณ  ์žˆ์Œ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
`str`, `float`, `bool`, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์„ ์–ธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `str`, `float`, `bool`, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์„ ์–ธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -130,7 +130,7 @@
## ์‚ฌ์ „์ •์˜ ๊ฐ’ { #predefined-values } ## ์‚ฌ์ „์ •์˜ ๊ฐ’ { #predefined-values }
๋งŒ์•ฝ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜*๋ฅผ ๋ฐ›๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ์ง€๋งŒ, ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜* ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์ด์ฌ ํ‘œ์ค€ <abbr title="์—ด๊ฑฐํ˜•">`Enum`</abbr>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜*๋ฅผ ๋ฐ›๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ์ง€๋งŒ, ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜* ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์ด์ฌ ํ‘œ์ค€ <abbr title="Enumeration - ์—ด๊ฑฐํ˜•">`Enum`</abbr>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### `Enum` ํด๋ž˜์Šค ์ƒ์„ฑ { #create-an-enum-class } ### `Enum` ํด๋ž˜์Šค ์ƒ์„ฑ { #create-an-enum-class }
@ -150,7 +150,7 @@
### *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜* ์„ ์–ธ { #declare-a-path-parameter } ### *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜* ์„ ์–ธ { #declare-a-path-parameter }
์ƒ์„ฑํ•œ ์—ด๊ฑฐํ˜• ํด๋ž˜์Šค(`ModelName`)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜*๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค: ์ƒ์„ฑํ•œ ์—ด๊ฑฐํ˜• ํด๋ž˜์Šค(`ModelName`)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ* ๋งŒ๋“ญ๋‹ˆ๋‹ค:
{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}

4
docs/ko/docs/tutorial/query-params-str-validations.md

@ -35,13 +35,13 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด
์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1 ๋ฒ„์ „์œผ๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”. `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1 ๋ฒ„์ „์œผ๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../deployment/versions.md#upgrading-the-fastapi-versions)๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”.
/// ///
## `q` ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์— `Annotated` ์‚ฌ์šฉํ•˜๊ธฐ { #use-annotated-in-the-type-for-the-q-parameter } ## `q` ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์— `Annotated` ์‚ฌ์šฉํ•˜๊ธฐ { #use-annotated-in-the-type-for-the-q-parameter }
์ด์ „์— [Python ํƒ€์ž… ์†Œ๊ฐœ](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}์—์„œ `Annotated`๋ฅผ ์‚ฌ์šฉํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? ์ด์ „์— [Python ํƒ€์ž… ์†Œ๊ฐœ](../python-types.md#type-hints-with-metadata-annotations)์—์„œ `Annotated`๋ฅผ ์‚ฌ์šฉํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”?
์ด์ œ FastAPI์—์„œ ์‚ฌ์šฉํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ๐Ÿš€ ์ด์ œ FastAPI์—์„œ ์‚ฌ์šฉํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ๐Ÿš€

2
docs/ko/docs/tutorial/query-params.md

@ -183,6 +183,6 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
/// tip /// tip
[๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜](path-params.md#predefined-values){.internal-link target=_blank}์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `Enum`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜](path-params.md#predefined-values)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `Enum`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///

12
docs/ko/docs/tutorial/request-files.md

@ -4,9 +4,9 @@
/// info | ์ •๋ณด /// info | ์ •๋ณด
์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ „๋‹ฌ๋ฐ›๊ธฐ ์œ„ํ•ด ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ „๋‹ฌ๋ฐ›๊ธฐ ์œ„ํ•ด ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
```console ```console
$ pip install python-multipart $ pip install python-multipart
@ -63,8 +63,8 @@ File์˜ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณธ
* ์ตœ๋Œ€ ํฌ๊ธฐ ์ œํ•œ๊นŒ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฉฐ, ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ๋””์Šคํฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. * ์ตœ๋Œ€ ํฌ๊ธฐ ์ œํ•œ๊นŒ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฉฐ, ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ๋””์Šคํฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
* ๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€, ๋™์˜์ƒ, ํฐ ์ด์ง„์ฝ”๋“œ์™€ ๊ฐ™์€ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ๋“ค์„ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. * ๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€, ๋™์˜์ƒ, ํฐ ์ด์ง„์ฝ”๋“œ์™€ ๊ฐ™์€ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ๋“ค์„ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
* ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> `async` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. * [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
* file-like object๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ด์ฌ <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * file-like object๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ด์ฌ [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
### `UploadFile` { #uploadfile } ### `UploadFile` { #uploadfile }
@ -72,7 +72,7 @@ File์˜ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณธ
* `filename` : ๋ฌธ์ž์—ด(`str`)๋กœ ๋œ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ํŒŒ์ผ๋ช…์ž…๋‹ˆ๋‹ค (์˜ˆ: `myimage.jpg`). * `filename` : ๋ฌธ์ž์—ด(`str`)๋กœ ๋œ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ํŒŒ์ผ๋ช…์ž…๋‹ˆ๋‹ค (์˜ˆ: `myimage.jpg`).
* `content_type` : ๋ฌธ์ž์—ด(`str`)๋กœ ๋œ ํŒŒ์ผ ํ˜•์‹(MIME type / media type)์ž…๋‹ˆ๋‹ค (์˜ˆ:ย `image/jpeg`). * `content_type` : ๋ฌธ์ž์—ด(`str`)๋กœ ๋œ ํŒŒ์ผ ํ˜•์‹(MIME type / media type)์ž…๋‹ˆ๋‹ค (์˜ˆ:ย `image/jpeg`).
* `file` : <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> (a <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> object)์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "file-like" ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ํŒŒ์ด์ฌ ํŒŒ์ผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. * `file` : [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (a [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) object)์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "file-like" ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ํŒŒ์ด์ฌ ํŒŒ์ผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
`UploadFile` ์—๋Š” ๋‹ค์Œ์˜ `async` ๋ฉ”์†Œ๋“œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋‚ด๋ถ€์ ์ธ `SpooledTemporaryFile` ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. `UploadFile` ์—๋Š” ๋‹ค์Œ์˜ `async` ๋ฉ”์†Œ๋“œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋‚ด๋ถ€์ ์ธ `SpooledTemporaryFile` ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
@ -121,7 +121,7 @@ HTML์˜ ํผ๋“ค(`<form></form>`)์ด ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์€
ํ•˜์ง€๋งŒ ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. `File`์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด, **FastAPI**๋Š” ๋ณธ๋ฌธ์˜ ์ ํ•ฉํ•œ ๋ถ€๋ถ„์—์„œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. `File`์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด, **FastAPI**๋Š” ๋ณธ๋ฌธ์˜ ์ ํ•ฉํ•œ ๋ถ€๋ถ„์—์„œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•ฉ๋‹ˆ๋‹ค.
์ธ์ฝ”๋”ฉ๊ณผ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> web docs for <code>POST</code></a>๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ธ์ฝ”๋”ฉ๊ณผ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด, [<abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> ์›น ๋ฌธ์„œ์˜ `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
/// ///

4
docs/ko/docs/tutorial/request-form-models.md

@ -4,9 +4,9 @@ FastAPI์—์„œ **Pydantic ๋ชจ๋ธ**์„ ์ด์šฉํ•˜์—ฌ **ํผ ํ•„๋“œ**๋ฅผ ์„ ์–ธํ• 
/// info | ์ •๋ณด /// info | ์ •๋ณด
ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
```console ```console
$ pip install python-multipart $ pip install python-multipart

8
docs/ko/docs/tutorial/request-forms-and-files.md

@ -2,11 +2,11 @@
`File` ๊ณผ `Form` ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๊ณผ ํผ ํ•„๋“œ๋ฅผ ๋™์‹œ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `File` ๊ณผ `Form` ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๊ณผ ํผ ํ•„๋“œ๋ฅผ ๋™์‹œ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// info | ์ •๋ณด /// info
์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฐ/๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฐ/๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:
```console ```console
$ pip install python-multipart $ pip install python-multipart
@ -28,7 +28,7 @@ $ pip install python-multipart
๋˜ํ•œ ์ผ๋ถ€ ํŒŒ์ผ์€ `bytes`๋กœ, ์ผ๋ถ€ ํŒŒ์ผ์€ `UploadFile`๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ํŒŒ์ผ์€ `bytes`๋กœ, ์ผ๋ถ€ ํŒŒ์ผ์€ `UploadFile`๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// warning | ๊ฒฝ๊ณ  /// warning
๋‹ค์ˆ˜์˜ `File`๊ณผ `Form` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์š”์ฒญ์˜ ๋ณธ๋ฌธ์ด `application/json`๊ฐ€ ์•„๋‹Œ `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— JSON์œผ๋กœ ๋ฐ›๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” `Body` ํ•„๋“œ๋ฅผ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์ˆ˜์˜ `File`๊ณผ `Form` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์š”์ฒญ์˜ ๋ณธ๋ฌธ์ด `application/json`๊ฐ€ ์•„๋‹Œ `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— JSON์œผ๋กœ ๋ฐ›๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” `Body` ํ•„๋“œ๋ฅผ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

8
docs/ko/docs/tutorial/request-forms.md

@ -4,9 +4,9 @@ JSON ๋Œ€์‹  ํผ ํ•„๋“œ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ `Form`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต
/// info | ์ •๋ณด /// info | ์ •๋ณด
ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
```console ```console
$ pip install python-multipart $ pip install python-multipart
@ -40,7 +40,7 @@ $ pip install python-multipart
/// tip | ํŒ /// tip | ํŒ
ํผ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œ, ํผ์ด ์—†์œผ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ๋ณธ๋ฌธ(JSON) ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•ด์„(interpret)๋˜๊ธฐ ๋•Œ๋ฌธ์— `Form`์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํผ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œ๋Š” `Form`์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ๋ณธ๋ฌธ(JSON) ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.
/// ///
@ -56,7 +56,7 @@ HTML ํผ(`<form></form>`)์ด ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์€ ์ผ๋ฐ˜
๊ทธ๋Ÿฌ๋‚˜ ํผ์— ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์žฅ์—์„œ ํŒŒ์ผ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ฝ์„ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํผ์— ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์žฅ์—์„œ ํŒŒ์ผ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ฝ์„ ๊ฒ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ธ์ฝ”๋”ฉ ๋ฐ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์ฝ๊ณ  ์‹ถ๋‹ค๋ฉด, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - Mozilla ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> ์›น ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” <code>POST</code>์— ๋Œ€ํ•œ</a>. ์ด๋Ÿฌํ•œ ์ธ์ฝ”๋”ฉ ๋ฐ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์ฝ๊ณ  ์‹ถ๋‹ค๋ฉด, [`POST`์— ๋Œ€ํ•œ <abbr title="Mozilla Developer Network - Mozilla ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> ์›น ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
/// ///

9
docs/ko/docs/tutorial/response-model.md

@ -13,6 +13,7 @@ FastAPI๋Š” ์ด ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ:
* OpenAPI *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์˜ ์‘๋‹ต์— **JSON Schema**๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. * OpenAPI *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์˜ ์‘๋‹ต์— **JSON Schema**๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
* ์ด๋Š” **์ž๋™ ๋ฌธ์„œ**์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. * ์ด๋Š” **์ž๋™ ๋ฌธ์„œ**์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
* ๋˜ํ•œ ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. * ๋˜ํ•œ ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
* ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์„ ์‚ฌ์šฉํ•ด JSON์œผ๋กœ **์ง๋ ฌํ™”**ํ•ฉ๋‹ˆ๋‹ค. Pydantic์€ **Rust**๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด **ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค**.
ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€: ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€:
@ -73,9 +74,9 @@ FastAPI๋Š” ์ด `response_model`์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ๋ฌธ์„œํ™”, ๊ฒ€์ฆ ๋“ฑ์„
/// info | ์ •๋ณด /// info | ์ •๋ณด
`EmailStr`์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email-validator`</a>๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. `EmailStr`์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € [`email-validator`](https://github.com/JoshData/python-email-validator)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
```console ```console
$ pip install email-validator $ pip install email-validator
@ -181,7 +182,7 @@ FastAPI๋Š” Pydantic์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ํด๋ž˜
### ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ { #return-a-response-directly } ### ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ { #return-a-response-directly }
๊ฐ€์žฅ ํ”ํ•œ ๊ฒฝ์šฐ๋Š” [๊ณ ๊ธ‰ ๋ฌธ์„œ์—์„œ ๋‚˜์ค‘์— ์„ค๋ช…ํ•˜๋Š” ๋Œ€๋กœ Response๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ](../advanced/response-directly.md){.internal-link target=_blank}์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ๊ฒฝ์šฐ๋Š” [๊ณ ๊ธ‰ ๋ฌธ์„œ์—์„œ ๋‚˜์ค‘์— ์„ค๋ช…ํ•˜๋Š” ๋Œ€๋กœ Response๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ](../advanced/response-directly.md)์ž…๋‹ˆ๋‹ค.
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
@ -257,7 +258,7 @@ FastAPI๋Š” Pydantic์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ํด๋ž˜
* `response_model_exclude_defaults=True` * `response_model_exclude_defaults=True`
* `response_model_exclude_none=True` * `response_model_exclude_none=True`
`exclude_defaults` ๋ฐ `exclude_none`์— ๋Œ€ํ•ด <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">Pydantic ๋ฌธ์„œ</a>์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `exclude_defaults` ๋ฐ `exclude_none`์— ๋Œ€ํ•ด [Pydantic ๋ฌธ์„œ](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict)์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///

6
docs/ko/docs/tutorial/response-status-code.md

@ -20,7 +20,7 @@
/// info | ์ •๋ณด /// info | ์ •๋ณด
`status_code` ๋Š” ํŒŒ์ด์ฌ์˜ <a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a> ์™€ ๊ฐ™์€ `IntEnum` ์„ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. `status_code` ๋Š” ํŒŒ์ด์ฌ์˜ [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) ์™€ ๊ฐ™์€ `IntEnum` ์„ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -43,7 +43,7 @@ FastAPI๋Š” ์ด๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ์‘๋‹ต ๋ณธ๋ฌธ์ด ์—†๋‹ค๊ณ  ๋ช…์‹œํ•˜๋Š” Open
/// note | ์ฐธ๊ณ  /// note | ์ฐธ๊ณ 
๋งŒ์•ฝ HTTP ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์„ก์…˜์œผ๋กœ ๋„˜์–ด๊ฐ€์„ธ์š”. ๋งŒ์•ฝ HTTP ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์„น์…˜์œผ๋กœ ๋„˜์–ด๊ฐ€์„ธ์š”.
/// ///
@ -66,7 +66,7 @@ HTTP์—์„œ๋Š” ์‘๋‹ต์˜ ์ผ๋ถ€๋กœ 3์ž๋ฆฌ ์ˆซ์ž ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
/// tip | ํŒ /// tip | ํŒ
๊ฐ ์ƒํƒœ ์ฝ”๋“œ์™€ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์šฉ๋„์ธ์ง€ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr>์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ์— ๊ด€ํ•œ ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๊ฐ ์ƒํƒœ ์ฝ”๋“œ์™€ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์šฉ๋„์ธ์ง€ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด [<abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr>์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ์— ๊ด€ํ•œ ๋ฌธ์„œ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
/// ///

10
docs/ko/docs/tutorial/schema-extra-example.md

@ -2,7 +2,7 @@
์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์˜ˆ์ œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์˜ˆ์ œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ ์ด๋ฅผ ์œ„ํ•œ ๋ช‡๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ด๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
## Pydantic ๋ชจ๋ธ ์† ์ถ”๊ฐ€ JSON ์Šคํ‚ค๋งˆ ๋ฐ์ดํ„ฐ { #extra-json-schema-data-in-pydantic-models } ## Pydantic ๋ชจ๋ธ ์† ์ถ”๊ฐ€ JSON ์Šคํ‚ค๋งˆ ๋ฐ์ดํ„ฐ { #extra-json-schema-data-in-pydantic-models }
@ -12,7 +12,7 @@
์ถ”๊ฐ€ ์ •๋ณด๋Š” ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ๋ชจ๋ธ์˜ **JSON ์Šคํ‚ค๋งˆ** ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€๋˜๊ณ , API ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ๋ชจ๋ธ์˜ **JSON ์Šคํ‚ค๋งˆ** ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€๋˜๊ณ , API ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
<a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">Pydantic ๋ฌธ์„œ: Configuration</a>์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ `dict`๋ฅผ ๋ฐ›๋Š” `model_config` ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [Pydantic ๋ฌธ์„œ: Configuration](https://docs.pydantic.dev/latest/api/config/)์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ `dict`๋ฅผ ๋ฐ›๋Š” `model_config` ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
`"json_schema_extra"`๋ฅผ ์ƒ์„ฑ๋œ JSON ์Šคํ‚ค๋งˆ์—์„œ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ์™€ `examples`๋ฅผ ํฌํ•จํ•˜๋Š” `dict`์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `"json_schema_extra"`๋ฅผ ์ƒ์„ฑ๋œ JSON ์Šคํ‚ค๋งˆ์—์„œ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ์™€ `examples`๋ฅผ ํฌํ•จํ•˜๋Š” `dict`์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -145,12 +145,12 @@ JSON ์Šคํ‚ค๋งˆ๋Š” `examples`๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์•˜๊ณ , ๋”ฐ๋ผ์„œ OpenAPI๋Š”
OpenAPI๋Š” ๋˜ํ•œ `example`๊ณผ `examples` ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: OpenAPI๋Š” ๋˜ํ•œ `example`๊ณผ `examples` ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค:
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object" class="external-link" target="_blank">`Parameter Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)</a>๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค: * [`Parameter Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object)๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค:
* `Path()` * `Path()`
* `Query()` * `Query()`
* `Header()` * `Header()`
* `Cookie()` * `Cookie()`
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object" class="external-link" target="_blank">`Request Body Object`, `Media Type Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)์˜ `content` ํ•„๋“œ์— ์žˆ๋Š”</a>๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค: * [`Request Body Object`, `Media Type Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)์˜ `content` ํ•„๋“œ์— ์žˆ๋Š”](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object)๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค:
* `Body()` * `Body()`
* `File()` * `File()`
* `Form()` * `Form()`
@ -163,7 +163,7 @@ OpenAPI๋Š” ๋˜ํ•œ `example`๊ณผ `examples` ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„
### JSON ์Šคํ‚ค๋งˆ์˜ `examples` ํ•„๋“œ { #json-schemas-examples-field } ### JSON ์Šคํ‚ค๋งˆ์˜ `examples` ํ•„๋“œ { #json-schemas-examples-field }
ํ•˜์ง€๋งŒ, ํ›„์— JSON ์Šคํ‚ค๋งˆ๋Š” <a href="https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5" class="external-link" target="_blank">`examples`</a> ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ์ƒˆ ๋ฒ„์ „์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ›„์— JSON ์Šคํ‚ค๋งˆ๋Š” [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ์ƒˆ ๋ฒ„์ „์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด OpenAPI 3.1.0์€ ์ด ์ƒˆ๋กœ์šด `examples` ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ์ตœ์‹  ๋ฒ„์ „ (JSON ์Šคํ‚ค๋งˆ 2020-12)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด OpenAPI 3.1.0์€ ์ด ์ƒˆ๋กœ์šด `examples` ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ์ตœ์‹  ๋ฒ„์ „ (JSON ์Šคํ‚ค๋งˆ 2020-12)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

10
docs/ko/docs/tutorial/security/first-steps.md

@ -26,11 +26,11 @@
/// info | ์ •๋ณด /// info | ์ •๋ณด
<a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> ํŒจํ‚ค์ง€๋Š” `pip install "fastapi[standard]"` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด **FastAPI**์™€ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. [`python-multipart`](https://github.com/Kludex/python-multipart) ํŒจํ‚ค์ง€๋Š” `pip install "fastapi[standard]"` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด **FastAPI**์™€ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ `pip install fastapi` ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด `python-multipart` ํŒจํ‚ค์ง€๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ `pip install fastapi` ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด `python-multipart` ํŒจํ‚ค์ง€๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์•„๋ž˜๋กœ ์„ค์น˜ํ•˜์„ธ์š”: ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์•„๋ž˜๋กœ ์„ค์น˜ํ•˜์„ธ์š”:
```console ```console
$ pip install python-multipart $ pip install python-multipart
@ -45,7 +45,7 @@ $ pip install python-multipart
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev main.py $ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@ -54,7 +54,7 @@ $ fastapi dev main.py
## ํ™•์ธํ•˜๊ธฐ { #check-it } ## ํ™•์ธํ•˜๊ธฐ { #check-it }
๋Œ€ํ™”ํ˜• ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์„ธ์š”: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>. ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์„ธ์š”: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ํ™”๋ฉด์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ํ™”๋ฉด์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
@ -140,7 +140,7 @@ OAuth2๋Š” backend ๋˜๋Š” API๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋Š” ์„œ๋ฒ„์™€ ๋…๋ฆฝ์ ์ผ
์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด API๊ฐ€ `https://example.com/`์— ์žˆ๋‹ค๋ฉด `https://example.com/token`์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ API๊ฐ€ `https://example.com/api/v1/`์— ์žˆ๋‹ค๋ฉด `https://example.com/api/v1/token`์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด API๊ฐ€ `https://example.com/`์— ์žˆ๋‹ค๋ฉด `https://example.com/token`์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ API๊ฐ€ `https://example.com/api/v1/`์— ์žˆ๋‹ค๋ฉด `https://example.com/api/v1/token`์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ [ํ”„๋ก์‹œ ๋’ค์—์„œ](../../advanced/behind-a-proxy.md){.internal-link target=_blank} ๊ฐ™์€ ๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์† ๋™์ž‘ํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ [ํ”„๋ก์‹œ ๋’ค์—์„œ](../../advanced/behind-a-proxy.md) ๊ฐ™์€ ๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์† ๋™์ž‘ํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
/// ///

10
docs/ko/docs/tutorial/security/oauth2-jwt.md

@ -24,13 +24,13 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4
1์ฃผ์ผ ๋’ค์—๋Š” ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ณ  ์‚ฌ์šฉ์ž๋Š” ์ธ๊ฐ€๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒˆ ํ† ํฐ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž(๋˜๋Š” ์ œ3์ž)๊ฐ€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ํ† ํฐ์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์„œ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1์ฃผ์ผ ๋’ค์—๋Š” ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ณ  ์‚ฌ์šฉ์ž๋Š” ์ธ๊ฐ€๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒˆ ํ† ํฐ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž(๋˜๋Š” ์ œ3์ž)๊ฐ€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ํ† ํฐ์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์„œ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
JWT ํ† ํฐ์„ ์ง์ ‘ ๋‹ค๋ค„๋ณด๊ณ  ๋™์ž‘ ๋ฐฉ์‹์„ ํ™•์ธํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://jwt.io/" class="external-link" target="_blank">https://jwt.io</a>๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. JWT ํ† ํฐ์„ ์ง์ ‘ ๋‹ค๋ค„๋ณด๊ณ  ๋™์ž‘ ๋ฐฉ์‹์„ ํ™•์ธํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด [https://jwt.io](https://jwt.io/)๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
## `PyJWT` ์„ค์น˜ { #install-pyjwt } ## `PyJWT` ์„ค์น˜ { #install-pyjwt }
Python์—์„œ JWT ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋ ค๋ฉด `PyJWT`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Python์—์„œ JWT ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋ ค๋ฉด `PyJWT`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
[๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ `pyjwt`๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค: [๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ `pyjwt`๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:
<div class="termy"> <div class="termy">
@ -46,7 +46,7 @@ $ pip install pyjwt
RSA๋‚˜ ECDSA ๊ฐ™์€ ์ „์ž ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด๋ผ๋ฉด, cryptography ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์ธ `pyjwt[crypto]`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. RSA๋‚˜ ECDSA ๊ฐ™์€ ์ „์ž ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด๋ผ๋ฉด, cryptography ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์ธ `pyjwt[crypto]`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://pyjwt.readthedocs.io/en/latest/installation.html" class="external-link" target="_blank">PyJWT Installation docs</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [PyJWT ์„ค์น˜ ๋ฌธ์„œ](https://pyjwt.readthedocs.io/en/latest/installation.html)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -72,7 +72,7 @@ pwdlib๋Š” ํŒจ์Šค์›Œ๋“œ ํ•ด์‹œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ Python ํŒจํ‚ค์ง€์ž…
์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ "Argon2"์ž…๋‹ˆ๋‹ค. ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ "Argon2"์ž…๋‹ˆ๋‹ค.
[๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ Argon2์™€ ํ•จ๊ป˜ pwdlib๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค: [๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ Argon2์™€ ํ•จ๊ป˜ pwdlib๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:
<div class="termy"> <div class="termy">
@ -200,7 +200,7 @@ JWT๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ API์—์„œ ์ง์ ‘ ์ž‘์—…์„ ์ˆ˜ํ–‰
## ํ™•์ธํ•˜๊ธฐ { #check-it } ## ํ™•์ธํ•˜๊ธฐ { #check-it }
์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

2
docs/ko/docs/tutorial/security/simple-oauth2.md

@ -216,7 +216,7 @@ UserInDB(
## ํ™•์ธํ•˜๊ธฐ { #see-it-in-action } ## ํ™•์ธํ•˜๊ธฐ { #see-it-in-action }
๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์—ด๊ธฐ: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>. ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์—ด๊ธฐ: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
### ์ธ์ฆํ•˜๊ธฐ { #authenticate } ### ์ธ์ฆํ•˜๊ธฐ { #authenticate }

22
docs/ko/docs/tutorial/sql-databases.md

@ -2,9 +2,9 @@
**FastAPI**์—์„œ SQL(๊ด€๊ณ„ํ˜•) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์ด ์›ํ•˜๋Š” **์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ ** ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **FastAPI**์—์„œ SQL(๊ด€๊ณ„ํ˜•) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์ด ์›ํ•˜๋Š” **์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ ** ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel</a>์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” [SQLModel](https://sqlmodel.tiangolo.com/)์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
**SQLModel**์€ <a href="https://www.sqlalchemy.org/" class="external-link" target="_blank">SQLAlchemy</a>์™€ Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. **SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์™„๋ฒฝํžˆ ์–ด์šธ๋ฆฌ๋„๋ก **FastAPI**์™€ ๊ฐ™์€ ์ œ์ž‘์ž๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. **SQLModel**์€ [SQLAlchemy](https://www.sqlalchemy.org/)์™€ Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. **SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์™„๋ฒฝํžˆ ์–ด์šธ๋ฆฌ๋„๋ก **FastAPI**์™€ ๊ฐ™์€ ์ œ์ž‘์ž๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
/// tip | ํŒ /// tip | ํŒ
@ -26,15 +26,15 @@ SQLModel์€ SQLAlchemy๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ, SQLAlchemy์—์„œ **์ง€์›ํ•˜
/// tip | ํŒ /// tip | ํŒ
ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋” ๋งŽ์€ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•˜์—ฌ **FastAPI**์™€ **PostgreSQL**์„ ํฌํ•จํ•œ ๊ณต์‹ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: <a href="https://github.com/fastapi/full-stack-fastapi-template" class="external-link" target="_blank">https://github.com/fastapi/full-stack-fastapi-template</a> ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋” ๋งŽ์€ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•˜์—ฌ **FastAPI**์™€ **PostgreSQL**์„ ํฌํ•จํ•œ ๊ณต์‹ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)
/// ///
์ด ํŠœํ† ๋ฆฌ์–ผ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์งง์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ๊ฐœ๋…, SQL, ๋˜๋Š” ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์งง์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ๊ฐœ๋…, SQL, ๋˜๋Š” ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, [SQLModel ๋ฌธ์„œ](https://sqlmodel.tiangolo.com/)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
## `SQLModel` ์„ค์น˜ํ•˜๊ธฐ { #install-sqlmodel } ## `SQLModel` ์„ค์น˜ํ•˜๊ธฐ { #install-sqlmodel }
๋จผ์ €, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `sqlmodel`์„ ์„ค์น˜ํ•˜์„ธ์š”: ๋จผ์ €, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `sqlmodel`์„ ์„ค์น˜ํ•˜์„ธ์š”:
<div class="termy"> <div class="termy">
@ -65,7 +65,7 @@ $ pip install sqlmodel
* `Field(primary_key=True)`๋Š” SQLModel์— `id`๊ฐ€ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ **๊ธฐ๋ณธ ํ‚ค**์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค (SQL ๊ธฐ๋ณธ ํ‚ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ SQLModel ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”). * `Field(primary_key=True)`๋Š” SQLModel์— `id`๊ฐ€ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ **๊ธฐ๋ณธ ํ‚ค**์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค (SQL ๊ธฐ๋ณธ ํ‚ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ SQLModel ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”).
**์ฐธ๊ณ :** ๊ธฐ๋ณธ ํ‚ค ํ•„๋“œ์— `int | None`์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, Python ์ฝ”๋“œ์—์„œ *`id` ์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ*ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค(`id=None`). ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ *์ €์žฅํ•  ๋•Œ ์ƒ์„ฑํ•ด ์ค„ ๊ฒƒ*์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. SQLModel์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ `id`๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์—์„œ *ํ•ด๋‹น ์—ด์„ null์ด ์•„๋‹Œ `INTEGER`*๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id" class="external-link" target="_blank">๊ธฐ๋ณธ ํ‚ค์— ๋Œ€ํ•œ SQLModel ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. **์ฐธ๊ณ :** ๊ธฐ๋ณธ ํ‚ค ํ•„๋“œ์— `int | None`์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, Python ์ฝ”๋“œ์—์„œ *`id` ์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ*ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค(`id=None`). ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ *์ €์žฅํ•  ๋•Œ ์ƒ์„ฑํ•ด ์ค„ ๊ฒƒ*์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. SQLModel์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ `id`๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์—์„œ *ํ•ด๋‹น ์—ด์„ null์ด ์•„๋‹Œ `INTEGER`*๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ธฐ๋ณธ ํ‚ค์— ๋Œ€ํ•œ SQLModel ๋ฌธ์„œ](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
* `Field(index=True)`๋Š” SQLModel์— ํ•ด๋‹น ์—ด์— ๋Œ€ํ•ด **SQL ์ธ๋ฑ์Šค**๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด ์—ด๋กœ ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ๋” ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * `Field(index=True)`๋Š” SQLModel์— ํ•ด๋‹น ์—ด์— ๋Œ€ํ•ด **SQL ์ธ๋ฑ์Šค**๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด ์—ด๋กœ ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ๋” ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -111,7 +111,7 @@ SQLModel์˜ `engine` (๋‚ด๋ถ€์ ์œผ๋กœ๋Š” SQLAlchemy `engine`)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด
/// tip | ํŒ /// tip | ํŒ
SQLModel์€ Alembic์„ ๊ฐ์‹ธ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ <a href="https://alembic.sqlalchemy.org/en/latest/" class="external-link" target="_blank">Alembic</a>์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SQLModel์€ Alembic์„ ๊ฐ์‹ธ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ [Alembic](https://alembic.sqlalchemy.org/en/latest/)์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -152,7 +152,7 @@ SQLModel์€ Alembic์„ ๊ฐ์‹ธ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ• 
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev main.py $ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@ -337,7 +337,7 @@ hero **์‚ญ์ œ**๋Š” ์ด์ „๊ณผ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
<div class="termy"> <div class="termy">
```console ```console
$ fastapi dev main.py $ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) <span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
``` ```
@ -352,6 +352,6 @@ $ fastapi dev main.py
## ์š”์•ฝ { #recap } ## ์š”์•ฝ { #recap }
<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">**SQLModel**</a>์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ , *๋ฐ์ดํ„ฐ ๋ชจ๋ธ* ๋ฐ *ํ…Œ์ด๋ธ” ๋ชจ๋ธ*๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [**SQLModel**](https://sqlmodel.tiangolo.com/)์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ , *๋ฐ์ดํ„ฐ ๋ชจ๋ธ* ๋ฐ *ํ…Œ์ด๋ธ” ๋ชจ๋ธ*๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋” ๋งŽ์€ ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๋ ค๋ฉด **SQLModel** ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. **FastAPI**์™€ ํ•จ๊ป˜ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋” ๊ธด ๋ฏธ๋‹ˆ <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">ํŠœํ† ๋ฆฌ์–ผ</a>๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€ ๋” ๋งŽ์€ ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๋ ค๋ฉด **SQLModel** ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. **FastAPI**์™€ ํ•จ๊ป˜ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋” ๊ธด ๋ฏธ๋‹ˆ [ํŠœํ† ๋ฆฌ์–ผ](https://sqlmodel.tiangolo.com/tutorial/fastapi/)๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

4
docs/ko/docs/tutorial/static-files.md

@ -23,7 +23,7 @@
๋งˆ์šดํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ `APIRouter`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ OpenAPI ๋ฐ ๋ฌธ์„œ์—๋Š” ๋งˆ์šดํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด์šฉ ๋“ฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์šดํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ `APIRouter`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ OpenAPI ๋ฐ ๋ฌธ์„œ์—๋Š” ๋งˆ์šดํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด์šฉ ๋“ฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../advanced/index.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../advanced/index.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ์„ธ๋ถ€์‚ฌํ•ญ { #details } ## ์„ธ๋ถ€์‚ฌํ•ญ { #details }
@ -37,4 +37,4 @@
## ์ถ”๊ฐ€ ์ •๋ณด { #more-info } ## ์ถ”๊ฐ€ ์ •๋ณด { #more-info }
์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ต์…˜์€ <a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">Starlette์˜ ์ •์  ํŒŒ์ผ ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ต์…˜์€ [Starlette์˜ ์ •์  ํŒŒ์ผ ๋ฌธ์„œ](https://www.starlette.dev/staticfiles/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

20
docs/ko/docs/tutorial/testing.md

@ -1,18 +1,18 @@
# ํ…Œ์ŠคํŒ… { #testing } # ํ…Œ์ŠคํŒ… { #testing }
<a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">Starlette</a> ๋•๋ถ„์— **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ์€ ์‰ฝ๊ณ  ์ฆ๊ฑฐ์šด ์ผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. [Starlette](https://www.starlette.dev/testclient/) ๋•๋ถ„์— **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ์€ ์‰ฝ๊ณ  ์ฆ๊ฑฐ์šด ์ผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ด๋Š” Requests๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์นœ์ˆ™ํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” [HTTPX](https://www.python-httpx.org)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ด๋Š” Requests๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์นœ์ˆ™ํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **FastAPI**์—์„œ <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a>๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **FastAPI**์—์„œ [pytest](https://docs.pytest.org/)๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## `TestClient` ์‚ฌ์šฉํ•˜๊ธฐ { #using-testclient } ## `TestClient` ์‚ฌ์šฉํ•˜๊ธฐ { #using-testclient }
/// info | ์ •๋ณด /// info | ์ •๋ณด
`TestClient` ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์šฐ์„  <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `TestClient` ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์šฐ์„  [`httpx`](https://www.python-httpx.org)๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
[virtual environment](../virtual-environments.md){.internal-link target=_blank}๋ฅผ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™” ์‹œํ‚จ ๋’ค์— ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋’ค ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ:
```console ```console
$ pip install httpx $ pip install httpx
@ -52,7 +52,7 @@ $ pip install httpx
/// tip | ํŒ /// tip | ํŒ
FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ `async` ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (์˜ˆ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•จ์ˆ˜), ์‹ฌํ™” ํŠœํ† ๋ฆฌ์–ผ์˜ [Async Tests](../advanced/async-tests.md){.internal-link target=_blank}๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ `async` ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (์˜ˆ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•จ์ˆ˜), ์‹ฌํ™” ํŠœํ† ๋ฆฌ์–ผ์˜ [๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ](../advanced/async-tests.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
/// ///
@ -64,7 +64,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
### **FastAPI** app ํŒŒ์ผ { #fastapi-app-file } ### **FastAPI** app ํŒŒ์ผ { #fastapi-app-file }
[Bigger Applications](bigger-applications.md){.internal-link target=_blank}์— ๋ฌ˜์‚ฌ๋œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. [๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜](bigger-applications.md)์— ๋ฌ˜์‚ฌ๋œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
``` ```
. .
@ -142,13 +142,13 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
* *ํ—ค๋”*๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด, `headers` ํŒŒ๋ผ๋ฏธํ„ฐ์— `dict`๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. * *ํ—ค๋”*๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด, `headers` ํŒŒ๋ผ๋ฏธํ„ฐ์— `dict`๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
* *์ฟ ํ‚ค*๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด, `cookies` ํŒŒ๋ผ๋ฏธํ„ฐ์— `dict`๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. * *์ฟ ํ‚ค*๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด, `cookies` ํŒŒ๋ผ๋ฏธํ„ฐ์— `dict`๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
๋ฐฑ์—”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ด๋Š”์ง€ ์ •๋ณด๋ฅผ ๋” ์–ป์œผ๋ ค๋ฉด (`httpx` ํ˜น์€ `TestClient`๋ฅผ ์ด์šฉํ•ด์„œ) <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX documentation</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋ฐฑ์—”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ด๋Š”์ง€ ์ •๋ณด๋ฅผ ๋” ์–ป์œผ๋ ค๋ฉด (`httpx` ํ˜น์€ `TestClient`๋ฅผ ์ด์šฉํ•ด์„œ) [HTTPX ๋ฌธ์„œ](https://www.python-httpx.org)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
/// info | ์ •๋ณด /// info | ์ •๋ณด
`TestClient`๋Š” Pydantic ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ JSON์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. `TestClient`๋Š” Pydantic ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ JSON์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ ํ…Œ์ŠคํŠธ ์ค‘ Pydantic ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์ค‘์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด, [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}์— ์„ค๋ช…๋˜์–ด ์žˆ๋Š” `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ…Œ์ŠคํŠธ ์ค‘ Pydantic ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์ค‘์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด, [JSON ํ˜ธํ™˜ ์ธ์ฝ”๋”](encoder.md)์— ์„ค๋ช…๋˜์–ด ์žˆ๋Š” `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// ///
@ -156,7 +156,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
๊ทธ ํ›„์—๋Š” `pytest`๋ฅผ ์„ค์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” `pytest`๋ฅผ ์„ค์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
[virtual environment](../virtual-environments.md){.internal-link target=_blank}๋ฅผ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™” ์‹œํ‚จ ๋’ค์— ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ: [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™” ์‹œํ‚จ ๋’ค์— ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ:
<div class="termy"> <div class="termy">

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

@ -22,7 +22,7 @@ Python ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ•  ๋•Œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ**(๋˜๋Š” ์ด์™€ ์œ ์‚ฌ
์ด ํŽ˜์ด์ง€์—์„œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ**์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ž‘๋™ ๋ฐฉ์‹์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ**์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ž‘๋™ ๋ฐฉ์‹์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.
Python ์„ค์น˜๊นŒ์ง€ ํฌํ•จํ•ด **๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ**๋ฅผ ๋„์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. Python ์„ค์น˜๊นŒ์ง€ ํฌํ•จํ•ด **๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ**๋ฅผ ๋„์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
/// ///
@ -86,7 +86,7 @@ $ python -m venv .venv
//// tab | `uv` //// tab | `uv`
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [`uv`](https://github.com/astral-sh/uv)๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<div class="termy"> <div class="termy">
@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1
//// tab | Windows Bash //// tab | Windows Bash
๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: ๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: [Git Bash](https://gitforwindows.org/))๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
<div class="termy"> <div class="termy">
@ -216,7 +216,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
/// tip /// tip
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, `pip` ๋Œ€์‹  `uv`๋กœ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ `pip`์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž [`uv`](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, `pip` ๋Œ€์‹  `uv`๋กœ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ `pip`์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž
/// ///
@ -268,7 +268,7 @@ $ python -m ensurepip --upgrade
/// tip /// tip
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋กœ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด, ์ด๋ฏธ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž [`uv`](https://github.com/astral-sh/uv)๋กœ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด, ์ด๋ฏธ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
/// ///
@ -340,7 +340,7 @@ $ pip install "fastapi[standard]"
//// tab | `uv` //// tab | `uv`
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๊ฐ€ ์žˆ๋‹ค๋ฉด: [`uv`](https://github.com/astral-sh/uv)๊ฐ€ ์žˆ๋‹ค๋ฉด:
<div class="termy"> <div class="termy">
@ -372,7 +372,7 @@ $ pip install -r requirements.txt
//// tab | `uv` //// tab | `uv`
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๊ฐ€ ์žˆ๋‹ค๋ฉด: [`uv`](https://github.com/astral-sh/uv)๊ฐ€ ์žˆ๋‹ค๋ฉด:
<div class="termy"> <div class="termy">
@ -416,8 +416,8 @@ Hello World
์˜ˆ๋ฅผ ๋“ค๋ฉด: ์˜ˆ๋ฅผ ๋“ค๋ฉด:
* <a href="https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment" class="external-link" target="_blank">VS Code</a> * [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment)
* <a href="https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html" class="external-link" target="_blank">PyCharm</a> * [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html)
/// tip /// tip
@ -455,7 +455,7 @@ $ deactivate
## ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š” { #why-virtual-environments } ## ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š” { #why-virtual-environments }
FastAPI๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด <a href="https://www.python.org/" class="external-link" target="_blank">Python</a>์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FastAPI๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด [Python](https://www.python.org/)์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ FastAPI์™€ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋‹ค๋ฅธ **ํŒจํ‚ค์ง€**๋ฅผ **์„ค์น˜**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ FastAPI์™€ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋‹ค๋ฅธ **ํŒจํ‚ค์ง€**๋ฅผ **์„ค์น˜**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@ -564,7 +564,7 @@ $ pip install "fastapi[standard]"
</div> </div>
FastAPI ์ฝ”๋“œ๋ฅผ ๋‹ด์€ ์••์ถ• ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต <a href="https://pypi.org/project/fastapi/" class="external-link" target="_blank">PyPI</a>์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค. FastAPI ์ฝ”๋“œ๋ฅผ ๋‹ด์€ ์••์ถ• ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต [PyPI](https://pypi.org/project/fastapi/)์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ FastAPI๊ฐ€ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์˜ ํŒŒ์ผ๋„ **๋‹ค์šด๋กœ๋“œ**ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ FastAPI๊ฐ€ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์˜ ํŒŒ์ผ๋„ **๋‹ค์šด๋กœ๋“œ**ํ•ฉ๋‹ˆ๋‹ค.
@ -627,7 +627,7 @@ $ .venv\Scripts\Activate.ps1
//// tab | Windows Bash //// tab | Windows Bash
๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: ๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: [Git Bash](https://gitforwindows.org/))๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
<div class="termy"> <div class="termy">
@ -846,7 +846,7 @@ I solemnly swear ๐Ÿบ
๊ฐ€์ƒ ํ™˜๊ฒฝ, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ(requirements), ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋งŽ์€ **๋Œ€์•ˆ**์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ํ™˜๊ฒฝ, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ(requirements), ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋งŽ์€ **๋Œ€์•ˆ**์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ค€๋น„๊ฐ€ ๋˜์—ˆ๊ณ  **ํ”„๋กœ์ ํŠธ ์ „์ฒด**, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ, ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋“ฑ์„ **๊ด€๋ฆฌ**ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค. ์ค€๋น„๊ฐ€ ๋˜์—ˆ๊ณ  **ํ”„๋กœ์ ํŠธ ์ „์ฒด**, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ, ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋“ฑ์„ **๊ด€๋ฆฌ**ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.
`uv`๋Š” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: `uv`๋Š” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

Loadingโ€ฆ
Cancel
Save