Browse Source

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

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <[email protected]>
pull/15909/head
Sebastiรกn Ramรญrez 18 hours ago
committed by GitHub
parent
commit
3b7cb60067
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      docs/ko/docs/_llm-test.md
  2. 2
      docs/ko/docs/advanced/additional-status-codes.md
  3. 2
      docs/ko/docs/advanced/advanced-dependencies.md
  4. 2
      docs/ko/docs/advanced/dataclasses.md
  5. 14
      docs/ko/docs/advanced/events.md
  6. 14
      docs/ko/docs/advanced/generate-clients.md
  7. 2
      docs/ko/docs/advanced/json-base64-bytes.md
  8. 2
      docs/ko/docs/advanced/openapi-callbacks.md
  9. 1
      docs/ko/docs/advanced/response-change-status-code.md
  10. 2
      docs/ko/docs/advanced/response-cookies.md
  11. 1
      docs/ko/docs/advanced/response-headers.md
  12. 4
      docs/ko/docs/advanced/security/oauth2-scopes.md
  13. 1
      docs/ko/docs/advanced/settings.md
  14. 18
      docs/ko/docs/advanced/stream-data.md
  15. 2
      docs/ko/docs/advanced/wsgi.md
  16. 46
      docs/ko/docs/alternatives.md
  17. 1
      docs/ko/docs/async.md
  18. 4
      docs/ko/docs/deployment/cloud.md
  19. 10
      docs/ko/docs/deployment/concepts.md
  20. 36
      docs/ko/docs/deployment/docker.md
  21. 2
      docs/ko/docs/deployment/https.md
  22. 12
      docs/ko/docs/deployment/manually.md
  23. 1
      docs/ko/docs/editor-support.md
  24. 1
      docs/ko/docs/environment-variables.md
  25. 8
      docs/ko/docs/features.md
  26. 1
      docs/ko/docs/help-fastapi.md
  27. 2
      docs/ko/docs/how-to/configure-swagger-ui.md
  28. 1
      docs/ko/docs/how-to/custom-request-and-route.md
  29. 2
      docs/ko/docs/how-to/graphql.md
  30. 18
      docs/ko/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
  31. 2
      docs/ko/docs/how-to/separate-openapi-schemas.md
  32. 10
      docs/ko/docs/index.md
  33. 1
      docs/ko/docs/project-generation.md
  34. 4
      docs/ko/docs/python-types.md
  35. 90
      docs/ko/docs/tutorial/bigger-applications.md
  36. 2
      docs/ko/docs/tutorial/body-nested-models.md
  37. 10
      docs/ko/docs/tutorial/body.md
  38. 4
      docs/ko/docs/tutorial/debugging.md
  39. 19
      docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
  40. 1
      docs/ko/docs/tutorial/extra-data-types.md
  41. 8
      docs/ko/docs/tutorial/extra-models.md
  42. 29
      docs/ko/docs/tutorial/first-steps.md
  43. 1
      docs/ko/docs/tutorial/handling-errors.md
  44. 1
      docs/ko/docs/tutorial/index.md
  45. 4
      docs/ko/docs/tutorial/metadata.md
  46. 1
      docs/ko/docs/tutorial/path-operation-configuration.md
  47. 4
      docs/ko/docs/tutorial/query-params-str-validations.md
  48. 1
      docs/ko/docs/tutorial/query-params.md
  49. 4
      docs/ko/docs/tutorial/request-files.md
  50. 1
      docs/ko/docs/tutorial/request-forms.md
  51. 1
      docs/ko/docs/tutorial/response-status-code.md
  52. 2
      docs/ko/docs/tutorial/schema-extra-example.md
  53. 1
      docs/ko/docs/tutorial/security/first-steps.md
  54. 2
      docs/ko/docs/tutorial/security/get-current-user.md
  55. 1
      docs/ko/docs/tutorial/security/oauth2-jwt.md
  56. 6
      docs/ko/docs/tutorial/security/simple-oauth2.md
  57. 1
      docs/ko/docs/tutorial/sql-databases.md
  58. 8
      docs/ko/docs/tutorial/static-files.md
  59. 8
      docs/ko/docs/tutorial/testing.md
  60. 1
      docs/ko/docs/virtual-environments.md

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

@ -7,11 +7,11 @@
์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ `docs/{language code}/llm-prompt.md`๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
* ์ด ๋ฌธ์„œ๋ฅผ ์›ํ•˜๋Š” ๋Œ€์ƒ ์–ธ์–ด๋กœ ์ƒˆ๋กœ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: `translate.py`์˜ `translate-page` ๋ช…๋ น). ๊ทธ๋Ÿฌ๋ฉด `docs/{language code}/docs/_llm-test.md` ์•„๋ž˜์— ๋ฒˆ์—ญ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
* ์ด ๋ฌธ์„œ๋ฅผ ์›ํ•˜๋Š” ๋Œ€์ƒ ์–ธ์–ด๋กœ ์ƒˆ๋กœ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: `translate.py`์˜ `translate-page` ๋ช…๋ น์–ด). ๊ทธ๋Ÿฌ๋ฉด `docs/{language code}/docs/_llm-test.md` ์•„๋ž˜์— ๋ฒˆ์—ญ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
* ๋ฒˆ์—ญ์—์„œ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
* ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ, ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ, ๋˜๋Š” ์˜์–ด ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
* ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฒˆ์—ญ์—์„œ ๋‚จ์•„ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•ด ์ข‹์€ ๋ฒˆ์—ญ์ด ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
* ์ข‹์€ ๋ฒˆ์—ญ์„ ๋‘” ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๊ฒฐ๊ณผ๋Š” LLM์ด ๋” ์ด์ƒ ๋ฒˆ์—ญ์— ๋ณ€๊ฒฝ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์™€ ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์„ ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค(๋•Œ๋•Œ๋กœ ๋ช‡ ๊ฐ€์ง€ seemingly random ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” [LLM์€ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ](https://doublespeak.chat/#/handbook#deterministic-output)์ž…๋‹ˆ๋‹ค).
* ์ข‹์€ ๋ฒˆ์—ญ์„ ๋‘” ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๊ฒฐ๊ณผ๋Š” LLM์ด ๋” ์ด์ƒ ๋ฒˆ์—ญ์— ๋ณ€๊ฒฝ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์™€ ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์„ ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค(๋•Œ๋•Œ๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ฒ‰๋ณด๊ธฐ์— ๋ฌด์ž‘์œ„์ธ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” [LLM์€ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ](https://doublespeak.chat/#/handbook#deterministic-output)์ž…๋‹ˆ๋‹ค).
ํ…Œ์ŠคํŠธ:
@ -150,7 +150,7 @@ works(foo="bar") # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
ํƒญ๊ณผ `Info`/`Note`/`Warning`/๋“ฑ์˜ ๋ธ”๋ก์€ ์ œ๋ชฉ ๋ฒˆ์—ญ์„ ์ˆ˜์ง ๋ง‰๋Œ€(`|`) ๋’ค์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
`scripts/translate.py`์˜ ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์—์„œ `### Special blocks`์™€ `### Tab blocks` ์„์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
`scripts/translate.py`์˜ ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์—์„œ `### Special blocks`์™€ `### Tab blocks` ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
////
@ -240,7 +240,7 @@ works(foo="bar") # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
`scripts/translate.py`์˜ ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์—์„œ `### Headings` ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์–ธ์–ด๋ณ„ ์ง€์นจ์€ ์˜ˆ๋ฅผ ๋“ค์–ด `docs/de/llm-prompt.md`์˜ `### Headings` ์„์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์–ธ์–ด๋ณ„ ์ง€์นจ์€ ์˜ˆ๋ฅผ ๋“ค์–ด `docs/de/llm-prompt.md`์˜ `### Headings` ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
////
@ -289,7 +289,7 @@ works(foo="bar") # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น™ํ•˜๋‹ค
* ํŽ˜์ด์ง€๋ฅผ ์„œ๋น™ํ•˜๋‹ค
* ์•ฑ
* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
* ์š”์ฒญ
@ -490,6 +490,6 @@ works(foo="bar") # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
์ด๊ฒƒ์€ ๋ฌธ์„œ์—์„œ ๋ณด์ด๋Š” (๋Œ€๋ถ€๋ถ„) ๊ธฐ์ˆ  ์šฉ์–ด์˜ ๋ถˆ์™„์ „ํ•˜๊ณ  ๋น„๊ทœ๋ฒ”์ ์ธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ ์„ค๊ณ„์ž๊ฐ€ ์–ด๋–ค ์šฉ์–ด์— ๋Œ€ํ•ด LLM์— ์ถ”๊ฐ€์ ์ธ ๋„์›€์ด ํ•„์š”ํ•œ์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ข‹์€ ๋ฒˆ์—ญ์„ ๊ณ„์† ๋œ ์ข‹์€ ๋ฒˆ์—ญ์œผ๋กœ ๋˜๋Œ๋ฆด ๋•Œ, ๋˜๋Š” ์–ธ์–ด์—์„œ ์šฉ์–ด์˜ ํ™œ์šฉ/๋ณ€ํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด `docs/de/llm-prompt.md`์˜ `### List of English terms and their preferred German translations` ์„์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์˜ˆ๋ฅผ ๋“ค์–ด `docs/de/llm-prompt.md`์˜ `### List of English terms and their preferred German translations` ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
////

2
docs/ko/docs/advanced/additional-status-codes.md

@ -8,7 +8,7 @@
๊ธฐ๋ณธ ์ƒํƒœ ์ฝ”๋“œ์™€ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด `JSONResponse`์™€ ๊ฐ™์ด `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ถ”๊ฐ€ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํ•ญ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ๊ณ  ์„ฑ๊ณต ์‹œ 200 โ€œOKโ€์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํ•ญ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ๊ณ  ์„ฑ๊ณต ์‹œ 200 "OK"์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ํ—ˆ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ญ๋ชฉ์ด ์ด์ „์— ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  HTTP ์ƒํƒœ ์ฝ”๋“œ 201 "Created"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2
docs/ko/docs/advanced/advanced-dependencies.md

@ -79,7 +79,7 @@ checker(q="somequery")
### `yield`์™€ `scope`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ { #dependencies-with-yield-and-scope }
0.121.0 ๋ฒ„์ „์—์„œ FastAPI๋Š” `Depends(scope="function")` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
0.121.0 ๋ฒ„์ „์—์„œ FastAPI๋Š” `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์„ ์œ„ํ•œ `Depends(scope="function")` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
`Depends(scope="function")`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, `yield` ์ดํ›„์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๊ฐ€ ๋๋‚œ ์งํ›„(ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๊ธฐ ์ „)์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

2
docs/ko/docs/advanced/dataclasses.md

@ -18,7 +18,7 @@ FastAPI๋Š” **Pydantic** ์œ„์— ๊ตฌ์ถ•๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ง€๊ธˆ๊นŒ์ง€๋Š” Pydantic
์ด๋Š” Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Pydantic์„ ์‚ฌ์šฉํ•ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
/// note
/// note | ์ฐธ๊ณ 
dataclasses๋Š” Pydantic ๋ชจ๋ธ์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.

14
docs/ko/docs/advanced/events.md

@ -6,15 +6,15 @@
์ด ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์š”์ฒญ์„ ๋ฐ›๊ธฐ **์‹œ์ž‘**ํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๊ณ , ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ **๋๋‚ธ ์งํ›„**์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **์ˆ˜๋ช…(lifespan)**์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค(์ž ์‹œ ํ›„ "lifespan"์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค ๐Ÿ˜‰).
์ด๋Š” ์ „์ฒด ์•ฑ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” **์ž์›**์„ ์„ค์ •ํ•˜๊ณ , ์š”์ฒญ ๊ฐ„์— **๊ณต์œ ๋˜๋Š”** ์ž์›์„ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ฆฌ๊ณ /๋˜๋Š” ์ดํ›„์— **์ •๋ฆฌ**ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€ ๋˜๋Š” ๊ณต์œ  ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
์ด๋Š” ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” **์ž์›**์„ ์„ค์ •ํ•˜๊ณ , ์š”์ฒญ ๊ฐ„์— **๊ณต์œ ๋˜๋Š”** ์ž์›์„ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ฆฌ๊ณ /๋˜๋Š” ์ดํ›„์— **์ •๋ฆฌ**ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€ ๋˜๋Š” ๊ณต์œ  ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
## ์‚ฌ์šฉ ์‚ฌ๋ก€ { #use-case }
๋จผ์ € **์‚ฌ์šฉ ์‚ฌ๋ก€** ์˜ˆ์‹œ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ **๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ**์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ๐Ÿค–
์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๋ช‡ ๊ฐ€์ง€ **๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ**์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ๐Ÿค–
๋™์ผํ•œ ๋ชจ๋ธ์ด ์š”์ฒญ ๊ฐ„์— ๊ณต์œ ๋˜๋ฏ€๋กœ, ์š”์ฒญ๋งˆ๋‹ค ๋ชจ๋ธ์ด ํ•˜๋‚˜์”ฉ ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์žˆ๋Š” ๋“ฑ์˜ ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.
๋™์ผํ•œ ๋ชจ๋ธ๋“ค์ด ์š”์ฒญ ๊ฐ„์— ๊ณต์œ ๋˜๋ฏ€๋กœ, ์š”์ฒญ๋งˆ๋‹ค ๋ชจ๋ธ์ด ํ•˜๋‚˜์”ฉ ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์žˆ๋Š” ๋“ฑ์˜ ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.
๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ **์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค**, ์™œ๋ƒํ•˜๋ฉด ๋ชจ๋ธ์ด **๋””์Šคํฌ์—์„œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ** ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
@ -24,7 +24,7 @@
## Lifespan { #lifespan }
`FastAPI` ์•ฑ์˜ `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜์™€ "์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ *์‹œ์ž‘*๊ณผ *์ข…๋ฃŒ* ๋กœ์ง์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž ์‹œ ํ›„์— ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค).
`FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜์™€ "์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ *์‹œ์ž‘*๊ณผ *์ข…๋ฃŒ* ๋กœ์ง์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž ์‹œ ํ›„์— ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค).
์˜ˆ์ œ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
@ -32,7 +32,7 @@
{* ../../docs_src/events/tutorial003_py310.py hl[16,19] *}
์—ฌ๊ธฐ์„œ๋Š” `yield` ์ด์ „์— (๊ฐ€์งœ) ๋ชจ๋ธ ํ•จ์ˆ˜๋ฅผ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์ด ๋“ค์–ด ์žˆ๋Š” ๋”•์…”๋„ˆ๋ฆฌ์— ๋„ฃ์–ด ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋Š” ๋น„์šฉ์ด ํฐ *์‹œ์ž‘* ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **์š”์ฒญ์„ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์ „**, *์‹œ์ž‘* ๋™์•ˆ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” `yield` ์ด์ „์— (๊ฐ€์งœ) ๋ชจ๋ธ ํ•จ์ˆ˜๋ฅผ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ๋“ค์ด ๋“ค์–ด ์žˆ๋Š” ๋”•์…”๋„ˆ๋ฆฌ์— ๋„ฃ์–ด ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋Š” ๋น„์šฉ์ด ํฐ *์‹œ์ž‘* ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **์š”์ฒญ์„ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์ „**, *์‹œ์ž‘* ๋™์•ˆ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  `yield` ์งํ›„์—๋Š” ๋ชจ๋ธ์„ ์–ธ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋งˆ์นœ ํ›„**, *์ข…๋ฃŒ* ์ง์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๋ชจ๋ฆฌ๋‚˜ GPU ๊ฐ™์€ ์ž์›์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -80,7 +80,7 @@ async with lifespan(app):
์œ„์˜ ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ๋Š” ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , FastAPI์— ์ „๋‹ฌํ•˜์—ฌ FastAPI๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
`FastAPI` ์•ฑ์˜ `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” **๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €**๋ฅผ ๋ฐ›์œผ๋ฏ€๋กœ, ์ƒˆ `lifespan` ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
`FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” **๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €**๋ฅผ ๋ฐ›์œผ๋ฏ€๋กœ, ์ƒˆ `lifespan` ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{* ../../docs_src/events/tutorial003_py310.py hl[22] *}
@ -88,7 +88,7 @@ async with lifespan(app):
/// warning | ๊ฒฝ๊ณ 
*์‹œ์ž‘*๊ณผ *์ข…๋ฃŒ*๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ถŒ์žฅ ๋ฐฉ๋ฒ•์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ `FastAPI` ์•ฑ์˜ `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋ฉด `startup`๊ณผ `shutdown` ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋” ์ด์ƒ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `lifespan`๋งŒ ์“ฐ๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋งŒ ์“ฐ๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜์ด์ง€, ๋‘˜ ๋‹ค๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
*์‹œ์ž‘*๊ณผ *์ข…๋ฃŒ*๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ถŒ์žฅ ๋ฐฉ๋ฒ•์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. `lifespan` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋ฉด `startup`๊ณผ `shutdown` ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋” ์ด์ƒ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `lifespan`๋งŒ ์“ฐ๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋งŒ ์“ฐ๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜์ด์ง€, ๋‘˜ ๋‹ค๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
์ด ๋ถ€๋ถ„์€ ์•„๋งˆ ๊ฑด๋„ˆ๋›ฐ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

14
docs/ko/docs/advanced/generate-clients.md

@ -20,20 +20,6 @@ FastAPI๋Š” **OpenAPI 3.1** ์‚ฌ์–‘์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉํ•˜๋Š”
///
## FastAPI ์Šคํฐ์„œ์˜ SDK ์ƒ์„ฑ๊ธฐ { #sdk-generators-from-fastapi-sponsors }
์ด ์„น์…˜์—์„œ๋Š” FastAPI๋ฅผ ํ›„์›ํ•˜๋Š” ํšŒ์‚ฌ๋“ค์ด ์ œ๊ณตํ•˜๋Š” **๋ฒค์ฒ˜ ํˆฌ์ž ๊ธฐ๋ฐ˜** ๋ฐ **๊ธฐ์—… ์ง€์›** ์†”๋ฃจ์…˜์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œํ’ˆ๋“ค์€ ๊ณ ํ’ˆ์งˆ๋กœ ์ƒ์„ฑ๋œ SDK์— ๋”ํ•ด **์ถ”๊ฐ€ ๊ธฐ๋Šฅ**๊ณผ **ํ†ตํ•ฉ**์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
โœจ [**FastAPI ํ›„์›ํ•˜๊ธฐ**](../help-fastapi.md#sponsor-the-author) โœจ๋ฅผ ํ†ตํ•ด, ์ด ํšŒ์‚ฌ๋“ค์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ทธ **์ƒํƒœ๊ณ„**๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ณ  **์ง€์† ๊ฐ€๋Šฅ**ํ•˜๊ฒŒ ์œ ์ง€๋˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด๋“ค์˜ ํ›„์›์€ FastAPI **์ปค๋ฎค๋‹ˆํ‹ฐ**(์—ฌ๋Ÿฌ๋ถ„)์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ํ—Œ์‹ ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, **์ข‹์€ ์„œ๋น„์Šค**๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ฟ ์•„๋‹ˆ๋ผ, ๊ฒฌ๊ณ ํ•˜๊ณ  ํ™œ๋ฐœํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ธ FastAPI๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ์—๋„ ๊ด€์‹ฌ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๐Ÿ™‡
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
์ด ์ค‘ ์ผ๋ถ€๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๊ฑฐ๋‚˜ ๋ฌด๋ฃŒ ํ‹ฐ์–ด๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๋น„์šฉ ๋ถ€๋‹ด ์—†์ด ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ƒ์šฉ SDK ์ƒ์„ฑ๊ธฐ๋„ ์žˆ์œผ๋ฉฐ ์˜จ๋ผ์ธ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
## TypeScript SDK ๋งŒ๋“ค๊ธฐ { #create-a-typescript-sdk }
๊ฐ„๋‹จํ•œ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

2
docs/ko/docs/advanced/json-base64-bytes.md

@ -4,7 +4,7 @@
## Base64์™€ ํŒŒ์ผ { #base64-vs-files }
๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ์—๋Š” [์š”์ฒญ ํŒŒ์ผ](../tutorial/request-files.md)์„, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก์—๋Š” [์ปค์Šคํ…€ ์‘๋‹ต - FileResponse](./custom-response.md#fileresponse--fileresponse-)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋จผ์ € ๊ณ ๋ คํ•˜์„ธ์š”. JSON์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ง์ž…๋‹ˆ๋‹ค.
๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ์—๋Š” [์š”์ฒญ ํŒŒ์ผ](../tutorial/request-files.md)์„, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก์—๋Š” [์ปค์Šคํ…€ ์‘๋‹ต - FileResponse](./custom-response.md#fileresponse)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋จผ์ € ๊ณ ๋ คํ•˜์„ธ์š”. JSON์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ง์ž…๋‹ˆ๋‹ค.
JSON์€ UTF-8๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์›์‹œ ๋ฐ”์ดํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‹ด์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2
docs/ko/docs/advanced/openapi-callbacks.md

@ -165,7 +165,7 @@ https://www.external.org/events/invoices/2expen51ve
### ์ฝœ๋ฐฑ ๋ผ์šฐํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ { #add-the-callback-router }
์ด ์‹œ์ ์—์„œ, ์œ„์—์„œ ๋งŒ๋“  ์ฝœ๋ฐฑ ๋ผ์šฐํ„ฐ ์•ˆ์— *์ฝœ๋ฐฑ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ(๋“ค)*(์ฆ‰ *external developer*๊ฐ€ *external API*์— ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค)์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ์‹œ์ ์—์„œ, ์œ„์—์„œ ๋งŒ๋“  ์ฝœ๋ฐฑ ๋ผ์šฐํ„ฐ ์•ˆ์— *์ฝœ๋ฐฑ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ(๋“ค)*(์ฆ‰ *์™ธ๋ถ€ ๊ฐœ๋ฐœ์ž*๊ฐ€ *external API*์— ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค)์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ *์—ฌ๋Ÿฌ๋ถ„์˜ API ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์—์„œ `callbacks` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด, ๊ทธ ์ฝœ๋ฐฑ ๋ผ์šฐํ„ฐ์˜ `.routes` ์†์„ฑ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค:

1
docs/ko/docs/advanced/response-change-status-code.md

@ -1,5 +1,6 @@
# ์‘๋‹ต - ์ƒํƒœ ์ฝ”๋“œ ๋ณ€๊ฒฝ { #response-change-status-code }
๊ธฐ๋ณธ [์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ ์„ค์ •](../tutorial/response-status-code.md)์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑธ ์ด๋ฏธ ์•Œ๊ณ  ๊ณ„์‹ค ๊ฒ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ์„ค์ •๊ณผ ๋‹ค๋ฅธ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2
docs/ko/docs/advanced/response-cookies.md

@ -26,7 +26,7 @@
{* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *}
/// tip
/// tip | ํŒ
`Response` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ, FastAPI๋Š” ์ด๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

1
docs/ko/docs/advanced/response-headers.md

@ -1,5 +1,6 @@
# ์‘๋‹ต ํ—ค๋” { #response-headers }
## `Response` ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ { #use-a-response-parameter }
์—ฌ๋Ÿฌ๋ถ„์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ `Response` ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ฟ ํ‚ค์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

4
docs/ko/docs/advanced/security/oauth2-scopes.md

@ -4,9 +4,9 @@
์ด๋ฅผ ํ†ตํ•ด OAuth2 ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋Š” ๋” ์„ธ๋ฐ€ํ•œ ๊ถŒํ•œ ์‹œ์Šคํ…œ์„ OpenAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋ฐ API ๋ฌธ์„œ)์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OAuth2๋Š” Facebook, Google, GitHub, Microsoft, X(Twitter) ๋“ฑ ๋งŽ์€ ๋Œ€ํ˜• ์ธ์ฆ ์ œ๊ณต์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠน์ • ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OAuth2๋Š” Facebook, Google, GitHub, Microsoft, X (Twitter) ๋“ฑ ๋งŽ์€ ๋Œ€ํ˜• ์ธ์ฆ ์ œ๊ณต์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠน์ • ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
Facebook, Google, GitHub, Microsoft, X(Twitter)๋กœ โ€œ๋กœ๊ทธ์ธโ€ํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์Šค์ฝ”ํ”„๊ฐ€ ์žˆ๋Š” OAuth2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Facebook, Google, GitHub, Microsoft, X (Twitter)๋กœ โ€œ๋กœ๊ทธ์ธโ€ํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์Šค์ฝ”ํ”„๊ฐ€ ์žˆ๋Š” OAuth2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์„น์…˜์—์„œ๋Š” **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋™์ผํ•œ โ€œ์Šค์ฝ”ํ”„๊ฐ€ ์žˆ๋Š” OAuth2โ€๋กœ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

1
docs/ko/docs/advanced/settings.md

@ -1,5 +1,6 @@
# ์„ค์ •๊ณผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ { #settings-and-environment-variables }
๋งŽ์€ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์™ธ๋ถ€ ์„ค์ •์ด๋‚˜ ๊ตฌ์„ฑ(์˜ˆ: secret key, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๊ฒฉ ์ฆ๋ช…, ์ด๋ฉ”์ผ ์„œ๋น„์Šค ์ž๊ฒฉ ์ฆ๋ช… ๋“ฑ)์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์„ค์ • ๋Œ€๋ถ€๋ถ„์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URL์ฒ˜๋Ÿผ ๋ณ€๋™ ๊ฐ€๋Šฅ(๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ)ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ์„ค์ •์€ secret์ฒ˜๋Ÿผ ๋ฏผ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

18
docs/ko/docs/advanced/stream-data.md

@ -2,7 +2,7 @@
JSON์œผ๋กœ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด [JSON Lines ์ŠคํŠธ๋ฆฌ๋ฐ](../tutorial/stream-json-lines.md)์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
ํ•˜์ง€๋งŒ ์ˆœ์ˆ˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฌธ์ž์—ด์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ **์ˆœ์ˆ˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ**๋‚˜ ๋ฌธ์ž์—ด์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
/// note | ์ฐธ๊ณ 
@ -12,21 +12,21 @@ FastAPI 0.134.0์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
## ์‚ฌ์šฉ ์˜ˆ์‹œ { #use-cases }
์˜ˆ๋ฅผ ๋“ค์–ด AI LLM ์„œ๋น„์Šค์˜ ์ถœ๋ ฅ์—์„œ ๋ฐ”๋กœ ์ˆœ์ˆ˜ ๋ฌธ์ž์—ด์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด **AI LLM** ์„œ๋น„์Šค์˜ ์ถœ๋ ฅ์—์„œ ๋ฐ”๋กœ ์ˆœ์ˆ˜ ๋ฌธ์ž์—ด์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ฝ์ง€ ์•Š๊ณ , ์ฝ๋Š” ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ **ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ**์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ฝ์ง€ ์•Š๊ณ , ์ฝ๋Š” ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์œผ๋กœ ๋น„๋””์˜ค๋‚˜ ์˜ค๋””์˜ค๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณง๋ฐ”๋กœ ์ „์†กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์œผ๋กœ **๋น„๋””์˜ค**๋‚˜ **์˜ค๋””์˜ค**๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณง๋ฐ”๋กœ ์ „์†กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
## `yield`์™€ ํ•จ๊ป˜ `StreamingResponse` ์‚ฌ์šฉํ•˜๊ธฐ { #a-streamingresponse-with-yield }
๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์—์„œ `response_class=StreamingResponse`๋ฅผ ์„ ์–ธํ•˜๋ฉด `yield`๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ `response_class=StreamingResponse`๋ฅผ ์„ ์–ธํ•˜๋ฉด `yield`๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
FastAPI๋Š” ๊ฐ ๋ฐ์ดํ„ฐ ์ฒญํฌ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ `StreamingResponse`์— ์ „๋‹ฌํ•˜๋ฉฐ, JSON ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
### async๊ฐ€ ์•„๋‹Œ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ { #non-async-path-operation-functions }
### async๊ฐ€ ์•„๋‹Œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜* { #non-async-path-operation-functions }
`async`๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ `def` ํ•จ์ˆ˜์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ `yield`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -40,7 +40,7 @@ FastAPI๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์œผ๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ๋ฐฉ์‹
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
์ด๋Š” ๊ณง `StreamingResponse`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ, ์ „์†ก ๊ธฐ์ค€์— ๋งž์ถฐ ๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•  ์ž์œ ์™€ ์ฑ…์ž„์ด ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
์ด๋Š” ๊ณง `StreamingResponse`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํƒ€์ž… ์• ๋„ˆํ…Œ์ด์…˜๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ, ์ „์†ก ๊ธฐ์ค€์— ๋งž์ถฐ ๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•  **์ž์œ **์™€ **์ฑ…์ž„**์ด ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
### ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ { #stream-bytes }
@ -58,7 +58,7 @@ FastAPI๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์œผ๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ๋ฐฉ์‹
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์—์„œ `response_class=PNGStreamingResponse`๋กœ ์ด ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๊ทธ๋Ÿฐ ๋‹ค์Œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ `response_class=PNGStreamingResponse`๋กœ ์ด ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
@ -98,7 +98,7 @@ FastAPI๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์œผ๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ๋ฐฉ์‹
///
์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋ธ”๋กœํ‚น๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ ค๋ฉด ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ `async def` ๋Œ€์‹  ์ผ๋ฐ˜ `def`๋กœ ์„ ์–ธํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด FastAPI๊ฐ€ ์Šค๋ ˆ๋“œํ’€ ์›Œ์ปค์—์„œ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”์ธ ๋ฃจํ”„๊ฐ€ ๋ง‰ํžˆ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋ธ”๋กœํ‚น๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ ค๋ฉด *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ `async def` ๋Œ€์‹  ์ผ๋ฐ˜ `def`๋กœ ์„ ์–ธํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด FastAPI๊ฐ€ ์Šค๋ ˆ๋“œํ’€ ์›Œ์ปค์—์„œ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”์ธ ๋ฃจํ”„๊ฐ€ ๋ง‰ํžˆ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}

2
docs/ko/docs/advanced/wsgi.md

@ -42,7 +42,7 @@
Hello, World from Flask!
```
๊ทธ๋ฆฌ๊ณ  [http://localhost:8000/v2](http://localhost:8000/v2)๋กœ ์ด๋™ํ•˜๋ฉด **FastAPI**์˜ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๊ทธ๋ฆฌ๊ณ  [http://localhost:8000/v2](http://localhost:8000/v2)๋กœ ์ด๋™ํ•˜๋ฉด FastAPI์˜ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```JSON
{

46
docs/ko/docs/alternatives.md

@ -24,7 +24,7 @@
### [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 ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
Mozilla, Red Hat, Eventbrite๋ฅผ ํฌํ•จํ•ด ๋งŽ์€ ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@ -36,7 +36,7 @@ Django REST Framework๋Š” Tom Christie๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. **FastAPI**์˜ ๊ธฐ
///
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
์ž๋™ API ๋ฌธ์„œํ™” ์›น ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ.
@ -56,7 +56,7 @@ Flask๋Š” "microframework"๋กœ, Django์— ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด
Flask์˜ ๋‹จ์ˆœํ•จ์„ ๊ณ ๋ คํ•˜๋ฉด API๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ž˜ ๋งž๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์ฐพ๊ณ ์ž ํ–ˆ๋˜ ๊ฒƒ์€ Flask์šฉ "Django REST Framework"์˜€์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
micro-framework๊ฐ€ ๋˜๊ธฐ. ํ•„์š”ํ•œ ๋„๊ตฌ์™€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ.
@ -80,7 +80,7 @@ Requests๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ์„ค๊ณ„๋ฅผ ๊ฐ€์กŒ๊ณ , ํ•ฉ๋ฆฌ์ ์ธ
๊ทธ๋ž˜์„œ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ ๋งํ•˜๋“ฏ์ด:
> Requests is one of the most downloaded Python packages of all time
> Requests๋Š” ์—ญ๋Œ€ ๊ฐ€์žฅ ๋งŽ์ด ๋‹ค์šด๋กœ๋“œ๋œ Python ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค
์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `GET` ์š”์ฒญ์„ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:
@ -98,7 +98,7 @@ def read_url():
`requests.get(...)`์™€ `@app.get(...)`์˜ ์œ ์‚ฌ์„ฑ์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
* ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ๊ฐ–๊ธฐ.
* HTTP method ์ด๋ฆ„(operations)์„ ์ง์ ‘, ์ง๊ด€์ ์ด๊ณ  ๋ช…ํ™•ํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ.
@ -118,7 +118,7 @@ def read_url():
๊ทธ๋ž˜์„œ 2.0 ๋ฒ„์ „์„ ์ด์•ผ๊ธฐํ•  ๋•Œ๋Š” "Swagger"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๊ณ , 3+ ๋ฒ„์ „์€ "OpenAPI"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
์ปค์Šคํ…€ schema ๋Œ€์‹ , API ์‚ฌ์–‘์„ ์œ„ํ•œ ์—ด๋ฆฐ ํ‘œ์ค€์„ ์ฑ„ํƒํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ.
@ -147,7 +147,7 @@ API์— ๋˜ ํ•˜๋‚˜ ํฌ๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์ž…๋‹ˆ๋‹ค. ํŠน์ •
ํ•˜์ง€๋งŒ Python type hints๊ฐ€ ์กด์žฌํ•˜๊ธฐ ์ „์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ <dfn title="๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •์˜">์Šคํ‚ค๋งˆ</dfn>๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด Marshmallow๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŠน์ • ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ฒ€์ฆ์„ ์ œ๊ณตํ•˜๋Š” "schema"๋ฅผ ์ฝ”๋“œ๋กœ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ์ž๋™์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ.
@ -169,7 +169,7 @@ Webargs๋Š” Marshmallow์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
///
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
๋“ค์–ด์˜ค๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ์˜ ์ž๋™ ๊ฒ€์ฆ์„ ๊ฐ–๊ธฐ.
@ -199,7 +199,7 @@ APISpec์€ Marshmallow์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
///
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
API๋ฅผ ์œ„ํ•œ ์—ด๋ฆฐ ํ‘œ์ค€์ธ OpenAPI๋ฅผ ์ง€์›ํ•˜๊ธฐ.
@ -231,7 +231,7 @@ Flask-apispec์€ Marshmallow์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
///
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
serialization๊ณผ validation์„ ์ •์˜ํ•˜๋Š” ๋™์ผํ•œ ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ OpenAPI schema๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๊ธฐ.
@ -251,7 +251,7 @@ Angular 2์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ์˜์กด์„ฑ ์ฃผ์ž… ์‹œ์Šคํ…œ์ด ํ†ตํ•ฉ๋˜์–ด ์žˆ
์ค‘์ฒฉ ๋ชจ๋ธ์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์š”์ฒญ์˜ JSON body๊ฐ€ ๋‚ด๋ถ€ ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ JSON ๊ฐ์ฒด์ด๊ณ  ๊ทธ ๋‚ด๋ถ€ ํ•„๋“œ๋“ค์ด ๋‹ค์‹œ ์ค‘์ฒฉ๋œ JSON ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ, ์ œ๋Œ€๋กœ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
Python ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋›ฐ์–ด๋‚œ ์—๋””ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ.
@ -271,7 +271,7 @@ Python ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋›ฐ์–ด๋‚œ ์—๋””ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ.
///
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
๋ฏธ์นœ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ.
@ -283,11 +283,11 @@ Python ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋›ฐ์–ด๋‚œ ์—๋””ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ.
Falcon์€ ๋˜ ๋‹ค๋ฅธ ๊ณ ์„ฑ๋Šฅ Python framework๋กœ, ์ตœ์†Œํ•œ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ณ  Hug ๊ฐ™์€ ๋‹ค๋ฅธ framework์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
ํ•จ์ˆ˜๊ฐ€ ๋‘ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(ํ•˜๋‚˜๋Š” "request", ํ•˜๋‚˜๋Š” "response")๋ฅผ ๋ฐ›๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ request์—์„œ ์ผ๋ถ€๋ฅผ "์ฝ๊ณ ", response์— ์ผ๋ถ€๋ฅผ "์ž‘์„ฑ"ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค๊ณ„ ๋•Œ๋ฌธ์—, ํ‘œ์ค€ Python type hints๋ฅผ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•ด ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ body๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜๊ฐ€ ๋‘ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(ํ•˜๋‚˜๋Š” "์š”์ฒญ", ํ•˜๋‚˜๋Š” "์‘๋‹ต")๋ฅผ ๋ฐ›๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์š”์ฒญ์—์„œ ์ผ๋ถ€๋ฅผ "์ฝ๊ณ ", ์‘๋‹ต์— ์ผ๋ถ€๋ฅผ "์ž‘์„ฑ"ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค๊ณ„ ๋•Œ๋ฌธ์—, ํ‘œ์ค€ Python type hints๋ฅผ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•ด ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ body๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, serialization, ๋ฌธ์„œํ™”๋Š” ์ž๋™์œผ๋กœ ๋˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” Hug์ฒ˜๋Ÿผ Falcon ์œ„์— framework๋ฅผ ์–น์–ด ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. request ๊ฐ์ฒด ํ•˜๋‚˜์™€ response ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” Falcon์˜ ์„ค๊ณ„์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๋‹ค๋ฅธ framework์—์„œ๋„ ๊ฐ™์€ ๊ตฌ๋ถ„์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, serialization, ๋ฌธ์„œํ™”๋Š” ์ž๋™์œผ๋กœ ๋˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” Hug์ฒ˜๋Ÿผ Falcon ์œ„์— framework๋ฅผ ์–น์–ด ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ๊ฐ์ฒด ํ•˜๋‚˜์™€ ์‘๋‹ต ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” Falcon์˜ ์„ค๊ณ„์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๋‹ค๋ฅธ framework์—์„œ๋„ ๊ฐ™์€ ๊ตฌ๋ถ„์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
ํ›Œ๋ฅญํ•œ ์„ฑ๋Šฅ์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ.
@ -313,7 +313,7 @@ Pydantic ๊ฐ™์€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ/seria
Route๋Š” ํ•œ ๊ณณ์—์„œ ์„ ์–ธํ•˜๊ณ , ๋‹ค๋ฅธ ๊ณณ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜ ๋ฐ”๋กœ ์œ„์— ๋‘˜ ์ˆ˜ ์žˆ๋Š” decorator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ). ์ด๋Š” Flask(๋ฐ Starlette)๋ณด๋‹ค๋Š” Django ๋ฐฉ์‹์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๊ฒƒ๋“ค์„ ๋ถ„๋ฆฌํ•ด ๋†“์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
๋ชจ๋ธ ์†์„ฑ์˜ "default" ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ฒ€์ฆ์„ ์ •์˜ํ•˜๊ธฐ. ์ด๋Š” ์—๋””ํ„ฐ ์ง€์›์„ ๊ฐœ์„ ํ•˜๋ฉฐ, ์ด์ „์—๋Š” Pydantic์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
@ -341,7 +341,7 @@ Hug๋Š” Timothy Crosley๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Python ํŒŒ์ผ์—์„œ import๋ฅผ ์ž
///
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์•„์ด๋””์–ด
Hug๋Š” APIStar์˜ ์ผ๋ถ€์— ์˜๊ฐ์„ ์ฃผ์—ˆ๊ณ , ์ €๋Š” APIStar์™€ ํ•จ๊ป˜ Hug๋ฅผ ๊ฐ€์žฅ ์œ ๋งํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋กœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
@ -385,7 +385,7 @@ APIStar๋Š” Tom Christie๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๋งŒ๋“  ์‚ฌ๋žŒ๊ณผ ๋™์ผ
///
/// tip | ํŒ
/// tip | **FastAPI**์— ์˜๊ฐ์„ ์ค€ ์ 
์กด์žฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ.
@ -409,7 +409,7 @@ Pydantic์€ Python type hints๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, serialization,
Marshmallow์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ benchmark์—์„œ Marshmallow๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ Python type hints๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ ์—๋””ํ„ฐ ์ง€์›๋„ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•ด
๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, ๋ฐ์ดํ„ฐ serialization, ์ž๋™ ๋ชจ๋ธ ๋ฌธ์„œํ™”(JSON Schema ๊ธฐ๋ฐ˜)๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ.
@ -430,7 +430,7 @@ Starlette๋Š” ๊ฒฝ๋Ÿ‰ <dfn title="๋น„๋™๊ธฐ Python ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ
* ํ”„๋กœ์„ธ์Šค ๋‚ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—….
* ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์ด๋ฒคํŠธ.
* HTTPX ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ.
* CORS, GZip, Static Files, Streaming responses.
* CORS, GZip, Static Files, ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต.
* ์„ธ์…˜ ๋ฐ ์ฟ ํ‚ค ์ง€์›.
* 100% ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€.
* 100% ํƒ€์ž… ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์ฝ”๋“œ๋ฒ ์ด์Šค.
@ -452,7 +452,7 @@ ASGI๋Š” Django ์ฝ”์–ด ํŒ€ ๋ฉค๋ฒ„๋“ค์ด ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒˆ๋กœ์šด "ํ‘œ์ค€"์ž…๋‹ˆ๋‹ค
///
/// tip | ํŒ
/// tip | **FastAPI**๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•ด
ํ•ต์‹ฌ ์›น ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ. ๊ทธ ์œ„์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ.
@ -470,11 +470,11 @@ web framework๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ routing
Starlette์™€ **FastAPI**์—์„œ ๊ถŒ์žฅํ•˜๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
/// tip | ํŒ
/// tip | **FastAPI**๋Š” ์ด๋ฅผ ๋‹ค์Œ์œผ๋กœ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค
**FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ์›น ์„œ๋ฒ„.
๋˜ํ•œ `--workers` ์ปค๋งจ๋“œ๋ผ์ธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ์„œ๋ฒ„๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ `--workers` ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ์„œ๋ฒ„๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ](deployment/index.md) ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.

1
docs/ko/docs/async.md

@ -1,5 +1,6 @@
# ๋™์‹œ์„ฑ๊ณผ async / await { #concurrency-and-async-await }
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ์˜ `async def` ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ๊ณผ ๋น„๋™๊ธฐ ์ฝ”๋“œ, ๋™์‹œ์„ฑ ๋ฐ ๋ณ‘๋ ฌ์„ฑ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ
## ๋ฐ”์˜์‹ ๊ฐ€์š”? { #in-a-hurry }

4
docs/ko/docs/deployment/cloud.md

@ -10,13 +10,13 @@
์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๊ตฌ์ถ•**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
FastAPI๋กœ ์•ฑ์„ ๋นŒ๋“œํ•  ๋•Œ์˜ ๋™์ผํ•œ **๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜**์„ ํด๋ผ์šฐ๋“œ์— **๋ฐฐํฌ**ํ•˜๋Š” ๋ฐ์—๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
FastAPI๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ๋•Œ์˜ ๋™์ผํ•œ **๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜**์„ ํด๋ผ์šฐ๋“œ์— **๋ฐฐํฌ**ํ•˜๋Š” ๋ฐ์—๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
FastAPI Cloud๋Š” *FastAPI and friends* ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ํ›„์›์ž์ด์ž ์ž๊ธˆ ์ œ๊ณต์ž์ž…๋‹ˆ๋‹ค. โœจ
## ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด - ํ›„์›์ž๋“ค { #cloud-providers-sponsors }
๋‹ค๋ฅธ ๋ช‡๋ช‡ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋“ค๋„ โœจ [**FastAPI๋ฅผ ํ›„์›ํ•ฉ๋‹ˆ๋‹ค**](../help-fastapi.md#sponsor-the-author) โœจ. ๐Ÿ™‡
๋‹ค๋ฅธ ๋ช‡๋ช‡ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋“ค๋„ โœจ [**FastAPI๋ฅผ ํ›„์›ํ•ฉ๋‹ˆ๋‹ค**](https://github.com/sponsors/tiangolo) โœจ. ๐Ÿ™‡
๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์ด๋“ค๋„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

10
docs/ko/docs/deployment/concepts.md

@ -104,7 +104,7 @@ TLS Termination Proxy๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ
### ์‹œ์ž‘ ์‹œ ์ž๋™ ์‹คํ–‰ { #run-automatically-on-startup }
์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ(์˜ˆ: Uvicorn)์€ ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋˜๊ณ , **์‚ฌ๋žŒ์˜ ๊ฐœ์ž…** ์—†์ด๋„ FastAPI ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ญ์ƒ ์‹คํ–‰ ์ค‘์ด๋„๋ก(์˜ˆ: FastAPI ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” Uvicorn) ๊ตฌ์„ฑํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ(์˜ˆ: Uvicorn)์€ ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋˜๊ณ , **์‚ฌ๋žŒ์˜ ๊ฐœ์ž…** ์—†์ด๋„ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ญ์ƒ ์‹คํ–‰ ์ค‘์ด๋„๋ก(์˜ˆ: FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” Uvicorn) ๊ตฌ์„ฑํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
### ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ { #separate-program }
@ -159,7 +159,7 @@ FastAPI๋กœ ์›น API๋ฅผ ๋งŒ๋“ค ๋•Œ ์ฝ”๋“œ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด, FastAPI๋Š” ๋ณด
///
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์—ญํ• ์€ **์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ**๊ฐ€ ๋งก๋Š” ํŽธ์ด ๋ณดํ†ต ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—๋Š” Uvicorn๊ณผ Python์„ ํฌํ•จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด๋ฏธ ํฌ๋ž˜์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ์•ฑ์˜ ๊ฐ™์€ ์ฝ”๋“œ ์•ˆ์—์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์—ญํ• ์€ **์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ**๊ฐ€ ๋งก๋Š” ํŽธ์ด ๋ณดํ†ต ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—๋Š” Uvicorn๊ณผ Python์„ ํฌํ•จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด๋ฏธ ํฌ๋ž˜์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ™์€ ์ฝ”๋“œ ์•ˆ์—์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
### ์ž๋™ ์žฌ์‹œ์ž‘์„ ์œ„ํ•œ ๋„๊ตฌ ์˜ˆ์‹œ { #example-tools-to-restart-automatically }
@ -243,7 +243,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Uvicorn์„ ์‹คํ–‰ํ•˜๋Š” `fastapi` ๋ช…๋ น ๊ฐ™์€
**์ปจํ…Œ์ด๋„ˆ**, Docker, Kubernetes์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋‚ด์šฉ์ด ์•„์ง์€ ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์žฅ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€, Docker, Kubernetes ๋“ฑ์„ ๋” ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md).
ํ–ฅํ›„ ์žฅ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€, Docker, Kubernetes ๋“ฑ์„ ๋” ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md).
///
@ -275,13 +275,13 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Uvicorn์„ ์‹คํ–‰ํ•˜๋Š” `fastapi` ๋ช…๋ น ๊ฐ™์€
๊ฐ€๋Šฅํ•œ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* ์•ฑ ์ปจํ…Œ์ด๋„ˆ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋Š” Kubernetes์˜ โ€œInit Containerโ€
* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋Š” Kubernetes์˜ โ€œInit Containerโ€
* ์‚ฌ์ „ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋Š” bash ์Šคํฌ๋ฆฝํŠธ
* ์ด bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹œ์ž‘/์žฌ์‹œ์ž‘ํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ๋ฒ•๋„ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
/// tip | ํŒ
์ปจํ…Œ์ด๋„ˆ๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ ์žฅ์—์„œ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md).
์ปจํ…Œ์ด๋„ˆ๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋Š” ํ–ฅํ›„ ์žฅ์—์„œ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md).
///

36
docs/ko/docs/deployment/docker.md

@ -11,7 +11,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ **๋ฆฌ
///
<details>
<summary>Dockerfile Preview ๐Ÿ‘€</summary>
<summary>Dockerfile ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๐Ÿ‘€</summary>
```Dockerfile
FROM python:3.14
@ -46,7 +46,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
**์ปจํ…Œ์ด๋„ˆ**๋Š” **์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ๊ธฐ๋ณธ ๋ช…๋ น/ํ”„๋กœ๊ทธ๋žจ์˜ **์ •์ ** ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ **์ •์ **์ด๋ผ๋Š” ๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ **์ด๋ฏธ์ง€**๊ฐ€ ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํŒจํ‚ค์ง•๋œ ํŒŒ์ผ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ผ ๋ฟ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ๊ธฐ๋ณธ ๋ช…๋ น์–ด/ํ”„๋กœ๊ทธ๋žจ์˜ **์ •์ ** ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ **์ •์ **์ด๋ผ๋Š” ๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ **์ด๋ฏธ์ง€**๊ฐ€ ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํŒจํ‚ค์ง•๋œ ํŒŒ์ผ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ผ ๋ฟ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
์ €์žฅ๋œ ์ •์  ์ฝ˜ํ…์ธ ์ธ "**์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**"์™€ ๋‹ฌ๋ฆฌ, "**์ปจํ…Œ์ด๋„ˆ**"๋Š” ๋ณดํ†ต ์‹คํ–‰ ์ค‘์ธ ์ธ์Šคํ„ด์Šค, ์ฆ‰ **์‹คํ–‰๋˜๋Š”** ๋Œ€์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
@ -62,7 +62,7 @@ Docker๋Š” **์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**์™€ **์ปจํ…Œ์ด๋„ˆ**๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ
๋˜ํ•œ [Docker Hub](https://hub.docker.com/)์—๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ, ํ™˜๊ฒฝ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ **๊ณต์‹ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์‹ [Python Image](https://hub.docker.com/_/python)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์‹ [Python ์ด๋ฏธ์ง€](https://hub.docker.com/_/python)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„์˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด:
@ -81,11 +81,11 @@ Docker๋‚˜ Kubernetes ๊ฐ™์€ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—๋Š” ์ด๋Ÿฌํ•œ
## ์ปจํ…Œ์ด๋„ˆ์™€ ํ”„๋กœ์„ธ์Šค { #containers-and-processes }
**์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๋Š” ๋ณดํ†ต **์ปจํ…Œ์ด๋„ˆ**๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ๊ทธ๋žจ/๋ช…๋ น๊ณผ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ์‹คํ–‰ํ•  ๋•Œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
**์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๋Š” ๋ณดํ†ต **์ปจํ…Œ์ด๋„ˆ**๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ํ”„๋กœ๊ทธ๋žจ/๋ช…๋ น์–ด์™€ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ์‹คํ–‰ํ•  ๋•Œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
**์ปจํ…Œ์ด๋„ˆ**๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๋ช…๋ น/ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๋‹ค๋ฅธ ๋ช…๋ น/ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).
**์ปจํ…Œ์ด๋„ˆ**๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๋ช…๋ น์–ด/ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๋‹ค๋ฅธ ๋ช…๋ น์–ด/ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).
์ปจํ…Œ์ด๋„ˆ๋Š” **๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค**(๋ช…๋ น ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ)๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ๋Š” **๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค**(๋ช…๋ น์–ด ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ)๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณดํ†ต **๋‹จ์ผ ํ”„๋กœ์„ธ์Šค**๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—์„œ ์„œ๋ธŒํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์— **์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค**๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
@ -218,11 +218,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด `Dockerfile`์˜ **๋๋ถ€๋ถ„ ๊ทผ์ฒ˜**์— ๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
6. ๋‚ด๋ถ€์ ์œผ๋กœ Uvicorn์„ ์‚ฌ์šฉํ•˜๋Š” `fastapi run`์„ ์‚ฌ์šฉํ•˜๋„๋ก **๋ช…๋ น**์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
6. ๋‚ด๋ถ€์ ์œผ๋กœ Uvicorn์„ ์‚ฌ์šฉํ•˜๋Š” `fastapi run`์„ ์‚ฌ์šฉํ•˜๋„๋ก **๋ช…๋ น์–ด**๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
`CMD`๋Š” ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉฐ, ๊ฐ ๋ฌธ์ž์—ด์€ ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ž…๋ ฅํ•˜๋Š” ํ•ญ๋ชฉ๋“ค์ž…๋‹ˆ๋‹ค.
์ด ๋ช…๋ น์€ **ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ**์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์ด๋Š” ์œ„์—์„œ `WORKDIR /code`๋กœ ์„ค์ •ํ•œ `/code` ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด ๋ช…๋ น์–ด๋Š” **ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ**์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์ด๋Š” ์œ„์—์„œ `WORKDIR /code`๋กœ ์„ค์ •ํ•œ `/code` ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
@ -258,7 +258,7 @@ FastAPI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ(graceful shutdown)๋˜๊ณ  [lifespan ์ด๋ฒคํŠธ](
์ž์„ธํ•œ ๋‚ด์šฉ์€ [shell and exec form์— ๋Œ€ํ•œ Docker ๋ฌธ์„œ](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์ด๋Š” `docker compose`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฝค ๋ˆˆ์— ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๊ธฐ์ˆ ์ ์ธ ์ƒ์„ธ ๋‚ด์šฉ์€ Docker Compose FAQ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: [Why do my services take 10 seconds to recreate or stop?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
์ด๋Š” `docker compose`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฝค ๋ˆˆ์— ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๊ธฐ์ˆ ์ ์ธ ์ƒ์„ธ ๋‚ด์šฉ์€ Docker Compose FAQ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: [์™œ ๋‚ด ์„œ๋น„์Šค๋Š” ๋‹ค์‹œ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ค‘์ง€๋˜๋Š” ๋ฐ 10์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋‚˜์š”?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
#### ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ { #directory-structure }
@ -409,7 +409,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
2. ๋‹จ์ผ ํŒŒ์ผ `main.py`์— ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณต(serve)ํ•˜๊ธฐ ์œ„ํ•ด `fastapi run`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
`fastapi run`์— ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜๋ฉด, ์ด๊ฒƒ์ด ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์ž„ํฌํŠธํ•ด์„œ FastAPI ์•ฑ์„ ์ œ๊ณตํ• ์ง€ ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค. ๐Ÿ˜Ž
`fastapi run`์— ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜๋ฉด, ์ด๊ฒƒ์ด ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์ž„ํฌํŠธํ•ด์„œ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ• ์ง€ ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค. ๐Ÿ˜Ž
## ๋ฐฐํฌ ๊ฐœ๋… { #deployment-concepts }
@ -472,17 +472,17 @@ HTTPS์— ์‚ฌ์šฉ๋˜๋Š” ๋™์ผํ•œ **TLS ์ข…๋ฃŒ ํ”„๋ก์‹œ** ์ปดํฌ๋„ŒํŠธ๊ฐ€ **๋กœ
///
๋˜ํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ž‘์—…ํ•  ๋•Œ, ์ด๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์€ ์ด๋ฏธ ํ•ด๋‹น **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**(๋˜๋Š” **TLS ์ข…๋ฃŒ ํ”„๋ก์‹œ**)์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ **๋„คํŠธ์›Œํฌ ํ†ต์‹ **(์˜ˆ: HTTP ์š”์ฒญ)์„ ์ „๋‹ฌํ•˜๋Š” ๋‚ด๋ถ€ ๋„๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ž‘์—…ํ•  ๋•Œ, ์ด๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์€ ์ด๋ฏธ ํ•ด๋‹น **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**(๋˜๋Š” **TLS ์ข…๋ฃŒ ํ”„๋ก์‹œ**)์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ **๋„คํŠธ์›Œํฌ ํ†ต์‹ **(์˜ˆ: HTTP ์š”์ฒญ)์„ ์ „๋‹ฌํ•˜๋Š” ๋‚ด๋ถ€ ๋„๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
### ํ•˜๋‚˜์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ - ์—ฌ๋Ÿฌ ์›Œ์ปค ์ปจํ…Œ์ด๋„ˆ { #one-load-balancer-multiple-worker-containers }
**Kubernetes** ๊ฐ™์€ ๋ถ„์‚ฐ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‚ด๋ถ€ ๋„คํŠธ์›Œํ‚น ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด, ๋ฉ”์ธ **ํฌํŠธ**์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ๋‹จ์ผ **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” **์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ**๋กœ ํ†ต์‹ (์š”์ฒญ)์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**Kubernetes** ๊ฐ™์€ ๋ถ„์‚ฐ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‚ด๋ถ€ ๋„คํŠธ์›Œํ‚น ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด, ๋ฉ”์ธ **ํฌํŠธ**์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ๋‹จ์ผ **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” **์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ**๋กœ ํ†ต์‹ (์š”์ฒญ)์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณดํ†ต **ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋งŒ** ๊ฐ€์ง‘๋‹ˆ๋‹ค(์˜ˆ: FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” Uvicorn ํ”„๋กœ์„ธ์Šค). ๋ชจ๋‘ ๊ฐ™์€ ๊ฒƒ์„ ์‹คํ–‰ํ•˜๋Š” **๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ**์ด์ง€๋งŒ, ๊ฐ์ž ๊ณ ์œ ํ•œ ํ”„๋กœ์„ธ์Šค, ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด CPU์˜ **์„œ๋กœ ๋‹ค๋ฅธ ์ฝ”์–ด** ๋˜๋Š” **์„œ๋กœ ๋‹ค๋ฅธ ๋จธ์‹ **์—์„œ **๋ณ‘๋ ฌํ™”**์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณดํ†ต **ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋งŒ** ๊ฐ€์ง‘๋‹ˆ๋‹ค(์˜ˆ: FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” Uvicorn ํ”„๋กœ์„ธ์Šค). ๋ชจ๋‘ ๊ฐ™์€ ๊ฒƒ์„ ์‹คํ–‰ํ•˜๋Š” **๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ**์ด์ง€๋งŒ, ๊ฐ์ž ๊ณ ์œ ํ•œ ํ”„๋กœ์„ธ์Šค, ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด CPU์˜ **์„œ๋กœ ๋‹ค๋ฅธ ์ฝ”์–ด** ๋˜๋Š” **์„œ๋กœ ๋‹ค๋ฅธ ๋จธ์‹ **์—์„œ **๋ณ‘๋ ฌํ™”**์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**๊ฐ€ ์žˆ๋Š” ๋ถ„์‚ฐ ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— **๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ** ์š”์ฒญ์„ **๋ถ„์‚ฐ**ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ์š”์ฒญ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ **๋ณต์ œ๋œ ์ปจํ…Œ์ด๋„ˆ** ์ค‘ ํ•˜๋‚˜์—์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**๊ฐ€ ์žˆ๋Š” ๋ถ„์‚ฐ ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— **๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ** ์š”์ฒญ์„ **๋ถ„์‚ฐ**ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ์š”์ฒญ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ **๋ณต์ œ๋œ ์ปจํ…Œ์ด๋„ˆ** ์ค‘ ํ•˜๋‚˜์—์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ณดํ†ต ์ด **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด *๋‹ค๋ฅธ* ์•ฑ์œผ๋กœ ๊ฐ€๋Š” ์š”์ฒญ(์˜ˆ: ๋‹ค๋ฅธ ๋„๋ฉ”์ธ, ๋˜๋Š” ๋‹ค๋ฅธ URL ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ ์•„๋ž˜๋กœ ๊ฐ€๋Š” ์š”์ฒญ)๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ํ†ต์‹ ์„ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ *๊ทธ ๋‹ค๋ฅธ* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ณดํ†ต ์ด **๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ**๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด *๋‹ค๋ฅธ* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ฐ€๋Š” ์š”์ฒญ(์˜ˆ: ๋‹ค๋ฅธ ๋„๋ฉ”์ธ, ๋˜๋Š” ๋‹ค๋ฅธ URL ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ ์•„๋ž˜๋กœ ๊ฐ€๋Š” ์š”์ฒญ)๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ํ†ต์‹ ์„ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ *๊ทธ ๋‹ค๋ฅธ* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### ์ปจํ…Œ์ด๋„ˆ๋‹น ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค { #one-process-per-container }
@ -566,7 +566,7 @@ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ [Init Container](https://kuberne
### ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ { #single-container }
**๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ**์—์„œ ์—ฌ๋Ÿฌ **์›Œ์ปค ํ”„๋กœ์„ธ์Šค**(๋˜๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค)๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์ˆœํ•œ ์…‹์—…์ด๋ผ๋ฉด, ์•ฑ์ด ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ง์ „์— ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹œ์ž‘ ์ „ ์‚ฌ์ „ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ**์—์„œ ์—ฌ๋Ÿฌ **์›Œ์ปค ํ”„๋กœ์„ธ์Šค**(๋˜๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค)๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์ˆœํ•œ ์…‹์—…์ด๋ผ๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ง์ „์— ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹œ์ž‘ ์ „ ์‚ฌ์ „ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### ๋ฒ ์ด์Šค ๋„์ปค ์ด๋ฏธ์ง€ { #base-docker-image }
@ -582,7 +582,7 @@ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ [Init Container](https://kuberne
์ด Docker ์ด๋ฏธ์ง€๋Š” Uvicorn์ด ์ฃฝ์€ ์›Œ์ปค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๋˜ ์‹œ๊ธฐ์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Gunicorn๊ณผ Uvicorn์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ณ , Gunicorn์ด Uvicorn ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๋‹นํ•œ ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด์ œ Uvicorn(๊ทธ๋ฆฌ๊ณ  `fastapi` ๋ช…๋ น)์€ `--workers`๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ, ๋ฒ ์ด์Šค ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ง์ ‘ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์ฝ”๋“œ ์–‘๋„ ์‚ฌ์‹ค์ƒ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ˜…).
ํ•˜์ง€๋งŒ ์ด์ œ Uvicorn(๊ทธ๋ฆฌ๊ณ  `fastapi` ๋ช…๋ น์–ด)์€ `--workers`๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ, ๋ฒ ์ด์Šค ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ง์ ‘ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์ฝ”๋“œ ์–‘๋„ ์‚ฌ์‹ค์ƒ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ˜…).
///
@ -600,7 +600,7 @@ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ [Init Container](https://kuberne
## `uv`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„์ปค ์ด๋ฏธ์ง€ { #docker-image-with-uv }
ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, [uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/)๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, [uv Docker ๊ฐ€์ด๋“œ](https://docs.astral.sh/uv/guides/integration/docker/)๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ์š”์•ฝ { #recap }

2
docs/ko/docs/deployment/https.md

@ -14,7 +14,7 @@ HTTPS๋Š” ๊ทธ๋ƒฅ โ€œ์ผœ์ ธ ์žˆ๊ฑฐ๋‚˜โ€ ์•„๋‹ˆ๋ฉด โ€œ๊บผ์ ธ ์žˆ๋Š”โ€ ๊ฒƒ์ด๋ผ
์ด์ œ **๊ฐœ๋ฐœ์ž ๊ด€์ **์—์„œ HTTPS๋ฅผ ์ƒ๊ฐํ•  ๋•Œ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
* HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, **์„œ๋ฒ„**๊ฐ€ **์ œ3์ž**๊ฐ€ ๋ฐœ๊ธ‰ํ•œ **"์ธ์ฆ์„œ(certificates)"**๋ฅผ **๋ณด์œ **ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, **์„œ๋ฒ„**๊ฐ€ **์ œ3์ž**๊ฐ€ ์ƒ์„ฑํ•œ **"์ธ์ฆ์„œ(certificates)"**๋ฅผ **๋ณด์œ **ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
* ์ด ์ธ์ฆ์„œ๋Š” ์‹ค์ œ๋กœ '์ƒ์„ฑ'๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ œ3์ž๋กœ๋ถ€ํ„ฐ **๋ฐœ๊ธ‰/ํš๋“**ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ์ธ์ฆ์„œ์—๋Š” **์œ ํšจ ๊ธฐ๊ฐ„**์ด ์žˆ์Šต๋‹ˆ๋‹ค.
* ์ฆ‰, **๋งŒ๋ฃŒ**๋ฉ๋‹ˆ๋‹ค.

12
docs/ko/docs/deployment/manually.md

@ -1,6 +1,6 @@
# ์„œ๋ฒ„๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ { #run-a-server-manually }
## `fastapi run` ๋ช…๋ น ์‚ฌ์šฉํ•˜๊ธฐ { #use-the-fastapi-run-command }
## `fastapi run` ๋ช…๋ น์–ด ์‚ฌ์šฉํ•˜๊ธฐ { #use-the-fastapi-run-command }
์š”์•ฝํ•˜๋ฉด, `fastapi run`์„ ์‚ฌ์šฉํ•ด FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น„์Šคํ•˜์„ธ์š”:
@ -40,7 +40,7 @@ $ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋ช…๋ น์€ ์ปจํ…Œ์ด๋„ˆ๋‚˜ ์„œ๋ฒ„ ๋“ฑ์—์„œ **FastAPI** ์•ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋ช…๋ น์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ๋‚˜ ์„œ๋ฒ„ ๋“ฑ์—์„œ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ASGI ์„œ๋ฒ„ { #asgi-servers }
@ -48,7 +48,7 @@ $ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid
FastAPI๋Š” <abbr title="Asynchronous Server Gateway Interface - ๋น„๋™๊ธฐ ์„œ๋ฒ„ ๊ฒŒ์ดํŠธ์›จ์ด ์ธํ„ฐํŽ˜์ด์Šค">ASGI</abbr>๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”, Python ์›น ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. FastAPI๋Š” ASGI ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
์›๊ฒฉ ์„œ๋ฒ„ ๋จธ์‹ ์—์„œ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋˜๋Š” ๋‹ค๋ฅธ ASGI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•ต์‹ฌ ์š”์†Œ๋Š” **Uvicorn** ๊ฐ™์€ ASGI ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. `fastapi` ๋ช…๋ น์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ด๊ฒƒ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์›๊ฒฉ ์„œ๋ฒ„ ๋จธ์‹ ์—์„œ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋˜๋Š” ๋‹ค๋ฅธ ASGI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•ต์‹ฌ ์š”์†Œ๋Š” **Uvicorn** ๊ฐ™์€ ASGI ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. `fastapi` ๋ช…๋ น์–ด์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ด๊ฒƒ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์„ ํฌํ•จํ•ด ์—ฌ๋Ÿฌ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
@ -69,7 +69,7 @@ FastAPI๋Š” <abbr title="Asynchronous Server Gateway Interface - ๋น„๋™๊ธฐ ์„œ๋ฒ„
## ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜ํ•˜๊ธฐ { #install-the-server-program }
FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์ธ Uvicorn์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, `fastapi run` ๋ช…๋ น์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์ธ Uvicorn์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, `fastapi run` ๋ช…๋ น์–ด๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ASGI ์„œ๋ฒ„๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -115,7 +115,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 80
/// note | ์ฐธ๊ณ 
`uvicorn main:app` ๋ช…๋ น์€ ๋‹ค์Œ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค:
`uvicorn main:app` ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค:
* `main`: ํŒŒ์ผ `main.py`(Python "module").
* `app`: `main.py` ์•ˆ์—์„œ `app = FastAPI()` ๋ผ์ธ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด.
@ -128,7 +128,7 @@ from main import app
///
๊ฐ ASGI ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์˜ ๋Œ€์•ˆ๋„ ๋น„์Šทํ•œ ๋ช…๋ น์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐ์ž์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
๊ฐ ASGI ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์˜ ๋Œ€์•ˆ๋„ ๋น„์Šทํ•œ ๋ช…๋ น์–ด๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐ์ž์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
/// warning | ๊ฒฝ๊ณ 

1
docs/ko/docs/editor-support.md

@ -1,5 +1,6 @@
# ์—๋””ํ„ฐ ์ง€์› { #editor-support }
๊ณต์‹ [FastAPI ํ™•์žฅ](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)์€ FastAPI ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ•ํ™”ํ•ด ์ค๋‹ˆ๋‹ค. *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ํƒ์ƒ‰ ๋ฐ ์ด๋™, FastAPI Cloud ๋ฐฐํฌ, ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ํ™•์žฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [GitHub ์ €์žฅ์†Œ](https://github.com/fastapi/fastapi-vscode)์˜ README๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

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

@ -1,5 +1,6 @@
# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ { #environment-variables }
/// tip | ํŒ
๋งŒ์•ฝ "ํ™˜๊ฒฝ ๋ณ€์ˆ˜"๊ฐ€ ๋ฌด์—‡์ด๊ณ , ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด, ์ด ์ฑ•ํ„ฐ๋ฅผ ์Šคํ‚ตํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

8
docs/ko/docs/features.md

@ -63,7 +63,7 @@ second_user_data = {
my_second_user: User = User(**second_user_data)
```
/// note
/// note | ์ฐธ๊ณ 
`**second_user_data`๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:
@ -172,8 +172,8 @@ FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๊ฐ•๋ ฅํ•œ <dfn title='๋˜ํ•œ
* HTTPX ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ.
* **CORS**, GZip, ์ •์  ํŒŒ์ผ, ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต.
* **์„ธ์…˜๊ณผ ์ฟ ํ‚ค** ์ง€์›.
* 100% test coverage.
* 100% type annotated codebase.
* 100% ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€.
* 100% ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค.
## Pydantic ๊ธฐ๋Šฅ { #pydantic-features }
@ -198,4 +198,4 @@ FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๊ฐ•๋ ฅํ•œ <dfn title='๋˜ํ•œ
* ๊นŠ๊ฒŒ **์ค‘์ฒฉ๋œ JSON** ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋ชจ๋‘ ๊ฒ€์ฆํ•˜๊ณ  ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* **ํ™•์žฅ ๊ฐ€๋Šฅ**:
* Pydantic์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ฑฐ๋‚˜, validator decorator๊ฐ€ ๋ถ™์€ ๋ชจ๋ธ ๋ฉ”์„œ๋“œ๋กœ ๊ฒ€์ฆ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* 100% test coverage.
* 100% ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€.

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

@ -1,5 +1,6 @@
# ๋„์›€ { #help }
FastAPI๋ฅผ ๋•๊ฑฐ๋‚˜ FastAPI์— ๋Œ€ํ•œ ๋„์›€์„ ๋ฐ›๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋•๊ณ  ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ -2,7 +2,7 @@
์ถ”๊ฐ€์ ์ธ [Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ์„ฑ์„ ํ•˜๋ ค๋ฉด, `FastAPI()` ์•ฑ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋˜๋Š” `get_swagger_ui_html()` ํ•จ์ˆ˜์— `swagger_ui_parameters` ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค.
๊ตฌ์„ฑ์„ ํ•˜๋ ค๋ฉด, `FastAPI()` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋˜๋Š” `get_swagger_ui_html()` ํ•จ์ˆ˜์— `swagger_ui_parameters` ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค.
`swagger_ui_parameters`๋Š” Swagger UI์— ์ง์ ‘ ์ „๋‹ฌ๋œ ๊ตฌ์„ฑ์„ ํฌํ•จํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

1
docs/ko/docs/how-to/custom-request-and-route.md

@ -1,5 +1,6 @@
# ์ปค์Šคํ…€ Request ๋ฐ APIRoute ํด๋ž˜์Šค { #custom-request-and-apiroute-class }
์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” `Request`์™€ `APIRoute` ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋กœ์ง์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ, ์ด๋Š” middleware์— ์žˆ๋Š” ๋กœ์ง์˜ ์ข‹์€ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ -2,7 +2,7 @@
**FastAPI**๋Š” **ASGI** ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ, ASGI์™€๋„ ํ˜ธํ™˜๋˜๋Š” ์–ด๋–ค **GraphQL** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“  ๋งค์šฐ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๋ฐ˜ FastAPI **๊ฒฝ๋กœ ์ฒ˜๋ฆฌ**์™€ GraphQL์„ ํ•จ๊ป˜ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๋ฐ˜ FastAPI *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์™€ GraphQL์„ ํ•จ๊ป˜ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ

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

@ -8,6 +8,8 @@ FastAPI 0.119.0 ๋ฒ„์ „์—์„œ๋Š” v2๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„
FastAPI 0.126.0 ๋ฒ„์ „์—์„œ๋Š” Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์ง€๋งŒ, `pydantic.v1`์€ ์ž ์‹œ ๋™์•ˆ ๊ณ„์† ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค.
FastAPI 0.128.0 ๋ฒ„์ „์—์„œ๋Š” `pydantic.v1` ์ง€์›๋„ ์ค‘๋‹จํ–ˆ์œผ๋ฏ€๋กœ, FastAPI์˜ ์ตœ์‹  ๋ฒ„์ „์€ Pydantic v2๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
/// warning | ๊ฒฝ๊ณ 
Pydantic ํŒ€์€ ์ตœ์‹  Python ๋ฒ„์ „์—์„œ Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์œผ๋ฉฐ, ์‹œ์ž‘ ๋ฒ„์ „์€ **Python 3.14**์ž…๋‹ˆ๋‹ค.
@ -54,6 +56,16 @@ Pydantic v2๋Š” Pydantic v1์˜ ๋ชจ๋“  ๊ฒƒ์„ ์„œ๋ธŒ๋ชจ๋“ˆ `pydantic.v1`๋กœ ํฌํ•จ
### v2 ์•ˆ์˜ Pydantic v1์— ๋Œ€ํ•œ FastAPI ์ง€์› { #fastapi-support-for-pydantic-v1-in-v2 }
/// warning | ๊ฒฝ๊ณ 
`pydantic.v1` ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ด FastAPI ์ง€์›์€ **FastAPI 0.119.0**์—์„œ ์ถ”๊ฐ€๋˜์—ˆ๊ณ  **FastAPI 0.128.0**์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Pydantic v2๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ์ž„์‹œ ๋„์›€ ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ฒ„์ „์˜ FastAPI์—์„œ๋Š” ์•ฑ์—์„œ `pydantic.v1` ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด ์„น์…˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ํ•ด๋‹น ์˜ค๋ž˜๋œ ๋ฒ„์ „์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ์ง€์›์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
///
FastAPI 0.119.0๋ถ€ํ„ฐ๋Š” v2๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด, Pydantic v2 ๋‚ด๋ถ€์˜ Pydantic v1์— ๋Œ€ํ•ด์„œ๋„ ๋ถ€๋ถ„์ ์ธ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ Pydantic์„ ์ตœ์‹  v2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ , import๋ฅผ `pydantic.v1` ์„œ๋ธŒ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ”๊พธ๋ฉด, ๋งŽ์€ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
@ -122,6 +134,12 @@ Pydantic v1 ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ `Body`, `Query`, `Form` ๋“ฑ ํŒŒ๋ผ๋ฏธํ„ฐ์šฉ FastAPI
### ๋‹จ๊ณ„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ { #migrate-in-steps }
/// warning | ๊ฒฝ๊ณ 
์•„๋ž˜์— ์„ค๋ช…๋œ ๊ฐ™์€ ์•ฑ์—์„œ Pydantic v1๊ณผ v2 ๋ชจ๋ธ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ **FastAPI 0.119.0๋ถ€ํ„ฐ 0.127.x๊นŒ์ง€**์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” **FastAPI 0.128.0**์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ, ์ตœ์‹  ๋ฒ„์ „์€ **Pydantic v2** ๋ชจ๋ธ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
///
/// tip | ํŒ
๋จผ์ € `bump-pydantic`๋กœ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”. ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ณ  ์ž˜ ๋™์ž‘ํ•œ๋‹ค๋ฉด, ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ๋์ž…๋‹ˆ๋‹ค. โœจ

2
docs/ko/docs/how-to/separate-openapi-schemas.md

@ -1,4 +1,4 @@
# ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์— ๋Œ€ํ•ด OpenAPI ์Šคํ‚คะผะฐ๋ฅผ ๋ถ„๋ฆฌํ• ์ง€ ์—ฌ๋ถ€ { #separate-openapi-schemas-for-input-and-output-or-not }
# ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์— ๋Œ€ํ•ด OpenAPI ์Šคํ‚ค๋งˆ๋ฅผ ๋ถ„๋ฆฌํ• ์ง€ ์—ฌ๋ถ€ { #separate-openapi-schemas-for-input-and-output-or-not }
**Pydantic v2**๊ฐ€ ๋ฆด๋ฆฌ์Šค๋œ ์ดํ›„, ์ƒ์„ฑ๋˜๋Š” OpenAPI๋Š” ์ด์ „๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•˜๊ณ  **์˜ฌ๋ฐ”๋ฅด๊ฒŒ** ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๐Ÿ˜Ž

10
docs/ko/docs/index.md

@ -125,7 +125,7 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
<div class="only-github" markdown="1">
"_[...] ์ €๋Š” ์š”์ฆ˜ **FastAPI**๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. [...] ์‚ฌ์‹ค ์šฐ๋ฆฌ ํŒ€์˜ **๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ML ์„œ๋น„์Šค** ์ „๋ถ€๋ฅผ ๋ฐ”๊ฟ€ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ํ•ต์‹ฌ **Windows**์™€ ๋ช‡๋ช‡์˜ **Office** ์ œํ’ˆ๋“ค์ด ํ†ตํ•ฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._"
"_[...] ์ €๋Š” ์š”์ฆ˜ **FastAPI**๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. [...] ์‚ฌ์‹ค ์šฐ๋ฆฌ ํŒ€์˜ **๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ML ์„œ๋น„์Šค** ์ „๋ถ€์— ์‚ฌ์šฉํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ํ•ต์‹ฌ **Windows** ์ œํ’ˆ๊ณผ ์ผ๋ถ€ **Office** ์ œํ’ˆ์— ํ†ตํ•ฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._"
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(ref)</small></a></div>
@ -137,7 +137,7 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
---
"_**Netflix**๋Š” ์šฐ๋ฆฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฐฐํฌํŒ์ธ **์œ„๊ธฐ ๊ด€๋ฆฌ** ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐœํ‘œํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค: ๋ฐ”๋กœ **Dispatch**์ž…๋‹ˆ๋‹ค! [**FastAPI**๋กœ ๋นŒ๋“œ]_"
"_**Netflix**๋Š” ์šฐ๋ฆฌ์˜ **์œ„๊ธฐ ๊ด€๋ฆฌ** ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์ธ **Dispatch**์˜ ์˜คํ”ˆ ์†Œ์Šค ๊ณต๊ฐœ๋ฅผ ๋ฐœํ‘œํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค! [**FastAPI**๋กœ ๋นŒ๋“œ]_"
<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>Netflix</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072"><small>(ref)</small></a></div>
@ -192,7 +192,7 @@ $ pip install "fastapi[standard]"
</div>
**Note**: ๋ชจ๋“  ํ„ฐ๋ฏธ๋„์—์„œ ๋™์ž‘ํ•˜๋„๋ก `"fastapi[standard]"`๋ฅผ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ ๋„ฃ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
**์ฐธ๊ณ **: ๋ชจ๋“  ํ„ฐ๋ฏธ๋„์—์„œ ๋™์ž‘ํ•˜๋„๋ก `"fastapi[standard]"`๋ฅผ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ ๋„ฃ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
## ์˜ˆ์ œ { #example }
@ -237,9 +237,9 @@ async def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
```
**Note**:
**์ฐธ๊ณ **:
์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ["๊ธ‰ํ•˜์„ธ์š”?"](https://fastapi.tiangolo.com/ko/async/#in-a-hurry) ์„น์…˜์„ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ๋ฌธ์„œ์˜ [`async`์™€ `await`](https://fastapi.tiangolo.com/ko/async/#in-a-hurry)์— ๊ด€ํ•œ _"๊ธ‰ํ•˜์„ธ์š”?"_ ์„น์…˜์„ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
</details>

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

@ -1,5 +1,6 @@
# Full Stack FastAPI ํ…œํ”Œ๋ฆฟ { #full-stack-fastapi-template }
ํ…œํ”Œ๋ฆฟ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ์„ค์ •๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€๋งŒ, ์œ ์—ฐํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋””์ž์ธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠน์„ฑ๋“ค์€ ์—ฌ๋Ÿฌ๋ถ„์ด ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์ˆ˜์ •, ์ ์šฉ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ , ํ…œํ”Œ๋ฆฟ์ด ์™„๋ฒฝํ•œ ์‹œ์ž‘์ ์ด ๋˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๐Ÿ
๋งŽ์€ ์ดˆ๊ธฐ ์„ค์ •, ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์ผ๋ถ€ API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ด๋ฏธ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ํ…œํ”Œ๋ฆฟ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ -124,7 +124,7 @@ John Doe
์ด๊ฒƒ์€ **FastAPI**์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์ฃผ์š” ์œ„์น˜์ž…๋‹ˆ๋‹ค.
### Simple ํƒ€์ž… { #simple-types }
### ๊ฐ„๋‹จํ•œ ํƒ€์ž… { #simple-types }
`str`๋ฟ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž…์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -287,7 +287,7 @@ Pydantic ๊ณต์‹ ๋ฌธ์„œ์˜ ์˜ˆ์‹œ:
/// note | ์ฐธ๊ณ 
Pydantic์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”](https://docs.pydantic.dev/).
๋” ์•Œ์•„๋ณด๋ ค๋ฉด [Pydantic ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”](https://docs.pydantic.dev/).
///

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

@ -17,16 +17,16 @@ Flask๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ๋‹ค๋ฉด, ์ด๋Š” Flask์˜ Blueprints์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ
```
.
โ”œโ”€โ”€ app
โ”‚ย ย  โ”œโ”€โ”€ __init__.py
โ”‚ย ย  โ”œโ”€โ”€ main.py
โ”‚ย ย  โ”œโ”€โ”€ dependencies.py
โ”‚ย ย  โ””โ”€โ”€ routers
โ”‚ย ย  โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ย ย  โ”‚ โ”œโ”€โ”€ items.py
โ”‚ย ย  โ”‚ โ””โ”€โ”€ users.py
โ”‚ย ย  โ””โ”€โ”€ internal
โ”‚ย ย  โ”œโ”€โ”€ __init__.py
โ”‚ย ย  โ””โ”€โ”€ admin.py
โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”œโ”€โ”€ main.py
โ”‚ โ”œโ”€โ”€ dependencies.py
โ”‚ โ””โ”€โ”€ routers
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ items.py
โ”‚ โ”‚ โ””โ”€โ”€ users.py
โ”‚ โ””โ”€โ”€ internal
โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ””โ”€โ”€ admin.py
```
/// tip | ํŒ
@ -75,11 +75,11 @@ from app.routers import items
์‚ฌ์šฉ์ž๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์ „์šฉ ํŒŒ์ผ์ด `/app/routers/users.py`์˜ submodule์ด๋ผ๊ณ  ํ•ด๋ด…์‹œ๋‹ค.
์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ๋œ *path operations*๋ฅผ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌํ•ด ๋‘๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ๋œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌํ•ด ๋‘๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ ๊ฐ™์€ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/์›น API์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค(๊ฐ™์€ "Python Package"์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค).
`APIRouter`๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ๋ชจ๋“ˆ์˜ *path operations*๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
`APIRouter`๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ๋ชจ๋“ˆ์˜ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### `APIRouter` importํ•˜๊ธฐ { #import-apirouter }
@ -87,9 +87,9 @@ from app.routers import items
{* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[1,3] title["app/routers/users.py"] *}
### `APIRouter`๋กœ *path operations* ๋งŒ๋“ค๊ธฐ { #path-operations-with-apirouter }
### `APIRouter`๋กœ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋งŒ๋“ค๊ธฐ { #path-operations-with-apirouter }
๊ทธ ๋‹ค์Œ ์ด๋ฅผ ์‚ฌ์šฉํ•ด *path operations*๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ๋‹ค์Œ ์ด๋ฅผ ์‚ฌ์šฉํ•ด *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
`FastAPI` ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
@ -107,7 +107,7 @@ from app.routers import items
///
์ด์ œ ์ด `APIRouter`๋ฅผ ๋ฉ”์ธ `FastAPI` ์•ฑ์— ํฌํ•จ(include)ํ•  ๊ฒƒ์ด์ง€๋งŒ, ๋จผ์ € dependencies์™€ ๋‹ค๋ฅธ `APIRouter` ํ•˜๋‚˜๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด์ œ ์ด `APIRouter`๋ฅผ ๋ฉ”์ธ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ(include)ํ•  ๊ฒƒ์ด์ง€๋งŒ, ๋จผ์ € dependencies์™€ ๋‹ค๋ฅธ `APIRouter` ํ•˜๋‚˜๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
## Dependencies { #dependencies }
@ -131,7 +131,7 @@ from app.routers import items
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ "items"๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ „์šฉ endpoint๋“ค๋„ `app/routers/items.py` ๋ชจ๋“ˆ์— ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.
์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์— ๋Œ€ํ•œ *path operations*๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์— ๋Œ€ํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
* `/items/`
* `/items/{item_id}`
@ -140,18 +140,18 @@ from app.routers import items
ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์กฐ๊ธˆ ๋” ๋˜‘๋˜‘ํ•˜๊ฒŒ, ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ด ๋ชจ๋“ˆ์˜ ๋ชจ๋“  *path operations*์—๋Š” ๋‹ค์Œ์ด ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค:
์ด ๋ชจ๋“ˆ์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—๋Š” ๋‹ค์Œ์ด ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค:
* ๊ฒฝ๋กœ `prefix`: `/items`.
* `tags`: (ํƒœ๊ทธ ํ•˜๋‚˜: `items`).
* ์ถ”๊ฐ€ `responses`.
* `dependencies`: ๋ชจ๋‘ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  `X-Token` dependency๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ฐ *path operation*๋งˆ๋‹ค ๋งค๋ฒˆ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ , `APIRouter`์— ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ฐ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋งˆ๋‹ค ๋งค๋ฒˆ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ , `APIRouter`์— ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[5:10,16,21] title["app/routers/items.py"] *}
๊ฐ *path operation*์˜ ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ `/`๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฏ€๋กœ:
๊ฐ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์˜ ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ `/`๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฏ€๋กœ:
```Python hl_lines="1"
@router.get("/{item_id}")
@ -163,13 +163,13 @@ async def read_item(item_id: str):
๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ prefix๋Š” `/items`์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด router์— ํฌํ•จ๋œ ๋ชจ๋“  *path operations*์— ์ ์šฉ๋  `tags` ๋ชฉ๋ก๊ณผ ์ถ”๊ฐ€ `responses`๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด router์— ํฌํ•จ๋œ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋  `tags` ๋ชฉ๋ก๊ณผ ์ถ”๊ฐ€ `responses`๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  router์˜ ๋ชจ๋“  *path operations*์— ์ถ”๊ฐ€๋  `dependencies` ๋ชฉ๋ก๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๊ฒฝ๋กœ๋“ค๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์‹คํ–‰/ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  router์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ถ”๊ฐ€๋  `dependencies` ๋ชฉ๋ก๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๊ฒฝ๋กœ๋“ค๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์‹คํ–‰/ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
/// tip | ํŒ
[*path operation decorator์˜ dependencies*](dependencies/dependencies-in-path-operation-decorators.md)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, *path operation function*์— ์–ด๋–ค ๊ฐ’๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
[*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์˜ dependencies](dependencies/dependencies-in-path-operation-decorators.md)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์— ์–ด๋–ค ๊ฐ’๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
///
@ -183,14 +183,14 @@ async def read_item(item_id: str):
* ๋‹จ์ผ ๋ฌธ์ž์—ด `"items"`๋ฅผ ํฌํ•จํ•˜๋Š” ํƒœ๊ทธ ๋ชฉ๋ก์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
* ์ด "tags"๋Š” ์ž๋™ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์‹œ์Šคํ…œ(OpenAPI ์‚ฌ์šฉ)์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
* ๋ชจ๋‘ ๋ฏธ๋ฆฌ ์ •์˜๋œ `responses`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
* ์ด ๋ชจ๋“  *path operations*๋Š” ์‹คํ–‰๋˜๊ธฐ ์ „์— `dependencies` ๋ชฉ๋ก์ด ํ‰๊ฐ€/์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
* ํŠน์ • *path operation*์— dependencies๋ฅผ ์ถ”๊ฐ€๋กœ ์„ ์–ธํ•˜๋ฉด **๊ทธ๊ฒƒ๋“ค๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค**.
* router dependencies๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— [decorator์˜ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ dependencies๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
* ์ด ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋Š” ์‹คํ–‰๋˜๊ธฐ ์ „์— `dependencies` ๋ชฉ๋ก์ด ํ‰๊ฐ€/์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
* ํŠน์ • *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— dependencies๋ฅผ ์ถ”๊ฐ€๋กœ ์„ ์–ธํ•˜๋ฉด **๊ทธ๊ฒƒ๋“ค๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค**.
* router dependencies๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— [๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ dependencies๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
* [`scopes`๊ฐ€ ์žˆ๋Š” `Security` dependencies](../advanced/security/oauth2-scopes.md)๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
`APIRouter`์— `dependencies`๋ฅผ ๋‘๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด *path operations* ๊ทธ๋ฃน์— ์ธ์ฆ์„ ์š”๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ์— ๊ฐœ๋ณ„์ ์œผ๋กœ dependencies๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
`APIRouter`์— `dependencies`๋ฅผ ๋‘๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ์ธ์ฆ์„ ์š”๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ์— ๊ฐœ๋ณ„์ ์œผ๋กœ dependencies๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
///
@ -232,7 +232,7 @@ from .dependencies import get_token_header
ํ•˜์ง€๋งŒ ๊ทธ ํŒŒ์ผ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. dependencies๋Š” `app/dependencies.py` ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ ์•ฑ/ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค ๋ณด์„ธ์š”:
์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค ๋ณด์„ธ์š”:
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
@ -271,13 +271,13 @@ from ...dependencies import get_token_header
์ด๋Š” `app/` ์œ„์ชฝ์˜ ์–ด๋–ค package(์ž์‹ ์˜ `__init__.py` ํŒŒ์ผ ๋“ฑ์„ ๊ฐ€์ง„)์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๐Ÿšจ
์ด์ œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•˜์œผ๋‹ˆ, ์•ฑ์ด ์–ผ๋งˆ๋‚˜ ๋ณต์žกํ•˜๋“  ์ƒ๋Œ€ import๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
์ด์ œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•˜์œผ๋‹ˆ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ผ๋งˆ๋‚˜ ๋ณต์žกํ•˜๋“  ์ƒ๋Œ€ import๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
### ์ปค์Šคํ…€ `tags`, `responses`, `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ { #add-some-custom-tags-responses-and-dependencies }
`APIRouter`์— ์ด๋ฏธ prefix `/items`์™€ `tags=["items"]`๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ *path operation*์— ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
`APIRouter`์— ์ด๋ฏธ prefix `/items`์™€ `tags=["items"]`๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํŠน์ • *path operation*์—๋งŒ ์ ์šฉ๋  _์ถ”๊ฐ€_ `tags`๋ฅผ ๋”ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ *path operation* ์ „์šฉ์˜ ์ถ”๊ฐ€ `responses`๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
ํ•˜์ง€๋งŒ ํŠน์ • *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—๋งŒ ์ ์šฉ๋  _์ถ”๊ฐ€_ `tags`๋ฅผ ๋”ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์ „์šฉ์˜ ์ถ”๊ฐ€ `responses`๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[30:31] title["app/routers/items.py"] *}
@ -416,13 +416,13 @@ router๋ฅผ ํฌํ•จ(include)ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
์ด์ œ ์กฐ์ง์—์„œ `app/internal/admin.py` ํŒŒ์ผ์„ ๋ฐ›์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.
์—ฌ๊ธฐ์—๋Š” ์กฐ์ง์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๊ฐ„์— ๊ณต์œ ํ•˜๋Š” ๊ด€๋ฆฌ์ž์šฉ *path operations*๊ฐ€ ์žˆ๋Š” `APIRouter`๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—๋Š” ์กฐ์ง์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๊ฐ„์— ๊ณต์œ ํ•˜๋Š” ๊ด€๋ฆฌ์ž์šฉ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ๋Š” `APIRouter`๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์กฐ์ง ๋‚ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์™€ ๊ณต์œ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์–ด `prefix`, `dependencies`, `tags` ๋“ฑ์„ `APIRouter`์— ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค:
{* ../../docs_src/bigger_applications/app_an_py310/internal/admin.py hl[3] title["app/internal/admin.py"] *}
ํ•˜์ง€๋งŒ `APIRouter`๋ฅผ ํฌํ•จํ•  ๋•Œ ์ปค์Šคํ…€ `prefix`๋ฅผ ์ง€์ •ํ•ด ๋ชจ๋“  *path operations*๊ฐ€ `/admin`์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•˜๊ณ , ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฏธ ๊ฐ€์ง„ `dependencies`๋กœ ๋ณดํ˜ธํ•˜๊ณ , `tags`์™€ `responses`๋„ ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ `APIRouter`๋ฅผ ํฌํ•จํ•  ๋•Œ ์ปค์Šคํ…€ `prefix`๋ฅผ ์ง€์ •ํ•ด ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ `/admin`์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•˜๊ณ , ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฏธ ๊ฐ€์ง„ `dependencies`๋กœ ๋ณดํ˜ธํ•˜๊ณ , `tags`์™€ `responses`๋„ ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์›๋ž˜ `APIRouter`๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ `app.include_router()`์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์„œ ์ด๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
@ -430,26 +430,26 @@ router๋ฅผ ํฌํ•จ(include)ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ž˜ `APIRouter`๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์กฐ์ง ๋‚ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋™์ผํ•œ `app/internal/admin.py` ํŒŒ์ผ์„ ๊ณ„์† ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ ์•ฑ์—์„œ `admin` ๋ชจ๋“ˆ์˜ ๊ฐ *path operations*๋Š” ๋‹ค์Œ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ `admin` ๋ชจ๋“ˆ์˜ ๊ฐ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋Š” ๋‹ค์Œ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
* prefix `/admin`.
* tag `admin`.
* dependency `get_token_header`.
* ์‘๋‹ต `418`. ๐Ÿต
ํ•˜์ง€๋งŒ ์ด๋Š” ์šฐ๋ฆฌ ์•ฑ์—์„œ ๊ทธ `APIRouter`์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋Š” ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ทธ `APIRouter`์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์€ ๊ฐ™์€ `APIRouter`๋ฅผ ๋‹ค๋ฅธ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
### *path operation* ํฌํ•จํ•˜๊ธฐ { #include-a-path-operation }
### *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ํฌํ•จํ•˜๊ธฐ { #include-a-path-operation }
*path operations*๋ฅผ `FastAPI` ์•ฑ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด... ๊ทธ๋ƒฅ ํ•ด๋ด…๋‹ˆ๋‹ค ๐Ÿคท:
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[21:23] title["app/main.py"] *}
๊ทธ๋ฆฌ๊ณ  `app.include_router()`๋กœ ์ถ”๊ฐ€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  *path operations*์™€ ํ•จ๊ป˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  `app.include_router()`๋กœ ์ถ”๊ฐ€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์™€ ํ•จ๊ป˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
/// note | ๋งค์šฐ ๊ธฐ์ˆ ์ ์ธ ์„ธ๋ถ€์‚ฌํ•ญ
@ -459,9 +459,9 @@ router๋ฅผ ํฌํ•จ(include)ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
`APIRouter`๋Š” "mount"๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๋Š” OpenAPI ์Šคํ‚ค๋งˆ์™€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ๊ทธ๋“ค์˜ *path operations*๋ฅผ ํฌํ•จ์‹œํ‚ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
์ด๋Š” OpenAPI ์Šคํ‚ค๋งˆ์™€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ๊ทธ๋“ค์˜ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ํฌํ•จ์‹œํ‚ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
FastAPI๋Š” ์›๋ž˜์˜ router์™€ *path operations*๋ฅผ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ , ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  OpenAPI๋ฅผ ์ƒ์„ฑํ•  ๋•Œ router์˜ prefix, dependencies, tags, responses ๋ฐ ๊ธฐํƒ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
FastAPI๋Š” ์›๋ž˜์˜ router์™€ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ , ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  OpenAPI๋ฅผ ์ƒ์„ฑํ•  ๋•Œ router์˜ prefix, dependencies, tags, responses ๋ฐ ๊ธฐํƒ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
///
@ -480,7 +480,7 @@ entrypoint = "app.main:app"
from app.main import app
```
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด `fastapi` ๋ช…๋ น์–ด๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด `fastapi` ๋ช…๋ น์–ด๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// Note | ์ฐธ๊ณ 
@ -498,7 +498,7 @@ $ fastapi dev app/main.py
## ์ž๋™ API ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ { #check-the-automatic-api-docs }
์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜์„ธ์š”:
์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์„ธ์š”:
<div class="termy">
@ -532,16 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
`router`๋ฅผ `FastAPI` ์•ฑ์— ํฌํ•จํ•˜๊ธฐ ์ „์ด๋“  ํ›„๋“ , ์–ด๋А ์‹œ์ ์— ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. FastAPI๋Š” ๋ผ์šฐํŒ…๊ณผ OpenAPI์— `other_router`์˜ *path operations*๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
`router`๋ฅผ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จํ•˜๊ธฐ ์ „์ด๋“  ํ›„๋“ , ์–ด๋А ์‹œ์ ์— ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. FastAPI๋Š” ๋ผ์šฐํŒ…๊ณผ OpenAPI์— `other_router`์˜ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
๋‚˜์ค‘์— router๋“ค์— ์ถ”๊ฐ€๋œ *path operations*๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์ˆ˜ํ–‰ํ•œ ํฌํ•จ์„ ํ†ตํ•ด์„œ๋„ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋‚˜์ค‘์— router๋“ค์— ์ถ”๊ฐ€๋œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์ˆ˜ํ–‰ํ•œ ํฌํ•จ์„ ํ†ตํ•ด์„œ๋„ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
/// warning | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
router๋ฅผ ํฌํ•จํ•œ ๋’ค์— `router.routes`๋ฅผ ์ง์ ‘ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•˜์„ธ์š”. FastAPI๋Š” router ํฌํ•จ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ์›๋ž˜ router์™€ ๊ทธ routes๋Š” ๋ผ์šฐํŒ…๊ณผ OpenAPI ์ƒ์„ฑ์˜ ์ผ๋ถ€๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฒฝ๋กœ์™€ router๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” path operation ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ `.include_router()` ๊ฐ™์€ ๋ฌธ์„œํ™”๋œ API๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
๊ฒฝ๋กœ์™€ router๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ `.include_router()` ๊ฐ™์€ ๋ฌธ์„œํ™”๋œ API๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
`router.routes`๋Š” ์ตœ์ข… *path operations*์˜ ํ‰ํƒ„ํ™”๋œ ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ผ, route ์ •์˜์™€ ํฌํ•จ๋œ router๋ฅผ ๋‹ด๋Š” ํ•˜์œ„ ์ˆ˜์ค€์˜ ํŠธ๋ฆฌ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , ์—ฌ๊ธฐ์— ์˜์กดํ•˜์ง€ ๋งˆ์„ธ์š”.
`router.routes`๋Š” ์ตœ์ข… *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์˜ ํ‰ํƒ„ํ™”๋œ ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ผ, route ์ •์˜์™€ ํฌํ•จ๋œ router๋ฅผ ๋‹ด๋Š” ํ•˜์œ„ ์ˆ˜์ค€์˜ ํŠธ๋ฆฌ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , ์—ฌ๊ธฐ์— ์˜์กดํ•˜์ง€ ๋งˆ์„ธ์š”.
///

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

@ -182,7 +182,7 @@ Pydantic ๋ชจ๋ธ ๋Œ€์‹  `dict`๋กœ ์ง์ ‘ ์ž‘์—…ํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํŽธ์ง‘
๋˜ํ•œ ํ‚ค๋Š” ์–ด๋–ค ํƒ€์ž…์ด๊ณ  ๊ฐ’์€ ๋‹ค๋ฅธ ํƒ€์ž…์ธ `dict`๋กœ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด (Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ฒ˜๋Ÿผ) ์œ ํšจํ•œ ํ•„๋“œ/์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋ฆ„์ด ๋ฌด์—‡์ธ์ง€ ๋ฏธ๋ฆฌ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด (Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋‹ฌ๋ฆฌ) ์œ ํšจํ•œ ํ•„๋“œ/์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋ฆ„์ด ๋ฌด์—‡์ธ์ง€ ๋ฏธ๋ฆฌ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์•„์ง ๋ชจ๋ฅด๋Š” ํ‚ค๋ฅผ ๋ฐ›์œผ๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

@ -10,7 +10,7 @@
/// note | ์ฐธ๊ณ 
๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด, (์ข€ ๋” ๋ณดํŽธ์ ์ธ) `POST`, `PUT`, `DELETE` ํ˜น์€ `PATCH` ์ค‘์— ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด, `POST` (๊ฐ€์žฅ ์ผ๋ฐ˜์ ), `PUT`, `DELETE` ํ˜น์€ `PATCH` ์ค‘์— ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
`GET` ์š”์ฒญ์— ๋ณธ๋ฌธ์„ ๋‹ด์•„ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋ช…์„ธ์„œ์— ์ •์˜๋˜์ง€ ์•Š์€ ํ–‰๋™์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ด ๋ฐฉ์‹์€ ์•„์ฃผ ๋ณต์žกํ•œ/๊ทนํ•œ์˜ ์‚ฌ์šฉ ์ƒํ™ฉ์—์„œ๋งŒ FastAPI์— ์˜ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
@ -88,7 +88,7 @@
## ํŽธ์ง‘๊ธฐ ์ง€์› { #editor-support }
ํŽธ์ง‘๊ธฐ์—์„œ, ํ•จ์ˆ˜ ๋‚ด์—์„œ ํƒ€์ž… ํžŒํŠธ์™€ ์™„์„ฑ์„ ์–ด๋””์„œ๋‚˜ (๋งŒ์•ฝ Pydantic model ๋Œ€์‹ ์— `dict`์„ ๋ฐ›์„ ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค) ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
ํŽธ์ง‘๊ธฐ์—์„œ, ํ•จ์ˆ˜ ๋‚ด์—์„œ ํƒ€์ž… ํžŒํŠธ์™€ ์™„์„ฑ์„ ์–ด๋””์„œ๋‚˜ (๋งŒ์•ฝ Pydantic ๋ชจ๋ธ ๋Œ€์‹ ์— `dict`์„ ๋ฐ›์„ ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค) ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
<img src="/img/tutorial/body/image03.png">
@ -141,14 +141,14 @@
**๋ณธ๋ฌธ**, **๊ฒฝ๋กœ** ๊ทธ๋ฆฌ๊ณ  **์ฟผ๋ฆฌ** ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ๋‘ ๋™์‹œ์— ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
**FastAPI**๋Š” ๊ฐ๊ฐ์„ ์ธ์ง€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
**FastAPI**๋Š” ๊ฐ๊ฐ์„ ์ธ์ง€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์—์„œ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
{* ../../docs_src/body/tutorial004_py310.py hl[16] *}
ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ์„ ๋”ฐ๋ผ์„œ ์ธ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
* ๋งŒ์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ **๊ฒฝ๋กœ**์—๋„ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋Š” ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ๋งŒ์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ (`int`, `float`, `str`, `bool` ๋“ฑ๊ณผ ๊ฐ™์€) **์œ ์ผํ•œ ํƒ€์ž…**์œผ๋กœ ๋˜์–ด์žˆ์œผ๋ฉด, **์ฟผ๋ฆฌ** ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•ด์„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ๋งŒ์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ (`int`, `float`, `str`, `bool` ๋“ฑ๊ณผ ๊ฐ™์€) **๋‹จ์ผ ํƒ€์ž…**์œผ๋กœ ๋˜์–ด์žˆ์œผ๋ฉด, **์ฟผ๋ฆฌ** ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•ด์„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
* ๋งŒ์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ **Pydantic ๋ชจ๋ธ** ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉด, ์š”์ฒญ **๋ณธ๋ฌธ**์œผ๋กœ ํ•ด์„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
/// note | ์ฐธ๊ณ 
@ -163,4 +163,4 @@ FastAPI๋Š” `q`์˜ ๊ฐ’์ด ํ•„์š”์—†์Œ์„ ๊ธฐ๋ณธ ๊ฐ’ `= None` ๋•Œ๋ฌธ์— ์•Œ๊ฒŒ
## Pydantic์—†์ด { #without-pydantic }
๋งŒ์•ฝ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, **Body** ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body) ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
๋งŒ์•ฝ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, **Body** ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. [Body - ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜: ๋ณธ๋ฌธ์˜ ๋‹จ์ผ ๊ฐ’](body-multiple-params.md#singular-values-in-body) ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

4
docs/ko/docs/tutorial/debugging.md

@ -59,7 +59,7 @@ Python์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ์˜ ๋‚ด๋ถ€ ๋ณ€์ˆ˜ `__name__`์€
```Python
from myapp import app
# Some more code
# ์ถ”๊ฐ€ ์ฝ”๋“œ
```
์ด ๊ฒฝ์šฐ `myapp.py` ๋‚ด๋ถ€์˜ ์ž๋™ ๋ณ€์ˆ˜ `__name__`์—๋Š” ๊ฐ’์ด `"__main__"`์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@ -99,7 +99,7 @@ from myapp import app
---
Pycharm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
PyCharm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
* "Run" ๋ฉ”๋‰ด๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
* "Debug..." ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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

@ -4,7 +4,7 @@ FastAPI๋Š” <dfn title='๋•Œ๋กœ๋Š” "exit code", "cleanup code", "teardown code", "
์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด `return` ๋Œ€์‹  `yield`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ถ”๊ฐ€๋กœ ์‹คํ–‰ํ•  ๋‹จ๊ณ„ (์ฝ”๋“œ)๋ฅผ ๊ทธ ๋’ค์— ์ž‘์„ฑํ•˜์„ธ์š”.
/// tip
/// tip | ํŒ
๊ฐ ์˜์กด์„ฑ๋งˆ๋‹ค `yield`๋Š” ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@ -39,7 +39,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
{* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *}
/// tip
/// tip | ํŒ
`async` ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -55,7 +55,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
๋”ฐ๋ผ์„œ, ์˜์กด์„ฑ ๋‚ด์—์„œ `except SomeException`์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, `finally`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„ ์—†์ด ์ข…๋ฃŒ ๋‹จ๊ณ„๊นŒ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, `finally`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„ ์—†์ด ์ข…๋ฃŒ ๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{* ../../docs_src/dependencies/tutorial007_py310.py hl[3,5] *}
@ -87,7 +87,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
ํŒŒ์ด์ฌ์˜ [Context Managers](https://docs.python.org/3/library/contextlib.html) ๋•๋ถ„์— ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ์˜ [์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž](https://docs.python.org/3/library/contextlib.html) ๋•๋ถ„์— ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
**FastAPI**๋Š” ์ด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
@ -101,7 +101,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
์˜ˆ๋ฅผ ๋“ค์–ด, `HTTPException` ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip
/// tip | ํŒ
์ด๋Š” ๋‹ค์†Œ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜* ๋“ฑ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ (`HTTPException` ํฌํ•จ)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
/// note
/// note | ์ฐธ๊ณ 
ํด๋ผ์ด์–ธํŠธ์—๋Š” **ํ•˜๋‚˜์˜ ์‘๋‹ต**๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฅ˜ ์‘๋‹ต ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ๊ณ , *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ์ƒ์„ฑ๋œ ์‘๋‹ต์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
@ -178,7 +178,7 @@ participant tasks as Background tasks
///
/// tip
/// tip | ํŒ
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์˜ ์ฝ”๋“œ์—์„œ ์–ด๋–ค ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด `HTTPException`์„ ํฌํ•จํ•ด `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ˆ์™ธ(๋˜๋Š” ์ƒˆ ์˜ˆ์™ธ)๋ฅผ `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ๋‹ค์‹œ ๋ฐœ์ƒ์‹œ์ผœ, ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@ -234,6 +234,7 @@ participant operation as Path Operation
`yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ „ํ•ด ์™”์Šต๋‹ˆ๋‹ค.
FastAPI์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ์˜ [๊ณ ๊ธ‰ ์˜์กด์„ฑ - `yield`, `HTTPException`, `except` ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)์—์„œ ๋” ์ž์„ธํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž { #context-managers }
### "์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž"๋ž€ { #what-are-context-managers }
@ -256,7 +257,7 @@ with open("./somefile.txt") as f:
### `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž ์‚ฌ์šฉํ•˜๊ธฐ { #using-context-managers-in-dependencies-with-yield }
/// warning
/// warning | ๊ฒฝ๊ณ 
์ด๊ฒƒ์€ ์–ด๋А ์ •๋„ "๊ณ ๊ธ‰" ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
@ -271,7 +272,7 @@ Python์—์„œ๋Š” [๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ: `__enter__()`์™€ `__exit__()`๊ฐ€ ์žˆ๋Š”
{* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *}
/// tip
/// tip | ํŒ
์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

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

@ -1,5 +1,6 @@
# ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜• { #extra-data-types }
์ง€๊ธˆ๊นŒ์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
* `int`

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

@ -8,7 +8,7 @@
* **์ถœ๋ ฅ ๋ชจ๋ธ**์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
* **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ**์€ ์•„๋งˆ๋„ ํ•ด์‹œ ์ฒ˜๋ฆฌ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
/// danger
/// danger | ์œ„ํ—˜
์ ˆ๋Œ€ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•ญ์ƒ ์ดํ›„์— ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ "์•ˆ์ „ํ•œ ํ•ด์‹œ(secure hash)"๋กœ ์ €์žฅํ•˜์„ธ์š”.
@ -132,7 +132,7 @@ UserInDB(
)
```
/// warning
/// warning | ๊ฒฝ๊ณ 
์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณต๋œ ํ•จ์ˆ˜ `fake_password_hasher`์™€ `fake_save_user`๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์‹œ์—ฐํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ์ผ ๋ฟ์ด๋ฉฐ, ์‹ค์ œ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@ -164,7 +164,7 @@ OpenAPI์—์„œ๋Š” ์ด๋ฅผ `anyOf`๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ํ‘œ์ค€ Python ํƒ€์ž… ํžŒํŠธ์ธ [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
/// note
/// note | ์ฐธ๊ณ 
[`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions)์„ ์ •์˜ํ•  ๋•Œ๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋จผ์ € ํฌํ•จํ•˜๊ณ , ๋œ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๊ทธ ๋’ค์— ๋‚˜์—ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” `Union[PlaneItem, CarItem]`์—์„œ ๋” ๊ตฌ์ฒด์ ์ธ `PlaneItem`์ด `CarItem`๋ณด๋‹ค ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
@ -208,4 +208,4 @@ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ‚ค์™€ ๊ฐ’์˜ ํƒ€์ž…๋งŒ ์„ ์–ธํ•˜์—ฌ ํ‰
์—ฌ๋Ÿฌ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ ๊ฒฝ์šฐ์— ๋งž๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ์ƒ์†ํ•˜์„ธ์š”.
์—”ํ„ฐํ‹ฐ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ "์ƒํƒœ"๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์—”ํ„ฐํ‹ฐ๋‹น ๋‹จ์ผ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž "์—”ํ„ฐํ‹ฐ"๊ฐ€ `password`, `password_hash`, ๊ทธ๋ฆฌ๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์—†๋Š” ์ƒํƒœ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ง์ž…๋‹ˆ๋‹ค.
์—”ํ„ฐํ‹ฐ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ "์ƒํƒœ"๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์—”ํ„ฐํ‹ฐ๋‹น ๋‹จ์ผ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, **์‚ฌ์šฉ์ž** "์—”ํ„ฐํ‹ฐ"๊ฐ€ `password`, `password_hash`, ๊ทธ๋ฆฌ๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์—†๋Š” ์ƒํƒœ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ง์ž…๋‹ˆ๋‹ค.

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

@ -54,7 +54,7 @@ $ <font color="#4E9A06">fastapi</font> dev
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
ํ•ด๋‹น ์ค„์€ ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ์•ฑ์ด ์„œ๋น„์Šค๋˜๋Š” URL์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
ํ•ด๋‹น ์ค„์€ ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋น„์Šค๋˜๋Š” URL์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
### ํ™•์ธํ•˜๊ธฐ { #check-it }
@ -143,16 +143,16 @@ OpenAPI ์Šคํ‚ค๋งˆ๋Š” ํฌํ•จ๋œ ๋‘ ๊ฐœ์˜ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์‹œ์Šคํ…œ์„ ์ œ๊ณต
API์™€ ํ†ต์‹ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ, ๋ชจ๋ฐ”์ผ, IoT ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ)๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### `pyproject.toml`์— ์•ฑ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
### `pyproject.toml`์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
๋‹ค์Œ๊ณผ ๊ฐ™์ด `pyproject.toml` ํŒŒ์ผ์—์„œ ์•ฑ์ด ์œ„์น˜ํ•œ ๊ณณ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๋‹ค์Œ๊ณผ ๊ฐ™์ด `pyproject.toml` ํŒŒ์ผ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์œ„์น˜ํ•œ ๊ณณ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
```toml
[tool.fastapi]
entrypoint = "main:app"
```
ํ•ด๋‹น `entrypoint`๋Š” `fastapi` ๋ช…๋ น์–ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฑ์„ ์ž„ํฌํŠธํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค:
ํ•ด๋‹น `entrypoint`๋Š” `fastapi` ๋ช…๋ น์–ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž„ํฌํŠธํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค:
```python
from main import app
@ -182,7 +182,7 @@ from backend.main import app
### `fastapi dev`๋ฅผ ๊ฒฝ๋กœ ๋˜๋Š” `--entrypoint` CLI ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
`fastapi dev` ๋ช…๋ น์–ด์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉํ•  FastAPI app ๊ฐ์ฒด๋ฅผ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค:
`fastapi dev` ๋ช…๋ น์–ด์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉํ•  FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋ฅผ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค:
```console
$ fastapi dev main.py
@ -198,9 +198,9 @@ $ fastapi dev --entrypoint main:app
๋˜ํ•œ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด [VS Code ํ™•์žฅ](../editor-support.md)์ด๋‚˜ [FastAPI Cloud](https://fastapicloud.com)๊ฐ€ ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, `pyproject.toml`์˜ `entrypoint`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
### ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional }
### ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional }
์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋‹จ ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€
์„ ํƒ์ ์œผ๋กœ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋‹จ ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์–ด๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€
<div class="termy">
@ -218,7 +218,7 @@ Deploying to FastAPI Cloud...
CLI๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ ค ์ธ์ฆ ๊ณผ์ •์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค! ์ด์ œ ํ•ด๋‹น URL์—์„œ ์•ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœจ
์ด๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค! ์ด์ œ ํ•ด๋‹น URL์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœจ
## ๋‹จ๊ณ„๋ณ„ ์š”์•ฝ { #recap-step-by-step }
@ -261,6 +261,7 @@ https://example.com/items/foo
```
/items/foo
```
/// note | ์ฐธ๊ณ 
"๊ฒฝ๋กœ"๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "์—”๋“œํฌ์ธํŠธ" ๋˜๋Š” "๋ผ์šฐํŠธ"๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.
@ -392,7 +393,7 @@ JSON์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜๋Š” ๊ฐ์ฒด๋“ค๊ณผ ๋ชจ๋ธ๋“ค(ORM ๋“ฑ์„ ํฌํ•จํ•ด์„œ)
### 6 ๋‹จ๊ณ„: ๋ฐฐํฌํ•˜๊ธฐ { #step-6-deploy-it }
ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ **[FastAPI Cloud](https://fastapicloud.com)**์— ์•ฑ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค: `fastapi deploy`. ๐ŸŽ‰
ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์–ด๋กœ **[FastAPI Cloud](https://fastapicloud.com)**์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค: `fastapi deploy`. ๐ŸŽ‰
#### FastAPI Cloud ์†Œ๊ฐœ { #about-fastapi-cloud }
@ -400,15 +401,15 @@ JSON์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜๋Š” ๊ฐ์ฒด๋“ค๊ณผ ๋ชจ๋ธ๋“ค(ORM ๋“ฑ์„ ํฌํ•จํ•ด์„œ)
์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๋นŒ๋“œ**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
FastAPI๋กœ ์•ฑ์„ ๋นŒ๋“œํ•  ๋•Œ์˜ ๋™์ผํ•œ **๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜**์„ ํด๋ผ์šฐ๋“œ์— **๋ฐฐํฌ**ํ•  ๋•Œ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
FastAPI๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ๋•Œ์˜ ๋™์ผํ•œ **๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜**์„ ํด๋ผ์šฐ๋“œ์— **๋ฐฐํฌ**ํ•  ๋•Œ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
FastAPI Cloud๋Š” *FastAPI์™€ ์นœ๊ตฌ๋“ค* ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ์Šคํฐ์„œ์ด์ž ์ž๊ธˆ ์ œ๊ณต์ž์ž…๋‹ˆ๋‹ค. โœจ
#### ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์— ๋ฐฐํฌํ•˜๊ธฐ { #deploy-to-other-cloud-providers }
FastAPI๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ์–ด๋–ค ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์—๋„ FastAPI ์•ฑ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
FastAPI๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ์–ด๋–ค ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์—๋„ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์˜ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ FastAPI ์•ฑ์„ ๋ฐฐํฌํ•˜์„ธ์š”. ๐Ÿค“
ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์˜ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜์„ธ์š”. ๐Ÿค“
## ์š”์•ฝ { #recap }
@ -416,5 +417,5 @@ FastAPI๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ์–ด
* `app` ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ.
* (`@app.get("/")`์ฒ˜๋Ÿผ) **๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ** ์ž‘์„ฑ.
* (์œ„์— ์žˆ๋Š” `def root(): ...`์ฒ˜๋Ÿผ) **๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜** ์ž‘์„ฑ.
* `fastapi dev` ๋ช…๋ น์œผ๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰.
* ์„ ํƒ์ ์œผ๋กœ `fastapi deploy`๋กœ ์•ฑ ๋ฐฐํฌ.
* `fastapi dev` ๋ช…๋ น์–ด๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰.
* ์„ ํƒ์ ์œผ๋กœ `fastapi deploy`๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ.

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

@ -1,5 +1,6 @@
# ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ { #handling-errors }
API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์— ์˜ค๋ฅ˜๋ฅผ ์•Œ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ํด๋ผ์ด์–ธํŠธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ผ ์ˆ˜๋„ ์žˆ๊ณ , IoT ์žฅ์น˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

1
docs/ko/docs/tutorial/index.md

@ -1,5 +1,6 @@
# ์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ { #tutorial-user-guide }
์ด ์ž์Šต์„œ๋Š” **FastAPI**์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๊ฐ ์„น์…˜์€ ์ด์ „ ์„น์…˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€๋งŒ, ์ฃผ์ œ๋ฅผ ๋ถ„๋ฆฌํ•œ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์–ด ํŠน์ • API ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์›ํ•˜๋Š” ์„น์…˜์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4
docs/ko/docs/tutorial/metadata.md

@ -11,7 +11,7 @@ OpenAPI ๋ช…์„ธ ๋ฐ ์ž๋™ํ™”๋œ API ๋ฌธ์„œ UI์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์Œ ํ•„๋“œ๋ฅผ
| `title` | `str` | API์˜ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค. |
| `summary` | `str` | API์— ๋Œ€ํ•œ ์งง์€ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.</small> |
| `description` | `str` | API์— ๋Œ€ํ•œ ์งง์€ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| `version` | `string` | API์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. OpenAPI์˜ ๋ฒ„์ „์ด ์•„๋‹Œ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ: `2.5.0`. |
| `version` | `str` | API์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. OpenAPI์˜ ๋ฒ„์ „์ด ์•„๋‹Œ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ: `2.5.0`. |
| `terms_of_service` | `str` | API ์ด์šฉ ์•ฝ๊ด€์˜ URL์ž…๋‹ˆ๋‹ค. ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ URL ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. |
| `contact` | `dict` | ๋…ธ์ถœ๋œ API์— ๋Œ€ํ•œ ์—ฐ๋ฝ์ฒ˜ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <details><summary><code>contact</code> ํ•„๋“œ</summary><table><thead><tr><th>๋งค๊ฐœ๋ณ€์ˆ˜</th><th>ํƒ€์ž…</th><th>์„ค๋ช…</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>์—ฐ๋ฝ์ฒ˜ ์ธ๋ฌผ/์กฐ์ง์˜ ์‹๋ณ„๋ช…์ž…๋‹ˆ๋‹ค.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>์—ฐ๋ฝ์ฒ˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด URL์ž…๋‹ˆ๋‹ค. URL ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>์—ฐ๋ฝ์ฒ˜ ์ธ๋ฌผ/์กฐ์ง์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ ์ฃผ์†Œ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</td></tr></tbody></table></details> |
| `license_info` | `dict` | ๋…ธ์ถœ๋œ API์˜ ๋ผ์ด์„ ์Šค ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <details><summary><code>license_info</code> ํ•„๋“œ</summary><table><thead><tr><th>๋งค๊ฐœ๋ณ€์ˆ˜</th><th>ํƒ€์ž…</th><th>์„ค๋ช…</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>ํ•„์ˆ˜</strong> (<code>license_info</code>๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ). API์— ์‚ฌ์šฉ๋œ ๋ผ์ด์„ ์Šค ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>API์— ๋Œ€ํ•œ [SPDX](https://spdx.org/licenses/) ๋ผ์ด์„ ์Šค ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. <code>identifier</code> ํ•„๋“œ๋Š” <code>url</code> ํ•„๋“œ์™€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>API์— ์‚ฌ์šฉ๋œ ๋ผ์ด์„ ์Šค์˜ URL์ž…๋‹ˆ๋‹ค. URL ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</td></tr></tbody></table></details> |
@ -26,7 +26,7 @@ OpenAPI ๋ช…์„ธ ๋ฐ ์ž๋™ํ™”๋œ API ๋ฌธ์„œ UI์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์Œ ํ•„๋“œ๋ฅผ
///
์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์„œ ์ž๋™ํ™”(๋กœ ์ƒ์„ฑ๋œ) API ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค:
์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™ API ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค:
<img src="/img/tutorial/metadata/image01.png">

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

@ -1,5 +1,6 @@
# ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ์„ค์ • { #path-operation-configuration }
*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
/// warning | ๊ฒฝ๊ณ 

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

@ -29,7 +29,7 @@ FastAPI๋Š” `q`์˜ ๊ธฐ๋ณธ๊ฐ’์ด `= None`์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜๊ฐ€ ์•„๋‹˜์„ ์••
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
/// info | ์ •๋ณด
/// note | ์ฐธ๊ณ 
FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๊ถŒ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค).
@ -382,7 +382,7 @@ Pydantic์—๋Š” [BeforeValidator](https://docs.pydantic.dev/latest/concepts/valid
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
/// info | ์ •๋ณด
/// note | ์ฐธ๊ณ 
์ด๋Š” Pydantic 2 ์ด์ƒ ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž

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

@ -1,5 +1,6 @@
# ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ { #query-parameters }
๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด "์ฟผ๋ฆฌ" ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž๋™ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}

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

@ -151,11 +151,11 @@ HTML์˜ ํผ๋“ค(`<form></form>`)์ด ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์€
๊ทธ๋“ค์€ "ํผ ๋ฐ์ดํ„ฐ"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก๋œ ๋™์ผํ•œ "ํผ ํ•„๋“œ"์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด , `bytes` ์˜ `List` ๋˜๋Š” `UploadFile` ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค:
์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `bytes` ๋˜๋Š” `UploadFile`์˜ `list`๋ฅผ ์„ ์–ธํ•˜๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค:
{* ../../docs_src/request_files/tutorial002_an_py310.py hl[10,15] *}
์„ ์–ธํ•œ๋Œ€๋กœ, `bytes` ์˜ `list` ๋˜๋Š” `UploadFile` ๋“ค์„ ์ „์†ก๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์„ ์–ธํ•œ ๋Œ€๋กœ, `bytes` ๋˜๋Š” `UploadFile`์˜ `list`๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ

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

@ -1,5 +1,6 @@
# ํผ ๋ฐ์ดํ„ฐ { #form-data }
JSON ๋Œ€์‹  ํผ ํ•„๋“œ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ `Form`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// note | ์ฐธ๊ณ 

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

@ -1,5 +1,6 @@
# ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ { #response-status-code }
์‘๋‹ต ๋ชจ๋ธ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ, ์–ด๋–ค *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ๋“  `status_code` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต์— ์‚ฌ์šฉํ•  HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
* `@app.get()`

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

@ -1,6 +1,6 @@
# ์š”์ฒญ ์˜ˆ์ œ ๋ฐ์ดํ„ฐ ์„ ์–ธ { #declare-request-example-data }
์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์˜ˆ์ œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์˜ˆ์ œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ ์ด๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ -1,5 +1,6 @@
# ๋ณด์•ˆ - ์ฒซ ๋‹จ๊ณ„ { #security-first-steps }
์–ด๋–ค ๋„๋ฉ”์ธ์— **backend** API๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— **frontend**๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ๊ฐ™์€ ๋„๋ฉ”์ธ์˜ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ์žˆ๊ฑฐ๋‚˜(๋˜๋Š” ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

2
docs/ko/docs/tutorial/security/get-current-user.md

@ -14,7 +14,7 @@
Pydantic์„ ์‚ฌ์šฉํ•ด ๋ณธ๋ฌธ์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์–ด๋””์„œ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## `get_current_user` ์˜์กด์„ฑ ์ƒ์„ฑํ•˜๊ธฐ { #create-a-get-current-user-dependency }

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

@ -1,5 +1,6 @@
# ํŒจ์Šค์›Œ๋“œ(ํ•ด์‹ฑ ํฌํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OAuth2, JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” Bearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
๋ชจ๋“  ๋ณด์•ˆ ํ๋ฆ„์„ ๊ตฌ์„ฑํ–ˆ์œผ๋ฏ€๋กœ, ์ด์ œ <abbr title="JSON Web Tokens - JSON ์›น ํ† ํฐ">JWT</abbr> ํ† ํฐ๊ณผ ์•ˆ์ „ํ•œ ํŒจ์Šค์›Œ๋“œ ํ•ด์‹ฑ์„ ์‚ฌ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ค์ œ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒจ์Šค์›Œ๋“œ ํ•ด์‹œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ -6,7 +6,7 @@
**FastAPI** ๋ณด์•ˆ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `username` ๋ฐ `password`๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
OAuth2๋Š” (์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”) "ํŒจ์Šค์›Œ๋“œ ํ”Œ๋กœ์šฐ"์„ ์‚ฌ์šฉํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ/์œ ์ €๊ฐ€ `username` ๋ฐ `password` ํ•„๋“œ๋ฅผ ํผ ๋ฐ์ดํ„ฐ๋กœ ๋ณด๋‚ด์•ผ ํ•จ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
OAuth2๋Š” (์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”) "ํŒจ์Šค์›Œ๋“œ ํ”Œ๋กœ์šฐ"๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ/์œ ์ €๊ฐ€ `username` ๋ฐ `password` ํ•„๋“œ๋ฅผ ํผ ๋ฐ์ดํ„ฐ๋กœ ๋ณด๋‚ด์•ผ ํ•จ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‚ฌ์–‘์—๋Š” ํ•„๋“œ์˜ ์ด๋ฆ„์„ ๊ทธ๋ ‡๊ฒŒ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ `user-name` ๋˜๋Š” `email`์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@ -104,7 +104,7 @@ OAuth2 ์‚ฌ์–‘์€ ์‹ค์ œ๋กœ `password`๋ผ๋Š” ๊ณ ์ • ๊ฐ’์ด ์žˆ๋Š” `grant_type`
### ํŒจ์Šค์›Œ๋“œ ํ™•์ธํ•˜๊ธฐ { #check-the-password }
์ด ์‹œ์ ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ํ™•์ธํ–ˆ์ง€๋งŒ ์•”ํ˜ธ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์ด ์‹œ์ ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ์žˆ์ง€๋งŒ, ์•„์ง ํŒจ์Šค์›Œ๋“œ๋Š” ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ Pydantic `UserInDB` ๋ชจ๋ธ์— ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค.
@ -146,7 +146,7 @@ UserInDB(
/// note | ์ฐธ๊ณ 
`**user_dict`์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ [**์ถ”๊ฐ€ ๋ชจ๋ธ** ๋ฌธ์„œ](../extra-models.md#about-user-in-dict)๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด์„ธ์š”.
`**user_dict`์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ [**์ถ”๊ฐ€ ๋ชจ๋ธ** ๋ฌธ์„œ](../extra-models.md#about-user-in-model-dump)๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด์„ธ์š”.
///

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

@ -1,5 +1,6 @@
# SQL (๊ด€๊ณ„ํ˜•) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค { #sql-relational-databases }
**FastAPI**์—์„œ SQL(๊ด€๊ณ„ํ˜•) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์ด ์›ํ•˜๋Š” **์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ ** ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” [SQLModel](https://sqlmodel.tiangolo.com/)์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

@ -2,6 +2,14 @@
`StaticFiles`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์ •์  ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
/// tip | ํŒ
ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋Œ€์‹  `app.frontend()`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [ํ”„๋ก ํŠธ์—”๋“œ](frontend.md)์—์„œ ํ™•์ธํ•˜์„ธ์š”.
`app.frontend()`๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ `StaticFiles`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
///
## `StaticFiles` ์‚ฌ์šฉ { #use-staticfiles }
* `StaticFiles`๋ฅผ ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค.

8
docs/ko/docs/tutorial/testing.md

@ -62,7 +62,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
๊ทธ๋ฆฌ๊ณ  **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด๋‚˜ ๋ชจ๋“ˆ ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### **FastAPI** app ํŒŒ์ผ { #fastapi-app-file }
### **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ { #fastapi-app-file }
[๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜](bigger-applications.md)์— ๋ฌ˜์‚ฌ๋œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
@ -73,7 +73,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
โ”‚ย ย  โ””โ”€โ”€ main.py
```
`main.py` ํŒŒ์ผ ์•ˆ์— **FastAPI** app ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค:
`main.py` ํŒŒ์ผ ์•ˆ์— **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค:
{* ../../docs_src/app_testing/app_a_py310/main.py *}
@ -101,7 +101,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
์ด์ œ ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ํ™•์žฅํ•˜๊ณ  ๋” ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
### ํ™•์žฅ๋œ **FastAPI** app ํŒŒ์ผ { #extended-fastapi-app-file }
### ํ™•์žฅ๋œ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ { #extended-fastapi-app-file }
์ด์ „๊ณผ ๊ฐ™์€ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
@ -113,7 +113,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
โ”‚ย ย  โ””โ”€โ”€ test_main.py
```
์ด์ œ **FastAPI** ์•ฑ์ด ์žˆ๋Š” `main.py` ํŒŒ์ผ์— ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ **๊ฒฝ๋กœ ์ฒ˜๋ฆฌ**๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.
์ด์ œ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋Š” `main.py` ํŒŒ์ผ์— ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ **๊ฒฝ๋กœ ์ฒ˜๋ฆฌ**๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.
์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” `GET` ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ -1,5 +1,6 @@
# ๊ฐ€์ƒ ํ™˜๊ฒฝ { #virtual-environments }
Python ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ•  ๋•Œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ**(๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜)์„ ์‚ฌ์šฉํ•ด ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ์„ค์น˜ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
/// note | ์ฐธ๊ณ 

Loadingโ€ฆ
Cancel
Save