]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
๐ŸŒ Update translations for ko (update-outdated) (#15170)
authorSebastiรกn Ramรญrez <tiangolo@gmail.com>
Fri, 20 Mar 2026 14:06:26 +0000 (15:06 +0100)
committerGitHub <noreply@github.com>
Fri, 20 Mar 2026 14:06:26 +0000 (15:06 +0100)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
98 files changed:
docs/ko/docs/_llm-test.md
docs/ko/docs/advanced/additional-responses.md
docs/ko/docs/advanced/additional-status-codes.md
docs/ko/docs/advanced/advanced-dependencies.md
docs/ko/docs/advanced/async-tests.md
docs/ko/docs/advanced/behind-a-proxy.md
docs/ko/docs/advanced/custom-response.md
docs/ko/docs/advanced/dataclasses.md
docs/ko/docs/advanced/events.md
docs/ko/docs/advanced/generate-clients.md
docs/ko/docs/advanced/index.md
docs/ko/docs/advanced/middleware.md
docs/ko/docs/advanced/openapi-callbacks.md
docs/ko/docs/advanced/openapi-webhooks.md
docs/ko/docs/advanced/path-operation-advanced-configuration.md
docs/ko/docs/advanced/response-change-status-code.md
docs/ko/docs/advanced/response-cookies.md
docs/ko/docs/advanced/response-directly.md
docs/ko/docs/advanced/response-headers.md
docs/ko/docs/advanced/security/http-basic-auth.md
docs/ko/docs/advanced/security/index.md
docs/ko/docs/advanced/security/oauth2-scopes.md
docs/ko/docs/advanced/settings.md
docs/ko/docs/advanced/sub-applications.md
docs/ko/docs/advanced/templates.md
docs/ko/docs/advanced/testing-websockets.md
docs/ko/docs/advanced/using-request-directly.md
docs/ko/docs/advanced/websockets.md
docs/ko/docs/advanced/wsgi.md
docs/ko/docs/alternatives.md
docs/ko/docs/async.md
docs/ko/docs/benchmarks.md
docs/ko/docs/deployment/cloud.md
docs/ko/docs/deployment/concepts.md
docs/ko/docs/deployment/docker.md
docs/ko/docs/deployment/fastapicloud.md
docs/ko/docs/deployment/https.md
docs/ko/docs/deployment/index.md
docs/ko/docs/deployment/manually.md
docs/ko/docs/deployment/server-workers.md
docs/ko/docs/deployment/versions.md
docs/ko/docs/environment-variables.md
docs/ko/docs/fastapi-cli.md
docs/ko/docs/features.md
docs/ko/docs/help-fastapi.md
docs/ko/docs/history-design-future.md
docs/ko/docs/how-to/authentication-error-status-code.md
docs/ko/docs/how-to/conditional-openapi.md
docs/ko/docs/how-to/configure-swagger-ui.md
docs/ko/docs/how-to/custom-docs-ui-assets.md
docs/ko/docs/how-to/custom-request-and-route.md
docs/ko/docs/how-to/extending-openapi.md
docs/ko/docs/how-to/general.md
docs/ko/docs/how-to/graphql.md
docs/ko/docs/how-to/index.md
docs/ko/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
docs/ko/docs/how-to/testing-database.md
docs/ko/docs/index.md
docs/ko/docs/project-generation.md
docs/ko/docs/python-types.md
docs/ko/docs/tutorial/background-tasks.md
docs/ko/docs/tutorial/bigger-applications.md
docs/ko/docs/tutorial/body-nested-models.md
docs/ko/docs/tutorial/body-updates.md
docs/ko/docs/tutorial/body.md
docs/ko/docs/tutorial/cors.md
docs/ko/docs/tutorial/debugging.md
docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
docs/ko/docs/tutorial/dependencies/global-dependencies.md
docs/ko/docs/tutorial/dependencies/index.md
docs/ko/docs/tutorial/encoder.md
docs/ko/docs/tutorial/extra-data-types.md
docs/ko/docs/tutorial/extra-models.md
docs/ko/docs/tutorial/first-steps.md
docs/ko/docs/tutorial/handling-errors.md
docs/ko/docs/tutorial/index.md
docs/ko/docs/tutorial/metadata.md
docs/ko/docs/tutorial/middleware.md
docs/ko/docs/tutorial/path-operation-configuration.md
docs/ko/docs/tutorial/path-params-numeric-validations.md
docs/ko/docs/tutorial/path-params.md
docs/ko/docs/tutorial/query-params-str-validations.md
docs/ko/docs/tutorial/query-params.md
docs/ko/docs/tutorial/request-files.md
docs/ko/docs/tutorial/request-form-models.md
docs/ko/docs/tutorial/request-forms-and-files.md
docs/ko/docs/tutorial/request-forms.md
docs/ko/docs/tutorial/response-model.md
docs/ko/docs/tutorial/response-status-code.md
docs/ko/docs/tutorial/schema-extra-example.md
docs/ko/docs/tutorial/security/first-steps.md
docs/ko/docs/tutorial/security/oauth2-jwt.md
docs/ko/docs/tutorial/security/simple-oauth2.md
docs/ko/docs/tutorial/sql-databases.md
docs/ko/docs/tutorial/static-files.md
docs/ko/docs/tutorial/testing.md
docs/ko/docs/virtual-environments.md

index 92bfb83f62b86843ddaa30ef9f5c84afe17baa7f..8b7b275c0ad458b979c6d7fe47b7d6066e7484c0 100644 (file)
@@ -11,7 +11,7 @@
 * ๋ฒˆ์—ญ์—์„œ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
 * ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ, ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ, ๋˜๋Š” ์˜์–ด ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
 * ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฒˆ์—ญ์—์„œ ๋‚จ์•„ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•ด ์ข‹์€ ๋ฒˆ์—ญ์ด ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
-* ์ข‹์€ ๋ฒˆ์—ญ์„ ๋‘” ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๊ฒฐ๊ณผ๋Š” LLM์ด ๋” ์ด์ƒ ๋ฒˆ์—ญ์— ๋ณ€๊ฒฝ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์™€ ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์„ ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค(๋•Œ๋•Œ๋กœ ๋ช‡ ๊ฐ€์ง€ seemingly random ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLM์€ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ</a>์ž…๋‹ˆ๋‹ค).
+* ์ข‹์€ ๋ฒˆ์—ญ์„ ๋‘” ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๊ฒฐ๊ณผ๋Š” LLM์ด ๋” ์ด์ƒ ๋ฒˆ์—ญ์— ๋ณ€๊ฒฝ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ์™€ ์–ธ์–ด๋ณ„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์„ ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค(๋•Œ๋•Œ๋กœ ๋ช‡ ๊ฐ€์ง€ seemingly random ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” [LLM์€ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ](https://doublespeak.chat/#/handbook#deterministic-output)์ž…๋‹ˆ๋‹ค).
 
 ํ…Œ์ŠคํŠธ:
 
@@ -169,15 +169,15 @@ works(foo="bar")  # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
 ๋งํฌ ํ…์ŠคํŠธ๋Š” ๋ฒˆ์—ญ๋˜์–ด์•ผ ํ•˜๊ณ , ๋งํฌ ์ฃผ์†Œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค:
 
 * [์œ„์˜ ์ œ๋ชฉ์œผ๋กœ ๊ฐ€๋Š” ๋งํฌ](#code-snippets)
-* [๋‚ด๋ถ€ ๋งํฌ](index.md#installation){.internal-link target=_blank}
-* <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">์™ธ๋ถ€ ๋งํฌ</a>
-* <a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">์Šคํƒ€์ผ๋กœ ๊ฐ€๋Š” ๋งํฌ</a>
-* <a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€๋Š” ๋งํฌ</a>
-* <a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">์ด๋ฏธ์ง€๋กœ ๊ฐ€๋Š” ๋งํฌ</a>
+* [๋‚ด๋ถ€ ๋งํฌ](index.md#installation)
+* [์™ธ๋ถ€ ๋งํฌ](https://sqlmodel.tiangolo.com/)
+* [์Šคํƒ€์ผ๋กœ ๊ฐ€๋Š” ๋งํฌ](https://fastapi.tiangolo.com/css/styles.css)
+* [์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€๋Š” ๋งํฌ](https://fastapi.tiangolo.com/js/logic.js)
+* [์ด๋ฏธ์ง€๋กœ ๊ฐ€๋Š” ๋งํฌ](https://fastapi.tiangolo.com/img/foo.jpg)
 
 ๋งํฌ ํ…์ŠคํŠธ๋Š” ๋ฒˆ์—ญ๋˜์–ด์•ผ ํ•˜๊ณ , ๋งํฌ ์ฃผ์†Œ๋Š” ๋ฒˆ์—ญ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค:
 
-* <a href="https://fastapi.tiangolo.com/ko/" class="external-link" target="_blank">FastAPI ๋งํฌ</a>
+* [FastAPI ๋งํฌ](https://fastapi.tiangolo.com/ko/)
 
 ////
 
@@ -259,8 +259,8 @@ works(foo="bar")  # ์ด๊ฑด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐ŸŽ‰
 * ์—ฌ๋Ÿฌ๋ถ„
 * ์—ฌ๋Ÿฌ๋ถ„์˜
 
-* ์˜ˆ: (e.g.)
-* ๋“ฑ (etc.)
+* ์˜ˆ:
+* ๋“ฑ
 
 * `foo`๋กœ์„œ์˜ `int`
 * `bar`๋กœ์„œ์˜ `str`
index 2ed6bc3fcf9137a4b04b798e42a80ed58c1ead6a..e43d7c727ffd806531fe9de3a2ca3ca0a0783a48 100644 (file)
@@ -243,5 +243,5 @@ new_dict = {**old_dict, "new key": "new value"}
 
 ์‘๋‹ต์— ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๋ ค๋ฉด, OpenAPI ์‚ฌ์–‘์˜ ๋‹ค์Œ ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”:
 
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object" class="external-link" target="_blank">OpenAPI Responses Object</a>: `Response Object`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object" class="external-link" target="_blank">OpenAPI Response Object</a>: `responses` ํŒŒ๋ผ๋ฏธํ„ฐ ์•ˆ์˜ ๊ฐ ์‘๋‹ต์— ์ด๊ฒƒ์˜ ์–ด๋–ค ํ•ญ๋ชฉ์ด๋“  ์ง์ ‘ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `description`, `headers`, `content`(์—ฌ๊ธฐ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฏธ๋””์–ด ํƒ€์ž…๊ณผ JSON Schema๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค), `links` ๋“ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+* [OpenAPI Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object): `Response Object`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
+* [OpenAPI Response Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object): `responses` ํŒŒ๋ผ๋ฏธํ„ฐ ์•ˆ์˜ ๊ฐ ์‘๋‹ต์— ์ด๊ฒƒ์˜ ์–ด๋–ค ํ•ญ๋ชฉ์ด๋“  ์ง์ ‘ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `description`, `headers`, `content`(์—ฌ๊ธฐ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฏธ๋””์–ด ํƒ€์ž…๊ณผ JSON Schema๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค), `links` ๋“ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
index e3c898044eea62bb505717bebe89444ed00b8f13..6251b68b2315b8b86412b30d0f3345523e8671ba 100644 (file)
@@ -38,4 +38,4 @@
 
 ์ถ”๊ฐ€ ์ƒํƒœ ์ฝ”๋“œ์™€ ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ, FastAPI๋Š” ๋ฐ˜ํ™˜ํ•  ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— OpenAPI ์Šคํ‚ค๋งˆ(API ๋ฌธ์„œ)์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์— ์ด๋ฅผ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md){.internal-link target=_blank}.
+ํ•˜์ง€๋งŒ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์— ์ด๋ฅผ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md).
index eb5d35d957c3288d7a1ef3982f17ab2f9742b640..2755986a21e4de6bed4befc80a50518496f0680d 100644 (file)
@@ -133,7 +133,7 @@ SQLModel(๋˜๋Š” SQLAlchemy)์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ด๋Ÿฐ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ 
 
 ๊ทธ๋Ÿฌ๋ฉด ์„ธ์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•˜์—ฌ, ๋‹ค๋ฅธ ์š”์ฒญ๋“ค์ด ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
 
-`yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์—์„œ ์กฐ๊ธฐ ์ข…๋ฃŒ๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์กฐ๊ธฐ ์ข…๋ฃŒ๊ฐ€ ์–ด๋–ค ์ ์—์„œ ์ด๋“์ด ๋˜๋Š”์ง€๋ฅผ ํฌํ•จํ•ด <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Discussions ์งˆ๋ฌธ</a>์„ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.
+`yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์—์„œ ์กฐ๊ธฐ ์ข…๋ฃŒ๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์กฐ๊ธฐ ์ข…๋ฃŒ๊ฐ€ ์–ด๋–ค ์ ์—์„œ ์ด๋“์ด ๋˜๋Š”์ง€๋ฅผ ํฌํ•จํ•ด [GitHub Discussions ์งˆ๋ฌธ](https://github.com/fastapi/fastapi/discussions/new?category=questions)์„ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.
 
 `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์—์„œ ์กฐ๊ธฐ ์ข…๋ฃŒ์— ๋Œ€ํ•œ ์„ค๋“๋ ฅ ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๋ฉด, ์กฐ๊ธฐ ์ข…๋ฃŒ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
 
@@ -145,7 +145,7 @@ FastAPI 0.110.0 ์ด์ „์—๋Š” `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ๊ทธ
 
 ### ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํƒœ์Šคํฌ์™€ `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ, ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ { #background-tasks-and-dependencies-with-yield-technical-details }
 
-FastAPI 0.106.0 ์ด์ „์—๋Š” `yield` ์ดํ›„์— ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ์‘๋‹ต์ด ์ „์†ก๋œ *ํ›„์—* ์‹คํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, [์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}๊ฐ€ ์ด๋ฏธ ์‹คํ–‰๋œ ๋’ค์˜€์Šต๋‹ˆ๋‹ค.
+FastAPI 0.106.0 ์ด์ „์—๋Š” `yield` ์ดํ›„์— ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ์‘๋‹ต์ด ์ „์†ก๋œ *ํ›„์—* ์‹คํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, [์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ](../tutorial/handling-errors.md#install-custom-exception-handlers)๊ฐ€ ์ด๋ฏธ ์‹คํ–‰๋œ ๋’ค์˜€์Šต๋‹ˆ๋‹ค.
 
 ์ด๋Š” ์ฃผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํƒœ์Šคํฌ ์•ˆ์—์„œ ์˜์กด์„ฑ์ด "yield"ํ•œ ๋™์ผํ•œ ๊ฐ์ฒด๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„์˜€์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํƒœ์Šคํฌ๊ฐ€ ๋๋‚œ ๋’ค์— ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 
index 0479ac41d15d1f2eb11fd68d4ea5d78c48ca7efa..b477c6c715e11a1b2b88c429ed40b6a966b34980 100644 (file)
 
 `TestClient`๋Š” ํ‘œ์ค€ pytest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ผ๋ฐ˜ `def` ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋น„๋™๊ธฐ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜ธ์ถœํ•˜๋„๋ก ๋‚ด๋ถ€์—์„œ ๋งˆ๋ฒ• ๊ฐ™์€ ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ๋งˆ๋ฒ•์€ ๋” ์ด์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•˜๋ฉด, ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์•ˆ์—์„œ `TestClient`๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
 
-`TestClient`๋Š” <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๋‹คํ–‰ํžˆ HTTPX๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด API๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`TestClient`๋Š” [HTTPX](https://www.python-httpx.org)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๋‹คํ–‰ํžˆ HTTPX๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด API๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ์˜ˆ์‹œ { #example }
 
-๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ, [๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜](../tutorial/bigger-applications.md){.internal-link target=_blank}๊ณผ [ํ…Œ์ŠคํŠธ](../tutorial/testing.md){.internal-link target=_blank}์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:
+๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ, [๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜](../tutorial/bigger-applications.md)๊ณผ [ํ…Œ์ŠคํŠธ](../tutorial/testing.md)์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:
 
 ```
 .
@@ -84,7 +84,7 @@ response = client.get('/')
 
 /// warning | ๊ฒฝ๊ณ 
 
-์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด lifespan ์ด๋ฒคํŠธ์— ์˜์กดํ•œ๋‹ค๋ฉด, `AsyncClient`๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ํ•˜๋ ค๋ฉด <a href="https://github.com/florimondmanca/asgi-lifespan#usage" class="external-link" target="_blank">florimondmanca/asgi-lifespan</a>์˜ `LifespanManager`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
+์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด lifespan ์ด๋ฒคํŠธ์— ์˜์กดํ•œ๋‹ค๋ฉด, `AsyncClient`๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ํ•˜๋ ค๋ฉด [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage)์˜ `LifespanManager`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
 
 ///
 
@@ -94,6 +94,6 @@ response = client.get('/')
 
 /// tip | ํŒ
 
-ํ…Œ์ŠคํŠธ์— ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ฉํ•  ๋•Œ(์˜ˆ: <a href="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop" class="external-link" target="_blank">MongoDB์˜ MotorClient</a>๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ) `RuntimeError: Task attached to a different loop`๋ฅผ ๋งˆ์ฃผ์นœ๋‹ค๋ฉด, ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋Š” async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด `@app.on_event("startup")` ์ฝœ๋ฐฑ์—์„œ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+ํ…Œ์ŠคํŠธ์— ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ฉํ•  ๋•Œ(์˜ˆ: [MongoDB์˜ MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ) `RuntimeError: Task attached to a different loop`๋ฅผ ๋งˆ์ฃผ์นœ๋‹ค๋ฉด, ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋Š” async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด `@app.on_event("startup")` ์ฝœ๋ฐฑ์—์„œ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
index 825592c0609c196aa985ab1baa0d3bf67b25b5a1..d5f42dd3743fa769f5d41d8f7864a1a2d2c6432f 100644 (file)
@@ -16,9 +16,9 @@
 
 ํ”„๋ก์‹œ ํ—ค๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" class="external-link" target="_blank">X-Forwarded-For</a>
-* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto" class="external-link" target="_blank">X-Forwarded-Proto</a>
-* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host" class="external-link" target="_blank">X-Forwarded-Host</a>
+* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
+* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
+* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
 
 ///
 
@@ -60,7 +60,7 @@ https://mysuperapp.com/items/
 
 /// tip | ํŒ
 
-HTTPS์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด ๊ฐ€์ด๋“œ [HTTPS์— ๋Œ€ํ•˜์—ฌ](../deployment/https.md){.internal-link target=_blank}๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+HTTPS์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด ๊ฐ€์ด๋“œ [HTTPS์— ๋Œ€ํ•˜์—ฌ](../deployment/https.md)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
@@ -149,14 +149,14 @@ IP `0.0.0.0`์€ ๋ณดํ†ต ํ•ด๋‹น ๋จธ์‹ /์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  IP์—
 ```JSON hl_lines="4-8"
 {
     "openapi": "3.1.0",
-    // More stuff here
+    // ์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ๋‚ด์šฉ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค
     "servers": [
         {
             "url": "/api/v1"
         }
     ],
     "paths": {
-            // More stuff here
+            // ์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ๋‚ด์šฉ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค
     }
 }
 ```
@@ -228,7 +228,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
 
 ์„œ๋ฒ„(Uvicorn)๋Š” ๊ทธ `root_path`๋ฅผ ์•ฑ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
 
-ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๋กœ <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a>์— ์ ‘์†ํ•˜๋ฉด ์ •์ƒ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๋กœ [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app)์— ์ ‘์†ํ•˜๋ฉด ์ •์ƒ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ```JSON
 {
@@ -251,9 +251,9 @@ Uvicorn์€ ํ”„๋ก์‹œ๊ฐ€ `http://127.0.0.1:8000/app`์—์„œ Uvicorn์— ์ ‘๊ทผํ•  
 
 ## Traefik์œผ๋กœ ๋กœ์ปฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #testing-locally-with-traefik }
 
-<a href="https://docs.traefik.io/" class="external-link" target="_blank">Traefik</a>์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๊ตฌ์„ฑ์„ ๋กœ์ปฌ์—์„œ ์‰ฝ๊ฒŒ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[Traefik](https://docs.traefik.io/)์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๊ตฌ์„ฑ์„ ๋กœ์ปฌ์—์„œ ์‰ฝ๊ฒŒ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-<a href="https://github.com/containous/traefik/releases" class="external-link" target="_blank">Traefik ๋‹ค์šด๋กœ๋“œ</a>๋Š” ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๋ฉฐ, ์••์ถ• ํŒŒ์ผ์„ ํ’€๊ณ  ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[Traefik ๋‹ค์šด๋กœ๋“œ](https://github.com/containous/traefik/releases)๋Š” ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๋ฉฐ, ์••์ถ• ํŒŒ์ผ์„ ํ’€๊ณ  ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ทธ ๋‹ค์Œ ๋‹ค์Œ ๋‚ด์šฉ์„ ๊ฐ€์ง„ `traefik.toml` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”:
 
@@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
 
 ### ์‘๋‹ต ํ™•์ธํ•˜๊ธฐ { #check-the-responses }
 
-์ด์ œ Uvicorn์˜ ํฌํŠธ๋กœ ๋œ URL์ธ <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a>๋กœ ์ ‘์†ํ•˜๋ฉด ์ •์ƒ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+์ด์ œ Uvicorn์˜ ํฌํŠธ๋กœ ๋œ URL์ธ [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app)๋กœ ์ ‘์†ํ•˜๋ฉด ์ •์ƒ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ```JSON
 {
@@ -345,7 +345,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
 
 ///
 
-์ด์ œ Traefik์˜ ํฌํŠธ๊ฐ€ ํฌํ•จ๋˜๊ณ  ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ํฌํ•จ๋œ URL <a href="http://127.0.0.1:9999/api/v1/app" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/app</a>์„ ์—ฌ์„ธ์š”.
+์ด์ œ Traefik์˜ ํฌํŠธ๊ฐ€ ํฌํ•จ๋˜๊ณ  ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ํฌํ•จ๋œ URL [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app)์„ ์—ฌ์„ธ์š”.
 
 ๋™์ผํ•œ ์‘๋‹ต์„ ์–ป์Šต๋‹ˆ๋‹ค:
 
@@ -370,13 +370,13 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
 
 ์•ฑ์— ์ ‘๊ทผํ•˜๋Š” "๊ณต์‹" ๋ฐฉ๋ฒ•์€ ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง„ ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด์„œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ๋Œ€๋กœ, URL์— ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ Uvicorn์ด ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” docs UI๋ฅผ ์‹œ๋„ํ•˜๋ฉด, ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/behind-a-proxy/image01.png">
 
 ํ•˜์ง€๋งŒ ํ”„๋ก์‹œ(ํฌํŠธ `9999`)๋ฅผ ์‚ฌ์šฉํ•ด "๊ณต์‹" URL์ธ `/api/v1/docs`์—์„œ docs UI์— ์ ‘๊ทผํ•˜๋ฉด, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰
 
-<a href="http://127.0.0.1:9999/api/v1/docs" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/docs</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+[http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/behind-a-proxy/image02.png">
 
@@ -407,7 +407,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
 ```JSON hl_lines="5-7"
 {
     "openapi": "3.1.0",
-    // More stuff here
+    // ์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ๋‚ด์šฉ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค
     "servers": [
         {
             "url": "/api/v1"
@@ -422,7 +422,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
         }
     ],
     "paths": {
-            // More stuff here
+            // ์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ๋‚ด์šฉ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค
     }
 }
 ```
@@ -433,7 +433,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
 
 ///
 
-<a href="http://127.0.0.1:9999/api/v1/docs" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/docs</a>์˜ docs UI์—์„œ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค:
+[http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs)์˜ docs UI์—์„œ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/behind-a-proxy/image03.png">
 
@@ -461,6 +461,6 @@ OpenAPI ์‚ฌ์–‘์—์„œ `servers` ์†์„ฑ์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
 
 ## ์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งˆ์šดํŠธํ•˜๊ธฐ { #mounting-a-sub-application }
 
-ํ”„๋ก์‹œ์—์„œ `root_path`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„, [์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ๋งˆ์šดํŠธ](sub-applications.md){.internal-link target=_blank}์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์šดํŠธํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๊ธฐ๋Œ€ํ•˜๋Š” ๋Œ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+ํ”„๋ก์‹œ์—์„œ `root_path`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„, [์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ๋งˆ์šดํŠธ](sub-applications.md)์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์šดํŠธํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๊ธฐ๋Œ€ํ•˜๋Š” ๋Œ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 FastAPI๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ `root_path`๋ฅผ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๊ทธ๋ƒฅ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. โœจ
index 6d54eaf2b1d453e57f35636f740b53c1b38e0674..e85ec3c743cd201e8468b66e9664ccc620ade528 100644 (file)
@@ -1,16 +1,14 @@
 # ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต - HTML, Stream, ํŒŒ์ผ, ๊ธฐํƒ€ { #custom-response-html-stream-file-others }
 
-๊ธฐ๋ณธ์ ์œผ๋กœ, **FastAPI** ์‘๋‹ต์„ `JSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
+๊ธฐ๋ณธ์ ์œผ๋กœ **FastAPI**๋Š” JSON ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
-์ด๋ฅผ ์žฌ์ •์˜ ํ•˜๋ ค๋ฉด [์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md){.internal-link target=_blank}์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
+[์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ด๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋Ÿฌ๋‚˜ `Response` (๋˜๋Š” `JSONResponse`์™€ ๊ฐ™์€ ํ•˜์œ„ ํด๋ž˜์Šค)๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ (์‹ฌ์ง€์–ด `response_model`์„ ์„ ์–ธํ–ˆ๋”๋ผ๋„), ๋ฌธ์„œํ™”๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ์„ฑ๋œ OpenAPI์˜ ์ผ๋ถ€๋กœ HTTP ํ—ค๋” `Content-Type`์— ํŠน์ • "๋ฏธ๋””์–ด ํƒ€์ž…"์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ).
+๊ทธ๋Ÿฌ๋‚˜ `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋ฉด(๋˜๋Š” `JSONResponse`์™€ ๊ฐ™์€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด) ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ(๋น„๋ก `response_model`์„ ์„ ์–ธํ–ˆ๋‹ค ํ•˜๋”๋ผ๋„), ๋ฌธ์„œ๋„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ์„ฑ๋œ OpenAPI์˜ ์ผ๋ถ€๋กœ HTTP ํ—ค๋” `Content-Type`์— ํŠน์ • "๋ฏธ๋””์–ด ํƒ€์ž…"์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ ๋“ฑ).
 
-รญ\95\98รฌยง\80รซยง\8c *รชยฒยฝรซยก\9c รฌยฒ\98รซยฆยฌ รซ\8dยฐรฌยฝ\94รซย \88รฌ\9dยดรญ\84ยฐ*รฌ\97\90รฌ\84\9c `response_class` รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95\98รฌ\97ยฌ รฌ\9b\90รญ\95\98รซ\8a\94 `Response`(รฌ\98\88: รซยชยจรซ\93ย  `Response` รญ\95\98รฌ\9c\84 รญ\81ยดรซ\9e\98รฌ\8aยค)๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+รญ\95\98รฌยง\80รซยง\8c *รชยฒยฝรซยก\9c รฌยฒ\98รซยฆยฌ รซ\8dยฐรฌยฝ\94รซย \88รฌ\9dยดรญ\84ยฐ*รฌ\97\90รฌ\84\9c `response_class` รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95\98รฌ\97ยฌ รฌ\82ยฌรฌ\9aยฉรญ\95ย  `Response`(รฌ\98\88: รฌ\96ยดรซ\96ยค `Response` รญ\95\98รฌ\9c\84 รญ\81ยดรซ\9e\98รฌ\8aยครซ\93ย )๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์šฉ์€ ํ•ด๋‹น `Response`์•ˆ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
-
-๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๊ทธ `Response`๊ฐ€ `JSONResponse`์™€ `UJSONResponse`์˜ ๊ฒฝ์šฐ ์ฒ˜๋Ÿผ JSON ๋ฏธ๋””์–ด ํƒ€์ž…(`application/json`)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์—์„œ ์„ ์–ธํ•œ Pydantic์˜ `response_model`์„ ์‚ฌ์šฉํ•ด ์ž๋™์œผ๋กœ ๋ณ€ํ™˜(๋ฐ ํ•„ํ„ฐ๋ง) ๋ฉ๋‹ˆ๋‹ค.
+*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์šฉ์€ ํ•ด๋‹น `Response` ์•ˆ์— ๋‹ด๊น๋‹ˆ๋‹ค.
 
 /// note | ์ฐธ๊ณ 
 
 
 ///
 
-## `ORJSONResponse` ์‚ฌ์šฉํ•˜๊ธฐ { #use-orjsonresponse }
-
-์˜ˆ๋ฅผ ๋“ค์–ด, ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>์„ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์‘๋‹ต์„ `ORJSONResponse`๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-
-์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” `Response` ํด๋ž˜์Šค(ํ•˜์œ„ ํด๋ž˜์Šค)๋ฅผ ์ž„ํฌํŠธํ•œ ํ›„, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์—์„œ ์„ ์–ธํ•˜์„ธ์š”.
-
-๋Œ€๊ทœ๋ชจ ์‘๋‹ต์˜ ๊ฒฝ์šฐ, ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค `Response`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.
-
-์ด์œ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ, FastAPI๊ฐ€ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ฒ€์‚ฌํ•˜๊ณ  JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ์—์„œ ์„ค๋ช…๋œ [JSON ํ˜ธํ™˜ ๊ฐ€๋Šฅ ์ธ์ฝ”๋”](../tutorial/encoder.md){.internal-link target=_blank}๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๊ณผ ๊ฐ™์€ **์ž„์˜์˜ ๊ฐ์ฒด**๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-
-ํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์šฉ์ด **JSON์œผ๋กœ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ**ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋‚ด์šฉ์„ ์‘๋‹ต ํด๋ž˜์Šค์— ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, FastAPI๊ฐ€ ๋ฐ˜ํ™˜ ๋‚ด์šฉ์„ `jsonable_encoder`๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•œ ๋’ค ์‘๋‹ต ํด๋ž˜์Šค์— ์ „๋‹ฌํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+## JSON ์‘๋‹ต { #json-responses }
 
-{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *}
+๊ธฐ๋ณธ์ ์œผ๋กœ FastAPI๋Š” JSON ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
-/// info | ์ •๋ณด
-
-`response_class` ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‘๋‹ต์˜ "๋ฏธ๋””์–ด ํƒ€์ž…"์„ ์ •์˜ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
+[์‘๋‹ต ๋ชจ๋ธ](../tutorial/response-model.md)์„ ์„ ์–ธํ•˜๋ฉด FastAPI๋Š” Pydantic์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
 
-รฌ\9dยด รชยฒยฝรฌ\9aยฐ, HTTP รญ\97ยครซ\8d\94 `Content-Type`รฌ\9d\80 `application/json`รฌ\9cยผรซยก\9c รฌ\84ยครฌย \95รซ\90ยฉ๋‹ˆ๋‹ค.
+รฌ\9d\91รซ\8bยต รซยชยจรซ\8dยธรฌ\9d\84 รฌ\84ย รฌ\96ยธรญ\95\98รฌยง\80 รฌ\95\8aรฌ\9cยผรซยฉยด FastAPIรซ\8a\94 [JSON รญ\98ยธรญ\99\98 รชยฐ\80รซ\8aยฅ รฌ\9dยธรฌยฝ\94รซ\8d\94](../tutorial/encoder.md)รฌ\97\90รฌ\84\9c รฌ\84ยครซยช\85รญ\95\9c `jsonable_encoder`รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95ยด รซ\8dยฐรฌ\9dยดรญ\84ยฐรซยฅยผ รซยณ\80รญ\99\98รญ\95\9c รซ\92ยค `JSONResponse`รฌ\97\90 รซ\84ยฃรฌ\8aยต๋‹ˆ๋‹ค.
 
-รชยทยธรซยฆยฌรชยณย  รฌ\9dยดรซ\8a\94 OpenAPIรฌ\97\90 รชยทยธรซ\8c\80รซยก\9c รซยฌยธรฌ\84\9cรญ\99\94รซ\90ยฉรซ\8b\88รซ\8bยค.
+`JSONResponse`รฌยฒ\98รซ\9fยผ JSON รซยฏยธรซ\94\94รฌ\96ยด รญ\83\80รฌ\9e\85(`application/json`)รฌ\9d\84 รชยฐ\80รฌยง\84 `response_class`รซยฅยผ รฌ\84ย รฌ\96ยธรญ\95\98รซยฉยด, รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9dยด *รชยฒยฝรซยก\9c รฌยฒ\98รซยฆยฌ รซ\8dยฐรฌยฝ\94รซย \88รฌ\9dยดรญ\84ยฐ*รฌ\97\90รฌ\84\9c รฌ\84ย รฌ\96ยธรญ\95\9c Pydanticรฌ\9d\98 `response_model`รซยก\9c รซ\8dยฐรฌ\9dยดรญ\84ยฐรชยฐ\80 รฌ\9e\90รซ\8f\99 รซยณ\80รญ\99\98(รซยฐ\8f รญ\95\84รญ\84ยฐรซยง\81)รซ\90ยฉรซ\8b\88รซ\8bยค. รญ\95\98รฌยง\80รซยง\8c รซ\8dยฐรฌ\9dยดรญ\84ยฐรฌ\9d\98 JSON รซยฐ\94รฌ\9dยดรญ\8aยธ รฌยง\81รซย ยฌรญ\99\94 รฌ\9e\90รฌยฒยดรซ\8a\94 Pydanticรฌ\9dยด รฌ\88\98รญ\96\89รญ\95\98รฌยง\80 รฌ\95\8aรชยณย , `jsonable_encoder`รซยก\9c รซยณ\80รญ\99\98รญ\95\9c รญ\9b\84 `JSONResponse` รญ\81ยดรซ\9e\98รฌ\8aยครฌ\97\90 รฌย \84รซ\8bยฌรญ\95\98รซยฉยฐ, รชยทยธ รญ\81ยดรซ\9e\98รฌ\8aยครชยฐ\80 Python รญ\91\9cรฌยค\80 JSON รซ\9dยผรฌ\9dยดรซยธ\8cรซ\9fยฌรซยฆยฌรซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95ยด รซยฐ\94รฌ\9dยดรญ\8aยธรซยก\9c รฌยง\81รซย ยฌรญ\99\94รญ\95ยฉรซ\8b\88รซ\8bยค.
 
-///
+### JSON ์„ฑ๋Šฅ { #json-performance }
 
-/// tip | ํŒ
+์š”์•ฝํ•˜๋ฉด, ์ตœ๋Œ€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด [์‘๋‹ต ๋ชจ๋ธ](../tutorial/response-model.md)์„ ์‚ฌ์šฉํ•˜๊ณ , *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `response_class`๋ฅผ ์„ ์–ธํ•˜์ง€ ๋งˆ์„ธ์š”.
 
-`ORJSONResponse`๋Š” FastAPI์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  Starlette์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
-
-///
+{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *}
 
 ## HTML ์‘๋‹ต { #html-response }
 
 **FastAPI**์—์„œ HTML ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด `HTMLResponse`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
 
-* `HTMLResponse`๋ฅผ ์ž„ํฌํŠธ ํ•ฉ๋‹ˆ๋‹ค.
+* `HTMLResponse`๋ฅผ ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค.
 * *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์˜ `response_class` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ `HTMLResponse`๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
 
 {* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
 
 ์ด ๊ฒฝ์šฐ, HTTP ํ—ค๋” `Content-Type`์€ `text/html`๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
 
-๊ทธ๋ฆฌ๊ณ  ์ด๋Š” OpenAPI์— ๊ทธ๋Œ€๋กœ ๋ฌธ์„œํ™” ๋ฉ๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  ์ด๋Š” OpenAPI์— ๊ทธ๋Œ€๋กœ ๋ฌธ์„œํ™”๋ฉ๋‹ˆ๋‹ค.
 
 ///
 
 ### `Response` ๋ฐ˜ํ™˜ํ•˜๊ธฐ { #return-a-response }
 
-[์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md){.internal-link target=_blank}์—์„œ ๋ณธ ๊ฒƒ ์ฒ˜๋Ÿผ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+[์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์œ„์˜ ์˜ˆ์ œ์™€ ๋™์ผํ•˜๊ฒŒ `HTMLResponse`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -77,7 +61,7 @@
 
 /// warning | ๊ฒฝ๊ณ 
 
-*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ์ง์ ‘ ๋ฐ˜ํ™˜๋œ `Response`๋Š” OpenAPI์— ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ๋“ค์–ด, `Content-Type`์ด ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์Œ) ์ž๋™ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ์—์„œ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ์ง์ ‘ ๋ฐ˜ํ™˜๋œ `Response`๋Š” OpenAPI์— ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, `Content-Type`์ด ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์Œ) ๊ทธ๋ฆฌ๊ณ  ์ž๋™ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ์—๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
 ///
 
 
 ///
 
-### OpenAPI์— ๋ฌธ์„œํ™”ํ•˜๊ณ  `Response` ์žฌ์ •์˜ ํ•˜๊ธฐ { #document-in-openapi-and-override-response }
+### OpenAPI์— ๋ฌธ์„œํ™”ํ•˜๊ณ  `Response` ์žฌ์ •์˜ํ•˜๊ธฐ { #document-in-openapi-and-override-response }
 
-รญ\95ยจรฌ\88\98 รซ\82ยดรซยถ\80รฌ\97\90รฌ\84\9c รฌ\9d\91รซ\8bยตรฌ\9d\84 รฌ\9eยฌรฌย \95รฌ\9d\98รญ\95\98รซยฉยดรฌ\84\9c รซ\8f\99รฌ\8b\9cรฌ\97\90 OpenAPIรฌ\97\90รฌ\84\9c "รซยฏยธรซ\94\94รฌ\96ยด รญ\83\80รฌ\9e\85"รฌ\9d\84 รซยฌยธรฌ\84\9cรญ\99\94รญ\95\98รชยณย  รฌ\8bยถรซ\8bยครซยฉยด, `response_class` รซยงยครชยฒ\8c๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ `Response` ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+รญ\95ยจรฌ\88\98 รซ\82ยดรซยถ\80รฌ\97\90รฌ\84\9c รฌ\9d\91รซ\8bยตรฌ\9d\84 รฌ\9eยฌรฌย \95รฌ\9d\98รญ\95\98รซยฉยดรฌ\84\9c รซ\8f\99รฌ\8b\9cรฌ\97\90 OpenAPIรฌ\97\90รฌ\84\9c "รซยฏยธรซ\94\94รฌ\96ยด รญ\83\80รฌ\9e\85"รฌ\9d\84 รซยฌยธรฌ\84\9cรญ\99\94รญ\95\98รชยณย  รฌ\8bยถรซ\8bยครซยฉยด, `response_class` รซยงยครชยฐ\9c๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ `Response` ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด ๊ฒฝ์šฐ `response_class`๋Š” OpenAPI *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋˜๊ณ , ์‹ค์ œ๋กœ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐ˜ํ™˜ํ•œ `Response`๊ฐ€ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
 
-#### `HTMLResponse`์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ { #return-an-htmlresponse-directly }
+#### `HTMLResponse` ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ { #return-an-htmlresponse-directly }
 
 ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 {* ../../docs_src/custom_response/tutorial004_py310.py hl[7,21,23] *}
 
-์ด ์˜ˆ์ œ์—์„œ, `generate_html_response()` ํ•จ์ˆ˜๋Š” HTML์„ `str`๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ์ด๋ฏธ `Response`๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
+์ด ์˜ˆ์ œ์—์„œ `generate_html_response()` ํ•จ์ˆ˜๋Š” HTML์„ `str`๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ์ด๋ฏธ `Response`๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
-`generate_html_response()`๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ, ๊ธฐ๋ณธ์ ์ธ **FastAPI** ๊ธฐ๋ณธ ๋™์ž‘์„ ์žฌ์ •์˜ ํ•˜๋Š” `Response`๋ฅผ ์ด๋ฏธ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
+`generate_html_response()`๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ, ๊ธฐ๋ณธ์ ์ธ **FastAPI** ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๋Š” `Response`๋ฅผ ์ด๋ฏธ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ `response_class`์— `HTMLResponse`๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, **FastAPI**๋Š” ์ด๋ฅผ OpenAPI ๋ฐ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ์—์„œ `text/html`๋กœ HTML์„ ๋ฌธ์„œํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+ํ•˜์ง€๋งŒ `response_class`์— `HTMLResponse`๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, **FastAPI**๋Š” ์ด๋ฅผ OpenAPI ๋ฐ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ์—์„œ `text/html`์˜ HTML๋กœ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/custom-response/image01.png">
 
 ## ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‘๋‹ต๋“ค { #available-responses }
 
-๋‹ค์Œ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡๊ฐ€์ง€ ์‘๋‹ต๋“ค ์ž…๋‹ˆ๋‹ค.
+๋‹ค์Œ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‘๋‹ต๋“ค์ž…๋‹ˆ๋‹ค.
 
-`Response`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ๋„ ๋ฐ˜ํ™˜ ํ• ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์ ‘ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+`Response`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์ ‘ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
 `from starlette.responses import HTMLResponse`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-**FastAPI**๋Š” ๊ฐœ๋ฐœ์ž์ธ ์—ฌ๋Ÿฌ๋ถ„์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด `starlette.responses`๋ฅผ `fastapi.responses`๋กœ ์ œ๊ณต ํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‘๋‹ต์€ Starlette์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
+**FastAPI**๋Š” ๊ฐœ๋ฐœ์ž์ธ ์—ฌ๋Ÿฌ๋ถ„์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด `starlette.responses`๋ฅผ `fastapi.responses`๋กœ ๋™์ผํ•˜๊ฒŒ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‘๋‹ต์€ Starlette์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
 
 ///
 
 ### `Response` { #response }
 
-๊ธฐ๋ณธ `Response` ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์‘๋‹ต ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค.
+๊ธฐ๋ณธ `Response` ํด๋ž˜์Šค์ด๋ฉฐ, ๋‹ค๋ฅธ ๋ชจ๋“  ์‘๋‹ต ํด๋ž˜์Šค๊ฐ€ ์ด๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.
 
 ์ด ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 * `content` - `str` ๋˜๋Š” `bytes`.
-* `status_code` - HTTP ์ƒํƒœ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”  `int`.
+* `status_code` - HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” `int`.
 * `headers` - ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ `dict`.
 * `media_type` - ๋ฏธ๋””์–ด ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” `str` ์˜ˆ: `"text/html"`.
 
-FastAPI (์‹ค์ œ๋กœ๋Š” Starlette)๊ฐ€ ์ž๋™์œผ๋กœ Content-Length ํ—ค๋”๋ฅผ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ๋˜ํ•œ `media_type`์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ Content-Type ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํ…์ŠคํŠธ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ๋ฌธ์ž ์ง‘ํ•ฉ์„ ์ถ”๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค.
+FastAPI(์ •ํ™•ํžˆ๋Š” Starlette)๊ฐ€ ์ž๋™์œผ๋กœ Content-Length ํ—ค๋”๋ฅผ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ๋˜ํ•œ `media_type`์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ Content-Type ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํ…์ŠคํŠธ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ๋ฌธ์ž ์ง‘ํ•ฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
 
 {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
 
@@ -154,37 +138,11 @@ FastAPI (์‹ค์ œ๋กœ๋Š” Starlette)๊ฐ€ ์ž๋™์œผ๋กœ Content-Length ํ—ค๋”๋ฅผ ํฌํ•จ
 
 ์ด๋Š” ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด **FastAPI**์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์‘๋‹ต ํ˜•์‹์ž…๋‹ˆ๋‹ค.
 
-### `ORJSONResponse` { #orjsonresponse }
-
- <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ JSON ์‘๋‹ต์„ ์ œ๊ณตํ•˜๋Š” ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋‚ด์šฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
-
-/// info | ์ •๋ณด
-
-์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `orjson`์„ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: `pip install orjson`.
-
-///
-
-### `UJSONResponse` { #ujsonresponse }
-
-<a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>์„ ์‚ฌ์šฉํ•œ ๋˜ ๋‹ค๋ฅธ JSON ์‘๋‹ต ํ˜•์‹์ž…๋‹ˆ๋‹ค.
-
-/// info | ์ •๋ณด
-
-์ด ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `ujson`์„ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: `pip install ujson`.
-
-///
+/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
-/// warning | ๊ฒฝ๊ณ 
+ํ•˜์ง€๋งŒ ์‘๋‹ต ๋ชจ๋ธ ๋˜๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์„ ์–ธํ•œ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐ ์ง์ ‘ ์‚ฌ์šฉ๋˜๋ฉฐ, ์˜ฌ๋ฐ”๋ฅธ JSON ๋ฏธ๋””์–ด ํƒ€์ž…์˜ ์‘๋‹ต์ด `JSONResponse` ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
 
-`ujson` ์€ ์ผ๋ถ€ ์˜ˆ์™ธ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด Python ๋‚ด์žฅ ๊ตฌํ˜„๋ณด๋‹ค ๋œ ์—„๊ฒฉํ•ฉ๋‹ˆ๋‹ค.
-
-///
-
-{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *}
-
-/// tip | ํŒ
-
-`ORJSONResponse`๊ฐ€ ๋” ๋น ๋ฅธ ๋Œ€์•ˆ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด ๋ฐฉ์‹์ด ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์–ป๋Š” ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
 
 ///
 
@@ -192,7 +150,7 @@ FastAPI (์‹ค์ œ๋กœ๋Š” Starlette)๊ฐ€ ์ž๋™์œผ๋กœ Content-Length ํ—ค๋”๋ฅผ ํฌํ•จ
 
 HTTP ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์ฝ”๋“œ๋Š” 307(์ž„์‹œ ๋ฆฌ๋””๋ ‰์…˜)์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
 
-`RedirectResponse`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`RedirectResponse`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 {* ../../docs_src/custom_response/tutorial006_py310.py hl[2,9] *}
 
@@ -205,7 +163,7 @@ HTTP ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์ฝ”๋“œ๋Š” 30
 
 ์ด ๊ฒฝ์šฐ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ํ•จ์ˆ˜์—์„œ URL์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ด ๊ฒฝ์šฐ, ์‚ฌ์šฉ๋˜๋Š” `status_code`๋Š” `RedirectResponse`์˜ ๊ธฐ๋ณธ๊ฐ’์ธ `307` ์ž…๋‹ˆ๋‹ค.
+์ด ๊ฒฝ์šฐ, ์‚ฌ์šฉ๋˜๋Š” `status_code`๋Š” `RedirectResponse`์˜ ๊ธฐ๋ณธ๊ฐ’์ธ `307`์ž…๋‹ˆ๋‹ค.
 
 ---
 
@@ -215,31 +173,25 @@ HTTP ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์ฝ”๋“œ๋Š” 30
 
 ### `StreamingResponse` { #streamingresponse }
 
-๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๋˜๋Š” ์ผ๋ฐ˜ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ/์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์‘๋‹ต ๋ณธ๋ฌธ์„ ์ŠคํŠธ๋ฆฌ๋ฐ ํ•ฉ๋‹ˆ๋‹ค.
-
-{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *}
-
-#### ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ `StreamingResponse` { #using-streamingresponse-with-file-like-objects }
+๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๋˜๋Š” ์ผ๋ฐ˜ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ/์ดํ„ฐ๋ ˆ์ดํ„ฐ(`yield`๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜)๋ฅผ ๋ฐ›์•„ ์‘๋‹ต ๋ณธ๋ฌธ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค.
 
-<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> ๊ฐ์ฒด(์˜ˆ: `open()`์œผ๋กœ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น file-like ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต(iterate)ํ•˜๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *}
 
-์ด ๋ฐฉ์‹์œผ๋กœ, ํŒŒ์ผ ์ „์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋จผ์ € ์ฝ์–ด๋“ค์ผ ํ•„์š” ์—†์ด, ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ `StreamingResponse`์— ์ „๋‹ฌํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-
-์ด ๋ฐฉ์‹์€ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€, ๋น„๋””์˜ค ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+/// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
-{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *}
+`async` ์ž‘์—…์€ `await`์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ๋งŒ ์ทจ์†Œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `await`๊ฐ€ ์—†์œผ๋ฉด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(`yield`๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜)๋Š” ์ œ๋Œ€๋กœ ์ทจ์†Œ๋  ์ˆ˜ ์—†๊ณ , ์ทจ์†Œ๊ฐ€ ์š”์ฒญ๋œ ํ›„์—๋„ ๊ณ„์† ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-1. ์ด๊ฒƒ์ด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. `yield` ๋ฌธ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ "์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜"์ž…๋‹ˆ๋‹ค.
-2. `with` ๋ธ”๋ก์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ๋‹ซํžˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‘๋‹ต ์ „์†ก์ด ๋๋‚œ ํ›„ ๋‹ซํž™๋‹ˆ๋‹ค.
-3. ์ด `yield from`์€ ํ•จ์ˆ˜๊ฐ€ `file_like`๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต(iterate)ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ๊ฐ ๋ถ€๋ถ„์€ ์ด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜(`iterfile`)์—์„œ ์ƒ์„ฑ๋œ ๊ฒƒ์ฒ˜๋Ÿผ `yield` ๋ฉ๋‹ˆ๋‹ค.
+์ด ์ž‘์€ ์˜ˆ์ œ๋Š” ์–ด๋–ค `await`๋„ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ทจ์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด `await anyio.sleep(0)`๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
 
-    รฌ\9dยดรซย \87รชยฒ\8c รญ\95\98รซยฉยด "รฌ\83\9dรฌ\84ยฑ(generating)" รฌ\9e\91รฌ\97\85รฌ\9d\84 รซ\82ยดรซยถ\80รฌย \81รฌ\9cยผรซยก\9c รซ\8bยครซยฅยธ รซยฌยดรฌ\96ยธรชยฐ\80รฌ\97\90 รฌ\9c\84รฌ\9e\84รญ\95\98รซ\8a\94 รฌย \9cรซ\84\88รซย \88รฌ\9dยดรญ\84ยฐ รญ\95ยจรฌ\88\98รชยฐ\80 รซ\90ยฉรซ\8b\88รซ\8bยค.
+รซ\8c\80รชยท\9cรซยชยจ รซ\98\90รซ\8a\94 รซยฌยดรญ\95\9c รฌ\8aยครญ\8aยธรซยฆยผรฌ\97\90รฌ\84\9cรซ\8a\94 รซ\8d\94รฌ\9aยฑ รฌยค\91รฌ\9a\94รญ\95ยฉรซ\8b\88รซ\8bยค.
 
-    ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด `with` ๋ธ”๋ก ์•ˆ์—์„œ ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์žˆ์–ด, ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ๋‹ซํžˆ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+///
 
 /// tip | ํŒ
 
-์—ฌ๊ธฐ์„œ ํ‘œ์ค€ `open()`์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `async`์™€ `await`๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋Š” ์ผ๋ฐ˜ `def`๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
+`StreamingResponse`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹ , [๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ](./stream-data.md)์—์„œ์˜ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•˜๋ฉฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ทจ์†Œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.
+
+JSON Lines๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•œ๋‹ค๋ฉด, [JSON Lines ์ŠคํŠธ๋ฆฌ๋ฐ](../tutorial/stream-json-lines.md) ํŠœํ† ๋ฆฌ์–ผ์„ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
@@ -268,9 +220,9 @@ HTTP ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์ฝ”๋“œ๋Š” 30
 
 `Response`๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด, ํฌํ•จ๋œ `ORJSONResponse` ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์„ค์ •์œผ๋กœ <a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด, [`orjson`](https://github.com/ijl/orjson)์„ ์ผ๋ถ€ ์„ค์ •๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
 
-รซยง\8cรฌ\95ยฝ รซ\93ยครฌ\97ยฌรฌ\93ยฐรชยธยฐ รซยฐ\8f รญ\8fยฌรซยงยทรซ\90\9c JSONรฌ\9d\84 รซยฐ\98รญ\99\98รญ\95\98รชยณย  รฌ\8bยถรซ\8bยครซยฉยด, `orjson.OPT_INDENT_2` รฌ\98ยตรฌ\85\98รฌ\9d\84 ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+รซ\93ยครฌ\97ยฌรฌ\93ยฐรชยธยฐ รซยฐ\8f รญ\8fยฌรซยงยทรซ\90\9c JSONรฌ\9d\84 รซยฐ\98รญ\99\98รญ\95\98รชยณย  รฌ\8bยถรซ\8bยครซยฉยด, orjson รฌ\98ยตรฌ\85\98 `orjson.OPT_INDENT_2`รซยฅยผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 `CustomORJSONResponse`๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ `Response.render(content)` ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‚ด์šฉ์„ `bytes`๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:
 
@@ -292,13 +244,21 @@ HTTP ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์ฝ”๋“œ๋Š” 30
 
 ๋ฌผ๋ก  JSON ํฌ๋งทํŒ…๋ณด๋‹ค ๋” ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜‰
 
+### `orjson` ๋˜๋Š” ์‘๋‹ต ๋ชจ๋ธ { #orjson-or-response-model }
+
+์„ฑ๋Šฅ์ด ๋ชฉ์ ์ด๋ผ๋ฉด, `orjson` ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค [์‘๋‹ต ๋ชจ๋ธ](../tutorial/response-model.md)์„ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚˜์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
+
+์‘๋‹ต ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉด FastAPI๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„(์˜ˆ: `jsonable_encoder`๋กœ์˜ ๋ณ€ํ™˜) ์—†์ด Pydantic์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ค‘๊ฐ„ ๋‹จ๊ณ„๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
+
+๊ทธ๋ฆฌ๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ Pydantic์€ JSON ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด `orjson`๊ณผ ๋™์ผํ•œ Rust ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์‘๋‹ต ๋ชจ๋ธ๋งŒ์œผ๋กœ๋„ ์ด๋ฏธ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
+
 ## ๊ธฐ๋ณธ ์‘๋‹ต ํด๋ž˜์Šค { #default-response-class }
 
-**FastAPI** ํด๋ž˜์Šค ๊ฐ์ฒด ๋˜๋Š” `APIRouter`๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์‘๋‹ต ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+**FastAPI** ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ๋˜๋Š” `APIRouter`๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•  ์‘๋‹ต ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด๋ฅผ ์ •์˜ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” `default_response_class`์ž…๋‹ˆ๋‹ค.
 
-์•„๋ž˜ ์˜ˆ์ œ์—์„œ **FastAPI**๋Š” ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ `JSONResponse` ๋Œ€์‹  `ORJSONResponse`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
+์•„๋ž˜ ์˜ˆ์ œ์—์„œ **FastAPI**๋Š” ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ JSON ๋Œ€์‹  ๊ธฐ๋ณธ์ ์œผ๋กœ `HTMLResponse`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
 {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *}
 
@@ -310,4 +270,4 @@ HTTP ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์ฝ”๋“œ๋Š” 30
 
 ## ์ถ”๊ฐ€ ๋ฌธ์„œํ™” { #additional-documentation }
 
-OpenAPI์—์„œ `responses`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋””์–ด ํƒ€์ž… ๋ฐ ๊ธฐํƒ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: [OpenAPI์—์„œ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md){.internal-link target=_blank}.
+OpenAPI์—์„œ `responses`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋””์–ด ํƒ€์ž… ๋ฐ ๊ธฐํƒ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: [OpenAPI์—์„œ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md).
index 0210812b6eb442626e441d933c21666da6bdeb98..77e8d0464cbef492f573278a147ae32e98de3b0f 100644 (file)
@@ -2,11 +2,11 @@
 
 FastAPI๋Š” **Pydantic** ์œ„์— ๊ตฌ์ถ•๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ง€๊ธˆ๊นŒ์ง€๋Š” Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ FastAPI๋Š” <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a>๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
+ํ•˜์ง€๋งŒ FastAPI๋Š” [`dataclasses`](https://docs.python.org/3/library/dataclasses.html)๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
 
 {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
 
-์ด๋Š” **Pydantic** ๋•๋ถ„์— ์—ฌ์ „ํžˆ ์ง€์›๋˜๋Š”๋ฐ, Pydantic์ด <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses`์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ์ง€์›</a>์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
+์ด๋Š” **Pydantic** ๋•๋ถ„์— ์—ฌ์ „ํžˆ ์ง€์›๋˜๋Š”๋ฐ, Pydantic์ด [`dataclasses`์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ์ง€์›](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel)์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 
 ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ Pydantic์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, FastAPI๋Š” Pydantic์„ ์‚ฌ์šฉํ•ด ํ‘œ์ค€ dataclasses๋ฅผ Pydantic์˜ dataclasses ๋ณ€ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -18,7 +18,7 @@ FastAPI๋Š” **Pydantic** ์œ„์— ๊ตฌ์ถ•๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ง€๊ธˆ๊นŒ์ง€๋Š” Pydantic
 
 ์ด๋Š” Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Pydantic์„ ์‚ฌ์šฉํ•ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
 
-/// info | ์ •๋ณด
+/// info
 
 dataclasses๋Š” Pydantic ๋ชจ๋ธ์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
 
@@ -74,7 +74,7 @@ dataclass๋Š” ์ž๋™์œผ๋กœ Pydantic dataclass๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
 
     ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ FastAPI์—์„œ๋Š” ํ•„์š”์— ๋”ฐ๋ผ `def`์™€ `async def`๋ฅผ ์กฐํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-    ์–ด๋–ค ๊ฒƒ์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, [`async`์™€ `await`](../async.md#in-a-hurry){.internal-link target=_blank} ๋ฌธ์„œ์˜ _"๊ธ‰ํ•˜์‹ ๊ฐ€์š”?"_ ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.
+    ์–ด๋–ค ๊ฒƒ์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, [`async`์™€ `await`](../async.md#in-a-hurry) ๋ฌธ์„œ์˜ _"๊ธ‰ํ•˜์‹ ๊ฐ€์š”?"_ ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.
 
 9. ์ด *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋Š” dataclasses๋ฅผ(๋ฌผ๋ก  ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ) ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ , ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋”•์…”๋„ˆ๋ฆฌ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -88,7 +88,7 @@ dataclass๋Š” ์ž๋™์œผ๋กœ Pydantic dataclass๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
 
 `dataclasses`๋ฅผ ๋‹ค๋ฅธ Pydantic ๋ชจ๋ธ๊ณผ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜, ์ด๋ฅผ ์ƒ์†ํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋ธ์— ํฌํ•จํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/" class="external-link" target="_blank">dataclasses์— ๊ด€ํ•œ Pydantic ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [dataclasses์— ๊ด€ํ•œ Pydantic ๋ฌธ์„œ](https://docs.pydantic.dev/latest/concepts/dataclasses/)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 ## ๋ฒ„์ „ { #version }
 
index f1dd8397a0b58af69c5633328a8b0f05141f8df5..708ad443ffc8074afb6c2c4ebb4edd0b97d8e36d 100644 (file)
@@ -150,11 +150,11 @@ async with lifespan(app):
 
 ํ˜ธ๊ธฐ์‹ฌ ๋งŽ์€ ๋ถ„๋“ค์„ ์œ„ํ•œ ๊ธฐ์ˆ ์ ์ธ ์„ธ๋ถ€์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๐Ÿค“
 
-๋‚ด๋ถ€์ ์œผ๋กœ ASGI ๊ธฐ์ˆ  ์‚ฌ์–‘์—์„œ๋Š” ์ด๊ฒƒ์ด <a href="https://asgi.readthedocs.io/en/latest/specs/lifespan.html" class="external-link" target="_blank">Lifespan Protocol</a>์˜ ์ผ๋ถ€์ด๋ฉฐ, `startup`๊ณผ `shutdown`์ด๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
+๋‚ด๋ถ€์ ์œผ๋กœ ASGI ๊ธฐ์ˆ  ์‚ฌ์–‘์—์„œ๋Š” ์ด๊ฒƒ์ด [Lifespan Protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html)์˜ ์ผ๋ถ€์ด๋ฉฐ, `startup`๊ณผ `shutdown`์ด๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
 
 /// info | ์ •๋ณด
 
-Starlette `lifespan` ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด์„œ๋Š” <a href="https://www.starlette.dev/lifespan/" class="external-link" target="_blank">Starlette์˜ Lifespan ๋ฌธ์„œ</a>์—์„œ ๋” ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+Starlette `lifespan` ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด์„œ๋Š” [Starlette์˜ Lifespan ๋ฌธ์„œ](https://www.starlette.dev/lifespan/)์—์„œ ๋” ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋˜ํ•œ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” lifespan ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -162,4 +162,4 @@ Starlette `lifespan` ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด์„œ๋Š” <a href="https://www.starlette.de
 
 ## ์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ { #sub-applications }
 
-๐Ÿšจ ์ด lifespan ์ด๋ฒคํŠธ(startup ๋ฐ shutdown)๋Š” ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, [์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - Mounts](sub-applications.md){.internal-link target=_blank}์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Œ์„ ์œ ์˜ํ•˜์„ธ์š”.
+๐Ÿšจ ์ด lifespan ์ด๋ฒคํŠธ(startup ๋ฐ shutdown)๋Š” ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, [์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - Mounts](sub-applications.md)์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Œ์„ ์œ ์˜ํ•˜์„ธ์š”.
index 3cfbb7578422eb9f5cfbcbd21922b8e035ad531e..bf29e52e9ba4244416fadf6018c2d7bf8b2d8eb3 100644 (file)
@@ -8,11 +8,11 @@
 
 ## ์˜คํ”ˆ ์†Œ์Šค SDK ์ƒ์„ฑ๊ธฐ { #open-source-sdk-generators }
 
-๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์œผ๋กœ <a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a>๊ฐ€ ์žˆ์œผ๋ฉฐ, **๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**๋ฅผ ์ง€์›ํ•˜๊ณ  OpenAPI ์‚ฌ์–‘์œผ๋กœ๋ถ€ํ„ฐ SDK๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์œผ๋กœ [OpenAPI Generator](https://openapi-generator.tech/)๊ฐ€ ์žˆ์œผ๋ฉฐ, **๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**๋ฅผ ์ง€์›ํ•˜๊ณ  OpenAPI ์‚ฌ์–‘์œผ๋กœ๋ถ€ํ„ฐ SDK๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-**TypeScript ํด๋ผ์ด์–ธํŠธ**์˜ ๊ฒฝ์šฐ <a href="https://heyapi.dev/" class="external-link" target="_blank">Hey API</a>๋Š” TypeScript ์ƒํƒœ๊ณ„์— ์ตœ์ ํ™”๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ค๊ณ„๋œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
+**TypeScript ํด๋ผ์ด์–ธํŠธ**์˜ ๊ฒฝ์šฐ [Hey API](https://heyapi.dev/)๋Š” TypeScript ์ƒํƒœ๊ณ„์— ์ตœ์ ํ™”๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ค๊ณ„๋œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
 
-๋” ๋งŽ์€ SDK ์ƒ์„ฑ๊ธฐ๋Š” <a href="https://openapi.tools/#sdk" class="external-link" target="_blank">OpenAPI.Tools</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋” ๋งŽ์€ SDK ์ƒ์„ฑ๊ธฐ๋Š” [OpenAPI.Tools](https://openapi.tools/#sdk)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
@@ -24,15 +24,15 @@ FastAPI๋Š” **OpenAPI 3.1** ์‚ฌ์–‘์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉํ•˜๋Š”
 
 ์ด ์„น์…˜์—์„œ๋Š” FastAPI๋ฅผ ํ›„์›ํ•˜๋Š” ํšŒ์‚ฌ๋“ค์ด ์ œ๊ณตํ•˜๋Š” **๋ฒค์ฒ˜ ํˆฌ์ž ๊ธฐ๋ฐ˜** ๋ฐ **๊ธฐ์—… ์ง€์›** ์†”๋ฃจ์…˜์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œํ’ˆ๋“ค์€ ๊ณ ํ’ˆ์งˆ๋กœ ์ƒ์„ฑ๋œ SDK์— ๋”ํ•ด **์ถ”๊ฐ€ ๊ธฐ๋Šฅ**๊ณผ **ํ†ตํ•ฉ**์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
 
-โœจ [**FastAPI ํ›„์›ํ•˜๊ธฐ**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} โœจ๋ฅผ ํ†ตํ•ด, ์ด ํšŒ์‚ฌ๋“ค์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ทธ **์ƒํƒœ๊ณ„**๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ณ  **์ง€์† ๊ฐ€๋Šฅ**ํ•˜๊ฒŒ ์œ ์ง€๋˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
+โœจ [**FastAPI ํ›„์›ํ•˜๊ธฐ**](../help-fastapi.md#sponsor-the-author) โœจ๋ฅผ ํ†ตํ•ด, ์ด ํšŒ์‚ฌ๋“ค์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ทธ **์ƒํƒœ๊ณ„**๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ณ  **์ง€์† ๊ฐ€๋Šฅ**ํ•˜๊ฒŒ ์œ ์ง€๋˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
 
 ๋˜ํ•œ ์ด๋“ค์˜ ํ›„์›์€ FastAPI **์ปค๋ฎค๋‹ˆํ‹ฐ**(์—ฌ๋Ÿฌ๋ถ„)์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ํ—Œ์‹ ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, **์ข‹์€ ์„œ๋น„์Šค**๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ฟ ์•„๋‹ˆ๋ผ, ๊ฒฌ๊ณ ํ•˜๊ณ  ํ™œ๋ฐœํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ธ FastAPI๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ์—๋„ ๊ด€์‹ฌ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๐Ÿ™‡
 
 ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
-* <a href="https://www.stainless.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
-* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
+* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship)
+* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
+* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
 
 ์ด ์ค‘ ์ผ๋ถ€๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๊ฑฐ๋‚˜ ๋ฌด๋ฃŒ ํ‹ฐ์–ด๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๋น„์šฉ ๋ถ€๋‹ด ์—†์ด ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ƒ์šฉ SDK ์ƒ์„ฑ๊ธฐ๋„ ์žˆ์œผ๋ฉฐ ์˜จ๋ผ์ธ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
 
@@ -42,7 +42,7 @@ FastAPI๋Š” **OpenAPI 3.1** ์‚ฌ์–‘์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉํ•˜๋Š”
 
 {* ../../docs_src/generate_clients/tutorial001_py310.py hl[7:9,12:13,16:17,21] *}
 
-*path operation*์—์„œ ์š”์ฒญ ํŽ˜์ด๋กœ๋“œ์™€ ์‘๋‹ต ํŽ˜์ด๋กœ๋“œ์— ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์„ `Item`, `ResponseMessage` ๋ชจ๋ธ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์„ธ์š”.
+*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ์š”์ฒญ ํŽ˜์ด๋กœ๋“œ์™€ ์‘๋‹ต ํŽ˜์ด๋กœ๋“œ์— ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์„ `Item`, `ResponseMessage` ๋ชจ๋ธ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์„ธ์š”.
 
 ### API ๋ฌธ์„œ { #api-docs }
 
@@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
 
 ์ด ๋ช…๋ น์€ `./src/client`์— TypeScript SDK๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
 
-<a href="https://heyapi.dev/openapi-ts/get-started" class="external-link" target="_blank">`@hey-api/openapi-ts` ์„ค์น˜ ๋ฐฉ๋ฒ•</a>๊ณผ <a href="https://heyapi.dev/openapi-ts/output" class="external-link" target="_blank">์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ</a>์€ ํ•ด๋‹น ์›น์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[`@hey-api/openapi-ts` ์„ค์น˜ ๋ฐฉ๋ฒ•](https://heyapi.dev/openapi-ts/get-started)๊ณผ [์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ](https://heyapi.dev/openapi-ts/output)์€ ํ•ด๋‹น ์›น์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ### SDK ์‚ฌ์šฉํ•˜๊ธฐ { #using-the-sdk }
 
@@ -94,7 +94,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
 
 ## ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” FastAPI ์•ฑ { #fastapi-app-with-tags }
 
-๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ FastAPI ์•ฑ์€ ๋” ์ปค์ง€๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ *path operations* ๊ทธ๋ฃน์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
+๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ FastAPI ์•ฑ์€ ๋” ์ปค์ง€๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
 
 ์˜ˆ๋ฅผ ๋“ค์–ด **items** ์„น์…˜๊ณผ **users** ์„น์…˜์ด ์žˆ๊ณ , ์ด๋ฅผ ํƒœ๊ทธ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -121,9 +121,9 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
 ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
 ```
 
-...์ด๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๊ฐ *path operation*์— ๋Œ€ํ•ด OpenAPI ๋‚ด๋ถ€์˜ **operation ID**๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
+...์ด๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๊ฐ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ๋Œ€ํ•ด OpenAPI ๋‚ด๋ถ€์˜ **operation ID**๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 
-OpenAPI๋Š” ๋ชจ๋“  *path operations* ์ „์ฒด์—์„œ operation ID๊ฐ€ ๊ฐ๊ฐ ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ FastAPI๋Š” operation ID๊ฐ€ ์œ ์ผํ•˜๋„๋ก **ํ•จ์ˆ˜ ์ด๋ฆ„**, **๊ฒฝ๋กœ**, **HTTP method/operation**์„ ์กฐํ•ฉํ•ด operation ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
+OpenAPI๋Š” ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์ „์ฒด์—์„œ operation ID๊ฐ€ ๊ฐ๊ฐ ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ FastAPI๋Š” operation ID๊ฐ€ ์œ ์ผํ•˜๋„๋ก **ํ•จ์ˆ˜ ์ด๋ฆ„**, **๊ฒฝ๋กœ**, **HTTP method/operation**์„ ์กฐํ•ฉํ•ด operation ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
 
 ํ•˜์ง€๋งŒ ๋‹ค์Œ์—์„œ ์ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
 
@@ -133,15 +133,15 @@ OpenAPI๋Š” ๋ชจ๋“  *path operations* ์ „์ฒด์—์„œ operation ID๊ฐ€ ๊ฐ๊ฐ ์œ ์ผ
 
 ์ด ๊ฒฝ์šฐ operation ID๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋„ **์œ ์ผ**ํ•˜๋„๋ก ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ *path operation*์ด ํƒœ๊ทธ๋ฅผ ๊ฐ–๋„๋ก ํ•œ ๋‹ค์Œ, **ํƒœ๊ทธ**์™€ *path operation* **์ด๋ฆ„**(ํ•จ์ˆ˜ ์ด๋ฆ„)์„ ๊ธฐ๋ฐ˜์œผ๋กœ operation ID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์ด ํƒœ๊ทธ๋ฅผ ๊ฐ–๋„๋ก ํ•œ ๋‹ค์Œ, **ํƒœ๊ทธ**์™€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* **์ด๋ฆ„**(ํ•จ์ˆ˜ ์ด๋ฆ„)์„ ๊ธฐ๋ฐ˜์œผ๋กœ operation ID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ### ์œ ์ผ ID ์ƒ์„ฑ ํ•จ์ˆ˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• { #custom-generate-unique-id-function }
 
-FastAPI๋Š” ๊ฐ *path operation*์— ๋Œ€ํ•ด **์œ ์ผ ID**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋Š” **operation ID** ๋ฐ ์š”์ฒญ/์‘๋‹ต์— ํ•„์š”ํ•œ ์ปค์Šคํ…€ ๋ชจ๋ธ ์ด๋ฆ„์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
+FastAPI๋Š” ๊ฐ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ๋Œ€ํ•ด **์œ ์ผ ID**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋Š” **operation ID** ๋ฐ ์š”์ฒญ/์‘๋‹ต์— ํ•„์š”ํ•œ ์ปค์Šคํ…€ ๋ชจ๋ธ ์ด๋ฆ„์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
 
 ์ด ํ•จ์ˆ˜๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” `APIRoute`๋ฅผ ๋ฐ›์•„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ํƒœ๊ทธ(๋Œ€๋ถ€๋ถ„ ํƒœ๊ทธ๋Š” ํ•˜๋‚˜๋งŒ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)์™€ *path operation* ์ด๋ฆ„(ํ•จ์ˆ˜ ์ด๋ฆ„)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ํƒœ๊ทธ(๋Œ€๋ถ€๋ถ„ ํƒœ๊ทธ๋Š” ํ•˜๋‚˜๋งŒ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)์™€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์ด๋ฆ„(ํ•จ์ˆ˜ ์ด๋ฆ„)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
 ๊ทธ ๋‹ค์Œ ์ด ์ปค์Šคํ…€ ํ•จ์ˆ˜๋ฅผ `generate_unique_id_function` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ **FastAPI**์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -201,7 +201,7 @@ npx @hey-api/openapi-ts -i ./openapi.json -o src/client
 
 ๋˜ํ•œ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด **์ธ๋ผ์ธ ์˜ค๋ฅ˜**๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋’ค ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ **์žฌ์ƒ์„ฑ(regenerate)**ํ•˜๋ฉด, ์ƒˆ *path operations*๊ฐ€ ๋ฉ”์„œ๋“œ๋กœ ์ถ”๊ฐ€๋˜๊ณ  ๊ธฐ์กด ๊ฒƒ์€ ์ œ๊ฑฐ๋˜๋ฉฐ, ๊ทธ ๋ฐ–์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๐Ÿค“
+๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋’ค ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ **์žฌ์ƒ์„ฑ(regenerate)**ํ•˜๋ฉด, ์ƒˆ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ๋ฉ”์„œ๋“œ๋กœ ์ถ”๊ฐ€๋˜๊ณ  ๊ธฐ์กด ๊ฒƒ์€ ์ œ๊ฑฐ๋˜๋ฉฐ, ๊ทธ ๋ฐ–์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๐Ÿค“
 
 ์ด๋Š” ๋ฌด์–ธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ทธ ๋ณ€๊ฒฝ์ด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—๋„ ์ž๋™์œผ๋กœ **๋ฐ˜์˜**๋œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ๋ฅผ **๋นŒ๋“œ(build)**ํ•˜๋ฉด ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ **๋ถˆ์ผ์น˜(mismatch)**ํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
 
index 6212a7279c845514cce8663433c89bcb8de42d4f..feb91d5a6b0c82105dfb2da03b3a03b9e5f2eea0 100644 (file)
@@ -2,7 +2,7 @@
 
 ## ์ถ”๊ฐ€ ๊ธฐ๋Šฅ { #additional-features }
 
-๋ฉ”์ธ [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](../tutorial/index.md){.internal-link target=_blank}๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด **FastAPI**์˜ ๋ชจ๋“  ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๋‘˜๋Ÿฌ๋ณด์‹œ๊ธฐ์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+๋ฉ”์ธ [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](../tutorial/index.md)๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด **FastAPI**์˜ ๋ชจ๋“  ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๋‘˜๋Ÿฌ๋ณด์‹œ๊ธฐ์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ์ด์–ด์ง€๋Š” ์žฅ์—์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๋‹ค๋ฅธ ์˜ต์…˜, ๊ตฌ์„ฑ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -16,6 +16,6 @@
 
 ## ์ž์Šต์„œ๋ฅผ ๋จผ์ € ์ฝ์œผ์‹ญ์‹œ์˜ค { #read-the-tutorial-first }
 
-์—ฌ๋Ÿฌ๋ถ„์€ ๋ฉ”์ธ [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](../tutorial/index.md){.internal-link target=_blank}์˜ ์ง€์‹์œผ๋กœ **FastAPI**์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์—ฌ๋Ÿฌ๋ถ„์€ ๋ฉ”์ธ [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](../tutorial/index.md)์˜ ์ง€์‹์œผ๋กœ **FastAPI**์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด์–ด์ง€๋Š” ์žฅ๋“ค์€ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฉ”์ธ ์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ๋ฅผ ์ด๋ฏธ ์ฝ์œผ์…จ์œผ๋ฉฐ ์ฃผ์š” ์•„์ด๋””์–ด๋ฅผ ์•Œ๊ณ  ๊ณ„์‹ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
index f6f7bbc96612a60756a027e8619c62855b9b10ae..7443cf42412f4477c96e4a7847922c85f2a01b6c 100644 (file)
@@ -1,8 +1,8 @@
 # ๊ณ ๊ธ‰ Middleware { #advanced-middleware }
 
-๋ฉ”์ธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— [์ปค์Šคํ…€ Middleware](../tutorial/middleware.md){.internal-link target=_blank}๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.
+๋ฉ”์ธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— [์ปค์Šคํ…€ Middleware](../tutorial/middleware.md)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋ฆฌ๊ณ  [`CORSMiddleware`๋กœ CORS ์ฒ˜๋ฆฌํ•˜๊ธฐ](../tutorial/cors.md){.internal-link target=_blank}๋„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  [`CORSMiddleware`๋กœ CORS ์ฒ˜๋ฆฌํ•˜๊ธฐ](../tutorial/cors.md)๋„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด ์„น์…˜์—์„œ๋Š” ๋‹ค๋ฅธ middleware๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
 
@@ -91,7 +91,7 @@ HTTP Host Header ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด, ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์— 
 
 ์˜ˆ๋ฅผ ๋“ค์–ด:
 
-* <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorn์˜ `ProxyHeadersMiddleware`</a>
-* <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">MessagePack</a>
+* [Uvicorn์˜ `ProxyHeadersMiddleware`](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py)
+* [MessagePack](https://github.com/florimondmanca/msgpack-asgi)
 
-์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ middleware๋ฅผ ๋ณด๋ ค๋ฉด <a href="https://www.starlette.dev/middleware/" class="external-link" target="_blank">Starlette์˜ Middleware ๋ฌธ์„œ</a>์™€ <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">ASGI Awesome List</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ middleware๋ฅผ ๋ณด๋ ค๋ฉด [Starlette์˜ Middleware ๋ฌธ์„œ](https://www.starlette.dev/middleware/)์™€ [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
index 95f90d73cca529d64019387883b0adce8579d8d5..fa71acdcf8c18dfd0d94a72f4897d2c3e834b021 100644 (file)
@@ -35,7 +35,7 @@
 
 /// tip | ํŒ
 
-`callback_url` ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Pydantic์˜ <a href="https://docs.pydantic.dev/latest/api/networks/" class="external-link" target="_blank">Url</a> ํƒ€์ž…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
+`callback_url` ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Pydantic์˜ [Url](https://docs.pydantic.dev/latest/api/networks/) ํƒ€์ž…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
 ///
 
@@ -66,7 +66,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
 
 ์‹ค์ œ ์ฝœ๋ฐฑ์€ ๋‹จ์ง€ HTTP ์š”์ฒญ์ž…๋‹ˆ๋‹ค.
 
-์ฝœ๋ฐฑ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>๋‚˜ <a href="https://requests.readthedocs.io/" class="external-link" target="_blank">Requests</a> ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ฝœ๋ฐฑ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” [HTTPX](https://www.python-httpx.org)๋‚˜ [Requests](https://requests.readthedocs.io/) ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -106,11 +106,11 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
 ์ผ๋ฐ˜์ ์ธ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์™€์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ 2๊ฐ€์ง€์ž…๋‹ˆ๋‹ค:
 
 * ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์€ ์ด ์ฝ”๋“œ๋ฅผ ์ ˆ๋Œ€ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” *external API*๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ `pass`๋งŒ ์žˆ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.
-* *path*์—๋Š” <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression" class="external-link" target="_blank">OpenAPI 3 expression</a>(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์ฐธ๊ณ )์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด *์—ฌ๋Ÿฌ๋ถ„์˜ API*๋กœ ๋ณด๋‚ด์ง„ ์›๋ž˜ ์š”์ฒญ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ผ๋ถ€ ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+* *path*์—๋Š” [OpenAPI 3 ํ‘œํ˜„์‹](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์ฐธ๊ณ )์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด *์—ฌ๋Ÿฌ๋ถ„์˜ API*๋กœ ๋ณด๋‚ด์ง„ ์›๋ž˜ ์š”์ฒญ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ผ๋ถ€ ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ### ์ฝœ๋ฐฑ ๊ฒฝ๋กœ ํ‘œํ˜„์‹ { #the-callback-path-expression }
 
-์ฝœ๋ฐฑ *path*๋Š” *์—ฌ๋Ÿฌ๋ถ„์˜ API*๋กœ ๋ณด๋‚ด์ง„ ์›๋ž˜ ์š”์ฒญ์˜ ์ผ๋ถ€๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression" class="external-link" target="_blank">OpenAPI 3 expression</a>์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ฝœ๋ฐฑ *path*๋Š” *์—ฌ๋Ÿฌ๋ถ„์˜ API*๋กœ ๋ณด๋‚ด์ง„ ์›๋ž˜ ์š”์ฒญ์˜ ์ผ๋ถ€๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” [OpenAPI 3 ํ‘œํ˜„์‹](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด ๊ฒฝ์šฐ, ๋‹ค์Œ `str`์ž…๋‹ˆ๋‹ค:
 
@@ -179,7 +179,7 @@ https://www.external.org/events/invoices/2expen51ve
 
 ### ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ { #check-the-docs }
 
-์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ์ด๋™ํ•˜์„ธ์š”.
+์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ์ด๋™ํ•˜์„ธ์š”.
 
 *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ๋Œ€ํ•ด "Callbacks" ์„น์…˜์„ ํฌํ•จํ•œ ๋ฌธ์„œ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, *external API*๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์—ฌ์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
index 8651c4176c31e4fc73723582c6acf24bb89c0f4e..e40a7bb186d24f9f055983287facbd476f29ae4e 100644 (file)
@@ -48,7 +48,7 @@ webhook์—์„œ๋Š” ์‹ค์ œ๋กœ(`/items/` ๊ฐ™์€) *๊ฒฝ๋กœ(path)*๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š
 
 ### ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ { #check-the-docs }
 
-์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ์ด๋™ํ•˜์„ธ์š”.
+์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ์ด๋™ํ•˜์„ธ์š”.
 
 ๋ฌธ์„œ์— ์ผ๋ฐ˜์ ์ธ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ๋ณด์ด๊ณ , ์ด์ œ๋Š” ์ผ๋ถ€ **webhooks**๋„ ํ•จ๊ป˜ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
 
index da8e43bd3e50da888ef02e0724d8f7a4ceb5c55a..253a6f3021e2d9be9e301db3a660040558470ec4 100644 (file)
@@ -60,7 +60,7 @@ OpenAPI์— ์‚ฌ์šฉํ•  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์˜ docstring ์ค„ ์ˆ˜๋ฅผ ์ œํ•œํ•  
 
 ๋ชจ๋ธ, ์ƒํƒœ ์ฝ”๋“œ ๋“ฑ๊ณผ ํ•จ๊ป˜ ์ถ”๊ฐ€ ์‘๋‹ต๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ์˜ ์ „์ฒด ์žฅ์ด ์žˆ์œผ๋‹ˆ, [OpenAPI์˜ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md){.internal-link target=_blank}์—์„œ ์ฝ์–ด๋ณด์„ธ์š”.
+์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ์˜ ์ „์ฒด ์žฅ์ด ์žˆ์œผ๋‹ˆ, [OpenAPI์˜ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md)์—์„œ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## OpenAPI Extra { #openapi-extra }
 
@@ -68,7 +68,7 @@ OpenAPI์— ์‚ฌ์šฉํ•  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์˜ docstring ์ค„ ์ˆ˜๋ฅผ ์ œํ•œํ•  
 
 /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
-OpenAPI ๋ช…์„ธ์—์„œ๋Š” ์ด๋ฅผ <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object" class="external-link" target="_blank">Operation Object</a>๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
+OpenAPI ๋ช…์„ธ์—์„œ๋Š” ์ด๋ฅผ [Operation Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
 
 ///
 
@@ -82,7 +82,7 @@ OpenAPI ๋ช…์„ธ์—์„œ๋Š” ์ด๋ฅผ <a href="https://github.com/OAI/OpenAPI-Specifica
 
 ์ด๋Š” ์ €์ˆ˜์ค€ ํ™•์žฅ ์ง€์ ์ž…๋‹ˆ๋‹ค.
 
-์ถ”๊ฐ€ ์‘๋‹ต๋งŒ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค๋ฉด, ๋” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ [OpenAPI์˜ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md){.internal-link target=_blank}์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+์ถ”๊ฐ€ ์‘๋‹ต๋งŒ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค๋ฉด, ๋” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ [OpenAPI์˜ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ///
 
index 7a01e8bbc73640826726ccc76956552acbe753f7..f30474917e86b2509d1c3083de9696863f685701 100644 (file)
@@ -1,6 +1,6 @@
 # ์‘๋‹ต - ์ƒํƒœ ์ฝ”๋“œ ๋ณ€๊ฒฝ { #response-change-status-code }
 
-๊ธฐ๋ณธ [์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ ์„ค์ •](../tutorial/response-status-code.md){.internal-link target=_blank}์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑธ ์ด๋ฏธ ์•Œ๊ณ  ๊ณ„์‹ค ๊ฒ๋‹ˆ๋‹ค.
+๊ธฐ๋ณธ [์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ ์„ค์ •](../tutorial/response-status-code.md)์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑธ ์ด๋ฏธ ์•Œ๊ณ  ๊ณ„์‹ค ๊ฒ๋‹ˆ๋‹ค.
 
 ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ์„ค์ •๊ณผ ๋‹ค๋ฅธ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
 
index 4ceb25b8dbcebbeb7ccf38680e9319d2404f4518..b73d719699a53bc34853183cc381d22d54602915 100644 (file)
 
 ์ฝ”๋“œ์—์„œ `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋„ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ด๋ฅผ ์œ„ํ•ด [Response๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md){.internal-link target=_blank}์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด๋ฅผ ์œ„ํ•ด [Response๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md)์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:
 
 {* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *}
 
-/// tip | ํŒ
+/// tip
 
 `Response` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ, FastAPI๋Š” ์ด๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.
 
@@ -48,4 +48,4 @@
 
 ///
 
-์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์˜ต์…˜์€ <a href="https://www.starlette.dev/responses/#set-cookie" class="external-link" target="_blank">Starlette์˜ ๋ฌธ์„œ</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์˜ต์…˜์€ [Starlette์˜ ๋ฌธ์„œ](https://www.starlette.dev/responses/#set-cookie)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
index c43b11a4d5926083e0c76f9fec94d1fd60b448f0..301a259b2f1d0463bdf9743fc9022fb88fa5dbf3 100644 (file)
@@ -2,19 +2,23 @@
 
 **FastAPI**์—์„œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ(path operation)*๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ผ๋ฐ˜์ ์œผ๋กœ `dict`, `list`, Pydantic ๋ชจ๋ธ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๊ธฐ๋ณธ์ ์œผ๋กœ **FastAPI**๋Š” [JSON ํ˜ธํ™˜ ๊ฐ€๋Šฅ ์ธ์ฝ”๋”](../tutorial/encoder.md){.internal-link target=_blank}์— ์„ค๋ช…๋œ `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ž๋™์œผ๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
+[์‘๋‹ต ๋ชจ๋ธ](../tutorial/response-model.md)์„ ์„ ์–ธํ•˜๋ฉด FastAPI๋Š” Pydantic์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
 
-๊ทธ๋Ÿฐ ๋‹ค์Œ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” JSON ํ˜ธํ™˜ ๋ฐ์ดํ„ฐ(์˜ˆ: `dict`)๋ฅผ `JSONResponse`์— ๋„ฃ์–ด ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต์„ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
+์‘๋‹ต ๋ชจ๋ธ์„ ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด, FastAPI๋Š” [JSON ํ˜ธํ™˜ ๊ฐ€๋Šฅ ์ธ์ฝ”๋”](../tutorial/encoder.md)์— ์„ค๋ช…๋œ `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ์ด๋ฅผ `JSONResponse`์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ `JSONResponse`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋˜ํ•œ `JSONResponse`๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”๋‚˜ ์ฟ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+/// tip | ํŒ
+
+์ผ๋ฐ˜์ ์œผ๋กœ `JSONResponse`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค [์‘๋‹ต ๋ชจ๋ธ](../tutorial/response-model.md)์„ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Pydantic์ด Rust์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
+
+///
 
 ## `Response` ๋ฐ˜ํ™˜ํ•˜๊ธฐ { #return-a-response }
 
-์‚ฌ์‹ค, `Response` ๋˜๋Š” ๊ทธ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`Response` ๋˜๋Š” ๊ทธ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-/// tip | ํŒ
+/// info | ์ •๋ณด
 
 `JSONResponse` ์ž์ฒด๋„ `Response`์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
 
@@ -26,6 +30,8 @@ Pydantic ๋ชจ๋ธ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋‚ด์šฉ์„ ๋‹ค๋ฅธ
 
 ์ด๋กœ ์ธํ•ด ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด๋“  ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ ์„ ์–ธ์ด๋‚˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
+๋˜ํ•œ ๋งŽ์€ ์ฑ…์ž„๋„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ณ , ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์ด๋ฉฐ, ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+
 ## `Response`์—์„œ `jsonable_encoder` ์‚ฌ์šฉํ•˜๊ธฐ { #using-the-jsonable-encoder-in-a-response }
 
 **FastAPI**๋Š” ๋ฐ˜ํ™˜ํ•˜๋Š” `Response`์— ์•„๋ฌด๋Ÿฐ ๋ณ€๊ฒฝ๋„ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ทธ ๋‚ด์šฉ์ด ์ค€๋น„๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@@ -50,16 +56,28 @@ Pydantic ๋ชจ๋ธ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋‚ด์šฉ์„ ๋‹ค๋ฅธ
 
 ์ด์ œ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด <a href="https://en.wikipedia.org/wiki/XML" class="external-link" target="_blank">XML</a> ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด [XML](https://en.wikipedia.org/wiki/XML) ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
 
 XML ๋‚ด์šฉ์„ ๋ฌธ์ž์—ด์— ๋„ฃ๊ณ , ์ด๋ฅผ `Response`์— ๋„ฃ์–ด ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
 
+## ์‘๋‹ต ๋ชจ๋ธ ๋™์ž‘ ๋ฐฉ์‹ { #how-a-response-model-works }
+
+๊ฒฝ๋กœ ์ฒ˜๋ฆฌ์—์„œ [์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž…](../tutorial/response-model.md)์„ ์„ ์–ธํ•˜๋ฉด **FastAPI**๋Š” Pydantic์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
+
+{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
+
+์ด๋Š” Rust ์ธก์—์„œ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ, ์ผ๋ฐ˜์ ์ธ Python๊ณผ `JSONResponse` ํด๋ž˜์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.
+
+`response_model` ๋˜๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ FastAPI๋Š” `jsonable_encoder`๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜(์ด๋Š” ๋” ๋А๋ฆฝ๋‹ˆ๋‹ค)ํ•˜์ง€๋„ ์•Š๊ณ , `JSONResponse` ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
+
+๋Œ€์‹  ์‘๋‹ต ๋ชจ๋ธ(๋˜๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…)์„ ์‚ฌ์šฉํ•ด Pydantic์ด ์ƒ์„ฑํ•œ JSON ๋ฐ”์ดํŠธ๋ฅผ ๊ฐ€์ ธ์™€, JSON์— ๋งž๋Š” ๋ฏธ๋””์–ด ํƒ€์ž…(`application/json`)์„ ๊ฐ€์ง„ `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
+
 ## ์ฐธ๊ณ  ์‚ฌํ•ญ { #notes }
 
 `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ๋•Œ, ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋˜๊ฑฐ๋‚˜, ๋ณ€ํ™˜(์ง๋ ฌํ™”)๋˜๊ฑฐ๋‚˜, ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋Ÿฌ๋‚˜ [OpenAPI์—์„œ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md){.internal-link target=_blank}์—์„œ ์„ค๋ช…๋œ ๋Œ€๋กœ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๊ทธ๋Ÿฌ๋‚˜ [OpenAPI์—์„œ ์ถ”๊ฐ€ ์‘๋‹ต](additional-responses.md)์—์„œ ์„ค๋ช…๋œ ๋Œ€๋กœ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ดํ›„ ์„น์…˜์—์„œ ์ž๋™ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜, ๋ฌธ์„œํ™” ๋“ฑ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ์ •์˜ `Response`๋ฅผ ์‚ฌ์šฉํ•˜๋Š”/์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
index a4cb287fec3b8f0cede986b5db5edd21679809b1..e7157d8f48a0ad32dae65306389b2d1752b3ffc3 100644 (file)
@@ -20,7 +20,7 @@
 
 `Response`๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•  ๋•Œ์—๋„ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-[์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md){.internal-link target=_blank}์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ณ , ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜์„ธ์š”:
+[์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ](response-directly.md)์— ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ณ , ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜์„ธ์š”:
 
 {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *}
 
@@ -36,6 +36,6 @@
 
 ## ์ปค์Šคํ…€ ํ—ค๋” { #custom-headers }
 
-<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">`X-` ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ</a> ์ปค์Šคํ…€ ์‚ฌ์„ค ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
+์ปค์Šคํ…€ ์‚ฌ์„ค ํ—ค๋”๋Š” [`X-` ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
 
-ํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ปค์Šคํ…€ ํ—ค๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, CORS ์„ค์ •์— ์ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค([CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”). <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starlette์˜ CORS ๋ฌธ์„œ</a>์— ๋ฌธ์„œํ™”๋œ `expose_headers` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
+ํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ปค์Šคํ…€ ํ—ค๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, CORS ์„ค์ •์— ์ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค([CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”). [Starlette์˜ CORS ๋ฌธ์„œ](https://www.starlette.dev/middleware/#corsmiddleware)์— ๋ฌธ์„œํ™”๋œ `expose_headers` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
index 5b50c65fdaeaea74b9ea7864611a63bc2a0aeabb..273b8020504dba6277bd688c53d82973ca5bb1c7 100644 (file)
@@ -32,7 +32,7 @@ HTTP Basic Auth์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ 
 
 dependency๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜์„ธ์š”.
 
-์ด๋ฅผ ์œ„ํ•ด Python ํ‘œ์ค€ ๋ชจ๋“ˆ <a href="https://docs.python.org/3/library/secrets.html" class="external-link" target="_blank">`secrets`</a>๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
+์ด๋ฅผ ์œ„ํ•ด Python ํ‘œ์ค€ ๋ชจ๋“ˆ [`secrets`](https://docs.python.org/3/library/secrets.html)๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
 
 `secrets.compare_digest()`๋Š” `bytes` ๋˜๋Š” ASCII ๋ฌธ์ž(์˜์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž)๋งŒ ํฌํ•จํ•œ `str`์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, `Sebastiรกn`์˜ `รก` ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ์žˆ์œผ๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
@@ -52,7 +52,7 @@ if not (credentials.username == "stanleyjobson") or not (credentials.password ==
 
 ํ•˜์ง€๋งŒ `secrets.compare_digest()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด "timing attacks"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ•œ ์œ ํ˜•์˜ ๊ณต๊ฒฉ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•ด์ง‘๋‹ˆ๋‹ค.
 
-### Timing Attacks { #timing-attacks }
+### ํƒ€์ด๋ฐ ๊ณต๊ฒฉ { #timing-attacks }
 
 ๊ทธ๋ ‡๋‹ค๋ฉด "timing attack"์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?
 
index 4c7abfacc77b47dc6e7f680874d07e73b6a34e12..126e6524a3adbb4346b3ff10ca9527baf81f30d2 100644 (file)
@@ -2,7 +2,7 @@
 
 ## ์ถ”๊ฐ€ ๊ธฐ๋Šฅ { #additional-features }
 
-[ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ: ๋ณด์•ˆ](../../tutorial/security/index.md){.internal-link target=_blank}์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ ์™ธ์—๋„, ๋ณด์•ˆ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
+[ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ: ๋ณด์•ˆ](../../tutorial/security/index.md)์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ ์™ธ์—๋„, ๋ณด์•ˆ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
@@ -14,6 +14,6 @@
 
 ## ๋จผ์ € ํŠœํ† ๋ฆฌ์–ผ ์ฝ๊ธฐ { #read-the-tutorial-first }
 
-๋‹ค์Œ ์„น์…˜์€ ์ฃผ์š” [ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ: ๋ณด์•ˆ](../../tutorial/security/index.md){.internal-link target=_blank}์„ ์ด๋ฏธ ์ฝ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
+๋‹ค์Œ ์„น์…˜์€ ์ฃผ์š” [ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ: ๋ณด์•ˆ](../../tutorial/security/index.md)์„ ์ด๋ฏธ ์ฝ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
 
 ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
index 0f90f92ae932d9f867fb5a97a06c9656f2437cc7..5a785ff9fdcec46bf8ccf47041a2f36032ffa40c 100644 (file)
@@ -60,7 +60,7 @@ OAuth2 ์ž…์žฅ์—์„œ๋Š” ๊ทธ์ € ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
 
 ## ์ „์ฒด ๊ฐœ์š” { #global-view }
 
-๋จผ์ €, ๋ฉ”์ธ **ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ**์˜ [๋น„๋ฐ€๋ฒˆํ˜ธ(๋ฐ ํ•ด์‹ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OAuth2, JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” Bearer](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ์˜ˆ์ œ์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ฐ”๋€Œ๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ OAuth2 ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
+๋จผ์ €, ๋ฉ”์ธ **ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ**์˜ [๋น„๋ฐ€๋ฒˆํ˜ธ(๋ฐ ํ•ด์‹ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OAuth2, JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” Bearer](../../tutorial/security/oauth2-jwt.md) ์˜ˆ์ œ์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ฐ”๋€Œ๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ OAuth2 ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
 
 {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
 
@@ -271,4 +271,4 @@ API ๋ฌธ์„œ๋ฅผ ์—ด๋ฉด, ์ธ์ฆํ•˜๊ณ  ์ธ๊ฐ€ํ•  ์Šค์ฝ”ํ”„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต
 
 ## ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ `dependencies`์—์„œ์˜ `Security` { #security-in-decorator-dependencies }
 
-[๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์˜์กด์„ฑ](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜์— `Depends`์˜ `list`๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ๊ฑฐ๊ธฐ์—์„œ `scopes`์™€ ํ•จ๊ป˜ `Security`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+[๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์˜์กด์„ฑ](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜์— `Depends`์˜ `list`๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ๊ฑฐ๊ธฐ์—์„œ `scopes`์™€ ํ•จ๊ป˜ `Security`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
index f53006bfba9731770df50f4392bbed3fa71b257c..49a2b640e9ee420b1ee337741359ac89e4a90040 100644 (file)
@@ -8,7 +8,7 @@
 
 /// tip | ํŒ
 
-ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด [ํ™˜๊ฒฝ ๋ณ€์ˆ˜](../environment-variables.md){.internal-link target=_blank}๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด [ํ™˜๊ฒฝ ๋ณ€์ˆ˜](../environment-variables.md)๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ///
 
 
 ## Pydantic `Settings` { #pydantic-settings }
 
-๋‹คํ–‰ํžˆ Pydantic์€ <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/" class="external-link" target="_blank">Pydantic: Settings management</a>๋ฅผ ํ†ตํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ์˜ค๋Š” ์ด๋Ÿฌํ•œ ์„ค์ •์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
+๋‹คํ–‰ํžˆ Pydantic์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ์˜ค๋Š” ์ด๋Ÿฌํ•œ ์„ค์ •์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ [Pydantic: Settings ๊ด€๋ฆฌ](https://docs.pydantic.dev/latest/concepts/pydantic_settings/)๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
 
 ### `pydantic-settings` ์„ค์น˜ํ•˜๊ธฐ { #install-pydantic-settings }
 
-๋จผ์ € [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `pydantic-settings` ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”:
+๋จผ์ € [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `pydantic-settings` ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”:
 
 <div class="termy">
 
@@ -100,7 +100,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p
 
 ## ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์„ค์ • { #settings-in-another-module }
 
-[Bigger Applications - Multiple Files](../tutorial/bigger-applications.md){.internal-link target=_blank}์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ์„ค์ •์„ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ํŒŒ์ผ์— ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+[๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ](../tutorial/bigger-applications.md)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ์„ค์ •์„ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ํŒŒ์ผ์— ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์˜ˆ๋ฅผ ๋“ค์–ด `config.py` ํŒŒ์ผ์„ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -112,7 +112,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p
 
 /// tip | ํŒ
 
-[Bigger Applications - Multiple Files](../tutorial/bigger-applications.md){.internal-link target=_blank}์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ `__init__.py` ํŒŒ์ผ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
+[๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ](../tutorial/bigger-applications.md)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ `__init__.py` ํŒŒ์ผ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
 
 ///
 
@@ -172,7 +172,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p
 
 ///
 
-Pydantic์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋Ÿฐ ์œ ํ˜•์˜ ํŒŒ์ผ์—์„œ ์ฝ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+Pydantic์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋Ÿฐ ์œ ํ˜•์˜ ํŒŒ์ผ์—์„œ ์ฝ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [Pydantic Settings: Dotenv (.env) ์ง€์›](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support)์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 /// tip | ํŒ
 
@@ -197,7 +197,7 @@ APP_NAME="ChimichangApp"
 
 /// tip | ํŒ
 
-`model_config` ์†์„ฑ์€ Pydantic ์„ค์ •์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Concepts: Configuration</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+`model_config` ์†์„ฑ์€ Pydantic ์„ค์ •์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [Pydantic: ๊ฐœ๋…: ๊ตฌ์„ฑ](https://docs.pydantic.dev/latest/concepts/config/)์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 ///
 
@@ -291,7 +291,7 @@ participant execute as Execute function
 
 ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฑฐ์˜ ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜์กด์„ฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์‰ฝ๊ฒŒ overrideํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-`@lru_cache`๋Š” Python ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ `functools`์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.python.org/3/library/functools.html#functools.lru_cache" class="external-link" target="_blank">`@lru_cache`์— ๋Œ€ํ•œ Python ๋ฌธ์„œ</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`@lru_cache`๋Š” Python ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ `functools`์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ [`@lru_cache`์— ๋Œ€ํ•œ Python ๋ฌธ์„œ](https://docs.python.org/3/library/functools.html#functools.lru_cache)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ์ •๋ฆฌ { #recap }
 
index 8da217aab61714a5a46ff2793927540083575627..b592c0a39df820409c5fa5efefc5afc462fa05cd 100644 (file)
@@ -1,10 +1,10 @@
-# รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ - ๋งˆ์šดํŠธ { #sub-applications-mounts }
+# รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 - ๋งˆ์šดํŠธ { #sub-applications-mounts }
 
-รชยฐ\81รชยฐ\81รฌ\9d\98 รซ\8f\85รซยฆยฝรฌย \81รฌ\9dยธ OpenAPIรฌ\99\80 รซยฌยธรฌ\84\9c UIรซยฅยผ รชยฐ\96รซ\8a\94 รซ\91\90 รชยฐ\9cรฌ\9d\98 รซ\8f\85รซยฆยฝรฌย \81รฌ\9dยธ FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9dยด รญ\95\84รฌ\9a\94รญ\95\98รซ\8bยครซยฉยด, รซยฉ\94รฌ\9dยธ รฌ\95ยฑรฌ\9d\84 รซ\91\90รชยณย  รญ\95\98รซ\82\98(รซ\98\90รซ\8a\94 รชยทยธ รฌ\9dยดรฌ\83\81)รฌ\9d\98 รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ์„ "๋งˆ์šดํŠธ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+รชยฐ\81รชยฐ\81รฌ\9d\98 รซ\8f\85รซยฆยฝรฌย \81รฌ\9dยธ OpenAPIรฌ\99\80 รซยฌยธรฌ\84\9c UIรซยฅยผ รชยฐ\96รซ\8a\94 รซ\91\90 รชยฐ\9cรฌ\9d\98 รซ\8f\85รซยฆยฝรฌย \81รฌ\9dยธ FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9dยด รญ\95\84รฌ\9a\94รญ\95\98รซ\8bยครซยฉยด, รซยฉ\94รฌ\9dยธ รฌ\95ยฑรฌ\9d\84 รซ\91\90รชยณย  รญ\95\98รซ\82\98(รซ\98\90รซ\8a\94 รชยทยธ รฌ\9dยดรฌ\83\81)รฌ\9d\98 รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์„ "๋งˆ์šดํŠธ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งˆ์šดํŠธ { #mounting-a-fastapi-application }
 
-"รซยง\88รฌ\9aยดรญ\8aยธ"รซ\9e\80 รฌ\99\84รฌย \84รญ\9e\88 "รซ\8f\85รซยฆยฝรฌย \81รฌ\9dยธ" รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 รญ\8aยนรฌย \95 รชยฒยฝรซยก\9cรฌ\97\90 รฌยถ\94รชยฐ\80รญ\95\98รชยณย , รชยทยธ รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ์— ์„ ์–ธ๋œ _๊ฒฝ๋กœ ์ฒ˜๋ฆฌ_๋กœ ํ•ด๋‹น ๊ฒฝ๋กœ ์•„๋ž˜์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
+"รซยง\88รฌ\9aยดรญ\8aยธ"รซ\9e\80 รฌ\99\84รฌย \84รญ\9e\88 "รซ\8f\85รซยฆยฝรฌย \81รฌ\9dยธ" รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 รญ\8aยนรฌย \95 รชยฒยฝรซยก\9cรฌ\97\90 รฌยถ\94รชยฐ\80รญ\95\98รชยณย , รชยทยธ รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์— ์„ ์–ธ๋œ _๊ฒฝ๋กœ ์ฒ˜๋ฆฌ_๋กœ ํ•ด๋‹น ๊ฒฝ๋กœ ์•„๋ž˜์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
 
 ### ์ตœ์ƒ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ { #top-level-application }
 
 
 {* ../../docs_src/sub_applications/tutorial001_py310.py hl[3, 6:8] *}
 
-### รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ { #sub-application }
+### รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 { #sub-application }
 
-รชยทยธ รซ\8bยครฌ\9d\8c, รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ๊ณผ ๊ทธ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
+รชยทยธ รซ\8bยครฌ\9d\8c, รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98๊ณผ ๊ทธ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
 
-รฌ\9dยด รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ์€ ๋˜ ๋‹ค๋ฅธ ํ‘œ์ค€ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด์ง€๋งŒ, "๋งˆ์šดํŠธ"๋  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค:
+รฌ\9dยด รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์€ ๋˜ ๋‹ค๋ฅธ ํ‘œ์ค€ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด์ง€๋งŒ, "๋งˆ์šดํŠธ"๋  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค:
 
 {* ../../docs_src/sub_applications/tutorial001_py310.py hl[11, 14:16] *}
 
-### รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ ๋งˆ์šดํŠธ { #mount-the-sub-application }
+### รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 ๋งˆ์šดํŠธ { #mount-the-sub-application }
 
-รฌยต\9cรฌ\83\81รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 `app`รฌ\97\90รฌ\84\9c รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ `subapi`๋ฅผ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.
+รฌยต\9cรฌ\83\81รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 `app`รฌ\97\90รฌ\84\9c รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 `subapi`๋ฅผ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.
 
 ์ด ๊ฒฝ์šฐ `/subapi` ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค:
 
 
 ### ์ž๋™ API ๋ฌธ์„œ ํ™•์ธ { #check-the-automatic-api-docs }
 
-์ด์ œ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ `fastapi` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”:
+์ด์ œ `fastapi` ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:
 
 <div class="termy">
 
 ```console
-$ fastapi dev main.py
+$ fastapi dev
 
 <span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
 
 </div>
 
-๊ทธ๋ฆฌ๊ณ  <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”.
+๊ทธ๋ฆฌ๊ณ  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”.
 
 ๋ฉ”์ธ ์•ฑ์˜ ์ž๋™ API ๋ฌธ์„œ๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋ฉฐ, ๋ฉ”์ธ ์•ฑ ์ž์ฒด์˜ _๊ฒฝ๋กœ ์ฒ˜๋ฆฌ_๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/sub-applications/image01.png">
 
-๊ทธ ๋‹ค์Œ, <a href="http://127.0.0.1:8000/subapi/docs" class="external-link" target="_blank">http://127.0.0.1:8000/subapi/docs</a>์—์„œ ํ•˜์œ„ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”.
+๊ทธ ๋‹ค์Œ, [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs)์—์„œ ํ•˜์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”.
 
-รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจรฌ\9d\98 รฌ\9e\90รซ\8f\99 API รซยฌยธรฌ\84\9cรซยฅยผ รซยณยดรชยฒ\8c รซ\90ย  รชยฒ\83รฌ\9dยดรซยฉยฐ, รญ\95\98รฌ\9c\84 รชยฒยฝรซยก\9c รฌย \91รซ\91\90รฌ\82ยฌ `/subapi` รฌ\95\84รซ\9e\98รฌ\97\90 รฌ\98ยฌรซยฐ\94รซยฅยดรชยฒ\8c รญ\8fยฌรญ\95ยจรซ\90\9c รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ ์ž์ฒด์˜ _๊ฒฝ๋กœ ์ฒ˜๋ฆฌ_๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:
+รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\98 รฌ\9e\90รซ\8f\99 API รซยฌยธรฌ\84\9cรซยฅยผ รซยณยดรชยฒ\8c รซ\90ย  รชยฒ\83รฌ\9dยดรซยฉยฐ, รญ\95\98รฌ\9c\84 รชยฒยฝรซยก\9c รฌย \91รซ\91\90รฌ\82ยฌ `/subapi` รฌ\95\84รซ\9e\98รฌ\97\90 รฌ\98ยฌรซยฐ\94รซยฅยดรชยฒ\8c รญ\8fยฌรญ\95ยจรซ\90\9c รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 ์ž์ฒด์˜ _๊ฒฝ๋กœ ์ฒ˜๋ฆฌ_๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/sub-applications/image02.png">
 
@@ -58,10 +58,10 @@ $ fastapi dev main.py
 
 ### ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ: `root_path` { #technical-details-root-path }
 
-รฌ\9c\84รฌ\97\90รฌ\84\9c รฌ\84ยครซยช\85รญ\95\9c รซ\8c\80รซยก\9c รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจรฌ\9d\84 รซยง\88รฌ\9aยดรญ\8aยธรญ\95\98รซยฉยด, FastAPIรซ\8a\94 ASGI รซยช\85รฌ\84ยธรฌ\9d\98 รซยฉ\94รฌยปยครซ\8b\88รฌยฆ\98รฌ\9dยธ `root_path`รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95ยด รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ์— ๋Œ€ํ•œ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
+รฌ\9c\84รฌ\97\90รฌ\84\9c รฌ\84ยครซยช\85รญ\95\9c รซ\8c\80รซยก\9c รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 รซยง\88รฌ\9aยดรญ\8aยธรญ\95\98รซยฉยด, FastAPIรซ\8a\94 ASGI รซยช\85รฌ\84ยธรฌ\9d\98 รซยฉ\94รฌยปยครซ\8b\88รฌยฆ\98รฌ\9dยธ `root_path`รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95ยด รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์— ๋Œ€ํ•œ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
 
-รฌ\9dยดรซย \87รชยฒ\8c รญ\95\98รซยฉยด รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ์€ ๋ฌธ์„œ UI๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
+รฌ\9dยดรซย \87รชยฒ\8c รญ\95\98รซยฉยด รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์€ ๋ฌธ์„œ UI๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
 
-รซ\98\90รญ\95\9c รญ\95\98รฌ\9c\84 รฌ\9d\91รฌ\9aยฉรญ\94\84รซยก\9cรชยทยธรซ\9eยจ๋„ ์ž์ฒด์ ์œผ๋กœ ํ•˜์œ„ ์•ฑ์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, FastAPI๊ฐ€ ์ด ๋ชจ๋“  `root_path`๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
+รซ\98\90รญ\95\9c รญ\95\98รฌ\9c\84 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98๋„ ์ž์ฒด์ ์œผ๋กœ ํ•˜์œ„ ์•ฑ์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, FastAPI๊ฐ€ ์ด ๋ชจ๋“  `root_path`๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
 
-`root_path`์™€ ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” [ํ”„๋ก์‹œ ๋’ค](behind-a-proxy.md){.internal-link target=_blank} ์„น์…˜์—์„œ ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`root_path`์™€ ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” [ํ”„๋ก์‹œ ๋’ค](behind-a-proxy.md) ์„น์…˜์—์„œ ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
index 3ae718f153ae4aa5e3dd1d7d9de9f7e8439424f6..9c33f37e918cdd3c4f5f9fbb4c853a5cd06777ba 100644 (file)
@@ -8,7 +8,7 @@
 
 ## ์˜์กด์„ฑ ์„ค์น˜ { #install-dependencies }
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ํ›„ `jinja2`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ํ›„ `jinja2`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
 
 <div class="termy">
 
@@ -123,4 +123,4 @@ Item ID: 42
 
 ## ๋” ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ { #more-details }
 
-ํ…œํ”Œ๋ฆฟ ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ๋” ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ <a href="https://www.starlette.dev/templates/" class="external-link" target="_blank">Starlette์˜ ํ…œํ”Œ๋ฆฟ ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+ํ…œํ”Œ๋ฆฟ ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ๋” ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ [Starlette์˜ ํ…œํ”Œ๋ฆฟ ๋ฌธ์„œ](https://www.starlette.dev/templates/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
index 23ff34cd3a4d766fb68587f917fece10133a5c1c..28f131c2d12374c2e2bb52ec49987db6709b655a 100644 (file)
@@ -6,8 +6,8 @@
 
 {* ../../docs_src/app_testing/tutorial002_py310.py hl[27:31] *}
 
-/// note | ์ฐธ๊ณ 
+/// note
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ Starlette์˜ <a href="https://www.starlette.dev/testclient/#testing-websocket-sessions" class="external-link" target="_blank">WebSocket ํ…Œ์ŠคํŠธ</a> ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ Starlette์˜ [WebSocket ํ…Œ์ŠคํŠธ](https://www.starlette.dev/testclient/#testing-websocket-sessions) ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
index 0c45e2e2f862e63a5225a18e162c3a0cf2549111..7456d2a79c30850742e48e71c797837ff49f6078 100644 (file)
@@ -15,7 +15,7 @@
 
 ## `Request` ๊ฐ์ฒด์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ { #details-about-the-request-object }
 
-**FastAPI**๋Š” ์‹ค์ œ๋กœ ๋‚ด๋ถ€์— **Starlette**์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ ์œ„์— ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๋ง๋ถ™์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ํ•„์š”ํ•  ๋•Œ Starlette์˜ <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`</a> ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+**FastAPI**๋Š” ์‹ค์ œ๋กœ ๋‚ด๋ถ€์— **Starlette**์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ ์œ„์— ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๋ง๋ถ™์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ํ•„์š”ํ•  ๋•Œ Starlette์˜ [`Request`](https://www.starlette.dev/requests/) ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋˜ํ•œ ์ด๋Š” `Request` ๊ฐ์ฒด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋ณธ๋ฌธ์„ ์ฝ๊ธฐ) FastAPI๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฌธ์„œํ™”(OpenAPI๋ฅผ ํ†ตํ•œ ์ž๋™ API ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์šฉ)๋„ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -45,7 +45,7 @@
 
 ## `Request` ์„ค๋ช…์„œ { #request-documentation }
 
-์—ฌ๋Ÿฌ๋ถ„์€ <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">๊ณต์‹ Starlette ์„ค๋ช…์„œ ์‚ฌ์ดํŠธ์˜ `Request` ๊ฐ์ฒด</a>์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์—ฌ๋Ÿฌ๋ถ„์€ [`Request` ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ณต์‹ Starlette ์„ค๋ช…์„œ ์‚ฌ์ดํŠธ](https://www.starlette.dev/requests/)์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
index cb59097f6ed50f82486c70485bb40d70a4048a84..0b920c3b388e48454d329d2eaf05dbb7e18dfe4e 100644 (file)
@@ -1,10 +1,10 @@
 # WebSockets { #websockets }
 
-์—ฌ๋Ÿฌ๋ถ„์€ **FastAPI**์—์„œ <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" class="external-link" target="_blank">WebSockets</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์—ฌ๋Ÿฌ๋ถ„์€ **FastAPI**์—์„œ [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## `websockets` ์„ค์น˜ { #install-websockets }
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `websockets`("WebSocket" ํ”„๋กœํ† ์ฝœ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `websockets`("WebSocket" ํ”„๋กœํ† ์ฝœ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”:
 
 <div class="termy">
 
@@ -64,19 +64,19 @@ WebSocket ๊ฒฝ๋กœ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€๊ธฐ(`await`)ํ•˜๊ณ  ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต
 
 ## ์‹œ๋„ํ•ด๋ณด๊ธฐ { #try-it }
 
-ํŒŒ์ผ ์ด๋ฆ„์ด `main.py`๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:
+์ฝ”๋“œ๋ฅผ `main.py` ํŒŒ์ผ์— ๋„ฃ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:
 
 <div class="termy">
 
 ```console
-$ fastapi dev main.py
+$ fastapi dev
 
 <span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
 
 </div>
 
-๋ธŒ๋ผ์šฐ์ €์—์„œ <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>์„ ์—ฌ์„ธ์š”.
+๋ธŒ๋ผ์šฐ์ €์—์„œ [http://127.0.0.1:8000](http://127.0.0.1:8000)์„ ์—ฌ์„ธ์š”.
 
 ๊ฐ„๋‹จํ•œ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค:
 
@@ -115,25 +115,25 @@ WebSocket ์—”๋“œํฌ์ธํŠธ์—์„œ `fastapi`์—์„œ ๋‹ค์Œ์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  
 
 WebSocket์ด๊ธฐ ๋•Œ๋ฌธ์— `HTTPException`์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  `WebSocketException`์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
 
-๋ช…์„ธ์„œ์— ์ •์˜๋œ <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">์œ ํšจํ•œ ์ฝ”๋“œ</a>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋ช…์„ธ์„œ์— ์ •์˜๋œ [์œ ํšจํ•œ ์ฝ”๋“œ](https://tools.ietf.org/html/rfc6455#section-7.4.1)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
 ### ์ข…์†์„ฑ์„ ๊ฐ€์ง„ WebSockets ์‹œ๋„ํ•ด๋ณด๊ธฐ { #try-the-websockets-with-dependencies }
 
-ํŒŒ์ผ ์ด๋ฆ„์ด `main.py`๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:
+์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:
 
 <div class="termy">
 
 ```console
-$ fastapi dev main.py
+$ fastapi dev
 
 <span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
 
 </div>
 
-๋ธŒ๋ผ์šฐ์ €์—์„œ <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>์„ ์—ฌ์„ธ์š”.
+๋ธŒ๋ผ์šฐ์ €์—์„œ [http://127.0.0.1:8000](http://127.0.0.1:8000)์„ ์—ฌ์„ธ์š”.
 
 ์—ฌ๊ธฐ์—์„œ ๋‹ค์Œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -174,7 +174,7 @@ Client #1596980209979 left the chat
 
 ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‹จ์ผ ๋ฆฌ์ŠคํŠธ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋™์•ˆ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
 
-FastAPI์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ ๋” ๊ฒฌ๊ณ ํ•˜๊ณ  Redis, PostgreSQL ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, <a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+FastAPI์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ ๋” ๊ฒฌ๊ณ ํ•˜๊ณ  Redis, PostgreSQL ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, [encode/broadcaster](https://github.com/encode/broadcaster)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
@@ -182,5 +182,5 @@ FastAPI์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ ๋” ๊ฒฌ๊ณ ํ•˜๊ณ  Redis, PostgreSQL
 
 ๋‹ค์Œ ์˜ต์…˜์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด Starlette์˜ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”:
 
-* <a href="https://www.starlette.dev/websockets/" class="external-link" target="_blank">`WebSocket` ํด๋ž˜์Šค</a>.
-* <a href="https://www.starlette.dev/endpoints/#websocketendpoint" class="external-link" target="_blank">ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ WebSocket ์ฒ˜๋ฆฌ</a>.
+* [`WebSocket` ํด๋ž˜์Šค](https://www.starlette.dev/websockets/).
+* [ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ WebSocket ์ฒ˜๋ฆฌ](https://www.starlette.dev/endpoints/#websocketendpoint).
index 24b074443d8ac5e9f367bc473a12f894b84ff8d3..921e426efd245c062e9752e22215aaf2fcae3603 100644 (file)
@@ -1,6 +1,6 @@
 # WSGI ํฌํ•จํ•˜๊ธฐ - Flask, Django ๋“ฑ { #including-wsgi-flask-django-others }
 
-[์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ๋งˆ์šดํŠธ](sub-applications.md){.internal-link target=_blank}, [ํ”„๋ก์‹œ ๋’ค์—์„œ](behind-a-proxy.md){.internal-link target=_blank}์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ WSGI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[์„œ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ๋งˆ์šดํŠธ](sub-applications.md), [ํ”„๋ก์‹œ ๋’ค์—์„œ](behind-a-proxy.md)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ WSGI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด๋ฅผ ์œ„ํ•ด `WSGIMiddleware`๋ฅผ ์‚ฌ์šฉํ•ด WSGI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์˜ˆ: Flask, Django ๋“ฑ)์„ ๊ฐ์Œ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 
 ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€๋Š” **FastAPI**์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
 
-์‹คํ–‰ํ•˜๊ณ  <a href="http://localhost:8000/v1/" class="external-link" target="_blank">http://localhost:8000/v1/</a>๋กœ ์ด๋™ํ•˜๋ฉด Flask์˜ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+์‹คํ–‰ํ•˜๊ณ  [http://localhost:8000/v1/](http://localhost:8000/v1/)๋กœ ์ด๋™ํ•˜๋ฉด Flask์˜ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ```txt
 Hello, World from Flask!
 ```
 
-๊ทธ๋ฆฌ๊ณ  <a href="http://localhost:8000/v2" class="external-link" target="_blank">http://localhost:8000/v2</a>๋กœ ์ด๋™ํ•˜๋ฉด **FastAPI**์˜ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+๊ทธ๋ฆฌ๊ณ  [http://localhost:8000/v2](http://localhost:8000/v2)๋กœ ์ด๋™ํ•˜๋ฉด **FastAPI**์˜ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ```JSON
 {
index f26fbe39dd6981c4961ae8f129c98419972f9928..4f92f69d24ae59d9b2e7484cc3a1c6efc67c2ea5 100644 (file)
@@ -14,7 +14,7 @@
 
 ## ์ด์ „ ๋„๊ตฌ๋“ค { #previous-tools }
 
-### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a> { #django }
+### [Django](https://www.djangoproject.com/) { #django }
 
 ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Python framework์ด๋ฉฐ ๋„๋ฆฌ ์‹ ๋ขฐ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Instagram ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
 
@@ -22,7 +22,7 @@
 
 ๋ฐฑ์—”๋“œ์—์„œ HTML์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์ง€, ํ˜„๋Œ€์ ์ธ ํ”„๋ŸฐํŠธ์—”๋“œ(์˜ˆ: React, Vue.js, Angular)๋‚˜ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ(์˜ˆ: <abbr title="Internet of Things - ์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท">IoT</abbr> ๊ธฐ๊ธฐ)์—์„œ ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
 
-### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a> { #django-rest-framework }
+### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
 
 Django REST framework๋Š” Django๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Web API๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์œ ์—ฐํ•œ toolkit์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , Django์˜ API ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
 
@@ -42,7 +42,7 @@ Django REST Framework๋Š” Tom Christie๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. **FastAPI**์˜ ๊ธฐ
 
 ///
 
-### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a> { #flask }
+### [Flask](https://flask.palletsprojects.com) { #flask }
 
 Flask๋Š” "microframework"๋กœ, Django์— ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ†ตํ•ฉ์ด๋‚˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
@@ -64,7 +64,7 @@ micro-framework๊ฐ€ ๋˜๊ธฐ. ํ•„์š”ํ•œ ๋„๊ตฌ์™€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์กฐํ•ฉํ• 
 
 ///
 
-### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a> { #requests }
+### [Requests](https://requests.readthedocs.io) { #requests }
 
 **FastAPI**๋Š” ์‹ค์ œ๋กœ **Requests**์˜ ๋Œ€์•ˆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‘˜์˜ ๋ฒ”์œ„๋Š” ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
 
@@ -106,7 +106,7 @@ def read_url():
 
 ///
 
-### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a> { #swagger-openapi }
+### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi }
 
 ์ œ๊ฐ€ Django REST Framework์—์„œ ๊ฐ€์žฅ ์›ํ–ˆ๋˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ์ž๋™ API ๋ฌธ์„œํ™”์˜€์Šต๋‹ˆ๋‹ค.
 
@@ -124,8 +124,8 @@ def read_url():
 
 ๋˜ํ•œ ํ‘œ์ค€ ๊ธฐ๋ฐ˜์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ:
 
-* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>
-* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>
+* [Swagger UI](https://github.com/swagger-api/swagger-ui)
+* [ReDoc](https://github.com/Rebilly/ReDoc)
 
 ์ด ๋‘ ๊ฐ€์ง€๋Š” ๊ฝค ๋Œ€์ค‘์ ์ด๊ณ  ์•ˆ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ„๋‹จํžˆ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด OpenAPI๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ UI๊ฐ€ ์ˆ˜์‹ญ ๊ฐ€์ง€๋‚˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(**FastAPI**์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
 
@@ -135,7 +135,7 @@ def read_url():
 
 Flask REST framework๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ์ง€๋งŒ, ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์กฐ์‚ฌํ•ด ๋ณธ ๊ฒฐ๊ณผ, ์ƒ๋‹น์ˆ˜๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฐฉ์น˜๋˜์–ด ์žˆ์—ˆ๊ณ , ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ด์Šˆ ๋•Œ๋ฌธ์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
 
-### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> { #marshmallow }
+### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
 
 API ์‹œ์Šคํ…œ์— ํ•„์š”ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ "<dfn title="๋งˆ์ƒฌ๋ง, ๋ณ€ํ™˜์ด๋ผ๊ณ ๋„ ํ•จ">์ง๋ ฌํ™”</dfn>"์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ(Python)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ JSON ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, `datetime` ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
 
@@ -153,7 +153,7 @@ API์— ๋˜ ํ•˜๋‚˜ ํฌ๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์ž…๋‹ˆ๋‹ค. ํŠน์ • 
 
 ///
 
-### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> { #webargs }
+### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs }
 
 API์— ํ•„์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ํฐ ๊ธฐ๋Šฅ์€ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ <dfn title="์ฝ์–ด์„œ Python ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ">ํŒŒ์‹ฑ</dfn>ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
@@ -175,7 +175,7 @@ Webargs๋Š” Marshmallow์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
-### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a> { #apispec }
+### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec }
 
 Marshmallow์™€ Webargs๋Š” plug-in ํ˜•ํƒœ๋กœ ๊ฒ€์ฆ, parsing, serialization์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
 
@@ -205,7 +205,7 @@ API๋ฅผ ์œ„ํ•œ ์—ด๋ฆฐ ํ‘œ์ค€์ธ OpenAPI๋ฅผ ์ง€์›ํ•˜๊ธฐ.
 
 ///
 
-### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a> { #flask-apispec }
+### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec }
 
 Flask plug-in์œผ๋กœ, Webargs, Marshmallow, APISpec์„ ๋ฌถ์–ด์ค๋‹ˆ๋‹ค.
 
@@ -219,11 +219,11 @@ Flask + Flask-apispec + Marshmallow + Webargs ์กฐํ•ฉ์€ **FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ
 
 ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ Flask full-stack generator๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ์ง€๊ธˆ๊นŒ์ง€ ์ €(๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์™ธ๋ถ€ ํŒ€)๊ฐ€ ์‚ฌ์šฉํ•ด ์˜จ ์ฃผ์š” stack์ž…๋‹ˆ๋‹ค:
 
-* <a href="https://github.com/tiangolo/full-stack" class="external-link" target="_blank">https://github.com/tiangolo/full-stack</a>
-* <a href="https://github.com/tiangolo/full-stack-flask-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchbase</a>
-* <a href="https://github.com/tiangolo/full-stack-flask-couchdb" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchdb</a>
+* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack)
+* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
+* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
 
-๊ทธ๋ฆฌ๊ณ  ์ด ๋™์ผํ•œ full-stack generator๋“ค์ด [**FastAPI** Project Generators](project-generation.md){.internal-link target=_blank}์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  ์ด ๋™์ผํ•œ full-stack generator๋“ค์ด [**FastAPI** Project Generators](project-generation.md)์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
 
 /// info | ์ •๋ณด
 
@@ -237,7 +237,7 @@ serialization๊ณผ validation์„ ์ •์˜ํ•˜๋Š” ๋™์ผํ•œ ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ OpenAPI sc
 
 ///
 
-### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (๊ทธ๋ฆฌ๊ณ  <a href="https://angular.io/" class="external-link" target="_blank">Angular</a>) { #nestjs-and-angular }
+### [NestJS](https://nestjs.com/) (๊ทธ๋ฆฌ๊ณ  [Angular](https://angular.io/)) { #nestjs-and-angular }
 
 ์ด๊ฑด Python๋„ ์•„๋‹™๋‹ˆ๋‹ค. NestJS๋Š” Angular์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ JavaScript(TypeScript) NodeJS framework์ž…๋‹ˆ๋‹ค.
 
@@ -259,13 +259,13 @@ Python ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋›ฐ์–ด๋‚œ ์—๋””ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ.
 
 ///
 
-### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a> { #sanic }
+### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic }
 
 `asyncio` ๊ธฐ๋ฐ˜์˜ ๋งค์šฐ ๋น ๋ฅธ Python framework ์ค‘ ์ดˆ๊ธฐ ์‚ฌ๋ก€์˜€์Šต๋‹ˆ๋‹ค. Flask์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
 
 /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
-๊ธฐ๋ณธ Python `asyncio` ๋ฃจํ”„ ๋Œ€์‹  <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a>๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“  ์š”์ธ์ž…๋‹ˆ๋‹ค.
+[`uvloop`](https://github.com/MagicStack/uvloop)๋ฅผ ๊ธฐ๋ณธ Python `asyncio` ๋ฃจํ”„ ๋Œ€์‹  ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“  ์š”์ธ์ž…๋‹ˆ๋‹ค.
 
 ์ด๋Š” Uvicorn๊ณผ Starlette์— ๋ช…ํ™•ํžˆ ์˜๊ฐ์„ ์ฃผ์—ˆ๊ณ , ํ˜„์žฌ ๊ณต๊ฐœ benchmark์—์„œ๋Š” ์ด ๋‘˜์ด Sanic๋ณด๋‹ค ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.
 
@@ -279,7 +279,7 @@ Python ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋›ฐ์–ด๋‚œ ์—๋””ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ.
 
 ///
 
-### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> { #falcon }
+### [Falcon](https://falconframework.org/) { #falcon }
 
 Falcon์€ ๋˜ ๋‹ค๋ฅธ ๊ณ ์„ฑ๋Šฅ Python framework๋กœ, ์ตœ์†Œํ•œ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ณ  Hug ๊ฐ™์€ ๋‹ค๋ฅธ framework์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
 
@@ -297,7 +297,7 @@ Hug(= Falcon ๊ธฐ๋ฐ˜)๊ณผ ํ•จ๊ป˜, ํ•จ์ˆ˜์—์„œ `response` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ ์–ธ
 
 ///
 
-### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> { #molten }
+### [Molten](https://moltenframework.com/) { #molten }
 
 **FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•œ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ Molten์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฝค ๋น„์Šทํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ–๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:
 
@@ -321,7 +321,7 @@ Route๋Š” ํ•œ ๊ณณ์—์„œ ์„ ์–ธํ•˜๊ณ , ๋‹ค๋ฅธ ๊ณณ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ
 
 ///
 
-### <a href="https://github.com/hugapi/hug" class="external-link" target="_blank">Hug</a> { #hug }
+### [Hug](https://github.com/hugapi/hug) { #hug }
 
 Hug๋Š” Python type hints๋ฅผ ์‚ฌ์šฉํ•ด API ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ดˆ๊ธฐ framework ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๋„ ๊ฐ™์€ ๋ฐฉ์‹์„ ํ•˜๋„๋ก ์˜๊ฐ์„ ์ค€ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค.
 
@@ -337,7 +337,7 @@ OpenAPI๋‚˜ JSON Schema ๊ฐ™์€ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—
 
 /// info | ์ •๋ณด
 
-Hug๋Š” Timothy Crosley๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Python ํŒŒ์ผ์—์„œ import๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ธ <a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>์˜ ์ œ์ž‘์ž์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
+Hug๋Š” Timothy Crosley๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Python ํŒŒ์ผ์—์„œ import๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ธ [`isort`](https://github.com/timothycrosley/isort)์˜ ์ œ์ž‘์ž์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
 
 ///
 
@@ -351,7 +351,7 @@ Hug๋Š” ํ—ค๋”์™€ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜์— `response` ํŒŒ๋ผ๋ฏธํ„ฐ
 
 ///
 
-### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (<= 0.5) { #apistar-0-5 }
+### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 }
 
 **FastAPI**๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์ง์ „์— **APIStar** ์„œ๋ฒ„๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐพ๊ณ  ์žˆ๋˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์—ˆ๊ณ  ์„ค๊ณ„๋„ ํ›Œ๋ฅญํ–ˆ์Šต๋‹ˆ๋‹ค.
 
@@ -401,7 +401,7 @@ APIStar๋Š” Tom Christie๊ฐ€ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๋งŒ๋“  ์‚ฌ๋žŒ๊ณผ ๋™์ผ
 
 ## **FastAPI**๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ { #used-by-fastapi }
 
-### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> { #pydantic }
+### [Pydantic](https://docs.pydantic.dev/) { #pydantic }
 
 Pydantic์€ Python type hints๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, serialization, ๋ฌธ์„œํ™”(JSON Schema ์‚ฌ์šฉ)๋ฅผ ์ •์˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
 
@@ -417,7 +417,7 @@ Marshmallow์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ benchmark์—์„œ Marshmallow๋ณด
 
 ///
 
-### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette }
+### [Starlette](https://www.starlette.dev/) { #starlette }
 
 Starlette๋Š” ๊ฒฝ๋Ÿ‰ <dfn title="๋น„๋™๊ธฐ Python ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํ‘œ์ค€">ASGI</dfn> framework/toolkit์œผ๋กœ, ๊ณ ์„ฑ๋Šฅ asyncio ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.
 
@@ -462,7 +462,7 @@ ASGI๋Š” Django ์ฝ”์–ด ํŒ€ ๋ฉค๋ฒ„๋“ค์ด ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒˆ๋กœ์šด "ํ‘œ์ค€"์ž…๋‹ˆ๋‹ค
 
 ///
 
-### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a> { #uvicorn }
+### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn }
 
 Uvicorn์€ uvloop๊ณผ httptools๋กœ ๊ตฌ์ถ•๋œ ์ดˆ๊ณ ์† ASGI ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
 
@@ -476,10 +476,10 @@ Starlette์™€ **FastAPI**์—์„œ ๊ถŒ์žฅํ•˜๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
 
 ๋˜ํ•œ `--workers` ์ปค๋งจ๋“œ๋ผ์ธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ์„œ๋ฒ„๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ](deployment/index.md){.internal-link target=_blank} ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ](deployment/index.md) ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
 ## ๋ฒค์น˜๋งˆํฌ์™€ ์†๋„ { #benchmarks-and-speed }
 
-Uvicorn, Starlette, FastAPI ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋น„๊ตํ•˜๋ ค๋ฉด [๋ฒค์น˜๋งˆํฌ](benchmarks.md){.internal-link target=_blank} ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.
+Uvicorn, Starlette, FastAPI ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋น„๊ตํ•˜๋ ค๋ฉด [๋ฒค์น˜๋งˆํฌ](benchmarks.md) ์„น์…˜์„ ํ™•์ธํ•˜์„ธ์š”.
index 36f1ca6bf171515748af8586c01a5fdd8ddf42d7..485111fac965fc1adb149e66bea8a8a9e2cfd9d8 100644 (file)
@@ -141,7 +141,7 @@ def results():
 
 /// info | ์ •๋ณด
 
-์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. ๐ŸŽจ
+์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). ๐ŸŽจ
 
 ///
 
@@ -207,7 +207,7 @@ def results():
 
 /// info | ์ •๋ณด
 
-์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: <a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a>. ๐ŸŽจ
+์•„๋ฆ„๋‹ค์šด ์ผ๋Ÿฌ์ŠคํŠธ: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). ๐ŸŽจ
 
 ///
 
@@ -251,7 +251,7 @@ def results():
 
 ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด **FastAPI**๋กœ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค.
 
-๋˜ํ•œ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ์„ฑ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๋œ NodeJS ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์–ป๊ณ , C์— ๋” ๊ฐ€๊นŒ์šด ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go์™€ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(๋ชจ๋‘ Starlette ๋•๋ถ„์ž…๋‹ˆ๋‹ค)</a>.
+๋˜ํ•œ ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ์„ฑ์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ŠคํŠธ๋œ NodeJS ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์–ป๊ณ , C์— ๋” ๊ฐ€๊นŒ์šด ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go์™€ ๋™๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [(๋ชจ๋‘ Starlette ๋•๋ถ„์ž…๋‹ˆ๋‹ค)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1).
 
 ### ๋™์‹œ์„ฑ์ด ๋ณ‘๋ ฌ์„ฑ๋ณด๋‹ค ๋” ๋‚˜์€๊ฐ€์š”? { #is-concurrency-better-than-parallelism }
 
@@ -298,7 +298,7 @@ CPU bound ์ž‘์—…์˜ ํ”ํ•œ ์˜ˆ์‹œ๋Š” ๋ณต์žกํ•œ ์ˆ˜ํ•™ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค
 
 ์ด๊ฒƒ์€ ํŒŒ์ด์ฌ์ด **๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค**, ๋จธ์‹ ๋Ÿฌ๋‹, ํŠนํžˆ ๋”ฅ๋Ÿฌ๋‹์˜ ์ฃผ์š” ์–ธ์–ด๋ผ๋Š” ๋‹จ์ˆœํ•œ ์‚ฌ์‹ค๊ณผ ๋”ํ•ด์ ธ, FastAPI๋ฅผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค/๋จธ์‹ ๋Ÿฌ๋‹ ์›น API ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๊ทธ ์™ธ์—๋„ ๋งŽ์€ ๊ฒƒ๋“ค)์— ๋งค์šฐ ์ž˜ ๋งž๋Š” ์„ ํƒ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
 
-ํ”„๋กœ๋•์…˜์—์„œ ์ด ๋ณ‘๋ ฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด [๋ฐฐํฌ](deployment/index.md){.internal-link target=_blank} ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+ํ”„๋กœ๋•์…˜์—์„œ ์ด ๋ณ‘๋ ฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด [๋ฐฐํฌ](deployment/index.md) ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 ## `async`์™€ `await` { #async-and-await }
 
@@ -363,13 +363,13 @@ async def read_burgers():
 
 ### ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ { #write-your-own-async-code }
 
-Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a>์™€ <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> ๋ชจ๋‘์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
+Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” [AnyIO](https://anyio.readthedocs.io/en/stable/)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ [asyncio](https://docs.python.org/3/library/asyncio-task.html)์™€ [Trio](https://trio.readthedocs.io/en/stable/) ๋ชจ๋‘์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
 
-ํŠนํžˆ, ์ฝ”๋“œ์—์„œ ๋” ๊ณ ๊ธ‰ ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ๋™์‹œ์„ฑ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์ง์ ‘ <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+ํŠนํžˆ, ์ฝ”๋“œ์—์„œ ๋” ๊ณ ๊ธ‰ ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ๋™์‹œ์„ฑ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์ง์ ‘ [AnyIO](https://anyio.readthedocs.io/en/stable/)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋ฆฌ๊ณ  FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๊ทธ ์ด์ (์˜ˆ: *structured concurrency*)์„ ์–ป๊ธฐ ์œ„ํ•ด <a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a>๋กœ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๊ทธ ์ด์ (์˜ˆ: *structured concurrency*)์„ ์–ป๊ธฐ ์œ„ํ•ด [AnyIO](https://anyio.readthedocs.io/en/stable/)๋กœ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ €๋Š” AnyIO ์œ„์— ์–‡์€ ๋ ˆ์ด์–ด๋กœ ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ์กฐ๊ธˆ ๊ฐœ์„ ํ•˜๊ณ  ๋” ๋‚˜์€ **์ž๋™์™„์„ฑ**, **์ธ๋ผ์ธ ์˜ค๋ฅ˜** ๋“ฑ์„ ์–ป๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ **์ดํ•ด**ํ•˜๊ณ  **์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ**๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋•๋Š” ์นœ์ ˆํ•œ ์†Œ๊ฐœ์™€ ํŠœํ† ๋ฆฌ์–ผ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: <a href="https://asyncer.tiangolo.com/" class="external-link" target="_blank">Asyncer</a>. ํŠนํžˆ **async ์ฝ”๋“œ์™€ ์ผ๋ฐ˜**(blocking/๋™๊ธฐ) ์ฝ”๋“œ๋ฅผ **๊ฒฐํ•ฉ**ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
+์ €๋Š” AnyIO ์œ„์— ์–‡์€ ๋ ˆ์ด์–ด๋กœ ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ์กฐ๊ธˆ ๊ฐœ์„ ํ•˜๊ณ  ๋” ๋‚˜์€ **์ž๋™์™„์„ฑ**, **์ธ๋ผ์ธ ์˜ค๋ฅ˜** ๋“ฑ์„ ์–ป๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ **์ดํ•ด**ํ•˜๊ณ  **์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ async ์ฝ”๋“œ**๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋•๋Š” ์นœ์ ˆํ•œ ์†Œ๊ฐœ์™€ ํŠœํ† ๋ฆฌ์–ผ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: [Asyncer](https://asyncer.tiangolo.com/). ํŠนํžˆ **async ์ฝ”๋“œ์™€ ์ผ๋ฐ˜**(blocking/๋™๊ธฐ) ์ฝ”๋“œ๋ฅผ **๊ฒฐํ•ฉ**ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
 ### ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ํ˜•ํƒœ { #other-forms-of-asynchronous-code }
 
@@ -381,7 +381,7 @@ Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” <a href="https://anyio.readthedocs.io/en/sta
 
 ํ•˜์ง€๋งŒ ๊ทธ ์ด์ „์—๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
 
-์ด์ „ ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ๋˜๋Š” <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•˜๊ณ , ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
+์ด์ „ ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ๋˜๋Š” [Gevent](https://www.gevent.org/)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•˜๊ณ , ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
 
 ์ด์ „ ๋ฒ„์ „์˜ NodeJS/๋ธŒ๋ผ์šฐ์ € JavaScript์—์„œ๋Š” "callback"์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” "callback hell"๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
 
@@ -419,15 +419,15 @@ Starlette(๊ทธ๋ฆฌ๊ณ  **FastAPI**)๋Š” <a href="https://anyio.readthedocs.io/en/sta
 
 ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ async ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์žˆ๊ณ , ์•„์ฃผ ์ž‘์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ(์•ฝ 100 ๋‚˜๋…ธ์ดˆ)์„ ์œ„ํ•ด ๊ณ„์‚ฐ๋งŒ ํ•˜๋Š” ์‚ฌ์†Œํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*๋ฅผ ์ผ๋ฐ˜ `def`๋กœ ์ •์˜ํ•˜๊ณค ํ–ˆ๋‹ค๋ฉด, **FastAPI**์—์„œ๋Š” ๊ทธ ํšจ๊ณผ๊ฐ€ ์ •๋ฐ˜๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์—์„œ ๋ธ”๋กœํ‚น <abbr title="Input/Output - ์ž…๋ ฅ/์ถœ๋ ฅ: ๋””์Šคํฌ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ .">I/O</abbr> ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ `async def`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋Ÿผ์—๋„ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, **FastAPI**๋Š” ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค [์—ฌ์ „ํžˆ ๋” ๋น ๋ฅผ](index.md#performance){.internal-link target=_blank} ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ตœ์†Œํ•œ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค).
+๊ทธ๋Ÿผ์—๋„ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, **FastAPI**๋Š” ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค [์—ฌ์ „ํžˆ ๋” ๋น ๋ฅผ](index.md#performance) ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ตœ์†Œํ•œ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค).
 
 ### ์˜์กด์„ฑ { #dependencies }
 
-[์˜์กด์„ฑ](tutorial/dependencies/index.md){.internal-link target=_blank}์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด `async def` ๋Œ€์‹  ํ‘œ์ค€ `def` ํ•จ์ˆ˜๋ผ๋ฉด, ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
+[์˜์กด์„ฑ](tutorial/dependencies/index.md)์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด `async def` ๋Œ€์‹  ํ‘œ์ค€ `def` ํ•จ์ˆ˜๋ผ๋ฉด, ์™ธ๋ถ€ ์Šค๋ ˆ๋“œํ’€์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
 
 ### ํ•˜์œ„ ์˜์กด์„ฑ { #sub-dependencies }
 
-์„œ๋กœ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜์กด์„ฑ๊ณผ [ํ•˜์œ„ ์˜์กด์„ฑ](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}์„ ํ•จ์ˆ˜ ์ •์˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” `async def`๋กœ, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ •์ƒ ๋™์ž‘ํ•˜๋ฉฐ, ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ๋“ค์€ "await"๋˜๋Š” ๋Œ€์‹  (์Šค๋ ˆ๋“œํ’€์—์„œ) ์™ธ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
+์„œ๋กœ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜์กด์„ฑ๊ณผ [ํ•˜์œ„ ์˜์กด์„ฑ](tutorial/dependencies/sub-dependencies.md)์„ ํ•จ์ˆ˜ ์ •์˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” `async def`๋กœ, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ •์ƒ ๋™์ž‘ํ•˜๋ฉฐ, ์ผ๋ฐ˜ `def`๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ๋“ค์€ "await"๋˜๋Š” ๋Œ€์‹  (์Šค๋ ˆ๋“œํ’€์—์„œ) ์™ธ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
 
 ### ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ { #other-utility-functions }
 
index 2d4fdbeddb215fc7baf81fa7a0ba792a647be149..43c25e865fc9a62c9ab6648461412ba9d0ff2ab6 100644 (file)
@@ -1,6 +1,6 @@
 # ๋ฒค์น˜๋งˆํฌ { #benchmarks }
 
-๋…๋ฆฝ์ ์ธ TechEmpower ๋ฒค์น˜๋งˆํฌ์— ๋”ฐ๋ฅด๋ฉด **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Uvicorn์„ ์‚ฌ์šฉํ•˜์—ฌ <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜</a>๋กœ ์‹คํ–‰๋˜๋ฉฐ, Starlette์™€ Uvicorn ์ž์ฒด(๋‚ด๋ถ€์ ์œผ๋กœ FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ)๋ณด๋‹ค ์กฐ๊ธˆ ์•„๋ž˜์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
+๋…๋ฆฝ์ ์ธ TechEmpower ๋ฒค์น˜๋งˆํฌ์— ๋”ฐ๋ฅด๋ฉด **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Uvicorn์„ ์‚ฌ์šฉํ•˜์—ฌ [์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7)๋กœ ์‹คํ–‰๋˜๋ฉฐ, Starlette์™€ Uvicorn ์ž์ฒด(๋‚ด๋ถ€์ ์œผ๋กœ FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ)๋ณด๋‹ค ์กฐ๊ธˆ ์•„๋ž˜์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
 
 ๊ทธ๋Ÿฌ๋‚˜ ๋ฒค์น˜๋งˆํฌ์™€ ๋น„๊ต๋ฅผ ํ™•์ธํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
index 0705e120c4c12695fdaee2601aea1f197abdf98b..9d9dc93a3d77db1232f3d122b2c5e62cd5e72e76 100644 (file)
@@ -6,7 +6,7 @@
 
 ## FastAPI Cloud { #fastapi-cloud }
 
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
+**[FastAPI Cloud](https://fastapicloud.com)**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
 
 ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๊ตฌ์ถ•**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -16,9 +16,9 @@ FastAPI Cloud๋Š” *FastAPI and friends* ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ํ›„
 
 ## ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด - ํ›„์›์ž๋“ค { #cloud-providers-sponsors }
 
-๋‹ค๋ฅธ ๋ช‡๋ช‡ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋“ค๋„ โœจ [**FastAPI๋ฅผ ํ›„์›ํ•ฉ๋‹ˆ๋‹ค**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} โœจ. ๐Ÿ™‡
+๋‹ค๋ฅธ ๋ช‡๋ช‡ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด๋“ค๋„ โœจ [**FastAPI๋ฅผ ํ›„์›ํ•ฉ๋‹ˆ๋‹ค**](../help-fastapi.md#sponsor-the-author) โœจ. ๐Ÿ™‡
 
 ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์ด๋“ค๋„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a>
-* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a>
+* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi)
+* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi)
index dd7edd1bae79d87c9d711fca798efbd7917e9fae..a5c5e53e0d914f0088845aede95994981d8f2b49 100644 (file)
@@ -25,7 +25,7 @@
 
 ## ๋ณด์•ˆ - HTTPS { #security-https }
 
-[์ด์ „ HTTPS ์žฅ](https.md){.internal-link target=_blank}์—์„œ HTTPS๊ฐ€ API์— ์•”ํ˜ธํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
+[์ด์ „ HTTPS ์žฅ](https.md)์—์„œ HTTPS๊ฐ€ API์— ์•”ํ˜ธํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
 
 ๋˜ํ•œ HTTPS๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ๋ฐ”๊นฅ์˜ **์™ธ๋ถ€** ์ปดํฌ๋„ŒํŠธ์ธ **TLS Termination Proxy**๊ฐ€ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
 
@@ -190,7 +190,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Uvicorn์„ ์‹คํ–‰ํ•˜๋Š” `fastapi` ๋ช…๋ น ๊ฐ™์€ 
 
 ### ์›Œ์ปค ํ”„๋กœ์„ธ์Šค์™€ ํฌํŠธ { #worker-processes-and-ports }
 
-[HTTPS์— ๋Œ€ํ•œ ๋ฌธ์„œ](https.md){.internal-link target=_blank}์—์„œ, ์„œ๋ฒ„์—์„œ ํ•˜๋‚˜์˜ ํฌํŠธ์™€ IP ์ฃผ์†Œ ์กฐํ•ฉ์—๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ๋ฆฌ์Šค๋‹ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”?
+[HTTPS์— ๋Œ€ํ•œ ๋ฌธ์„œ](https.md)์—์„œ, ์„œ๋ฒ„์—์„œ ํ•˜๋‚˜์˜ ํฌํŠธ์™€ IP ์ฃผ์†Œ ์กฐํ•ฉ์—๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ๋ฆฌ์Šค๋‹ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”?
 
 ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.
 
@@ -243,7 +243,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Uvicorn์„ ์‹คํ–‰ํ•˜๋Š” `fastapi` ๋ช…๋ น ๊ฐ™์€ 
 
 **์ปจํ…Œ์ด๋„ˆ**, Docker, Kubernetes์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋‚ด์šฉ์ด ์•„์ง์€ ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
 
-๋‹ค์Œ ์žฅ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€, Docker, Kubernetes ๋“ฑ์„ ๋” ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md){.internal-link target=_blank}.
+๋‹ค์Œ ์žฅ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€, Docker, Kubernetes ๋“ฑ์„ ๋” ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md).
 
 ///
 
@@ -281,7 +281,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Uvicorn์„ ์‹คํ–‰ํ•˜๋Š” `fastapi` ๋ช…๋ น ๊ฐ™์€ 
 
 /// tip | ํŒ
 
-์ปจํ…Œ์ด๋„ˆ๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ ์žฅ์—์„œ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md){.internal-link target=_blank}.
+์ปจํ…Œ์ด๋„ˆ๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ ์žฅ์—์„œ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: [์ปจํ…Œ์ด๋„ˆ์—์„œ FastAPI - Docker](docker.md).
 
 ///
 
index ca0136d836276df76aedffcdf172a52c8eb271f3..d965af1d1eddc6ae42a855143993ee5dc7c104bc 100644 (file)
@@ -1,6 +1,6 @@
 # ์ปจํ…Œ์ด๋„ˆ์˜ FastAPI - ๋„์ปค { #fastapi-in-containers-docker }
 
-FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ **๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker**</a>๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ **๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต [**Docker**](https://www.docker.com/)๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **๋ณด์•ˆ**, **์žฌํ˜„ ๊ฐ€๋Šฅ์„ฑ**, **๋‹จ์ˆœํ•จ** ๋“ฑ ์—ฌ๋Ÿฌ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -60,16 +60,16 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
 
 Docker๋Š” **์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**์™€ **์ปจํ…Œ์ด๋„ˆ**๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
 
-๋˜ํ•œ <a href="https://hub.docker.com/" class="external-link" target="_blank">Docker Hub</a>์—๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ, ํ™˜๊ฒฝ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ **๊ณต์‹ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
+๋˜ํ•œ [Docker Hub](https://hub.docker.com/)์—๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ, ํ™˜๊ฒฝ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ **๊ณต์‹ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์‹ <a href="https://hub.docker.com/_/python" class="external-link" target="_blank">Python Image</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต์‹ [Python Image](https://hub.docker.com/_/python)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„์˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด:
 
-* <a href="https://hub.docker.com/_/postgres" class="external-link" target="_blank">PostgreSQL</a>
-* <a href="https://hub.docker.com/_/mysql" class="external-link" target="_blank">MySQL</a>
-* <a href="https://hub.docker.com/_/mongo" class="external-link" target="_blank">MongoDB</a>
-* <a href="https://hub.docker.com/_/redis" class="external-link" target="_blank">Redis</a> ๋“ฑ
+* [PostgreSQL](https://hub.docker.com/_/postgres)
+* [MySQL](https://hub.docker.com/_/mysql)
+* [MongoDB](https://hub.docker.com/_/mongo)
+* [Redis](https://hub.docker.com/_/redis) ๋“ฑ
 
 ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ **๊ฒฐํ•ฉ**ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‹œํ—˜ํ•ด ๋ณผ ๋•Œ๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ **๊ณต์‹ ์ด๋ฏธ์ง€**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
@@ -111,7 +111,7 @@ Docker๋‚˜ Kubernetes ๊ฐ™์€ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—๋Š” ์ด๋Ÿฌํ•œ
 
 ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ํŒจํ‚ค์ง€ ์ด๋ฆ„๊ณผ ๋ฒ„์ „์„ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ ์–ด ๋‘” `requirements.txt` ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
-๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” [FastAPI ๋ฒ„์ „๋“ค์— ๋Œ€ํ•˜์—ฌ](versions.md){.internal-link target=_blank}์—์„œ ์ฝ์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
+๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” [FastAPI ๋ฒ„์ „๋“ค์— ๋Œ€ํ•˜์—ฌ](versions.md)์—์„œ ์ฝ์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
 ์˜ˆ๋ฅผ ๋“ค์–ด `requirements.txt`๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -238,7 +238,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
 
 #### `CMD` ์‚ฌ์šฉํ•˜๊ธฐ - Exec Form { #use-cmd-exec-form }
 
-Docker ์ง€์‹œ์–ด <a href="https://docs.docker.com/reference/dockerfile/#cmd" class="external-link" target="_blank">`CMD`</a>๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+Docker ์ง€์‹œ์–ด [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd)๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 โœ… **Exec** form:
 
@@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
 CMD fastapi run app/main.py --port 80
 ```
 
-FastAPI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ(graceful shutdown)๋˜๊ณ  [lifespan ์ด๋ฒคํŠธ](../advanced/events.md){.internal-link target=_blank}๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ํ•˜๋ ค๋ฉด, ํ•ญ์ƒ **exec** form์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
+FastAPI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ(graceful shutdown)๋˜๊ณ  [lifespan ์ด๋ฒคํŠธ](../advanced/events.md)๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ํ•˜๋ ค๋ฉด, ํ•ญ์ƒ **exec** form์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.docker.com/reference/dockerfile/#shell-and-exec-form" class="external-link" target="_blank">shell and exec form์— ๋Œ€ํ•œ Docker ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [shell and exec form์— ๋Œ€ํ•œ Docker ๋ฌธ์„œ](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
-์ด๋Š” `docker compose`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฝค ๋ˆˆ์— ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๊ธฐ์ˆ ์ ์ธ ์ƒ์„ธ ๋‚ด์šฉ์€ Docker Compose FAQ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: <a href="https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop" class="external-link" target="_blank">Why do my services take 10 seconds to recreate or stop?</a>.
+์ด๋Š” `docker compose`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฝค ๋ˆˆ์— ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๊ธฐ์ˆ ์ ์ธ ์ƒ์„ธ ๋‚ด์šฉ์€ Docker Compose FAQ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: [Why do my services take 10 seconds to recreate or stop?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
 
 #### ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ { #directory-structure }
 
@@ -305,7 +305,7 @@ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
 
 ํŒจํ‚ค์ง€ ์˜์กด์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜๋Š” ๋ฐ์—๋Š” **๋ช‡ ๋ถ„**์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, **์บ์‹œ**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์•„์•ผ **๋ช‡ ์ดˆ**๋ฉด ๋๋‚ฉ๋‹ˆ๋‹ค.
 
-รซ\98\90รญ\95\9c รชยฐ\9cรซยฐ\9c รฌยค\91รฌ\97\90 รฌยฝ\94รซ\93\9c รซยณ\80รชยฒยฝ รฌ\82ยฌรญ\95ยญรฌ\9dยด รซ\8f\99รฌ\9e\91รญ\95\98รซ\8a\94รฌยง\80 รญ\99\95รฌ\9dยธรญ\95\98รชยธยฐ รฌ\9c\84รญ\95ยด รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88 รฌ\9dยดรซยฏยธรฌยง\80รซยฅยผ รชยณ\84รฌ\86\8d รซยน\8cรซ\93\9cรญ\95\98รชยฒ\8c รซ\90\98รซยฏ\80รซยก\9c, รฌ\9dยดรซย \87รชยฒ\8c รฌย \88รฌ\95ยฝรซ\90\98รซ\8a\94 รฌ\8b\9cรชยฐ\84รฌ\9d\80 รซ\88\84รฌย \81๋˜์–ด ์ƒ๋‹นํžˆ ์ปค์ง‘๋‹ˆ๋‹ค.
+รซ\98\90รญ\95\9c รชยฐ\9cรซยฐ\9c รฌยค\91รฌ\97\90 รฌยฝ\94รซ\93\9c รซยณ\80รชยฒยฝ รฌ\82ยฌรญ\95ยญรฌ\9dยด รซ\8f\99รฌ\9e\91รญ\95\98รซ\8a\94รฌยง\80 รญ\99\95รฌ\9dยธรญ\95\98รชยธยฐ รฌ\9c\84รญ\95ยด รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88 รฌ\9dยดรซยฏยธรฌยง\80รซยฅยผ รชยณ\84รฌ\86\8d รซยน\8cรซ\93\9cรญ\95\98รชยฒ\8c รซ\90\98รซยฏ\80รซยก\9c, รฌ\9dยดรซย \87รชยฒ\8c รฌย \88รฌ\95ยฝรซ\90\98รซ\8a\94 รฌ\8b\9cรชยฐ\84รฌ\9d\80 รซ\88\84รฌยค\91๋˜์–ด ์ƒ๋‹นํžˆ ์ปค์ง‘๋‹ˆ๋‹ค.
 
 ๊ทธ ๋‹ค์Œ `Dockerfile`์˜ ๋๋ถ€๋ถ„ ๊ทผ์ฒ˜์—์„œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ **๊ฐ€์žฅ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š”** ๋ถ€๋ถ„์ด๋ฏ€๋กœ, ๊ฑฐ์˜ ํ•ญ์ƒ ์ด ๋‹จ๊ณ„ ์ดํ›„์—๋Š” ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋๋ถ€๋ถ„์— ๋‘ก๋‹ˆ๋‹ค.
 
@@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
 
 ## ํ™•์ธํ•˜๊ธฐ { #check-it }
 
-Docker ์ปจํ…Œ์ด๋„ˆ์˜ URL์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: <a href="http://192.168.99.100/items/5?q=somequery" class="external-link" target="_blank">http://192.168.99.100/items/5?q=somequery</a> ๋˜๋Š” <a href="http://127.0.0.1/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1/items/5?q=somequery</a>(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
+Docker ์ปจํ…Œ์ด๋„ˆ์˜ URL์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ๋˜๋Š” [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery)(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
 
 ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:
 
@@ -362,17 +362,17 @@ Docker ์ปจํ…Œ์ด๋„ˆ์˜ URL์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค
 
 ## ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ API ๋ฌธ์„œ { #interactive-api-docs }
 
-์ด์ œ <a href="http://192.168.99.100/docs" class="external-link" target="_blank">http://192.168.99.100/docs</a> ๋˜๋Š” <a href="http://127.0.0.1/docs" class="external-link" target="_blank">http://127.0.0.1/docs</a>(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด์ œ [http://192.168.99.100/docs](http://192.168.99.100/docs) ๋˜๋Š” [http://127.0.0.1/docs](http://127.0.0.1/docs)(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ API ๋ฌธ์„œ(<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ API ๋ฌธ์„œ([Swagger UI](https://github.com/swagger-api/swagger-ui) ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
 
 ## ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs }
 
-๋˜ํ•œ <a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> ๋˜๋Š” <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a>(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋˜ํ•œ [http://192.168.99.100/redoc](http://192.168.99.100/redoc) ๋˜๋Š” [http://127.0.0.1/redoc](http://127.0.0.1/redoc)(๋˜๋Š” Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋™๋“ฑํ•˜๊ฒŒ ์ ‘๊ทผ)๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๋Œ€์•ˆ ์ž๋™ ๋ฌธ์„œ(<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+๋Œ€์•ˆ ์ž๋™ ๋ฌธ์„œ([ReDoc](https://github.com/Rebilly/ReDoc) ์ œ๊ณต)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
 
@@ -413,7 +413,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
 
 ## ๋ฐฐํฌ ๊ฐœ๋… { #deployment-concepts }
 
-์ปจํ…Œ์ด๋„ˆ ๊ด€์ ์—์„œ ๊ฐ™์€ [๋ฐฐํฌ ๊ฐœ๋…](concepts.md){.internal-link target=_blank}๋“ค์„ ๋‹ค์‹œ ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค.
+์ปจํ…Œ์ด๋„ˆ ๊ด€์ ์—์„œ ๊ฐ™์€ [๋ฐฐํฌ ๊ฐœ๋…](concepts.md)๋“ค์„ ๋‹ค์‹œ ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค.
 
 ์ปจํ…Œ์ด๋„ˆ๋Š” ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ** ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋„๊ตฌ์ด์ง€๋งŒ, ์ด๋Ÿฌํ•œ **๋ฐฐํฌ ๊ฐœ๋…**์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํŠน์ • ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐ•์ œํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ, ๊ฐ€๋Šฅํ•œ ์ „๋žต์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
 
@@ -432,7 +432,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
 
 FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€**(๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ์‹คํ–‰ ์ค‘์ธ **์ปจํ…Œ์ด๋„ˆ**)์—๋งŒ ์ง‘์ค‘ํ•œ๋‹ค๋ฉด, HTTPS๋Š” ๋ณดํ†ต ๋‹ค๋ฅธ ๋„๊ตฌ์— ์˜ํ•ด **์™ธ๋ถ€์ ์œผ๋กœ** ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ **HTTPS**์™€ **์ธ์ฆ์„œ**์˜ **์ž๋™** ํš๋“์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด [Traefik](https://traefik.io/)์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ **HTTPS**์™€ **์ธ์ฆ์„œ**์˜ **์ž๋™** ํš๋“์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
@@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
 
 /// info | ์ •๋ณด
 
-Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init Container</a>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ///
 
@@ -570,7 +570,7 @@ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ <a href="https://kubernetes.io/d
 
 ### ๋ฒ ์ด์Šค ๋„์ปค ์ด๋ฏธ์ง€ { #base-docker-image }
 
-๊ณผ๊ฑฐ์—๋Š” ๊ณต์‹ FastAPI Docker ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>. ํ•˜์ง€๋งŒ ์ด์ œ๋Š” deprecated๋˜์—ˆ์Šต๋‹ˆ๋‹ค. โ›”๏ธ
+๊ณผ๊ฑฐ์—๋Š” ๊ณต์‹ FastAPI Docker ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). ํ•˜์ง€๋งŒ ์ด์ œ๋Š” deprecated๋˜์—ˆ์Šต๋‹ˆ๋‹ค. โ›”๏ธ
 
 ์•„๋งˆ๋„ ์ด ๋ฒ ์ด์Šค ๋„์ปค ์ด๋ฏธ์ง€(๋˜๋Š” ์œ ์‚ฌํ•œ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€)๋Š” **์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”** ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
 
@@ -600,7 +600,7 @@ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋Š” ์•„๋งˆ๋„ <a href="https://kubernetes.io/d
 
 ## `uv`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„์ปค ์ด๋ฏธ์ง€ { #docker-image-with-uv }
 
-ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, <a href="https://docs.astral.sh/uv/guides/integration/docker/" class="external-link" target="_blank">uv Docker guide</a>๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, [uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/)๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ์š”์•ฝ { #recap }
 
index 9a830b15797bbd01f256e62100c69f73bcc189e1..a601f5416c01ac2df8299869d5ce76a90be43bc7 100644 (file)
@@ -1,6 +1,6 @@
 # FastAPI Cloud { #fastapi-cloud }
 
-**ํ•œ ๋ฒˆ์˜ ๋ช…๋ น**์œผ๋กœ FastAPI ์•ฑ์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€
+**ํ•œ ๋ฒˆ์˜ ๋ช…๋ น**์œผ๋กœ FastAPI ์•ฑ์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€
 
 ## ๋กœ๊ทธ์ธํ•˜๊ธฐ { #login }
 
@@ -40,7 +40,7 @@ Deploying to FastAPI Cloud...
 
 ## FastAPI Cloud ์†Œ๊ฐœ { #about-fastapi-cloud }
 
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ €์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
+**[FastAPI Cloud](https://fastapicloud.com)**๋Š” **FastAPI**๋ฅผ ๋งŒ๋“  ๋™์ผํ•œ ์ €์ž์™€ ํŒ€์ด ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
 
 ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๊ตฌ์ถ•**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
 
index bda942af6839ebd1b896d45579783d856fdb910d..06ac147cdc17a1aa43b04db33ebb4160e18975ec 100644 (file)
@@ -10,7 +10,7 @@ HTTPS๋Š” ๊ทธ๋ƒฅ โ€œ์ผœ์ ธ ์žˆ๊ฑฐ๋‚˜โ€ ์•„๋‹ˆ๋ฉด โ€œ๊บผ์ ธ ์žˆ๋Š”โ€ ๊ฒƒ์ด๋ผ
 
 ///
 
-์†Œ๋น„์ž ๊ด€์ ์—์„œ **HTTPS์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๋ ค๋ฉด** <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+์†Œ๋น„์ž ๊ด€์ ์—์„œ **HTTPS์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๋ ค๋ฉด** [https://howhttps.works/](https://howhttps.works/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ์ด์ œ **๊ฐœ๋ฐœ์ž ๊ด€์ **์—์„œ HTTPS๋ฅผ ์ƒ๊ฐํ•  ๋•Œ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -28,13 +28,13 @@ HTTPS๋Š” ๊ทธ๋ƒฅ โ€œ์ผœ์ ธ ์žˆ๊ฑฐ๋‚˜โ€ ์•„๋‹ˆ๋ฉด โ€œ๊บผ์ ธ ์žˆ๋Š”โ€ ๊ฒƒ์ด๋ผ
 * **๊ธฐ๋ณธ์ ์œผ๋กœ** ์ด๋Š” IP ์ฃผ์†Œ ํ•˜๋‚˜๋‹น **HTTPS ์ธ์ฆ์„œ ํ•˜๋‚˜๋งŒ** ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
     * ์„œ๋ฒ„๊ฐ€ ์•„๋ฌด๋ฆฌ ํฌ๋“ , ๊ทธ ์œ„์— ์˜ฌ๋ฆฐ ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋ฌด๋ฆฌ ์ž‘๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.
     * ํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•œ **ํ•ด๊ฒฐ์ฑ…**์ด ์žˆ์Šต๋‹ˆ๋‹ค.
-* **TLS** ํ”„๋กœํ† ์ฝœ(HTTP ์ด์ „, TCP ๋ ˆ๋ฒจ์—์„œ ์•”ํ˜ธํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ **ํ™•์žฅ** ์ค‘์— **<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Server Name Indication - ์„œ๋ฒ„ ์ด๋ฆ„ ํ‘œ์‹œ">SNI</abbr></a>**๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
+* **TLS** ํ”„๋กœํ† ์ฝœ(HTTP ์ด์ „, TCP ๋ ˆ๋ฒจ์—์„œ ์•”ํ˜ธํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ **ํ™•์žฅ** ์ค‘์— **[<abbr title="Server Name Indication - ์„œ๋ฒ„ ์ด๋ฆ„ ํ‘œ์‹œ">SNI</abbr>](https://en.wikipedia.org/wiki/Server_Name_Indication)**๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
     * ์ด SNI ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹จ์ผ ์„œ๋ฒ„(**๋‹จ์ผ IP ์ฃผ์†Œ**)์—์„œ **์—ฌ๋Ÿฌ HTTPS ์ธ์ฆ์„œ**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  **์—ฌ๋Ÿฌ HTTPS ๋„๋ฉ”์ธ/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜**์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
     * ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„์—์„œ **๊ณต๊ฐœ IP ์ฃผ์†Œ**๋กœ ๋ฆฌ์Šค๋‹ํ•˜๋Š” **ํ•˜๋‚˜์˜** ์ปดํฌ๋„ŒํŠธ(ํ”„๋กœ๊ทธ๋žจ)๊ฐ€ ์„œ๋ฒ„์— ์žˆ๋Š” **๋ชจ๋“  HTTPS ์ธ์ฆ์„œ**์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 * ๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ์–ป์€ **์ดํ›„์—๋„**, ํ†ต์‹  ํ”„๋กœํ† ์ฝœ ์ž์ฒด๋Š” **์—ฌ์ „ํžˆ HTTP**์ž…๋‹ˆ๋‹ค.
     * **HTTP ํ”„๋กœํ† ์ฝœ**๋กœ ์ „์†ก๋˜๋”๋ผ๋„, ๋‚ด์šฉ์€ **์•”ํ˜ธํ™”**๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„(๋จธ์‹ , ํ˜ธ์ŠคํŠธ ๋“ฑ)์—๋Š” **ํ”„๋กœ๊ทธ๋žจ/HTTP ์„œ๋ฒ„ ํ•˜๋‚˜**๋ฅผ ์‹คํ–‰ํ•ด **HTTPS ๊ด€๋ จ ๋ถ€๋ถ„ ์ „์ฒด**๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค: **์•”ํ˜ธํ™”๋œ HTTPS ์š”์ฒญ**์„ ๋ฐ›๊ณ , ๋ณตํ˜ธํ™”๋œ **HTTP ์š”์ฒญ**์„ ๊ฐ™์€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ์‹ค์ œ HTTP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ด ๊ฒฝ์šฐ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **HTTP ์‘๋‹ต**์„ ๋ฐ›์•„ ์ ์ ˆํ•œ **HTTPS ์ธ์ฆ์„œ**๋กœ **์•”ํ˜ธํ™”**ํ•œ ๋’ค **HTTPS**๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์„œ๋ฒ„๋ฅผ ํ”ํžˆ **<a href="https://en.wikipedia.org/wiki/TLS_termination_proxy" class="external-link" target="_blank">TLS Termination Proxy</a>**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
+์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„(๋จธ์‹ , ํ˜ธ์ŠคํŠธ ๋“ฑ)์—๋Š” **ํ”„๋กœ๊ทธ๋žจ/HTTP ์„œ๋ฒ„ ํ•˜๋‚˜**๋ฅผ ์‹คํ–‰ํ•ด **HTTPS ๊ด€๋ จ ๋ถ€๋ถ„ ์ „์ฒด**๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค: **์•”ํ˜ธํ™”๋œ HTTPS ์š”์ฒญ**์„ ๋ฐ›๊ณ , ๋ณตํ˜ธํ™”๋œ **HTTP ์š”์ฒญ**์„ ๊ฐ™์€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ์‹ค์ œ HTTP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ด ๊ฒฝ์šฐ **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **HTTP ์‘๋‹ต**์„ ๋ฐ›์•„ ์ ์ ˆํ•œ **HTTPS ์ธ์ฆ์„œ**๋กœ **์•”ํ˜ธํ™”**ํ•œ ๋’ค **HTTPS**๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์„œ๋ฒ„๋ฅผ ํ”ํžˆ **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
 
 TLS Termination Proxy๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
 
@@ -49,7 +49,7 @@ Let's Encrypt ์ด์ „์—๋Š” ์ด๋Ÿฌํ•œ **HTTPS ์ธ์ฆ์„œ**๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”
 
 ์ธ์ฆ์„œ๋ฅผ ํš๋“ํ•˜๋Š” ๊ณผ์ •์€ ๋ฒˆ๊ฑฐ๋กญ๊ณ , ๊ฝค ๋งŽ์€ ์„œ๋ฅ˜ ์ž‘์—…์ด ํ•„์š”ํ–ˆ์œผ๋ฉฐ, ์ธ์ฆ์„œ๋„ ์ƒ๋‹นํžˆ ๋น„์ŒŒ์Šต๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ ๊ทธ ํ›„ **<a href="https://letsencrypt.org/" class="external-link" target="_blank">Let's Encrypt</a>**๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
+ํ•˜์ง€๋งŒ ๊ทธ ํ›„ **[Let's Encrypt](https://letsencrypt.org/)**๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
 
 ์ด๋Š” Linux Foundation์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ ์•”ํ˜ธํ•™์  ๋ณด์•ˆ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” **HTTPS ์ธ์ฆ์„œ**๋ฅผ **๋ฌด๋ฃŒ๋กœ**, ์ž๋™ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋“ค์€ ์ˆ˜๋ช…์ด ์งง๊ณ (์•ฝ 3๊ฐœ์›”) ๊ทธ๋ž˜์„œ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง์€ ๋งŒํผ **์‹ค์ œ๋กœ ๋ณด์•ˆ์ด ๋” ์ข‹์•„์ง€๊ธฐ๋„** ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -200,9 +200,9 @@ TLS Termination Proxy๋Š” ํ•ฉ์˜๋œ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•ด **์š”์ฒญ์„ ๋ณตํ˜ธํ™”*
 
 ํ”„๋ก์‹œ ํ—ค๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" class="external-link" target="_blank">X-Forwarded-For</a>
-* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto" class="external-link" target="_blank">X-Forwarded-Proto</a>
-* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host" class="external-link" target="_blank">X-Forwarded-Host</a>
+* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
+* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
+* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
 
 ///
 
@@ -218,7 +218,7 @@ TLS Termination Proxy๋Š” ํ•ฉ์˜๋œ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•ด **์š”์ฒญ์„ ๋ณตํ˜ธํ™”*
 
 /// tip | ํŒ
 
-์ด์— ๋Œ€ํ•ด์„œ๋Š” [ํ”„๋ก์‹œ ๋’ค์—์„œ ์‹คํ–‰ํ•˜๊ธฐ - ํ”„๋ก์‹œ ์ „๋‹ฌ ํ—ค๋” ํ™œ์„ฑํ™”](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} ๋ฌธ์„œ์—์„œ ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด์— ๋Œ€ํ•ด์„œ๋Š” [ํ”„๋ก์‹œ ๋’ค์—์„œ ์‹คํ–‰ํ•˜๊ธฐ - ํ”„๋ก์‹œ ์ „๋‹ฌ ํ—ค๋” ํ™œ์„ฑํ™”](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) ๋ฌธ์„œ์—์„œ ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
index e0d2375344783fac2d8f37953eb3d636072e6816..74b3e0c7189be4bd1b12e87bd7148334c027cc11 100644 (file)
@@ -16,7 +16,7 @@
 
 ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์กฐํ•ฉํ•ด ์ง์ ‘ **์„œ๋ฒ„๋ฅผ ๋ฐฐํฌ**ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ž‘์—…์˜ ์ผ๋ถ€๋ฅผ ๋Œ€์‹ ํ•ด ์ฃผ๋Š” **ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์„ ํƒ์ง€๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด, FastAPI ๋’ค์— ์žˆ๋Š” ์ €ํฌ ํŒ€์€ FastAPI๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋ฉด์„œ, FastAPI ์•ฑ์„ ํด๋ผ์šฐ๋“œ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„์†Œํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก <a href="https://fastapicloud.com" class="external-link" target="_blank">**FastAPI Cloud**</a>๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด, FastAPI ๋’ค์— ์žˆ๋Š” ์ €ํฌ ํŒ€์€ FastAPI๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋ฉด์„œ, FastAPI ์•ฑ์„ ํด๋ผ์šฐ๋“œ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„์†Œํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก [**FastAPI Cloud**](https://fastapicloud.com)๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
 
 **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์•„๋งˆ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ฐœ๋…์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค).
 
index 93b1e76115735e89de34b14334fed4dfd60730ff..7199686829280cd1e50442a51e449a2a603f2959 100644 (file)
@@ -52,11 +52,11 @@ FastAPI๋Š” <abbr title="Asynchronous Server Gateway Interface - ๋น„๋™๊ธฐ ์„œ๋ฒ„
 
 ๋‹ค์Œ์„ ํฌํ•จํ•ด ์—ฌ๋Ÿฌ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>: ๊ณ ์„ฑ๋Šฅ ASGI ์„œ๋ฒ„.
-* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: HTTP/2 ๋ฐ Trio ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜๋˜๋Š” ASGI ์„œ๋ฒ„.
-* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: Django Channels๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ASGI ์„œ๋ฒ„.
-* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>: Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ Rust HTTP ์„œ๋ฒ„.
-* <a href="https://unit.nginx.org/howto/fastapi/" class="external-link" target="_blank">NGINX Unit</a>: NGINX Unit์€ ๊ฐ€๋ณ๊ณ  ๋‹ค์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค.
+* [Uvicorn](https://www.uvicorn.dev/): ๊ณ ์„ฑ๋Šฅ ASGI ์„œ๋ฒ„.
+* [Hypercorn](https://hypercorn.readthedocs.io/): HTTP/2 ๋ฐ Trio ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜๋˜๋Š” ASGI ์„œ๋ฒ„.
+* [Daphne](https://github.com/django/daphne): Django Channels๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ASGI ์„œ๋ฒ„.
+* [Granian](https://github.com/emmett-framework/granian): Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ Rust HTTP ์„œ๋ฒ„.
+* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit์€ ๊ฐ€๋ณ๊ณ  ๋‹ค์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค.
 
 ## ์„œ๋ฒ„ ๋จธ์‹ ๊ณผ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ { #server-machine-and-server-program }
 
@@ -74,7 +74,7 @@ FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์ธ Uvicorn์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, `
 
 ํ•˜์ง€๋งŒ ASGI ์„œ๋ฒ„๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜์„ธ์š”.
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜์„ธ์š”.
 
 ์˜ˆ๋ฅผ ๋“ค์–ด Uvicorn์„ ์„ค์น˜ํ•˜๋ ค๋ฉด:
 
@@ -94,7 +94,7 @@ $ pip install "uvicorn[standard]"
 
 `standard`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด Uvicorn์ด ๊ถŒ์žฅ๋˜๋Š” ์ถ”๊ฐ€ ์˜์กด์„ฑ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
-์—ฌ๊ธฐ์—๋Š” `asyncio`๋ฅผ ๊ณ ์„ฑ๋Šฅ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋“œ๋กญ์ธ ๋Œ€์ฒด์žฌ์ธ `uvloop`๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ํฐ ๋™์‹œ์„ฑ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
+์—ฌ๊ธฐ์—๋Š” `uvloop`๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” `asyncio`๋ฅผ ๊ณ ์„ฑ๋Šฅ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋“œ๋กญ์ธ ๋Œ€์ฒด์žฌ๋กœ, ํฐ ๋™์‹œ์„ฑ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
 
 `pip install "fastapi[standard]"` ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด `uvicorn[standard]`๋„ ํ•จ๊ป˜ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
 
index 1be102925e6dfe6f608d3750dc3b8d82df894de0..9cc1a9a81602d0ebc504ce500f98190bc2788915 100644 (file)
 
 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ๋Š” **๋‹ค์ค‘ ์ฝ”์–ด**๋ฅผ ํ™œ์šฉํ•˜๊ณ  ๋” ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก **ํ”„๋กœ์„ธ์Šค ๋ณต์ œ**๋ฅผ ํ•˜๊ณ  ์‹ถ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
 
-์ด์ „ ์žฅ์˜ [๋ฐฐํฌ ๊ฐœ๋…๋“ค](concepts.md){.internal-link target=_blank}์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋žต์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด์ „ ์žฅ์˜ [๋ฐฐํฌ ๊ฐœ๋…๋“ค](concepts.md)์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋žต์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์—ฌ๊ธฐ์„œ๋Š” `fastapi` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ `uvicorn` ๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์„œ, **์›Œ์ปค ํ”„๋กœ์„ธ์Šค**์™€ ํ•จ๊ป˜ **Uvicorn**์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
 
 /// info | ์ •๋ณด
 
-Docker๋‚˜ Kubernetes ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md){.internal-link target=_blank}์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
+Docker๋‚˜ Kubernetes ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md)์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
 
 ํŠนํžˆ **Kubernetes**์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์›Œ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ๋Œ€์‹  **์ปจํ…Œ์ด๋„ˆ๋‹น ๋‹จ์ผ Uvicorn ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜**๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ์ง€๋งŒ, ํ•ด๋‹น ๋‚ด์šฉ์€ ๊ทธ ์žฅ์˜ ๋’ค์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
 
@@ -126,7 +126,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
 
 ## ์ปจํ…Œ์ด๋„ˆ์™€ ๋„์ปค { #containers-and-docker }
 
-๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md){.internal-link target=_blank}์—์„œ๋Š” ๋‹ค๋ฅธ **๋ฐฐํฌ ๊ฐœ๋…๋“ค**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ „๋žต์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
+๋‹ค์Œ ์žฅ์ธ [์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ FastAPI - ๋„์ปค](docker.md)์—์„œ๋Š” ๋‹ค๋ฅธ **๋ฐฐํฌ ๊ฐœ๋…๋“ค**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ „๋žต์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
 
 ๋‹จ์ผ Uvicorn ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, **์ฒ˜์Œ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ๋นŒ๋“œ**ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ„๋‹จํ•œ ๊ณผ์ •์ด๋ฉฐ, **Kubernetes** ๊ฐ™์€ ๋ถ„์‚ฐ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ๋•Œ ์•„๋งˆ๋„ ์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
index b94832aa822568d2e95de96c0f23c84725911609..fa1df45c302b14820520ca33e5d3838cf57cc791 100644 (file)
@@ -4,7 +4,7 @@
 
 ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ž์ฃผ ์ถ”๊ฐ€๋˜๊ณ , ๋ฒ„๊ทธ๊ฐ€ ๊ทœ์น™์ ์œผ๋กœ ์ˆ˜์ •๋˜๋ฉฐ, ์ฝ”๋“œ๋Š” ๊ณ„์†ํ•ด์„œ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋ž˜์„œ ํ˜„์žฌ ๋ฒ„์ „์ด ์•„์ง `0.x.x`์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ๋ฒ„์ „์ด ์ž ์žฌ์ ์œผ๋กœ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง€๋Š” ๋ณ€๊ฒฝ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” <a href="https://semver.org/" class="external-link" target="_blank">Semantic Versioning</a> ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
+๊ทธ๋ž˜์„œ ํ˜„์žฌ ๋ฒ„์ „์ด ์•„์ง `0.x.x`์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ๋ฒ„์ „์ด ์ž ์žฌ์ ์œผ๋กœ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง€๋Š” ๋ณ€๊ฒฝ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” [Semantic Versioning](https://semver.org/) ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
 
 ์ง€๊ธˆ ๋ฐ”๋กœ **FastAPI**๋กœ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ํ•œ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ํ•ด์˜ค์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‹ค๋งŒ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
@@ -34,7 +34,7 @@ fastapi[standard]>=0.112.0,<0.113.0
 
 ## ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „๋“ค { #available-versions }
 
-์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „(์˜ˆ: ํ˜„์žฌ ์ตœ์‹  ๋ฒ„์ „์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด)์€ [๋ฆด๋ฆฌ์Šค ๋…ธํŠธ](../release-notes.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „(์˜ˆ: ํ˜„์žฌ ์ตœ์‹  ๋ฒ„์ „์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด)์€ [๋ฆด๋ฆฌ์Šค ๋…ธํŠธ](../release-notes.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ๋ฒ„์ „๋“ค์— ๋Œ€ํ•ด { #about-versions }
 
@@ -66,7 +66,7 @@ fastapi>=0.45.0,<0.46.0
 
 ์•ฑ์— ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-**FastAPI**์—์„œ๋Š” ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(Starlette ๋•๋ถ„์—). ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”: [ํ…Œ์ŠคํŠธ](../tutorial/testing.md){.internal-link target=_blank}
+**FastAPI**์—์„œ๋Š” ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(Starlette ๋•๋ถ„์—). ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”: [ํ…Œ์ŠคํŠธ](../tutorial/testing.md)
 
 ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ–์ถ˜ ๋’ค์—๋Š” **FastAPI** ๋ฒ„์ „์„ ๋” ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
 
index e8809573fd0903dc395e6a21a4b9d6b4f7b1f8ec..5b55960c8b274fb858886cdfb5e18f5e0c04fbeb 100644 (file)
@@ -65,7 +65,7 @@ print(f"Hello {name} from Python")
 
 /// tip | ํŒ
 
-<a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐ˜ํ™˜ํ•  ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
+[`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐ˜ํ™˜ํ•  ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
 
 ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ `None`์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ `"World"`๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
 
@@ -153,7 +153,7 @@ Hello World from Python
 
 /// tip | ํŒ
 
-<a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a> ์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[The Twelve-Factor App: Config](https://12factor.net/config) ์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -163,7 +163,7 @@ Hello World from Python
 
 ์ฆ‰, ํŒŒ์ด์ฌ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ ์ฝ์€ **๋ชจ๋“  ๊ฐ’**์€ **`str`**์ด ๋˜๊ณ , ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ์˜ ๋ณ€ํ™˜์ด๋‚˜ ๊ฒ€์ฆ์€ ์ฝ”๋“œ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-**์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ - ์„ค์ • ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜](./advanced/settings.md){.internal-link target=_blank} ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+**์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •**์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ - ์„ค์ • ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜](./advanced/settings.md) ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## `PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜ { #path-environment-variable }
 
@@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python
 
 ////
 
-์ด ์ •๋ณด๋Š” [๊ฐ€์ƒ ํ™˜๊ฒฝ](virtual-environments.md){.internal-link target=_blank} ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๋•Œ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+์ด ์ •๋ณด๋Š” [๊ฐ€์ƒ ํ™˜๊ฒฝ](virtual-environments.md) ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๋•Œ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ## ๊ฒฐ๋ก  { #conclusion }
 
 ์ด ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด **ํ™˜๊ฒฝ ๋ณ€์ˆ˜**๊ฐ€ ๋ฌด์—‡์ด๊ณ  ํŒŒ์ด์ฌ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜์…จ์„ ๊ฒ๋‹ˆ๋‹ค.
 
-๋˜ํ•œ <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ„ํ‚คํ”ผ๋””์•„</a>์—์„œ ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋˜ํ•œ [ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ„ํ‚คํ”ผ๋””์•„](https://en.wikipedia.org/wiki/Environment_variable)์—์„œ ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋งŽ์€ ๊ฒฝ์šฐ์—์„œ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•˜๊ณ  ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ๋ฐ”๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ณ„์† ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
 
index 0d87ce3219802679578f7a45bb6ab4ed037b79d0..bfa16e8b38f7a66769a08695eb7ade467577b99f 100644 (file)
@@ -1,15 +1,15 @@
 # FastAPI CLI { #fastapi-cli }
 
-**FastAPI CLI**๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น™ํ•˜๊ณ , FastAPI ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
+**FastAPI <abbr title="command line interface - ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค">CLI</abbr>**๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น™ํ•˜๊ณ , FastAPI ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
 
-FastAPIรซยฅยผ รฌ\84ยครฌยน\98รญ\95ย  รซ\95\8c(รฌ\98\88: `pip install "fastapi[standard]"`), `fastapi-cli`รซ\9dยผรซ\8a\94 รญ\8cยจรญ\82ยครฌยง\80รชยฐ\80 รญ\8fยฌรญ\95ยจรซ\90\98รซยฉยฐ, รฌ\9dยด รญ\8cยจรญ\82ยครฌยง\80รซ\8a\94 รญ\84ยฐรซยฏยธรซ\84\90รฌ\97\90รฌ\84\9c `fastapi` รซยช\85รซย ยนรฌ\96ยดรซยฅยผ รฌย \9cรชยณยตรญ\95ยฉรซ\8b\88รซ\8bยค.
+FastAPIรซยฅยผ รฌ\84ยครฌยน\98รญ\95\98รซยฉยด(รฌ\98\88: `pip install "fastapi[standard]"`) รญ\84ยฐรซยฏยธรซ\84\90รฌ\97\90รฌ\84\9c รฌ\8bยครญ\96\89รญ\95ย  รฌ\88\98 รฌ\9e\88รซ\8a\94 รฌยปยครซยงยจรซ\93\9c รซ\9dยผรฌ\9dยธ รญ\94\84รซยก\9cรชยทยธรซ\9eยจรฌ\9dยด รญ\95ยจรชยป\98 รฌย \9cรชยณยตรซ\90ยฉรซ\8b\88รซ\8bยค.
 
 ๊ฐœ๋ฐœ์šฉ์œผ๋กœ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด `fastapi dev` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 <div class="termy">
 
 ```console
-$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+$ <font color="#4E9A06">fastapi</font> dev
 
   <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span>  Starting development server ๐Ÿš€
 
@@ -46,13 +46,66 @@ $ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid
 
 </div>
 
-`fastapi`๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ์€ **FastAPI CLI**์ž…๋‹ˆ๋‹ค.
+/// tip | ํŒ
+
+ํ”„๋กœ๋•์…˜์—์„œ๋Š” `fastapi dev` ๋Œ€์‹  `fastapi run`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€
+
+///
+
+๋‚ด๋ถ€์ ์œผ๋กœ **FastAPI CLI**๋Š” ๊ณ ์„ฑ๋Šฅ์˜, ํ”„๋กœ๋•์…˜์— ์ ํ•ฉํ•œ ASGI ์„œ๋ฒ„์ธ [Uvicorn](https://www.uvicorn.dev)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
+
+`fastapi` CLI๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•  FastAPI ์•ฑ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. `main.py` ํŒŒ์ผ ์•ˆ์˜ `app`์ด๋ผ๋Š” ๊ฐ์ฒด(๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณ€ํ˜•)๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
+
+ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•  ์•ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+## `pyproject.toml`์—์„œ ์•ฑ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
+
+`pyproject.toml` ํŒŒ์ผ์—์„œ ์•ฑ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+```toml
+[tool.fastapi]
+entrypoint = "main:app"
+```
+
+์ด `entrypoint`๋Š” `fastapi` ๋ช…๋ น์–ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฑ์„ ์ž„ํฌํŠธํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค:
+
+```python
+from main import app
+```
 
-FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ๋ฐ›์•„ `FastAPI` ์ธ์Šคํ„ด์Šค(์ผ๋ฐ˜์ ์œผ๋กœ `app`์œผ๋กœ ์ด๋ฆ„์„ ๋ถ™์ž„)๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅธ ์ž„ํฌํŠธ ๊ณผ์ •์„ ๊ฒฐ์ •ํ•œ ๋‹ค์Œ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค.
+์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด:
+
+```
+.
+โ”œโ”€โ”€ backend
+โ”‚ย ย  โ”œโ”€โ”€ main.py
+โ”‚ย ย  โ”œโ”€โ”€ __init__.py
+```
+
+`entrypoint`๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:
+
+```toml
+[tool.fastapi]
+entrypoint = "backend.main:app"
+```
+
+์ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค:
+
+```python
+from backend.main import app
+```
+
+### ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ `fastapi dev` { #fastapi-dev-with-path }
+
+`fastapi dev` ๋ช…๋ น์–ด์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉํ•  FastAPI ์•ฑ ๊ฐ์ฒด๋ฅผ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค:
+
+```console
+$ fastapi dev main.py
+```
 
-รญ\94\84รซยก\9cรซ\8d\95รฌ\85\98รฌ\97\90รฌ\84\9cรซ\8a\94 รซ\8c\80รฌ\8bย  `fastapi run`รฌ\9d\84 รฌ\82ยฌรฌ\9aยฉรญ\95ยฉรซ\8b\88รซ\8bยค. รฐ\9f\9a\80
+รญ\95\98รฌยง\80รซยง\8c รซยงยครซยฒ\88 `fastapi` รซยช\85รซย ยนรฌ\96ยดรซยฅยผ รญ\98ยธรฌยถ\9cรญ\95ย  รซ\95\8c รฌ\98ยฌรซยฐ\94รซยฅยธ รชยฒยฝรซยก\9cรซยฅยผ รฌย \84รซ\8bยฌรญ\95\98รซ\8a\94 รชยฒ\83รฌ\9d\84 รชยธยฐรฌ\96ยตรญ\95ยดรฌ\95ยผ รญ\95ยฉรซ\8b\88รซ\8bยค.
 
-รซ\82ยดรซยถ\80รฌย \81รฌ\9cยผรซยก\9c **FastAPI CLI**รซ\8a\94 รชยณย รฌ\84ยฑรซ\8aยฅรฌ\9d\98, รญ\94\84รซยก\9cรซ\8d\95รฌ\85\98รฌ\97\90 รฌย \81รญ\95ยฉรญ\95\9c ASGI รฌ\84\9cรซยฒ\84รฌ\9dยธ <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>รฌ\9d\84 รฌ\82ยฌรฌ\9aยฉรญ\95ยฉรซ\8b\88รซ\8bยค. รฐ\9f\98\8e
+รซ\98\90รญ\95\9c [VS Code รญ\99\95รฌ\9eยฅ](editor-support.md)รฌ\9dยดรซ\82\98 [FastAPI Cloud](https://fastapicloud.com) รชยฐ\99รฌ\9d\80 รซ\8bยครซยฅยธ รซ\8f\84รชยตยฌรฌ\97\90รฌ\84\9cรซ\8a\94 รฌ\9dยดรซยฅยผ รฌยฐยพรฌยง\80 รซยชยปรญ\95ย  รฌ\88\98รซ\8f\84 รฌ\9e\88รฌ\9cยผรซยฏ\80รซยก\9c, `pyproject.toml`รฌ\9d\98 `entrypoint`รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95\98รซ\8a\94 รชยฒ\83รฌ\9d\84 รชยถ\8cรฌ\9eยฅรญ\95ยฉรซ\8b\88รซ\8bยค.
 
 ## `fastapi dev` { #fastapi-dev }
 
@@ -62,7 +115,7 @@ FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ๋ฐ›์•„ `FastAPI`
 
 ## `fastapi run` { #fastapi-run }
 
-`fastapi run`์„ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ FastAPI๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
+`fastapi run`์„ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ FastAPI๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
 
 ๊ธฐ๋ณธ์ ์œผ๋กœ **auto-reload**๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  IP ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” `0.0.0.0`์—์„œ ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ์ปดํ“จํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๊ณต๊ฐœ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ๋ณดํ†ต ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -70,6 +123,6 @@ FastAPI CLI๋Š” Python ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ(์˜ˆ: `main.py`)๋ฅผ ๋ฐ›์•„ `FastAPI`
 
 /// tip | ํŒ
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ ๋ฌธ์„œ](deployment/index.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฐฐํฌ ๋ฌธ์„œ](deployment/index.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
index b511ae4707bc6b2d6a8fbf3286b2388e612cacbd..0a5aa6943603fd74e8980927e58ac552850880a5 100644 (file)
@@ -6,8 +6,8 @@
 
 ### ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ { #based-on-open-standards }
 
-* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a>: <dfn title="๋˜ํ•œ ๋‹ค์Œ์œผ๋กœ๋„ ๋ถˆ๋ฆผ: ์—”๋“œํฌ์ธํŠธ, ๋ผ์šฐํŠธ">๊ฒฝ๋กœ</dfn> <dfn title="HTTP ๋ฉ”์†Œ๋“œ(POST, GET, PUT, DELETE ๋“ฑ)๋กœ๋„ ์•Œ๋ ค์ง">์ฒ˜๋ฆฌ</dfn>, ๋งค๊ฐœ๋ณ€์ˆ˜, ์š”์ฒญ ๋ณธ๋ฌธ, ๋ณด์•ˆ ๋“ฑ์˜ ์„ ์–ธ์„ ํฌํ•จํ•˜์—ฌ API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
-* <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a>๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œํ™”(OpenAPI ์ž์ฒด๊ฐ€ JSON Schema๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
+* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification): <dfn title="๋˜ํ•œ ๋‹ค์Œ์œผ๋กœ๋„ ๋ถˆ๋ฆผ: ์—”๋“œํฌ์ธํŠธ, ๋ผ์šฐํŠธ">๊ฒฝ๋กœ</dfn> <dfn title="HTTP ๋ฉ”์†Œ๋“œ(POST, GET, PUT, DELETE ๋“ฑ)๋กœ๋„ ์•Œ๋ ค์ง">์ฒ˜๋ฆฌ</dfn>, ๋งค๊ฐœ๋ณ€์ˆ˜, ์š”์ฒญ ๋ณธ๋ฌธ, ๋ณด์•ˆ ๋“ฑ์˜ ์„ ์–ธ์„ ํฌํ•จํ•˜์—ฌ API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
+* [**JSON Schema**](https://json-schema.org/)๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œํ™”(OpenAPI ์ž์ฒด๊ฐ€ JSON Schema๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
 * ๋‹จ์ˆœํžˆ ๋– ์˜ฌ๋ ค์„œ ๋ง๋ถ™์ธ ๋ ˆ์ด์–ด๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ธ์‹ฌํ•œ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์นœ ๋’ค ์ด๋Ÿฌํ•œ ํ‘œ์ค€์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
 * ์ด๋Š” ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ž๋™ **ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ**์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
 
 
 ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ์™€ ํƒ์ƒ‰์šฉ ์›น ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ OpenAPI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ์— ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
 
-* ๋Œ€ํ™”ํ˜• ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+* [**Swagger UI**](https://github.com/swagger-api/swagger-ui)๋กœ ๋Œ€ํ™”ํ˜• ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
 
-* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>์„ ์ด์šฉํ•œ ๋Œ€์ฒด API ๋ฌธ์„œํ™”.
+* [**ReDoc**](https://github.com/Rebilly/ReDoc)์„ ์ด์šฉํ•œ ๋Œ€์ฒด API ๋ฌธ์„œํ™”.
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
 
 ### ๊ทธ์ € ํ˜„๋Œ€ ํŒŒ์ด์ฌ { #just-modern-python }
 
-( Pydantic ๋•๋ถ„์—) ๋ชจ๋“  ๊ฒƒ์ด ํ‘œ์ค€ **Python ํƒ€์ž…** ์„ ์–ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋ฐฐ์šธ ๋ฌธ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ํ‘œ์ค€์ ์ธ ํ˜„๋Œ€ ํŒŒ์ด์ฌ์ž…๋‹ˆ๋‹ค.
+(Pydantic ๋•๋ถ„์—) ๋ชจ๋“  ๊ฒƒ์ด ํ‘œ์ค€ **Python ํƒ€์ž…** ์„ ์–ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋ฐฐ์šธ ๋ฌธ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ํ‘œ์ค€์ ์ธ ํ˜„๋Œ€ ํŒŒ์ด์ฌ์ž…๋‹ˆ๋‹ค.
 
-Python ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ 2๋ถ„ ์ •๋„ ๋ณต์Šต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด(FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„), ๋‹ค์Œ์˜ ์งง์€ ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: [Python ํƒ€์ž…](python-types.md){.internal-link target=_blank}.
+Python ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ 2๋ถ„ ์ •๋„ ๋ณต์Šต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด(FastAPI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„), ๋‹ค์Œ์˜ ์งง์€ ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: [Python ํƒ€์ž…](python-types.md).
 
 ์—ฌ๋Ÿฌ๋ถ„์€ ํƒ€์ž…์ด ์žˆ๋Š” ํ‘œ์ค€ Python์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:
 
@@ -75,7 +75,7 @@ my_second_user: User = User(**second_user_data)
 
 ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ๋„ ์ „์— ๋ชจ๋“  ๊ฒฐ์ •์€ ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
 
-Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ "์ž๋™ ์™„์„ฑ"์ด๋ผ๋Š” ์ </a>์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
+Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ [๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ "์ž๋™ ์™„์„ฑ"์ด๋ผ๋Š” ์ ](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
 
 **FastAPI** ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด๋Š” ์ด๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ์€ ์–ด๋””์„œ๋‚˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -83,11 +83,11 @@ Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/
 
 ํŽธ์ง‘๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ์–ด๋–ป๊ฒŒ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”:
 
-* <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>์—์„œ:
+* [Visual Studio Code](https://code.visualstudio.com/)์—์„œ:
 
 ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
 
-* <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>์—์„œ:
+* [PyCharm](https://www.jetbrains.com/pycharm/)์—์„œ:
 
 ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png)
 
@@ -124,7 +124,7 @@ Python ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ <a href="https://www.jetbrains.com/research/
 ๋‹ค์Œ์„ ํฌํ•จํ•ด OpenAPI์— ์ •์˜๋œ ๋ชจ๋“  ๋ณด์•ˆ ์Šคํ‚ค๋งˆ:
 
 * HTTP Basic.
-* **OAuth2**(**JWT tokens** ๋˜ํ•œ ํฌํ•จ). [JWT๋ฅผ ์‚ฌ์šฉํ•œ OAuth2](tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
+* **OAuth2**(**JWT tokens** ๋˜ํ•œ ํฌํ•จ). [JWT๋ฅผ ์‚ฌ์šฉํ•œ OAuth2](tutorial/security/oauth2-jwt.md) ์ž์Šต์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
 * ๋‹ค์Œ์— ๋“ค์–ด ์žˆ๋Š” API ํ‚ค:
     * ํ—ค๋”.
     * ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜.
@@ -159,13 +159,13 @@ FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๊ฐ•๋ ฅํ•œ <dfn title='๋˜ํ•œ 
 
 ## Starlette ๊ธฐ๋Šฅ { #starlette-features }
 
-**FastAPI**๋Š” <a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a>์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Starlette ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
+**FastAPI**๋Š” [**Starlette**](https://www.starlette.dev/)์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Starlette ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
 
 `FastAPI`๋Š” ์‹ค์ œ๋กœ `Starlette`์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Starlette์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 **FastAPI**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **Starlette**์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(FastAPI๋Š” Starlette์— ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๋”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค):
 
-* ์ •๋ง ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ. <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">**NodeJS**์™€ **Go**์— ๋ฒ„๊ธˆ๊ฐ€๋Š”, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค</a>.
+* ์ •๋ง ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ. [**NodeJS**์™€ **Go**์— ๋ฒ„๊ธˆ๊ฐ€๋Š”, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค](https://github.com/encode/starlette#performance).
 * **WebSocket** ์ง€์›.
 * ํ”„๋กœ์„ธ์Šค ๋‚ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—….
 * ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์ด๋ฒคํŠธ.
@@ -177,7 +177,7 @@ FastAPI๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์ง€๋งŒ, ๋งค์šฐ ๊ฐ•๋ ฅํ•œ <dfn title='๋˜ํ•œ 
 
 ## Pydantic ๊ธฐ๋Šฅ { #pydantic-features }
 
-**FastAPI**๋Š” <a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a>๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Pydantic ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
+**FastAPI**๋Š” [**Pydantic**](https://docs.pydantic.dev/)๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ(๋˜ํ•œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Pydantic ์ฝ”๋“œ๋„ ๋ชจ๋‘ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
 
 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•œ <abbr title="Object-Relational Mapper - ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํผ">ORM</abbr>, <abbr title="Object-Document Mapper - ๊ฐ์ฒด-๋ฌธ์„œ ๋งคํผ">ODM</abbr>๊ณผ ๊ฐ™์€, Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
 
index a4abbe7afaaa6860b56d78ef5ff0574ed818b6bb..f67fb3f22b2e37608169e1ad4671ae643236a2b6 100644 (file)
@@ -12,7 +12,7 @@ FastAPI, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž, ๊ฐœ๋ฐœ์ž๋ฅผ ์‘์›ํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
 
 ## ๋‰ด์Šค๋ ˆํ„ฐ ๊ตฌ๋… { #subscribe-to-the-newsletter }
 
-(์ž์ฃผ ๋ฐœ์†ก๋˜์ง€ ์•Š๋Š”) [**FastAPI and friends** ๋‰ด์Šค๋ ˆํ„ฐ](newsletter.md){.internal-link target=_blank}๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+(์ž์ฃผ ๋ฐœ์†ก๋˜์ง€ ์•Š๋Š”) [**FastAPI and friends** ๋‰ด์Šค๋ ˆํ„ฐ](newsletter.md)๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 * FastAPI and friends์— ๋Œ€ํ•œ ๋‰ด์Šค ๐Ÿš€
 * ๊ฐ€์ด๋“œ ๐Ÿ“
@@ -22,17 +22,17 @@ FastAPI, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž, ๊ฐœ๋ฐœ์ž๋ฅผ ์‘์›ํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
 
 ## X(Twitter)์—์„œ FastAPI ํŒ”๋กœ์šฐํ•˜๊ธฐ { #follow-fastapi-on-x-twitter }
 
-<a href="https://x.com/fastapi" class="external-link" target="_blank">**X (Twitter)**์˜ @fastapi๋ฅผ ํŒ”๋กœ์šฐ</a>ํ•˜์—ฌ **FastAPI** ์— ๋Œ€ํ•œ ์ตœ์‹  ๋‰ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿฆ
+[**X (Twitter)**์˜ @fastapi๋ฅผ ํŒ”๋กœ์šฐ](https://x.com/fastapi)ํ•˜์—ฌ **FastAPI** ์— ๋Œ€ํ•œ ์ตœ์‹  ๋‰ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿฆ
 
 ## GitHub์—์„œ **FastAPI**์— Star ์ฃผ๊ธฐ { #star-fastapi-in-github }
 
-GitHub์—์„œ FastAPI์— "star"๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ star ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. โญ๏ธ
+GitHub์—์„œ FastAPI์— "star"๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ star ๋ฒ„ํŠผ์„ ํด๋ฆญ): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). โญ๏ธ
 
 ์Šคํƒ€๋ฅผ ๋Š˜๋ฆผ์œผ๋กœ์จ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ์ข€ ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ๋ฆด๋ฆฌ์ฆˆ ํ™•์ธ์„ ์œ„ํ•ด GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository-for-releases }
 
-GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€
+GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ๐Ÿ‘€
 
 ์—ฌ๊ธฐ์„œ "Releases only"๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -40,45 +40,45 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" 
 
 ## ๊ฐœ๋ฐœ์ž์™€์˜ ์—ฐ๊ฒฐ { #connect-with-the-author }
 
-๊ฐœ๋ฐœ์ž(์ž‘์„ฑ์ž)์ธ <a href="https://tiangolo.com" class="external-link" target="_blank">์ €(Sebastiรกn Ramรญrez / `tiangolo`)</a>์™€ ์—ฐ๋ฝ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๊ฐœ๋ฐœ์ž(์ž‘์„ฑ์ž)์ธ [์ €(Sebastiรกn Ramรญrez / `tiangolo`)](https://tiangolo.com)์™€ ์—ฐ๋ฝ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์—ฌ๋Ÿฌ๋ถ„์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://github.com/tiangolo" class="external-link" target="_blank">**GitHub**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ</a>.
+* [**GitHub**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ](https://github.com/tiangolo).
     * ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋„์›€์ด ๋  ์ €์˜ ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
     * ์ƒˆ๋กœ์šด ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ํ™•์ธํ•˜๋ ค๋ฉด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค.
-* <a href="https://x.com/tiangolo" class="external-link" target="_blank">**X (Twitter)**</a> ๋˜๋Š” <a href="https://fosstodon.org/@tiangolo" class="external-link" target="_blank">Mastodon</a>์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ.
+* [**X (Twitter)**](https://x.com/tiangolo) ๋˜๋Š” [Mastodon](https://fosstodon.org/@tiangolo)์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ.
     * FastAPI์˜ ์‚ฌ์šฉ ์šฉ๋„๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š” (๊ทธ๊ฒƒ์„ ๋“ฃ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค).
     * ๋ฐœํ‘œ๋‚˜ ์ƒˆ๋กœ์šด ํˆด ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค.
-    * <a href="https://x.com/fastapi" class="external-link" target="_blank">X(Twitter)์—์„œ @fastapi๋ฅผ ํŒ”๋กœ์šฐ</a> (๋ณ„๋„ ๊ณ„์ •์—์„œ) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">**LinkedIn**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ</a>.
+    * [X(Twitter)์—์„œ @fastapi๋ฅผ ํŒ”๋กœ์šฐ](https://x.com/fastapi) (๋ณ„๋„ ๊ณ„์ •์—์„œ) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+* [**LinkedIn**์—์„œ ํŒ”๋กœ์šฐํ•˜๊ธฐ](https://www.linkedin.com/in/tiangolo/).
     * ์ƒˆ๋กœ์šด ํˆด์˜ ๋ฐœํ‘œ๋‚˜ ์ถœ์‹œ ์†Œ์‹์„ ๋ฐ›์•„๋ณด์‹ญ์‹œ์˜ค (๋‹จ, X (Twitter)๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ๐Ÿคทโ€โ™‚).
-* <a href="https://dev.to/tiangolo" class="external-link" target="_blank">**Dev.to**</a> ๋˜๋Š” <a href="https://medium.com/@tiangolo" class="external-link" target="_blank">**Medium**</a>์—์„œ ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ณด์‹ญ์‹œ์˜ค (๋˜๋Š” ํŒ”๋กœ์šฐ).
+* [**Dev.to**](https://dev.to/tiangolo) ๋˜๋Š” [**Medium**](https://medium.com/@tiangolo)์—์„œ ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ณด์‹ญ์‹œ์˜ค (๋˜๋Š” ํŒ”๋กœ์šฐ).
     * ๋‹ค๋ฅธ ์•„์ด๋””์–ด์™€ ๊ธฐ์‚ฌ๋“ค์„ ์ฝ๊ณ , ์ œ๊ฐ€ ๋งŒ๋“ค์–ด์™”๋˜ ํˆด์— ๋Œ€ํ•ด์„œ๋„ ์ฝ์œผ์‹ญ์‹œ์˜ค.
     * ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ๊ฒŒ์‹œํ•  ๋•Œ ์ฝ๊ธฐ ์œ„ํ•ด ํŒ”๋กœ์šฐ ํ•˜์‹ญ์‹œ์˜ค.
 
 ## **FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—ํ•˜๊ธฐ { #tweet-about-fastapi }
 
-<a href="https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi" class="external-link" target="_blank">**FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—</a> ํ•˜๊ณ  ์ €์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ FastAPI๊ฐ€ ๋งˆ์Œ์— ๋“œ๋Š” ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”. ๐ŸŽ‰
+[**FastAPI**์— ๋Œ€ํ•ด ํŠธ์œ—](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) ํ•˜๊ณ  ์ €์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ FastAPI๊ฐ€ ๋งˆ์Œ์— ๋“œ๋Š” ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”. ๐ŸŽ‰
 
 **FastAPI**๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ์ ์ด ๋งˆ์Œ์— ๋“ค์—ˆ๋Š”์ง€, ์–ด๋–ค ํ”„๋กœ์ ํŠธ/ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
 
 ## FastAPI์— ํˆฌํ‘œํ•˜๊ธฐ { #vote-for-fastapi }
 
-* <a href="https://www.slant.co/options/34241/~fastapi-review" class="external-link" target="_blank">Slant์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค</a>.
-* <a href="https://alternativeto.net/software/fastapi/about/" class="external-link" target="_blank">AlternativeTo์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค</a>.
-* <a href="https://stackshare.io/pypi-fastapi" class="external-link" target="_blank">StackShare์—์„œ **FastAPI**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ‘œ์‹œํ•˜์„ธ์š”</a>.
+* [Slant์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค](https://www.slant.co/options/34241/~fastapi-review).
+* [AlternativeTo์—์„œ **FastAPI** ์— ๋Œ€ํ•ด ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค](https://alternativeto.net/software/fastapi/about/).
+* [StackShare์—์„œ **FastAPI**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ‘œ์‹œํ•˜์„ธ์š”](https://stackshare.io/pypi-fastapi).
 
 ## GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ { #help-others-with-questions-in-github }
 
 ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered" class="external-link" target="_blank">GitHub Discussions</a>
-* <a href="https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+" class="external-link" target="_blank">GitHub Issues</a>
+* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered)
+* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+)
 
 ๋งŽ์€ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ์•Œ๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
 
-๋งŒ์•ฝ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์„ ๋„์™€์ค€๋‹ค๋ฉด, ๊ณต์‹์ ์ธ [FastAPI ์ „๋ฌธ๊ฐ€](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰
+๋งŒ์•ฝ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์งˆ๋ฌธ์„ ๋„์™€์ค€๋‹ค๋ฉด, ๊ณต์‹์ ์ธ [FastAPI ์ „๋ฌธ๊ฐ€](fastapi-people.md#fastapi-experts)๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐ŸŽ‰
 
 ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€: ์นœ์ ˆํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ขŒ์ ˆ๊ฐ์„ ์•ˆ๊ณ  ์˜ค๋ฉฐ, ๋งŽ์€ ๊ฒฝ์šฐ ์ตœ์„ ์˜ ๋ฐฉ์‹์œผ๋กœ ์งˆ๋ฌธํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๋Œ€ํ•œ ์นœ์ ˆํ•˜๊ฒŒ ๋Œ€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์„ธ์š”. ๐Ÿค—
 
@@ -104,7 +104,7 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" 
 
 ๋งŽ์€ ๊ฒฝ์šฐ, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋งŒ ๋ณต์‚ฌํ•ด์„œ ์˜ฌ๋ฆฌ์ง€๋งŒ, ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” **๋ฌธ์ œ๋ฅผ ์žฌํ˜„**ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-* ์งˆ๋ฌธ์ž์—๊ฒŒ <a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ</a>๋ฅผ ์ œ๊ณตํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ **๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ**ํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ณ , ์งˆ๋ฌธ์ž๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜๋‚˜ ๋™์ž‘์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+* ์งˆ๋ฌธ์ž์—๊ฒŒ [์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ](https://stackoverflow.com/help/minimal-reproducible-example)๋ฅผ ์ œ๊ณตํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ **๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ**ํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ณ , ์งˆ๋ฌธ์ž๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜๋‚˜ ๋™์ž‘์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 * ๋„ˆ๊ทธ๋Ÿฌ์šด ๋งˆ์Œ์ด ๋“ ๋‹ค๋ฉด, ๋ฌธ์ œ ์„ค๋ช…๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ **์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด**๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋จผ์ € ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
 
@@ -125,7 +125,7 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" 
 
 ## GitHub ์ €์žฅ์†Œ ๋ณด๊ธฐ { #watch-the-github-repository }
 
-GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ๐Ÿ‘€
+GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" ๋ฒ„ํŠผ์„ ํด๋ฆญ): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ๐Ÿ‘€
 
 "Releases only" ๋Œ€์‹  "Watching"์„ ์„ ํƒํ•˜๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ƒˆ ์ด์Šˆ๋‚˜ ์งˆ๋ฌธ์„ ๋งŒ๋“ค ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒˆ ์ด์Šˆ, ๋””์Šค์ปค์…˜, PR ๋“ฑ๋งŒ ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -133,7 +133,7 @@ GitHub์—์„œ FastAPI๋ฅผ "watch"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ "watch" 
 
 ## ์งˆ๋ฌธํ•˜๊ธฐ { #ask-questions }
 
-GitHub ์ €์žฅ์†Œ์—์„œ <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">์ƒˆ ์งˆ๋ฌธ์„ ์ƒ์„ฑ</a>ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
+GitHub ์ €์žฅ์†Œ์—์„œ [์ƒˆ ์งˆ๋ฌธ์„ ์ƒ์„ฑ](https://github.com/fastapi/fastapi/discussions/new?category=questions)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
 
 * **์งˆ๋ฌธ**์„ ํ•˜๊ฑฐ๋‚˜ **๋ฌธ์ œ**์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค.
 * ์ƒˆ๋กœ์šด **๊ธฐ๋Šฅ**์„ ์ œ์•ˆ ํ•ฉ๋‹ˆ๋‹ค.
@@ -196,12 +196,12 @@ Pull request๋ฅผ ๋ฆฌ๋ทฐํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๊ณผ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™
 
 ## Pull Request ๋งŒ๋“ค๊ธฐ { #create-a-pull-request }
 
-Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.internal-link target=_blank}ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
+Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
 
 * ๋ฌธ์„œ์—์„œ ๋ฐœ๊ฒฌํ•œ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ.
-* FastAPI์— ๋Œ€ํ•œ ๊ธ€, ๋น„๋””์˜ค, ํŒŸ์บ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด <a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">์ด ํŒŒ์ผ์„ ํŽธ์ง‘</a>ํ•˜์—ฌ ๊ณต์œ ํ•  ๋•Œ.
+* FastAPI์— ๋Œ€ํ•œ ๊ธ€, ๋น„๋””์˜ค, ํŒŸ์บ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด [์ด ํŒŒ์ผ์„ ํŽธ์ง‘](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml)ํ•˜์—ฌ ๊ณต์œ ํ•  ๋•Œ.
     * ํ•ด๋‹น ์„น์…˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
-* ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ธ์–ด๋กœ [๋ฌธ์„œ ๋ฒˆ์—ญ์—](contributing.md#translations){.internal-link target=_blank} ๋„์›€์„ ์ค„ ๋•Œ.
+* ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ธ์–ด๋กœ [๋ฌธ์„œ ๋ฒˆ์—ญ์—](contributing.md#translations) ๋„์›€์„ ์ค„ ๋•Œ.
     * ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ๋ฒˆ์—ญ์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ๋„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 * ์ƒˆ๋กœ์šด ๋ฌธ์„œ ์„น์…˜์„ ์ œ์•ˆํ•  ๋•Œ.
 * ๊ธฐ์กด ์ด์Šˆ/๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ.
@@ -218,8 +218,8 @@ Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.intern
 
 ์ง€๊ธˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์ž‘์—…์€:
 
-* [GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ](#help-others-with-questions-in-github){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
-* [Pull Request ๋ฆฌ๋ทฐํ•˜๊ธฐ](#review-pull-requests){.internal-link target=_blank} (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
+* [GitHub์—์„œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๋•๊ธฐ](#help-others-with-questions-in-github) (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
+* [Pull Request ๋ฆฌ๋ทฐํ•˜๊ธฐ](#review-pull-requests) (์œ„์˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”).
 
 ์ด ๋‘ ์ž‘์—…์ด **๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจ**ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด FastAPI๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
 
@@ -227,11 +227,11 @@ Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.intern
 
 ## ์ฑ„ํŒ…์— ์ฐธ์—ฌํ•˜๊ธฐ { #join-the-chat }
 
-๐Ÿ‘ฅ <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">Discord ์ฑ„ํŒ… ์„œ๋ฒ„</a> ๐Ÿ‘ฅ ์— ์ฐธ์—ฌํ•ด์„œ FastAPI ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์–ด์šธ๋ฆฌ์„ธ์š”.
+๐Ÿ‘ฅ [Discord ์ฑ„ํŒ… ์„œ๋ฒ„](https://discord.gg/VQjSZaeJmf) ๐Ÿ‘ฅ ์— ์ฐธ์—ฌํ•ด์„œ FastAPI ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์–ด์šธ๋ฆฌ์„ธ์š”.
 
 /// tip | ํŒ
 
-์งˆ๋ฌธ์€ <a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Discussions</a>์—์„œ ํ•˜์„ธ์š”. [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๋กœ๋ถ€ํ„ฐ ๋„์›€์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋†’์Šต๋‹ˆ๋‹ค.
+์งˆ๋ฌธ์€ [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions)์—์„œ ํ•˜์„ธ์š”. [FastAPI Experts](fastapi-people.md#fastapi-experts)๋กœ๋ถ€ํ„ฐ ๋„์›€์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋†’์Šต๋‹ˆ๋‹ค.
 
 ์ฑ„ํŒ…์€ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋Œ€ํ™”๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
 
@@ -243,13 +243,13 @@ Pull Requests๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์— [๊ธฐ์—ฌ](contributing.md){.intern
 
 GitHub์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ์ด ์˜ฌ๋ฐ”๋ฅธ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•˜๋„๋ก ์•ˆ๋‚ดํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ์ข‹์€ ๋‹ต๋ณ€์„ ์–ป๊ฑฐ๋‚˜, ์งˆ๋ฌธํ•˜๊ธฐ ์ „์— ์Šค์Šค๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์—์„œ๋Š” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ๋”๋ผ๋„ ์ œ๊ฐ€ ํ•ญ์ƒ ๋ชจ๋“  ๊ฒƒ์— ๋‹ตํ•˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ๋Š” ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜…
 
-์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ์˜ ๋Œ€ํ™” ๋˜ํ•œ GitHub๋งŒํผ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ๋Œ€ํ™” ์†์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์— ์žˆ๋Š” ๊ฒƒ๋งŒ [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์ •๋˜๋ฏ€๋กœ, GitHub์—์„œ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
+์ฑ„ํŒ… ์‹œ์Šคํ…œ์—์„œ์˜ ๋Œ€ํ™” ๋˜ํ•œ GitHub๋งŒํผ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ๋Œ€ํ™” ์†์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub์— ์žˆ๋Š” ๊ฒƒ๋งŒ [FastAPI Expert](fastapi-people.md#fastapi-experts)๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์ •๋˜๋ฏ€๋กœ, GitHub์—์„œ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
 
 ๋ฐ˜๋ฉด, ์ฑ„ํŒ… ์‹œ์Šคํ…œ์—๋Š” ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๊ฑฐ์˜ ํ•ญ์ƒ ๋Œ€ํ™” ์ƒ๋Œ€๋ฅผ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„
 
 ## ๊ฐœ๋ฐœ์ž ์Šคํฐ์„œ ๋˜๊ธฐ { #sponsor-the-author }
 
-์—ฌ๋Ÿฌ๋ถ„์˜ **์ œํ’ˆ/ํšŒ์‚ฌ**๊ฐ€ **FastAPI**์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ , FastAPI ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์•Œ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub sponsors</a>๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž(์ €)๋ฅผ ์Šคํฐ์„œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์–ด์— ๋”ฐ๋ผ ๋ฌธ์„œ์— ๋ฐฐ์ง€ ๊ฐ™์€ ์ถ”๊ฐ€ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ
+์—ฌ๋Ÿฌ๋ถ„์˜ **์ œํ’ˆ/ํšŒ์‚ฌ**๊ฐ€ **FastAPI**์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ , FastAPI ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์•Œ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด [GitHub sponsors](https://github.com/sponsors/tiangolo)๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž(์ €)๋ฅผ ์Šคํฐ์„œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์–ด์— ๋”ฐ๋ผ ๋ฌธ์„œ์— ๋ฐฐ์ง€ ๊ฐ™์€ ์ถ”๊ฐ€ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ
 
 ---
 
index d9720012153e40531b789171b40d1fd66aa2098a..524eea59a4fb6b1bb98ac5843184cecc6e1712c3 100644 (file)
@@ -1,6 +1,6 @@
 # ์—ญ์‚ฌ, ๋””์ž์ธ ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜ { #history-design-and-future }
 
-์–ผ๋งˆ ์ „, <a href="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920" class="external-link" target="_blank">ํ•œ **FastAPI** ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค</a>:
+์–ผ๋งˆ ์ „, [ํ•œ **FastAPI** ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920):
 
 > ์ด ํ”„๋กœ์ ํŠธ์˜ ์—ญ์‚ฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? ๋ช‡ ์ฃผ ๋งŒ์— ์•„๋ฌด ๋ฐ์„œ๋„ ๊ฐ‘์ž๊ธฐ ๋‚˜ํƒ€๋‚˜ ์—„์ฒญ๋‚˜๊ฒŒ ์ข‹์•„์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋„ค์š” [...]
 
@@ -14,7 +14,7 @@
 
 **FastAPI**์˜ ์—ญ์‚ฌ๋Š” ์ƒ๋‹น ๋ถ€๋ถ„ ๊ทธ ์ด์ „์— ์žˆ๋˜ ๋„๊ตฌ๋“ค์˜ ์—ญ์‚ฌ์ž…๋‹ˆ๋‹ค.
 
-[๋Œ€์•ˆ](alternatives.md){.internal-link target=_blank} ์„น์…˜์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ:
+[๋Œ€์•ˆ](alternatives.md) ์„น์…˜์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ:
 
 <blockquote markdown="1">
 
@@ -44,7 +44,7 @@
 
 ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Python ํŽธ์ง‘๊ธฐ๋“ค: PyCharm, VS Code, Jedi ๊ธฐ๋ฐ˜ ํŽธ์ง‘๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ์•„์ด๋””์–ด๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
 
-์•ฝ 80%์˜ ์‚ฌ์šฉ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ์ตœ๊ทผ <a href="https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools" class="external-link" target="_blank">Python Developer Survey</a>์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
+์•ฝ 80%์˜ ์‚ฌ์šฉ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ์ตœ๊ทผ [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools)์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
 
 ์ฆ‰, **FastAPI**๋Š” Python ๊ฐœ๋ฐœ์ž์˜ 80%๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋“ค๋กœ ํŠน๋ณ„ํžˆ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋„ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ ๋ชจ๋“  ์ด์ ์€ ์‚ฌ์‹ค์ƒ ๋ชจ๋“  ํŽธ์ง‘๊ธฐ์—์„œ ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
 
 ## ํ•„์š”์กฐ๊ฑด { #requirements }
 
-์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ํ…Œ์ŠคํŠธํ•œ ํ›„, ์žฅ์  ๋•Œ๋ฌธ์— <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">**Pydantic**</a>์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
+์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ํ…Œ์ŠคํŠธํ•œ ํ›„, ์žฅ์  ๋•Œ๋ฌธ์— [**Pydantic**](https://docs.pydantic.dev/)์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ทธ ํ›„, JSON Schema๋ฅผ ์™„์ „ํžˆ ์ค€์ˆ˜ํ•˜๋„๋ก ํ•˜๊ณ , ์ œ์•ฝ ์กฐ๊ฑด ์„ ์–ธ์„ ์ •์˜ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์—์„œ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํŽธ์ง‘๊ธฐ ์ง€์›(ํƒ€์ž… ๊ฒ€์‚ฌ, ์ž๋™ ์™„์„ฑ)์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
 
-๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ, ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ํ•„์š”์กฐ๊ฑด์ธ <a href="https://www.starlette.dev/" class="external-link" target="_blank">**Starlette**</a>์—๋„ ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
+๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ, ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ํ•„์š”์กฐ๊ฑด์ธ [**Starlette**](https://www.starlette.dev/)์—๋„ ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
 
 ## ๊ฐœ๋ฐœ { #development }
 
-**FastAPI** ์ž์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ์ฏค์—๋Š”, ๋Œ€๋ถ€๋ถ„์˜ ์กฐ๊ฐ๋“ค์ด ์ด๋ฏธ ๊ฐ–์ถฐ์ ธ ์žˆ์—ˆ๊ณ , ๋””์ž์ธ์€ ์ •์˜๋˜์–ด ์žˆ์—ˆ์œผ๋ฉฐ, ํ•„์š”์กฐ๊ฑด๊ณผ ๋„๊ตฌ๋Š” ์ค€๋น„๋˜์–ด ์žˆ์—ˆ๊ณ , ํ‘œ์ค€๊ณผ ๋ช…์„ธ์— ๋Œ€ํ•œ ์ง€์‹๋„ ๋ช…ํ™•ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.
+**FastAPI** ์ž์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ์ฏค์—๋Š”, ๋Œ€๋ถ€๋ถ„์˜ ์กฐ๊ฐ๋“ค์ด ์ด๋ฏธ ๊ฐ–์ถฐ์ ธ ์žˆ์—ˆ๊ณ , ๋””์ž์ธ์€ ์ •์˜๋˜์–ด ์žˆ์—ˆ๋ฉฐ, ํ•„์š”์กฐ๊ฑด๊ณผ ๋„๊ตฌ๋Š” ์ค€๋น„๋˜์–ด ์žˆ์—ˆ๊ณ , ํ‘œ์ค€๊ณผ ๋ช…์„ธ์— ๋Œ€ํ•œ ์ง€์‹๋„ ๋ช…ํ™•ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.
 
 ## ๋ฏธ๋ž˜ { #future }
 
@@ -76,4 +76,4 @@
 
 **FastAPI**์˜ ๋ฏธ๋ž˜๋Š” ๋ฐ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋ฆฌ๊ณ  [์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€](help-fastapi.md){.internal-link target=_blank}์€ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  [์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€](help-fastapi.md)์€ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค.
index e039c073e94235e71904b606be9f7bc0b903ebe9..c82ed0de22249ad53dae1c8a1ced288ae6004247 100644 (file)
@@ -2,7 +2,7 @@
 
 FastAPI ๋ฒ„์ „ `0.122.0` ์ด์ „์—๋Š”, ํ†ตํ•ฉ ๋ณด์•ˆ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์ธ์ฆ ์‹คํŒจ ํ›„ ํด๋ผ์ด์–ธํŠธ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ HTTP ์ƒํƒœ ์ฝ”๋“œ `403 Forbidden`์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
 
-FastAPI ๋ฒ„์ „ `0.122.0`๋ถ€ํ„ฐ๋Š” ๋” ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ `401 Unauthorized`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, HTTP ๋ช…์„ธ์ธ <a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>, <a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>๋ฅผ ๋”ฐ๋ผ ์‘๋‹ต์— ํ•ฉ๋ฆฌ์ ์ธ `WWW-Authenticate` ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
+FastAPI ๋ฒ„์ „ `0.122.0`๋ถ€ํ„ฐ๋Š” ๋” ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ `401 Unauthorized`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, HTTP ๋ช…์„ธ์ธ [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized)๋ฅผ ๋”ฐ๋ผ ์‘๋‹ต์— ํ•ฉ๋ฆฌ์ ์ธ `WWW-Authenticate` ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
 ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด์ „ ๋™์ž‘์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋ณด์•ˆ ํด๋ž˜์Šค์—์„œ `make_not_authenticated_error` ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์ด์ „ ๋™์ž‘์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
index 3a87bf010b21aa1ad50c91d53a31a966d114069d..b1617b1e83049374607495462dea5325e55cec62 100644 (file)
@@ -10,7 +10,7 @@
 
 ์ฝ”๋“œ์— ๋ณด์•ˆ ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ฒฐํ•จ์€ ์—ฌ์ „ํžˆ ์กด์žฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
-๋ฌธ์„œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ํ”„๋กœ๋•์…˜์—์„œ ๋””๋ฒ„๊น…์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ <a href="https://en.wikipedia.org/wiki/Security_through_obscurity" class="external-link" target="_blank">Security through obscurity</a>์˜ ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋ฌธ์„œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ํ”„๋กœ๋•์…˜์—์„œ ๋””๋ฒ„๊น…์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ [์€ํ๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ](https://en.wikipedia.org/wiki/Security_through_obscurity)์˜ ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 API๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:
 
index b518fd8f729f09fa815c8ed41c7c27b0fb1cb6df..8322266f5bc64b1f38427d6eda88a0c09faa4092 100644 (file)
@@ -1,6 +1,6 @@
 # Swagger UI ๊ตฌ์„ฑ { #configure-swagger-ui }
 
-์ถ”๊ฐ€์ ์ธ <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜</a>๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ถ”๊ฐ€์ ์ธ [Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ตฌ์„ฑ์„ ํ•˜๋ ค๋ฉด, `FastAPI()` ์•ฑ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋˜๋Š” `get_swagger_ui_html()` ํ•จ์ˆ˜์— `swagger_ui_parameters` ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค.
 
@@ -50,7 +50,7 @@ FastAPI๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ๋งค
 
 ## ๊ธฐํƒ€ Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜ { #other-swagger-ui-parameters }
 
-์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ตฌ์„ฑ ์˜ต์…˜์„ ํ™•์ธํ•˜๋ ค๋ฉด, Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ณต์‹ <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์„œ</a>๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
+์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ตฌ์„ฑ ์˜ต์…˜์„ ํ™•์ธํ•˜๋ ค๋ฉด, ๊ณต์‹ [Swagger UI ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์„œ](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
 
 ## JavaScript ์ „์šฉ ์„ค์ • { #javascript-only-settings }
 
index 7eb4b3cfdb54badc8fbb2929ec3e09bbe6c42408..265eaca047429db61b8f04bf69b118d55a736416 100644 (file)
@@ -54,7 +54,7 @@ Swagger UI๊ฐ€ ์ด ๊ณผ์ •์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด ์ฃผ์ง€๋งŒ, ์ด๋ฅผ 
 
 ### ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #test-it }
 
-์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด, ์ƒˆ CDN์—์„œ ์—์…‹์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด, ์ƒˆ CDN์—์„œ ์—์…‹์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ๋ฌธ์„œ์šฉ JavaScript์™€ CSS ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๊ธฐ { #self-hosting-javascript-and-css-for-docs }
 
@@ -93,12 +93,12 @@ JavaScript์™€ CSS๋ฅผ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜คํ”„๋ผ์ธ 
 
 **Swagger UI**๋Š” ๋‹ค์Œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
 
-* <a href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js" class="external-link" target="_blank">`swagger-ui-bundle.js`</a>
-* <a href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css" class="external-link" target="_blank">`swagger-ui.css`</a>
+* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js)
+* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css)
 
 **ReDoc**์€ ๋‹ค์Œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
 
-* <a href="https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js" class="external-link" target="_blank">`redoc.standalone.js`</a>
+* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js)
 
 ์ดํ›„ ํŒŒ์ผ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -122,7 +122,7 @@ JavaScript์™€ CSS๋ฅผ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜คํ”„๋ผ์ธ 
 
 ### ์ •์  ํŒŒ์ผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #test-the-static-files }
 
-์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  <a href="http://127.0.0.1:8000/static/redoc.standalone.js" class="external-link" target="_blank">http://127.0.0.1:8000/static/redoc.standalone.js</a>๋กœ ์ด๋™ํ•˜์„ธ์š”.
+์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js)๋กœ ์ด๋™ํ•˜์„ธ์š”.
 
 **ReDoc**์šฉ ๋งค์šฐ ๊ธด JavaScript ํŒŒ์ผ์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
@@ -180,6 +180,6 @@ Swagger UI๊ฐ€ ์ด ๊ณผ์ •์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด ์ฃผ์ง€๋งŒ, ์ด๋ฅผ 
 
 ### ์ •์  ํŒŒ์ผ UI ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #test-static-files-ui }
 
-์ด์ œ WiFi ์—ฐ๊ฒฐ์„ ๋Š๊ณ  <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด ๋ณด์„ธ์š”.
+์ด์ œ WiFi ์—ฐ๊ฒฐ์„ ๋Š๊ณ  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ๋ฌธ์„œ์— ์ ‘์†ํ•œ ๋’ค ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด ๋ณด์„ธ์š”.
 
 ์ธํ„ฐ๋„ท์ด ์—†์–ด๋„ API ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ , API์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
index 335193bb35cc5283d15bc7f7f825c2c08359c97e..99138a737002b60da0572a8ed3c18952ae7e0743 100644 (file)
@@ -18,7 +18,7 @@
 
 ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:
 
-* JSON์ด ์•„๋‹Œ ์š”์ฒญ ๋ฐ”๋””๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ(์˜ˆ: <a href="https://msgpack.org/index.html" class="external-link" target="_blank">`msgpack`</a>).
+* JSON์ด ์•„๋‹Œ ์š”์ฒญ ๋ฐ”๋””๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ(์˜ˆ: [`msgpack`](https://msgpack.org/index.html)).
 * gzip์œผ๋กœ ์••์ถ•๋œ ์š”์ฒญ ๋ฐ”๋”” ์••์ถ• ํ•ด์ œํ•˜๊ธฐ.
 * ๋ชจ๋“  ์š”์ฒญ ๋ฐ”๋””๋ฅผ ์ž๋™์œผ๋กœ ๋กœ๊น…ํ•˜๊ธฐ.
 
@@ -32,7 +32,7 @@
 
 /// tip | ํŒ
 
-์ด ์˜ˆ์‹œ๋Š” ๋™์ž‘ ๋ฐฉ์‹ ์‹œ์—ฐ์„ ์œ„ํ•œ ์žฅ๋‚œ๊ฐ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. Gzip ์ง€์›์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ œ๊ณต๋˜๋Š” [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด ์˜ˆ์‹œ๋Š” ๋™์ž‘ ๋ฐฉ์‹ ์‹œ์—ฐ์„ ์œ„ํ•œ ์žฅ๋‚œ๊ฐ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. Gzip ์ง€์›์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ œ๊ณต๋˜๋Š” [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -66,7 +66,7 @@
 
 ๊ทธ๋ฆฌ๊ณ  ์ด ๋‘ ๊ฐ€์ง€, `scope`์™€ `receive`๊ฐ€ ์ƒˆ๋กœ์šด `Request` ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.
 
-`Request`์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">Starlette์˜ Requests ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+`Request`์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [Starlette์˜ Requests ๋ฌธ์„œ](https://www.starlette.dev/requests/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
@@ -82,7 +82,7 @@
 
 /// tip | ํŒ
 
-๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด `RequestValidationError`์— ๋Œ€ํ•œ ์ปค์Šคํ…€ ํ•ธ๋“ค๋Ÿฌ์—์„œ `body`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ์•„๋งˆ ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค([์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}).
+๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด `RequestValidationError`์— ๋Œ€ํ•œ ์ปค์Šคํ…€ ํ•ธ๋“ค๋Ÿฌ์—์„œ `body`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ์•„๋งˆ ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค([์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)).
 
 ํ•˜์ง€๋งŒ ์ด ์˜ˆ์‹œ๋„ ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋ฉฐ, ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
 
index 0589e479bf4599eccf74b0a9f4844b82ce471b27..992243dbe5c0843c7f08777056882c6fad62d299 100644 (file)
@@ -37,7 +37,7 @@
 
 ์œ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ๋™์ผํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด OpenAPI ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฐ ๋ถ€๋ถ„์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด, <a href="https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo" class="external-link" target="_blank">์ปค์Šคํ…€ ๋กœ๊ณ ๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ReDoc์˜ OpenAPI ํ™•์žฅ</a>์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
+์˜ˆ๋ฅผ ๋“ค์–ด, [์ปค์Šคํ…€ ๋กœ๊ณ ๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ReDoc์˜ OpenAPI ํ™•์žฅ](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo)์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
 
 ### ์ผ๋ฐ˜์ ์ธ **FastAPI** { #normal-fastapi }
 
@@ -75,6 +75,6 @@
 
 ### ํ™•์ธํ•˜๊ธฐ { #check-it }
 
-<a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ์ด๋™ํ•˜๋ฉด ์ปค์Šคํ…€ ๋กœ๊ณ (์ด ์˜ˆ์‹œ์—์„œ๋Š” **FastAPI** ๋กœ๊ณ )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ์ด๋™ํ•˜๋ฉด ์ปค์Šคํ…€ ๋กœ๊ณ (์ด ์˜ˆ์‹œ์—์„œ๋Š” **FastAPI** ๋กœ๊ณ )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/extending-openapi/image01.png">
index a18dc68a21b9d84209e8b0befafbcbabc2f82b15..28f9535bc7cc64f20cea0420e1918d4f7f56d0b0 100644 (file)
@@ -4,36 +4,40 @@
 
 ## ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง - ๋ณด์•ˆ { #filter-data-security }
 
-๋ฐ˜ํ™˜ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด, [ํŠœํ† ๋ฆฌ์–ผ - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž…](../tutorial/response-model.md){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+๋ฐ˜ํ™˜ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด, [ํŠœํ† ๋ฆฌ์–ผ - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž…](../tutorial/response-model.md) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+
+## ์‘๋‹ต ์„ฑ๋Šฅ ์ตœ์ ํ™” - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž… { #optimize-response-performance-response-model-return-type }
+
+JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ๋ฐ˜ํ™˜ ํƒ€์ž… ๋˜๋Š” ์‘๋‹ต ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด Pydantic์ด Python์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  Rust ์ธก์—์„œ JSON ์ง๋ ฌํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [ํŠœํ† ๋ฆฌ์–ผ - ์‘๋‹ต ๋ชจ๋ธ - ๋ฐ˜ํ™˜ ํƒ€์ž…](../tutorial/response-model.md) ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 ## ๋ฌธ์„œํ™” ํƒœ๊ทธ - OpenAPI { #documentation-tags-openapi }
 
-*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์—์„œ ์ด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ํƒœ๊ทธ](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์—์„œ ์ด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ํƒœ๊ทธ](../tutorial/path-operation-configuration.md#tags) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## ๋ฌธ์„œํ™” ์š”์•ฝ ๋ฐ ์„ค๋ช… - OpenAPI { #documentation-summary-and-description-openapi }
 
-*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์š”์•ฝ๊ณผ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์— ํ‘œ์‹œํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์š”์•ฝ ๋ฐ ์„ค๋ช…](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์š”์•ฝ๊ณผ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌธ์„œ UI์— ํ‘œ์‹œํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์š”์•ฝ ๋ฐ ์„ค๋ช…](../tutorial/path-operation-configuration.md#summary-and-description) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## ๋ฌธ์„œํ™” ์‘๋‹ต ์„ค๋ช… - OpenAPI { #documentation-response-description-openapi }
 
-๋ฌธ์„œ UI์— ํ‘œ์‹œ๋˜๋Š” ์‘๋‹ต์˜ ์„ค๋ช…์„ ์ •์˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์‘๋‹ต ์„ค๋ช…](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+๋ฌธ์„œ UI์— ํ‘œ์‹œ๋˜๋Š” ์‘๋‹ต์˜ ์„ค๋ช…์„ ์ •์˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์‘๋‹ต ์„ค๋ช…](../tutorial/path-operation-configuration.md#response-description) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## ๋ฌธ์„œํ™” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์ง€์› ์ค‘๋‹จํ•˜๊ธฐ - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
 
-*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ์ง€์› ์ค‘๋‹จ(deprecate)์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ , ๋ฌธ์„œ UI์— ๋ณด์—ฌ์ฃผ๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์ง€์› ์ค‘๋‹จ](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๋ฅผ ์ง€์› ์ค‘๋‹จ(deprecate)์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ , ๋ฌธ์„œ UI์— ๋ณด์—ฌ์ฃผ๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ - ์ง€์› ์ค‘๋‹จ](../tutorial/path-operation-configuration.md#deprecate-a-path-operation) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## ์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  JSON ํ˜ธํ™˜์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ { #convert-any-data-to-json-compatible }
 
-์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  JSON ํ˜ธํ™˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - JSON ํ˜ธํ™˜ ์ธ์ฝ”๋”](../tutorial/encoder.md){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  JSON ํ˜ธํ™˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - JSON ํ˜ธํ™˜ ์ธ์ฝ”๋”](../tutorial/encoder.md) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## OpenAPI ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ - ๋ฌธ์„œ { #openapi-metadata-docs }
 
-๋ผ์ด์„ ์Šค, ๋ฒ„์ „, ์—ฐ๋ฝ์ฒ˜ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด OpenAPI ์Šคํ‚ค๋งˆ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+๋ผ์ด์„ ์Šค, ๋ฒ„์ „, ์—ฐ๋ฝ์ฒ˜ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด OpenAPI ์Šคํ‚ค๋งˆ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## OpenAPI ์‚ฌ์šฉ์ž ์ •์˜ URL { #openapi-custom-url }
 
-OpenAPI URL์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ(๋˜๋Š” ์ œ๊ฑฐ)ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#openapi-url){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+OpenAPI URL์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ(๋˜๋Š” ์ œ๊ฑฐ)ํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#openapi-url) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ## OpenAPI ๋ฌธ์„œ URL { #openapi-docs-urls }
 
-์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” URL์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#docs-urls){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” URL์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด [ํŠœํ† ๋ฆฌ์–ผ - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์„œ URL](../tutorial/metadata.md#docs-urls) ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
index a960e6d8b240b1fa03292700b78d40bcd12ea2c6..c4353d57d3ae922107fc3367a012f42edb5ded67 100644 (file)
 
 ๋‹ค์Œ์€ **ASGI** ์ง€์›์ด ์žˆ๋Š” **GraphQL** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ž…๋‹ˆ๋‹ค. **FastAPI**์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a> ๐Ÿ“
-    * <a href="https://strawberry.rocks/docs/integrations/fastapi" class="external-link" target="_blank">FastAPI์šฉ ๋ฌธ์„œ</a> ์ œ๊ณต
-* <a href="https://ariadnegraphql.org/" class="external-link" target="_blank">Ariadne</a>
-    * <a href="https://ariadnegraphql.org/docs/fastapi-integration" class="external-link" target="_blank">FastAPI์šฉ ๋ฌธ์„œ</a> ์ œ๊ณต
-* <a href="https://tartiflette.io/" class="external-link" target="_blank">Tartiflette</a>
-    * ASGI ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด <a href="https://tartiflette.github.io/tartiflette-asgi/" class="external-link" target="_blank">Tartiflette ASGI</a> ์‚ฌ์šฉ
-* <a href="https://graphene-python.org/" class="external-link" target="_blank">Graphene</a>
-    * <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a> ์‚ฌ์šฉ
+* [Strawberry](https://strawberry.rocks/) ๐Ÿ“
+    * [FastAPI์šฉ ๋ฌธ์„œ](https://strawberry.rocks/docs/integrations/fastapi) ์ œ๊ณต
+* [Ariadne](https://ariadnegraphql.org/)
+    * [FastAPI์šฉ ๋ฌธ์„œ](https://ariadnegraphql.org/docs/fastapi-integration) ์ œ๊ณต
+* [Tartiflette](https://tartiflette.io/)
+    * ASGI ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) ์‚ฌ์šฉ
+* [Graphene](https://graphene-python.org/)
+    * [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ์‚ฌ์šฉ
 
 ## Strawberry๋กœ GraphQL ์‚ฌ์šฉํ•˜๊ธฐ { #graphql-with-strawberry }
 
-**GraphQL**๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, <a href="https://strawberry.rocks/" class="external-link" target="_blank">**Strawberry**</a>๋ฅผ **๊ถŒ์žฅ**ํ•ฉ๋‹ˆ๋‹ค. **FastAPI**์˜ ์„ค๊ณ„์™€ ๊ฐ€์žฅ ๊ฐ€๊น๊ณ , ๋ชจ๋“  ๊ฒƒ์ด **type annotations**์— ๊ธฐ๋ฐ˜ํ•ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
+**GraphQL**๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, [**Strawberry**](https://strawberry.rocks/)๋ฅผ **๊ถŒ์žฅ**ํ•ฉ๋‹ˆ๋‹ค. **FastAPI**์˜ ์„ค๊ณ„์™€ ๊ฐ€์žฅ ๊ฐ€๊น๊ณ , ๋ชจ๋“  ๊ฒƒ์ด **type annotations**์— ๊ธฐ๋ฐ˜ํ•ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 
 ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ œ๊ฒŒ ๋ฌป๋Š”๋‹ค๋ฉด ์•„๋งˆ **Strawberry**๋ฅผ ๋จผ์ € ์‹œ๋„ํ•ด ๋ณด๋ผ๊ณ  ์ œ์•ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 
 {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
 
-<a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry ๋ฌธ์„œ</a>์—์„œ Strawberry์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[Strawberry ๋ฌธ์„œ](https://strawberry.rocks/)์—์„œ Strawberry์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๋˜ํ•œ <a href="https://strawberry.rocks/docs/integrations/fastapi" class="external-link" target="_blank">FastAPI์—์„œ Strawberry ์‚ฌ์šฉ</a>์— ๋Œ€ํ•œ ๋ฌธ์„œ๋„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
+๋˜ํ•œ [FastAPI์—์„œ Strawberry ์‚ฌ์šฉ](https://strawberry.rocks/docs/integrations/fastapi)์— ๋Œ€ํ•œ ๋ฌธ์„œ๋„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
 
 ## Starlette์˜ ์˜ˆ์ „ `GraphQLApp` { #older-graphqlapp-from-starlette }
 
-์ด์ „ ๋ฒ„์ „์˜ Starlette์—๋Š” <a href="https://graphene-python.org/" class="external-link" target="_blank">Graphene</a>๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ `GraphQLApp` ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
+์ด์ „ ๋ฒ„์ „์˜ Starlette์—๋Š” [Graphene](https://graphene-python.org/)๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ `GraphQLApp` ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
 
-์ด๊ฒƒ์€ Starlette์—์„œ deprecated ๋˜์—ˆ์ง€๋งŒ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  **๊ฑฐ์˜ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค**๋ฅผ ๊ฐ€์ง„ <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a>๋กœ ์‰ฝ๊ฒŒ **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด๊ฒƒ์€ Starlette์—์„œ deprecated ๋˜์—ˆ์ง€๋งŒ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  **๊ฑฐ์˜ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค**๋ฅผ ๊ฐ€์ง„ [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3)๋กœ ์‰ฝ๊ฒŒ **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
-GraphQL์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ปค์Šคํ…€ ํด๋ž˜์Šค์™€ ํƒ€์ž… ๋Œ€์‹  type annotations์— ๊ธฐ๋ฐ˜ํ•œ <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a>๋ฅผ ์—ฌ์ „ํžˆ ํ™•์ธํ•ด ๋ณด์‹œ๊ธธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
+GraphQL์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ปค์Šคํ…€ ํด๋ž˜์Šค์™€ ํƒ€์ž… ๋Œ€์‹  type annotations์— ๊ธฐ๋ฐ˜ํ•œ [Strawberry](https://strawberry.rocks/)๋ฅผ ์—ฌ์ „ํžˆ ํ™•์ธํ•ด ๋ณด์‹œ๊ธธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
 
 ///
 
 ## ๋” ์•Œ์•„๋ณด๊ธฐ { #learn-more }
 
-<a href="https://graphql.org/" class="external-link" target="_blank">๊ณต์‹ GraphQL ๋ฌธ์„œ</a>์—์„œ **GraphQL**์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[๊ณต์‹ GraphQL ๋ฌธ์„œ](https://graphql.org/)์—์„œ **GraphQL**์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋˜ํ•œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ํ•ด๋‹น ๋งํฌ์—์„œ ๋” ์ž์„ธํžˆ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
index 9321c488bd85dc947674ccdf3dae110fe1d39e37..f80f9f3586693d2e215e58b74df2b21815a96741 100644 (file)
@@ -8,6 +8,6 @@
 
 /// tip | ํŒ
 
-**FastAPI๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ํ•™์Šต**ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(๊ถŒ์žฅ), ๋Œ€์‹  [ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../tutorial/index.md){.internal-link target=_blank}๋ฅผ ์žฅ๋ณ„๋กœ ์ฝ์–ด๋ณด์„ธ์š”.
+**FastAPI๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ํ•™์Šต**ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(๊ถŒ์žฅ), ๋Œ€์‹  [ํŠœํ† ๋ฆฌ์–ผ - ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../tutorial/index.md)๋ฅผ ์žฅ๋ณ„๋กœ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ///
index 5dd40cbdc2a9437aebcb42e029f79d71f3a691f3..d47f0bc415017f22aa3c4d3e37552a45d73ae451 100644 (file)
@@ -10,7 +10,7 @@ FastAPI 0.126.0 ๋ฒ„์ „์—์„œ๋Š” Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์ง€๋งŒ, `pydantic
 
 /// warning | ๊ฒฝ๊ณ 
 
-Pydantic ํŒ€์€ **Python 3.14**๋ถ€ํ„ฐ ์ตœ์‹  Python ๋ฒ„์ „์—์„œ Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
+Pydantic ํŒ€์€ ์ตœ์‹  Python ๋ฒ„์ „์—์„œ Pydantic v1 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์œผ๋ฉฐ, ์‹œ์ž‘ ๋ฒ„์ „์€ **Python 3.14**์ž…๋‹ˆ๋‹ค.
 
 ์—ฌ๊ธฐ์—๋Š” `pydantic.v1`๋„ ํฌํ•จ๋˜๋ฉฐ, Python 3.14 ์ด์ƒ์—์„œ๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
@@ -22,7 +22,7 @@ Pydantic v1์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ž˜๋œ FastAPI ์•ฑ์ด ์žˆ๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ๋Š” ์ด
 
 ## ๊ณต์‹ ๊ฐ€์ด๋“œ { #official-guide }
 
-Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ <a href="https://docs.pydantic.dev/latest/migration/" class="external-link" target="_blank">๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
+Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ [๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ](https://docs.pydantic.dev/latest/migration/)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์—ฌ๊ธฐ์—๋Š” ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€, ๊ฒ€์ฆ์ด ์ด์ œ ์–ด๋–ป๊ฒŒ ๋” ์ •ํ™•ํ•˜๊ณ  ์—„๊ฒฉํ•ด์กŒ๋Š”์ง€, ๊ฐ€๋Šฅํ•œ ์ฃผ์˜์‚ฌํ•ญ ๋“ฑ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -30,7 +30,7 @@ Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ <a href="https://docs.pydantic.dev/lates
 
 ## ํ…Œ์ŠคํŠธ { #tests }
 
-์•ฑ์— ๋Œ€ํ•œ [ํ…Œ์ŠคํŠธ](../tutorial/testing.md){.internal-link target=_blank}๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ง€์†์  ํ†ตํ•ฉ(CI)์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
+์•ฑ์— ๋Œ€ํ•œ [ํ…Œ์ŠคํŠธ](../tutorial/testing.md)๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ง€์†์  ํ†ตํ•ฉ(CI)์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
 
 ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ๋„ ๋ชจ๋“  ๊ฒƒ์ด ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๊ณ„์† ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -38,7 +38,7 @@ Pydantic์—๋Š” v1์—์„œ v2๋กœ์˜ ๊ณต์‹ <a href="https://docs.pydantic.dev/lates
 
 ๋งŽ์€ ๊ฒฝ์šฐ, ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์—†์ด ์ผ๋ฐ˜์ ์ธ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด Pydantic v1์—์„œ Pydantic v2๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ • ๋Œ€๋ถ€๋ถ„์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๊ฐ™์€ Pydantic ํŒ€์ด ์ œ๊ณตํ•˜๋Š” <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๊ฐ™์€ Pydantic ํŒ€์ด ์ œ๊ณตํ•˜๋Š” [`bump-pydantic`](https://github.com/pydantic/bump-pydantic)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด ๋„๊ตฌ๋Š” ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์„ ์ž๋™์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
 
index 2d7798d7075eefe482c509d16569b0e9f072f8e1..fe0bec809cb501ed6c4e28cdf450f8fc8eb7e70e 100644 (file)
@@ -1,7 +1,7 @@
 # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ŠคํŠธํ•˜๊ธฐ { #testing-a-database }
 
-๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, SQL, SQLModel์— ๋Œ€ํ•ด์„œ๋Š” <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ๋ฌธ์„œ</a>์—์„œ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
+๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, SQL, SQLModel์— ๋Œ€ํ•ด์„œ๋Š” [SQLModel ๋ฌธ์„œ](https://sqlmodel.tiangolo.com/)์—์„œ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
 
-<a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">FastAPI์—์„œ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฏธ๋‹ˆ ํŠœํ† ๋ฆฌ์–ผ</a>๋„ ์žˆ์Šต๋‹ˆ๋‹ค. โœจ
+[FastAPI์—์„œ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฏธ๋‹ˆ ํŠœํ† ๋ฆฌ์–ผ](https://sqlmodel.tiangolo.com/tutorial/fastapi/)๋„ ์žˆ์Šต๋‹ˆ๋‹ค. โœจ
 
-ํ•ด๋‹น ํŠœํ† ๋ฆฌ์–ผ์—๋Š” <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/" class="external-link" target="_blank">SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ŠคํŠธ</a>์— ๋Œ€ํ•œ ์„น์…˜๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž
+ํ•ด๋‹น ํŠœํ† ๋ฆฌ์–ผ์—๋Š” [SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ŠคํŠธ](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/)์— ๋Œ€ํ•œ ์„น์…˜๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž
index d2e08be16f5dda992b12ee30cb1664557588ca2c..91d27fcee9049041448d61cee532ae27c3bae14b 100644 (file)
     <em>FastAPI ํ”„๋ ˆ์ž„์›Œํฌ, ๊ณ ์„ฑ๋Šฅ, ๊ฐ„ํŽธํ•œ ํ•™์Šต, ๋น ๋ฅธ ์ฝ”๋“œ ์ž‘์„ฑ, ์ค€๋น„๋œ ํ”„๋กœ๋•์…˜</em>
 </p>
 <p align="center">
-<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
+<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster">
     <img src="https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master" alt="Test">
 </a>
-<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi" target="_blank">
+<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi">
     <img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg" alt="Coverage">
 </a>
-<a href="https://pypi.org/project/fastapi" target="_blank">
+<a href="https://pypi.org/project/fastapi">
     <img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version">
 </a>
-<a href="https://pypi.org/project/fastapi" target="_blank">
+<a href="https://pypi.org/project/fastapi">
     <img src="https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058" alt="Supported Python versions">
 </a>
 </p>
 
 ---
 
-**๋ฌธ์„œ**: <a href="https://fastapi.tiangolo.com/ko" target="_blank">https://fastapi.tiangolo.com</a>
+**๋ฌธ์„œ**: [https://fastapi.tiangolo.com/ko](https://fastapi.tiangolo.com/ko)
 
-**์†Œ์Šค ์ฝ”๋“œ**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a>
+**์†Œ์Šค ์ฝ”๋“œ**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)
 
 ---
 
@@ -44,7 +44,7 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
 * **์‰ฌ์›€**: ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฐ์šฐ๋„๋ก ์„ค๊ณ„. ์ ์€ ๋ฌธ์„œ ์ฝ๊ธฐ ์‹œ๊ฐ„.
 * **์งง์Œ**: ์ฝ”๋“œ ์ค‘๋ณต ์ตœ์†Œํ™”. ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ. ์ ์€ ๋ฒ„๊ทธ.
 * **๊ฒฌ๊ณ ํ•จ**: ์ค€๋น„๋œ ํ”„๋กœ๋•์…˜ ์šฉ ์ฝ”๋“œ๋ฅผ ์–ป์œผ์‹ญ์‹œ์˜ค. ์ž๋™ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ์™€ ํ•จ๊ป˜.
-* **ํ‘œ์ค€ ๊ธฐ๋ฐ˜**: API์— ๋Œ€ํ•œ (์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š”) ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๊ธฐ๋ฐ˜: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (์ด์ „์— Swagger๋กœ ์•Œ๋ ค์กŒ๋˜) ๋ฐ <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
+* **ํ‘œ์ค€ ๊ธฐ๋ฐ˜**: API์— ๋Œ€ํ•œ (์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š”) ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๊ธฐ๋ฐ˜: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (์ด์ „์— Swagger๋กœ ์•Œ๋ ค์กŒ๋˜) ๋ฐ [JSON Schema](https://json-schema.org/).
 
 <small>* ๋‚ด๋ถ€ ๊ฐœ๋ฐœํŒ€์˜ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•œ ํ…Œ์ŠคํŠธ์— ๊ทผ๊ฑฐํ•œ ์ธก์ •</small>
 
@@ -55,51 +55,51 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
 ### ํ‚ค์Šคํ†ค ์Šคํฐ์„œ { #keystone-sponsor }
 
 {% for sponsor in sponsors.keystone -%}
-<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
+<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
 {% endfor -%}
 
 ### ๊ณจ๋“œ ๋ฐ ์‹ค๋ฒ„ ์Šคํฐ์„œ { #gold-and-silver-sponsors }
 
 {% for sponsor in sponsors.gold -%}
-<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
+<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
 {% endfor -%}
 {%- for sponsor in sponsors.silver -%}
-<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
+<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
 {% endfor %}
 
 <!-- /sponsors -->
 
-<a href="https://fastapi.tiangolo.com/ko/fastapi-people/#sponsors" class="external-link" target="_blank">๋‹ค๋ฅธ ์Šคํฐ์„œ</a>
+[๋‹ค๋ฅธ ์Šคํฐ์„œ](https://fastapi.tiangolo.com/ko/fastapi-people/#sponsors)
 
 ## ์˜๊ฒฌ๋“ค { #opinions }
 
 "_[...] ์ €๋Š” ์š”์ฆ˜ **FastAPI**๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. [...] ์‚ฌ์‹ค ์šฐ๋ฆฌ ํŒ€์˜ **๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ML ์„œ๋น„์Šค** ์ „๋ถ€๋ฅผ ๋ฐ”๊ฟ€ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ํ•ต์‹ฌ **Windows**์™€ ๋ช‡๋ช‡์˜ **Office** ์ œํ’ˆ๋“ค์ด ํ†ตํ•ฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._"
 
-<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ</strong> <a href="https://github.com/fastapi/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(ref)</small></a></div>
 
 ---
 
 "_**FastAPI** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ **์˜ˆ์ธก**์„ ์–ป๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” **REST** ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. [Ludwig์„ ์œ„ํ•ด]_"
 
-<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin ๊ทธ๋ฆฌ๊ณ  Sai Sumanth Miryala - <strong>์šฐ๋ฒ„</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin ๊ทธ๋ฆฌ๊ณ  Sai Sumanth Miryala - <strong>์šฐ๋ฒ„</strong> <a href="https://eng.uber.com/ludwig-v0-2/"><small>(ref)</small></a></div>
 
 ---
 
 "_**Netflix**๋Š” ์šฐ๋ฆฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฐฐํฌํŒ์ธ **์œ„๊ธฐ ๊ด€๋ฆฌ** ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐœํ‘œํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค: ๋ฐ”๋กœ **Dispatch**์ž…๋‹ˆ๋‹ค! [**FastAPI**๋กœ ๋นŒ๋“œ]_"
 
-<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>๋„ทํ”Œ๋ฆญ์Šค</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>๋„ทํ”Œ๋ฆญ์Šค</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072"><small>(ref)</small></a></div>
 
 ---
 
 "_**FastAPI**๊ฐ€ ๋„ˆ๋ฌด ์ข‹์•„์„œ ๊ตฌ๋ฆ„ ์œ„๋ฅผ ๊ฑท๋Š”๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค!_"
 
-<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> ํŒŸ์บ์ŠคํŠธ ํ˜ธ์ŠคํŠธ</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong>[Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832"><small>(ref)</small></a></div>
 
 ---
 
 "_์†”์งํžˆ, ๋‹น์‹ ์ด ๋งŒ๋“  ๊ฒƒ์€ ๋งค์šฐ ๊ฒฌ๊ณ ํ•˜๊ณ  ์„ธ๋ จ๋˜์–ด ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฉด์—์„œ **Hug**๊ฐ€ ์ด๋ ‡๊ฒŒ ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค - ๊ทธ๊ฑธ ๋งŒ๋“  ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ๋งŽ์€ ์˜๊ฐ์„ ์ค๋‹ˆ๋‹ค._"
 
-<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> ์ œ์ž‘์ž</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong>[Hug](https://github.com/hugapi/hug) ์ œ์ž‘์ž</strong> <a href="https://news.ycombinator.com/item?id=19455465"><small>(ref)</small></a></div>
 
 ---
 
@@ -107,27 +107,27 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
 
 "_์šฐ๋ฆฌ **API**๋ฅผ **FastAPI**๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค  [...] ์•„๋งˆ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ข‹์•„ํ•˜์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค [...]_"
 
-<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> ์„ค๋ฆฝ์ž - <a href="https://spacy.io" target="_blank">spaCy</a> ์ œ์ž‘์ž</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong>[Explosion AI](https://explosion.ai) ์„ค๋ฆฝ์ž - [spaCy](https://spacy.io) ์ œ์ž‘์ž</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680"><small>(ref)</small></a></div>
 
 ---
 
 "_ํ”„๋กœ๋•์…˜ Python API๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ €๋Š” **FastAPI**๋ฅผ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. **์•„๋ฆ„๋‹ต๊ฒŒ ์„ค๊ณ„**๋˜์—ˆ๊ณ , **์‚ฌ์šฉ์ด ๊ฐ„๋‹จ**ํ•˜๋ฉฐ, **ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚˜**๊ณ , ์šฐ๋ฆฌ์˜ API ์šฐ์„  ๊ฐœ๋ฐœ ์ „๋žต์—์„œ **ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ**๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ Virtual TAC Engineer ๊ฐ™์€ ๋งŽ์€ ์ž๋™ํ™”์™€ ์„œ๋น„์Šค๋ฅผ ์ด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._"
 
-<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/"><small>(ref)</small></a></div>
 
 ---
 
 ## FastAPI ๋ฏธ๋‹ˆ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ { #fastapi-mini-documentary }
 
-2025๋…„ ๋ง์— ๊ณต๊ฐœ๋œ <a href="https://www.youtube.com/watch?v=mpR8ngthqiE" class="external-link" target="_blank">FastAPI ๋ฏธ๋‹ˆ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ์—์„œ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+2025๋…„ ๋ง์— ๊ณต๊ฐœ๋œ [FastAPI ๋ฏธ๋‹ˆ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ](https://www.youtube.com/watch?v=mpR8ngthqiE)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ์—์„œ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
-<a href="https://www.youtube.com/watch?v=mpR8ngthqiE" target="_blank"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
+<a href="https://www.youtube.com/watch?v=mpR8ngthqiE"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
 
 ## **Typer**, CLI๋ฅผ ์œ„ํ•œ FastAPI { #typer-the-fastapi-of-clis }
 
-<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
+<a href="https://typer.tiangolo.com"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
 
-์›น API ๋Œ€์‹  ํ„ฐ๋ฏธ๋„์—์„œ ์‚ฌ์šฉํ•  <abbr title="Command Line Interface - ์ปค๋งจ๋“œ ๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค">CLI</abbr> ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด, <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>๋ฅผ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
+์›น API ๋Œ€์‹  ํ„ฐ๋ฏธ๋„์—์„œ ์‚ฌ์šฉํ•  <abbr title="Command Line Interface - ์ปค๋งจ๋“œ ๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค">CLI</abbr> ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด, [**Typer**](https://typer.tiangolo.com/)๋ฅผ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
 
 **Typer**๋Š” FastAPI์˜ ๋™์ƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  **CLI๋ฅผ ์œ„ํ•œ FastAPI**๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. โŒจ๏ธ ๐Ÿš€
 
@@ -135,12 +135,12 @@ FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ
 
 FastAPI๋Š” ๊ฑฐ์ธ๋“ค์˜ ์–ด๊นจ ์œ„์— ์„œ ์žˆ์Šต๋‹ˆ๋‹ค:
 
-* ์›น ๋ถ€๋ถ„์„ ์œ„ํ•œ <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>.
-* ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์„ ์œ„ํ•œ <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>.
+* [Starlette](https://www.starlette.dev/) โ€” ์›น ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
+* [Pydantic](https://docs.pydantic.dev/) โ€” ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
 
 ## ์„ค์น˜ { #installation }
 
-<a href="https://fastapi.tiangolo.com/ko/virtual-environments/" class="external-link" target="_blank">๊ฐ€์ƒ ํ™˜๊ฒฝ</a>์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ FastAPI๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](https://fastapi.tiangolo.com/ko/virtual-environments/)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ FastAPI๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”:
 
 <div class="termy">
 
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None):
 
 **Note**:
 
-์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, <a href="https://fastapi.tiangolo.com/ko/async/#in-a-hurry" target="_blank">๋ฌธ์„œ์—์„œ `async`์™€ `await`</a>์— ๊ด€ํ•œ _"๊ธ‰ํ•˜์„ธ์š”?"_ ์„น์…˜์„ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
+์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ["๊ธ‰ํ•˜์„ธ์š”?"](https://fastapi.tiangolo.com/ko/async/#in-a-hurry) ์„น์…˜์„ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค.
 
 </details>
 
@@ -210,7 +210,7 @@ async def read_item(item_id: int, q: str | None = None):
 <div class="termy">
 
 ```console
-$ fastapi dev main.py
+$ fastapi dev
 
  โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ FastAPI CLI - Development mode โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
  โ”‚                                                     โ”‚
@@ -235,19 +235,19 @@ INFO:     Application startup complete.
 </div>
 
 <details markdown="1">
-<summary><code>fastapi dev main.py</code> ๋ช…๋ น์— ๊ด€ํ•˜์—ฌ...</summary>
+<summary><code>fastapi dev</code> ๋ช…๋ น์— ๊ด€ํ•˜์—ฌ...</summary>
 
-`fastapi dev` ๋ช…๋ น์€ `main.py` ํŒŒ์ผ์„ ์ฝ๊ณ , ๊ทธ ์•ˆ์˜ **FastAPI** ์•ฑ์„ ๊ฐ์ง€ํ•œ ๋‹ค์Œ, <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>์„ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
+`fastapi dev` ๋ช…๋ น์€ ์—ฌ๋Ÿฌ๋ถ„์˜ `main.py` ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ฝ๊ณ , ๊ทธ ์•ˆ์˜ **FastAPI** ์•ฑ์„ ๊ฐ์ง€ํ•œ ๋‹ค์Œ, [Uvicorn](https://www.uvicorn.dev)์„ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
 
 ๊ธฐ๋ณธ์ ์œผ๋กœ `fastapi dev`๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด auto-reload๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://fastapi.tiangolo.com/ko/fastapi-cli/" target="_blank">FastAPI CLI ๋ฌธ์„œ</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [FastAPI CLI ๋ฌธ์„œ](https://fastapi.tiangolo.com/ko/fastapi-cli/)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 </details>
 
 ### ํ™•์ธํ•˜๊ธฐ { #check-it }
 
-๋ธŒ๋ผ์šฐ์ €๋กœ <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a>๋ฅผ ์—ด์–ด๋ณด์‹ญ์‹œ์˜ค.
+๋ธŒ๋ผ์šฐ์ €๋กœ [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery)๋ฅผ ์—ด์–ด๋ณด์‹ญ์‹œ์˜ค.
 
 ์•„๋ž˜์˜ JSON ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -264,17 +264,17 @@ INFO:     Application startup complete.
 
 ### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ { #interactive-api-docs }
 
-์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ๊ฐ€๋ณด์‹ญ์‹œ์˜ค.
+์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ๊ฐ€๋ณด์‹ญ์‹œ์˜ค.
 
-์ž๋™ ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> ์ œ๊ณต):
+์ž๋™ ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ([Swagger UI](https://github.com/swagger-api/swagger-ui) ์ œ๊ณต):
 
 ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
 
 ### ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs }
 
-๊ทธ๋ฆฌ๊ณ  ์ด์ œ <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ๊ฐ€๋ด…์‹œ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  ์ด์ œ [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ๊ฐ€๋ด…์‹œ๋‹ค.
 
-๋‹ค๋ฅธ ์ž๋™ ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> ์ œ๊ณต):
+๋‹ค๋ฅธ ์ž๋™ ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค([ReDoc](https://github.com/Rebilly/ReDoc) ์ œ๊ณต):
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
 
@@ -316,7 +316,7 @@ def update_item(item_id: int, item: Item):
 
 ### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ { #interactive-api-docs-upgrade }
 
-์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
+์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
 
 * ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ๋Š” ์ƒˆ ๋ณธ๋ฌธ์„ ํฌํ•จํ•ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค:
 
@@ -332,7 +332,7 @@ def update_item(item_id: int, item: Item):
 
 ### ๋Œ€์•ˆ API ๋ฌธ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ { #alternative-api-docs-upgrade }
 
-๊ทธ๋ฆฌ๊ณ  ์ด์ œ, <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  ์ด์ œ, [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
 
 * ๋Œ€์•ˆ ๋ฌธ์„œ ์—ญ์‹œ ์ƒˆ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณธ๋ฌธ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค:
 
@@ -442,7 +442,7 @@ item: Item
 * ๊ฐ•๋ ฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด **<dfn title="๋‹ค๋ฅธ ๋ง๋กœ๋Š”: ์ปดํฌ๋„ŒํŠธ, ๋ฆฌ์†Œ์Šค, ํ”„๋กœ๋ฐ”์ด๋”, ์„œ๋น„์Šค, ์ธ์ ํ„ฐ๋ธ”">์˜์กด์„ฑ ์ฃผ์ž…</dfn>** ์‹œ์Šคํ…œ.
 * **OAuth2** ์ง€์›์„ ํฌํ•จํ•œ **JWT tokens** ๋ฐ **HTTP Basic**์„ ๊ฐ–๋Š” ๋ณด์•ˆ๊ณผ ์ธ์ฆ.
 * (Pydantic ๋•๋ถ„์—) **๊นŠ์€ ์ค‘์ฒฉ JSON ๋ชจ๋ธ**์„ ์„ ์–ธํ•˜๋Š”๋ฐ ๋” ์ง„๋ณดํ•œ (ํ•˜์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‰ฌ์šด) ๊ธฐ์ˆ .
-* <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> ๋ฐ ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ **GraphQL** ํ†ตํ•ฉ.
+* [Strawberry](https://strawberry.rocks) ๋ฐ ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ **GraphQL** ํ†ตํ•ฉ.
 * (Starlette ๋•๋ถ„์—) ๋งŽ์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ:
     * **์›น ์†Œ์ผ“**
     * HTTPX ๋ฐ `pytest`์— ๊ธฐ๋ฐ˜ํ•œ ๊ทนํžˆ ์‰ฌ์šด ํ…Œ์ŠคํŠธ
@@ -452,24 +452,10 @@ item: Item
 
 ### ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional }
 
-์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€
+์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์ด๋ผ๋ฉด ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•ด ๋ณด์„ธ์š”. ๐Ÿš€
 
 ์ด๋ฏธ **FastAPI Cloud** ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด(๋Œ€๊ธฐ์ž ๋ช…๋‹จ์—์„œ ์ดˆ๋Œ€ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰), ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๋ฐฐํฌํ•˜๊ธฐ ์ „์—, ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”:
-
-<div class="termy">
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud ๐Ÿš€
-```
-
-</div>
-
-๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ์„ ๋ฐฐํฌํ•˜์„ธ์š”:
-
 <div class="termy">
 
 ```console
@@ -488,7 +474,7 @@ Deploying to FastAPI Cloud...
 
 #### FastAPI Cloud ์†Œ๊ฐœ { #about-fastapi-cloud }
 
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**๋Š” **FastAPI** ๋’ค์— ์žˆ๋Š” ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
+**[FastAPI Cloud](https://fastapicloud.com)**๋Š” **FastAPI** ๋’ค์— ์žˆ๋Š” ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
 
 ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๋นŒ๋“œ**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -504,9 +490,9 @@ FastAPI๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ์–ด
 
 ## ์„ฑ๋Šฅ { #performance }
 
-๋…๋ฆฝ๋œ TechEmpower ๋ฒค์น˜๋งˆํฌ์—์„œ Uvicorn์—์„œ ์ž‘๋™ํ•˜๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜</a>๋กœ Starlette์™€ Uvicorn(FastAPI์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ)์—๋งŒ ๋ฐ‘๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (*)
+๋…๋ฆฝ๋œ TechEmpower ๋ฒค์น˜๋งˆํฌ์—์„œ Uvicorn์—์„œ ์ž‘๋™ํ•˜๋Š” **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด [์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7)๋กœ Starlette์™€ Uvicorn(FastAPI์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ)์—๋งŒ ๋ฐ‘๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (*)
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://fastapi.tiangolo.com/ko/benchmarks/" class="internal-link" target="_blank">๋ฒค์น˜๋งˆํฌ</a> ์„น์…˜์„ ๋ณด์‹ญ์‹œ์˜ค.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [๋ฒค์น˜๋งˆํฌ](https://fastapi.tiangolo.com/ko/benchmarks/) ์„น์…˜์„ ๋ณด์‹ญ์‹œ์˜ค.
 
 ## ์˜์กด์„ฑ { #dependencies }
 
@@ -514,23 +500,23 @@ FastAPI๋Š” Pydantic๊ณผ Starlette์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
 
 ### `standard` ์˜์กด์„ฑ { #standard-dependencies }
 
-FastAPI๋ฅผ `pip install "fastapi[standard]"`๋กœ ์„ค์น˜ํ•˜๋ฉด `standard` ๊ทธ๋ฃน์˜ ์„ ํƒ์  ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
+`pip install "fastapi[standard]"`๋กœ FastAPI๋ฅผ ์„ค์น˜ํ•˜๋ฉด `standard` ๊ทธ๋ฃน์˜ ์„ ํƒ์  ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
 
 Pydantic์ด ์‚ฌ์šฉํ•˜๋Š”:
 
-* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - ์ด๋ฉ”์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ.
+* [`email-validator`](https://github.com/JoshData/python-email-validator) - ์ด๋ฉ”์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ.
 
 Starlette์ด ์‚ฌ์šฉํ•˜๋Š”:
 
-* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - `TestClient`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
-* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
-* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - `request.form()`๊ณผ ํ•จ๊ป˜ form <dfn title="HTTP ์š”์ฒญ์—์„œ ์˜จ ๋ฌธ์ž์—ด์„ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜">"ํŒŒ์‹ฑ"</dfn> ์ง€์›์„ ์›ํ•˜๋ฉด ํ•„์š”.
+* [`httpx`](https://www.python-httpx.org) - `TestClient`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
+* [`jinja2`](https://jinja.palletsprojects.com) - ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
+* [`python-multipart`](https://github.com/Kludex/python-multipart) - `request.form()`๊ณผ ํ•จ๊ป˜ form <dfn title="HTTP ์š”์ฒญ์—์„œ ์˜จ ๋ฌธ์ž์—ด์„ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜">"ํŒŒ์‹ฑ"</dfn> ์ง€์›์„ ์›ํ•˜๋ฉด ํ•„์š”.
 
 FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”:
 
-* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณ ์„ฑ๋Šฅ ์„œ๋น™์— ํ•„์š”ํ•œ ์ผ๋ถ€ ์˜์กด์„ฑ(์˜ˆ: `uvloop`)์ด ํฌํ•จ๋œ `uvicorn[standard]`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
+* [`uvicorn`](https://www.uvicorn.dev) - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณ ์„ฑ๋Šฅ ์„œ๋น™์— ํ•„์š”ํ•œ ์ผ๋ถ€ ์˜์กด์„ฑ(์˜ˆ: `uvloop`)์ด ํฌํ•จ๋œ `uvicorn[standard]`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
 * `fastapi-cli[standard]` - `fastapi` ๋ช…๋ น์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
-    * ์—ฌ๊ธฐ์—๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” `fastapi-cloud-cli`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
+    * ์—ฌ๊ธฐ์—๋Š” [FastAPI Cloud](https://fastapicloud.com)์— FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” `fastapi-cloud-cli`๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
 
 ### `standard` ์˜์กด์„ฑ ์—†์ด { #without-standard-dependencies }
 
@@ -546,13 +532,13 @@ FastAPI๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”:
 
 ์ถ”๊ฐ€ ์„ ํƒ์  Pydantic ์˜์กด์„ฑ:
 
-* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - ์„ค์ • ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
-* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - Pydantic์—์„œ ์‚ฌ์šฉํ•  ์ถ”๊ฐ€ ํƒ€์ž…์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - ์„ค์ • ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - Pydantic์—์„œ ์‚ฌ์šฉํ•  ์ถ”๊ฐ€ ํƒ€์ž…์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ์ถ”๊ฐ€ ์„ ํƒ์  FastAPI ์˜์กด์„ฑ:
 
-* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - `ORJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
-* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - `UJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
+* [`orjson`](https://github.com/ijl/orjson) - `ORJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
+* [`ujson`](https://github.com/esnme/ultrajson) - `UJSONResponse`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”.
 
 ## ๋ผ์ด์„ผ์Šค { #license }
 
index e3120e6f806f966a3209525278488fbb331dcb8f..774b03a190e0571458c7ec3e3075267908044ef0 100644 (file)
@@ -4,7 +4,7 @@
 
 ๋งŽ์€ ์ดˆ๊ธฐ ์„ค์ •, ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์ผ๋ถ€ API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ด๋ฏธ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ํ…œํ”Œ๋ฆฟ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-GitHub ์ €์žฅ์†Œ: <a href="https://github.com/tiangolo/full-stack-fastapi-template" class="external-link" target="_blank">Full Stack FastAPI ํ…œํ”Œ๋ฆฟ</a>
+GitHub ์ €์žฅ์†Œ: [Full Stack FastAPI ํ…œํ”Œ๋ฆฟ](https://github.com/tiangolo/full-stack-fastapi-template)
 
 ## Full Stack FastAPI ํ…œํ”Œ๋ฆฟ - ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ๊ธฐ๋Šฅ๋“ค { #full-stack-fastapi-template-technology-stack-and-features }
 
index d7d9021ed3e8f886cb06834e0bb21ed7216f23ec..12890f2832bb3e2817f428b68b649441c290a6f7 100644 (file)
@@ -271,7 +271,7 @@ def some_function(data: Any):
 
 ## Pydantic ๋ชจ๋ธ { #pydantic-models }
 
-<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
+[Pydantic](https://docs.pydantic.dev/)์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
 
 ์†์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ์˜ "๋ชจ์–‘(shape)"์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
 
@@ -287,13 +287,13 @@ Pydantic ๊ณต์‹ ๋ฌธ์„œ์˜ ์˜ˆ์‹œ:
 
 /// info | ์ •๋ณด
 
-<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”</a>.
+Pydantic์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”](https://docs.pydantic.dev/).
 
 ///
 
 **FastAPI**๋Š” ๋ชจ๋‘ Pydantic์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ด ๋ชจ๋“  ๊ฒƒ์€ [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](tutorial/index.md){.internal-link target=_blank}์—์„œ ์‹ค์ œ๋กœ ๋งŽ์ด ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+์ด ๋ชจ๋“  ๊ฒƒ์€ [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](tutorial/index.md)์—์„œ ์‹ค์ œ๋กœ ๋งŽ์ด ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ## ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์• ๋„ˆํ…Œ์ด์…˜์ด ์žˆ๋Š” ํƒ€์ž… ํžŒํŠธ { #type-hints-with-metadata-annotations }
 
@@ -339,12 +339,12 @@ Pydantic ๊ณต์‹ ๋ฌธ์„œ์˜ ์˜ˆ์‹œ:
 * OpenAPI๋ฅผ ์‚ฌ์šฉํ•ด API๋ฅผ **๋ฌธ์„œํ™”**:
     * ์ž๋™ ์ƒํ˜ธ์ž‘์šฉ ๋ฌธ์„œ UI์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
 
-์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์†Œ ์ถ”์ƒ์ ์œผ๋กœ ๋“ค๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](tutorial/index.md){.internal-link target=_blank}์—์„œ ์‹ค์ œ๋กœ ํ™•์ธํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์†Œ ์ถ”์ƒ์ ์œผ๋กœ ๋“ค๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. [์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ](tutorial/index.md)์—์„œ ์‹ค์ œ๋กœ ํ™•์ธํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ํ‘œ์ค€ ํŒŒ์ด์ฌ ํƒ€์ž…์„ ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ(๋” ๋งŽ์€ ํด๋ž˜์Šค, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ ) **FastAPI**๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•ด ๋งŽ์€ ์ผ์„ ํ•ด์ค€๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.
 
 /// info | ์ •๋ณด
 
-์ž์Šต์„œ๋ฅผ ๋ชจ๋‘ ๋๋‚ด๊ณ  ํƒ€์ž…์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋Œ์•„์™”๋‹ค๋ฉด, ์ข‹์€ ์ž๋ฃŒ๋กœ <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">`mypy`์˜ "cheat sheet"</a>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ž์Šต์„œ๋ฅผ ๋ชจ๋‘ ๋๋‚ด๊ณ  ํƒ€์ž…์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋Œ์•„์™”๋‹ค๋ฉด, ์ข‹์€ ์ž๋ฃŒ๋กœ [`mypy`์˜ "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
index f23902e11fe3f5a7e667dd19ffb67056e4c91a6f..1f042829c05385470c791042b588665220732f18 100644 (file)
@@ -63,7 +63,7 @@ FastAPI์—์„œ๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ *ํ›„์—* ์‹คํ–‰ํ•  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…
 
 ## ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ { #technical-details }
 
-`BackgroundTasks` ํด๋ž˜์Šค๋Š” <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
+`BackgroundTasks` ํด๋ž˜์Šค๋Š” [`starlette.background`](https://www.starlette.dev/background/)์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
 
 FastAPI์— ์ง์ ‘ ์ž„ํฌํŠธ/ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ `fastapi`์—์„œ ์ž„ํฌํŠธํ•  ์ˆ˜ ์žˆ๊ณ , ์‹ค์ˆ˜๋กœ `starlette.background`์—์„œ ๋Œ€์•ˆ์ธ `BackgroundTask`(๋์— `s`๊ฐ€ ์—†์Œ)๋ฅผ ์ž„ํฌํŠธํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -71,15 +71,15 @@ FastAPI์— ์ง์ ‘ ์ž„ํฌํŠธ/ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ `fastapi`์—์„œ ์ž„ํฌํŠธ
 
 FastAPI์—์„œ `BackgroundTask`๋งŒ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํฌํ•จํ•˜๋Š” Starlette `Response`๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">Starlette์˜ Background Tasks ๊ณต์‹ ๋ฌธ์„œ</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ [Starlette์˜ Background Tasks ๊ณต์‹ ๋ฌธ์„œ](https://www.starlette.dev/background/)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ์ฃผ์˜์‚ฌํ•ญ { #caveat }
 
-๋ฌด๊ฑฐ์šด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ, ๋ณ€์ˆ˜ ๋“ฑ์„ ๊ณต์œ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ) <a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a> ๊ฐ™์€ ๋” ํฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋ฌด๊ฑฐ์šด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ, ๋ณ€์ˆ˜ ๋“ฑ์„ ๊ณต์œ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ) [Celery](https://docs.celeryq.dev) ๊ฐ™์€ ๋” ํฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด๋“ค์€ RabbitMQ๋‚˜ Redis ๊ฐ™์€ ๋ฉ”์‹œ์ง€/์ž‘์—… ํ ๊ด€๋ฆฌ์ž ๋“ฑ ๋” ๋ณต์žกํ•œ ์„ค์ •์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ, ํŠนํžˆ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ ๋™์ผํ•œ **FastAPI** ์•ฑ์˜ ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜(๋˜๋Š” ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์ „์†ก์ฒ˜๋Ÿผ) ์ž‘์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, `BackgroundTasks`๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
+ํ•˜์ง€๋งŒ ๋™์ผํ•œ **FastAPI** ์•ฑ์˜ ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์ž‘์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…(์˜ˆ: ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์ „์†ก)์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, `BackgroundTasks`๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
 ## ์š”์•ฝ { #recap }
 
index 1b9d17e49a58683cd6c817d3d29f7bcaac83318c..5b93dbb20bac70ee985f1e4d4e792bfaa956a553 100644 (file)
@@ -123,7 +123,7 @@ from app.routers import items
 
 ์ด ์˜ˆ์‹œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ž„์˜๋กœ ๋งŒ๋“  ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ ์‹ค์ œ ์ƒํ™ฉ์—์„œ๋Š” ํ†ตํ•ฉ๋œ [Security ์œ ํ‹ธ๋ฆฌํ‹ฐ](security/index.md){.internal-link target=_blank}๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+ํ•˜์ง€๋งŒ ์‹ค์ œ ์ƒํ™ฉ์—์„œ๋Š” ํ†ตํ•ฉ๋œ [Security ์œ ํ‹ธ๋ฆฌํ‹ฐ](security/index.md)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -169,7 +169,7 @@ async def read_item(item_id: str):
 
 /// tip | ํŒ
 
-[*path operation decorator์˜ dependencies*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, *path operation function*์— ์–ด๋–ค ๊ฐ’๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
+[*path operation decorator์˜ dependencies*](dependencies/dependencies-in-path-operation-decorators.md)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, *path operation function*์— ์–ด๋–ค ๊ฐ’๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -185,8 +185,8 @@ async def read_item(item_id: str):
 * ๋ชจ๋‘ ๋ฏธ๋ฆฌ ์ •์˜๋œ `responses`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
 * ์ด ๋ชจ๋“  *path operations*๋Š” ์‹คํ–‰๋˜๊ธฐ ์ „์— `dependencies` ๋ชฉ๋ก์ด ํ‰๊ฐ€/์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
     * ํŠน์ • *path operation*์— dependencies๋ฅผ ์ถ”๊ฐ€๋กœ ์„ ์–ธํ•˜๋ฉด **๊ทธ๊ฒƒ๋“ค๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค**.
-    * router dependencies๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— [decorator์˜ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ dependencies๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
-    * [`scopes`๊ฐ€ ์žˆ๋Š” `Security` dependencies](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+    * router dependencies๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— [decorator์˜ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ dependencies๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
+    * [`scopes`๊ฐ€ ์žˆ๋Š” `Security` dependencies](../advanced/security/oauth2-scopes.md)๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
@@ -303,7 +303,7 @@ from ...dependencies import get_token_header
 
 ํ‰์†Œ์ฒ˜๋Ÿผ `FastAPI` ํด๋ž˜์Šค๋ฅผ importํ•˜๊ณ  ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
 
-๋˜ํ•œ ๊ฐ `APIRouter`์˜ dependencies์™€ ๊ฒฐํ•ฉ๋  [global dependencies](dependencies/global-dependencies.md){.internal-link target=_blank}๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+๋˜ํ•œ ๊ฐ `APIRouter`์˜ dependencies์™€ ๊ฒฐํ•ฉ๋  [global dependencies](dependencies/global-dependencies.md)๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *}
 
@@ -353,7 +353,7 @@ from .routers import items, users
 from app.routers import items, users
 ```
 
-Python Packages์™€ Modules์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด <a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">Modules์— ๋Œ€ํ•œ Python ๊ณต์‹ ๋ฌธ์„œ</a>๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
+Python Packages์™€ Modules์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [Modules์— ๋Œ€ํ•œ Python ๊ณต์‹ ๋ฌธ์„œ](https://docs.python.org/3/tutorial/modules.html)๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ///
 
@@ -465,6 +465,37 @@ router๋ฅผ ํฌํ•จ(include)ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
 
 ///
 
+## `pyproject.toml`์—์„œ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-entrypoint-in-pyproject-toml }
+
+FastAPI `app` ๊ฐ์ฒด๊ฐ€ `app/main.py`์— ์žˆ์œผ๋ฏ€๋กœ `pyproject.toml` ํŒŒ์ผ์—์„œ `entrypoint`๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+```toml
+[tool.fastapi]
+entrypoint = "app.main:app"
+```
+
+์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด importํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค:
+
+```python
+from app.main import app
+```
+
+์ด๋ ‡๊ฒŒ ํ•˜๋ฉด `fastapi` ๋ช…๋ น์–ด๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
+/// Note | ์ฐธ๊ณ 
+
+๋ช…๋ น์–ด์— ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+```console
+$ fastapi dev app/main.py
+```
+
+ํ•˜์ง€๋งŒ `fastapi` ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์–ตํ•ด ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+
+๋˜ํ•œ [VS Code ํ™•์žฅ](../editor-support.md)์ด๋‚˜ [FastAPI Cloud](https://fastapicloud.com) ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์ด ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, `pyproject.toml`์˜ `entrypoint`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
+
+///
+
 ## ์ž๋™ API ๋ฌธ์„œ ํ™•์ธํ•˜๊ธฐ { #check-the-automatic-api-docs }
 
 ์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜์„ธ์š”:
@@ -472,14 +503,14 @@ router๋ฅผ ํฌํ•จ(include)ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
 <div class="termy">
 
 ```console
-$ fastapi dev app/main.py
+$ fastapi dev
 
 <span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
 
 </div>
 
-๊ทธ๋ฆฌ๊ณ  <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>์—์„œ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”.
+๊ทธ๋ฆฌ๊ณ  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)์—์„œ ๋ฌธ์„œ๋ฅผ ์—ฌ์„ธ์š”.
 
 ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ(๋ฐ prefix)์™€ ์˜ฌ๋ฐ”๋ฅธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด, ๋ชจ๋“  submodule์˜ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ์ž๋™ API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
index 33f0f71e9582018273bac4a5ed4074e13283b112..bbb95cf00b3fa6bd85ccd77ab75bb6ef8ab5119a 100644 (file)
@@ -96,7 +96,7 @@ Pydantic ๋ชจ๋ธ์˜ ๊ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ํƒ€์ž…์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
 
 `str`, `int`, `float` ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋‹จ์ผ ํƒ€์ž…๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, `str`์„ ์ƒ์†ํ•˜๋Š” ๋” ๋ณต์žกํ•œ ๋‹จ์ผ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ต์…˜์„ ๋ณด๋ ค๋ฉด <a href="https://docs.pydantic.dev/latest/concepts/types/" class="external-link" target="_blank">Pydantic์˜ Type Overview</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค์Œ ์žฅ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ต์…˜์„ ๋ณด๋ ค๋ฉด [Pydantic์˜ Type Overview](https://docs.pydantic.dev/latest/concepts/types/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค์Œ ์žฅ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์˜ˆ๋ฅผ ๋“ค์–ด `Image` ๋ชจ๋ธ์—๋Š” `url` ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ `str` ๋Œ€์‹  Pydantic์˜ `HttpUrl` ์ธ์Šคํ„ด์Šค๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
index 3719e1ffabe8998db2d10fb281af0ed3d2f9c8e2..f9ea061a6e044be1fa83f99ca342ab4136e9e09c 100644 (file)
@@ -2,7 +2,7 @@
 
 ## `PUT`์œผ๋กœ ๊ต์ฒด ์—…๋ฐ์ดํŠธํ•˜๊ธฐ { #update-replacing-with-put }
 
-ํ•ญ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a> ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+ํ•ญ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ ์‹œ). ์˜ˆ๋ฅผ ๋“ค์–ด `datetime`์„ `str`๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
 
@@ -28,7 +28,7 @@
 
 ## `PATCH`๋กœ ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ { #partial-updates-with-patch }
 
-<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> ์ž‘์—…์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ *๋ถ€๋ถ„์ ์œผ๋กœ* ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+[HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) ์ž‘์—…์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ *๋ถ€๋ถ„์ ์œผ๋กœ* ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด๋Š” ์—…๋ฐ์ดํŠธํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋‚ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
 
@@ -95,6 +95,6 @@
 
 ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์†์„ฑ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด, ๋ชจ๋“  ์†์„ฑ์ด optional๋กœ ํ‘œ์‹œ๋œ(๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ฑฐ๋‚˜ `None`์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š”) ๋ชจ๋ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
 
-**์—…๋ฐ์ดํŠธ**๋ฅผ ์œ„ํ•œ โ€œ๋ชจ๋“  ๊ฐ’์ด optional์ธโ€ ๋ชจ๋ธ๊ณผ, **์ƒ์„ฑ**์„ ์œ„ํ•œ โ€œํ•„์ˆ˜ ๊ฐ’์ด ์žˆ๋Š”โ€ ๋ชจ๋ธ์„ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด [์ถ”๊ฐ€ ๋ชจ๋ธ](extra-models.md){.internal-link target=_blank}์— ์„ค๋ช…๋œ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+**์—…๋ฐ์ดํŠธ**๋ฅผ ์œ„ํ•œ โ€œ๋ชจ๋“  ๊ฐ’์ด optional์ธโ€ ๋ชจ๋ธ๊ณผ, **์ƒ์„ฑ**์„ ์œ„ํ•œ โ€œํ•„์ˆ˜ ๊ฐ’์ด ์žˆ๋Š”โ€ ๋ชจ๋ธ์„ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด [์ถ”๊ฐ€ ๋ชจ๋ธ](extra-models.md)์— ์„ค๋ช…๋œ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
index b282d1cc9248886fa933bc5c7d3253474e324012..d124b4bef03d2a4bb4cd2e74222a56b1cdd2f7b5 100644 (file)
@@ -6,7 +6,7 @@
 
 ์—ฌ๋Ÿฌ๋ถ„์˜ API๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ **์‘๋‹ต** ๋ณธ๋ฌธ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ญ์ƒ **์š”์ฒญ ๋ณธ๋ฌธ**์„ ๋ณด๋‚ผ ํ•„์š”๋Š” ์—†๊ณ , ๋•Œ๋กœ๋Š” (์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜) ์–ด๋–ค ๊ฒฝ๋กœ๋งŒ ์š”์ฒญํ•˜๊ณ  ๋ณธ๋ฌธ์€ ๋ณด๋‚ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-**์š”์ฒญ** ๋ณธ๋ฌธ์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  ๊ฐ•๋ ฅํ•จ๊ณผ ์ด์ ์„ ๊ฐ–์ถ˜ <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
+**์š”์ฒญ** ๋ณธ๋ฌธ์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  ๊ฐ•๋ ฅํ•จ๊ณผ ์ด์ ์„ ๊ฐ–์ถ˜ [Pydantic](https://docs.pydantic.dev/) ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
 /// info | ์ •๋ณด
 
@@ -73,7 +73,7 @@
     * ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์ •ํ™•ํžˆ ์–ด๋–ค ๊ฒƒ์ด ๊ทธ๋ฆฌ๊ณ  ์–ด๋””์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋ชป ๋˜์—ˆ๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ์นœ์ ˆํ•˜๊ณ  ๋ช…๋ฃŒํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 * ๋งค๊ฐœ๋ณ€์ˆ˜ `item`์— ํฌํ•จ๋œ ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
     * ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ `Item` ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๊ทธ์— ๋Œ€ํ•œ ํƒ€์ž…์— ๋Œ€ํ•œ ํŽธ์ง‘๊ธฐ ์ง€์›(์™„์„ฑ ๋“ฑ)์„ ๋˜ํ•œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-* ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋ธ์„ ์œ„ํ•œ <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> ์ •์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+* ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋ธ์„ ์œ„ํ•œ [JSON Schema](https://json-schema.org) ์ •์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 * ์ด๋Ÿฌํ•œ ์Šคํ‚ค๋งˆ๋Š”, ์ƒ์„ฑ๋œ OpenAPI ์Šคํ‚ค๋งˆ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ, ์ž๋™ ๋ฌธ์„œํ™” <abbr title="User Interfaces - ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค">UIs</abbr>์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
 
 ## ์ž๋™ ๋ฌธ์„œํ™” { #automatic-docs }
 
 ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Pydantic ์ž์ฒด์—์„œ ๋ช‡๋ช‡ ๋ณ€๊ฒฝ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
 
-์ด์ „ ์Šคํฌ๋ฆฐ์ƒท์€ <a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a>๋ฅผ ์ฐ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+์ด์ „ ์Šคํฌ๋ฆฐ์ƒท์€ [Visual Studio Code](https://code.visualstudio.com)๋กœ ์ฐ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
-ํ•˜์ง€๋งŒ ๋˜‘๊ฐ™์€ ํŽธ์ง‘๊ธฐ ์ง€์›์„ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>์™€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŒŒ์ด์ฌ ํŽธ์ง‘๊ธฐ์—์„œ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+ํ•˜์ง€๋งŒ ๋˜‘๊ฐ™์€ ํŽธ์ง‘๊ธฐ ์ง€์›์„ [PyCharm](https://www.jetbrains.com/pycharm/)์™€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŒŒ์ด์ฌ ํŽธ์ง‘๊ธฐ์—์„œ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/body/image05.png">
 
 /// tip | ํŒ
 
-๋งŒ์•ฝ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>๋ฅผ ํŽธ์ง‘๊ธฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋งŒ์•ฝ [PyCharm](https://www.jetbrains.com/pycharm/)๋ฅผ ํŽธ์ง‘๊ธฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋‹ค์Œ ์‚ฌํ•ญ์„ ํฌํ•จํ•ด Pydantic ๋ชจ๋ธ์— ๋Œ€ํ•œ ํŽธ์ง‘๊ธฐ ์ง€์›์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค:
 
@@ -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){.internal-link target=_blank} ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+๋งŒ์•ฝ Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, **Body** ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body) ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
index f78e1c07079080819e7745f7ab17af8e2304aae4..08d0221d3d0262a6a8fc65bd0e7fc8022d161ef0 100644 (file)
@@ -1,6 +1,6 @@
 # CORS (๊ต์ฐจ-์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ) { #cors-cross-origin-resource-sharing }
 
-<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS ๋˜๋Š” "Cross-Origin Resource Sharing"</a>๋ž€, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ์— ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ํ•˜๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ , ๋ฐฑ์—”๋“œ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋‹ค๋ฅธ "์ถœ์ฒ˜(origin)"์— ์žˆ๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
+[CORS ๋˜๋Š” "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)๋ž€, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ์— ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ํ•˜๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ , ๋ฐฑ์—”๋“œ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋‹ค๋ฅธ "์ถœ์ฒ˜(origin)"์— ์žˆ๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
 
 ## ์ถœ์ฒ˜ { #origin }
 
 * `allow_origins` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š” ์ถœ์ฒ˜์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ: `['https://example.org', 'https://www.example.org']`. ๋ชจ๋“  ์ถœ์ฒ˜๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 * `allow_origin_regex` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š” ์ถœ์ฒ˜์™€ ๋งค์นญํ•  ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์˜ˆ: `'https://.*\.example\.org'`.
 * `allow_methods` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” HTTP ๋ฉ”์„œ๋“œ์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `['GET']`์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ‘œ์ค€ ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-* `allow_headers` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ง€์›๋˜์–ด์•ผ ํ•˜๋Š” HTTP ์š”์ฒญ ํ—ค๋”์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `[]`์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ—ค๋”๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `Accept`, `Accept-Language`, `Content-Language`, `Content-Type` ํ—ค๋”๋Š” <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">๋‹จ์ˆœ CORS ์š”์ฒญ</a>์— ๋Œ€ํ•ด ํ•ญ์ƒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
+* `allow_headers` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ง€์›๋˜์–ด์•ผ ํ•˜๋Š” HTTP ์š”์ฒญ ํ—ค๋”์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `[]`์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ—ค๋”๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด `['*']`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `Accept`, `Accept-Language`, `Content-Language`, `Content-Type` ํ—ค๋”๋Š” [๋‹จ์ˆœ CORS ์š”์ฒญ](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)์— ๋Œ€ํ•ด ํ•ญ์ƒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
 * `allow_credentials` - ๊ต์ฐจ-์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ฟ ํ‚ค๋ฅผ ์ง€์›ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `False`์ž…๋‹ˆ๋‹ค.
 
-    `allow_credentials`๊ฐ€ `True`๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ `allow_origins`, `allow_methods`, `allow_headers` ์ค‘ ์–ด๋А ๊ฒƒ๋„ `['*']`๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •</a>๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+    `allow_credentials`๊ฐ€ `True`๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ `allow_origins`, `allow_methods`, `allow_headers` ์ค‘ ์–ด๋А ๊ฒƒ๋„ `['*']`๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ [๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards)๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
 * `expose_headers` - ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์‘๋‹ต ํ—ค๋”๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `[]`์ž…๋‹ˆ๋‹ค.
 * `max_age` - ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CORS ์‘๋‹ต์„ ์บ์‹œํ•˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `600`์ž…๋‹ˆ๋‹ค.
@@ -78,7 +78,7 @@
 
 ## ๋” ๋งŽ์€ ์ •๋ณด { #more-info }
 
-<abbr title="Cross-Origin Resource Sharing - ๊ต์ฐจ-์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ">CORS</abbr>์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Mozilla CORS ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+<abbr title="Cross-Origin Resource Sharing - ๊ต์ฐจ-์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ">CORS</abbr>์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” [Mozilla CORS ๋ฌธ์„œ](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
index c27b68bc1c02f604f0187d10e1c866ea6fdcdfca..145ffb24bcbe7d39d59b63401f535408419f52a8 100644 (file)
@@ -74,7 +74,7 @@ from myapp import app
 
 /// info | ์ •๋ณด
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">๊ณต์‹ Python ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณต์‹ Python ๋ฌธ์„œ](https://docs.python.org/3/library/__main__.html)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
index d269e7e77438a49e67a898934ebb5eeaa7de30d5..880a47157f7507f9ba75b89f7a33b0a87e3d0556 100644 (file)
@@ -32,7 +32,7 @@
 
 ์ด ์˜ˆ์‹œ์—์„œ `X-Key`์™€ `X-Token`์ด๋ผ๋Š” ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
 
-๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๋ณด์•ˆ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ํ†ตํ•ฉ๋œ [๋ณด์•ˆ ์œ ํ‹ธ๋ฆฌํ‹ฐ (๋‹ค์Œ ์ฑ•ํ„ฐ)](../security/index.md){.internal-link target=_blank}๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๋ณด์•ˆ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ํ†ตํ•ฉ๋œ [๋ณด์•ˆ ์œ ํ‹ธ๋ฆฌํ‹ฐ (๋‹ค์Œ ์ฑ•ํ„ฐ)](../security/index.md)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -62,7 +62,7 @@
 
 ## *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ชจ์Œ์— ๋Œ€ํ•œ ์˜์กด์„ฑ { #dependencies-for-a-group-of-path-operations }
 
-๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md){.internal-link target=_blank})์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ชจ์Œ์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md))์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ชจ์Œ์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
 ## ์ „์—ญ ์˜์กด์„ฑ { #global-dependencies }
 
index 7b50fd438bf4d22b5dc647148b5eae0c1a21065e..56f690f5939066d4a4f89d79bec0e5ec2c9dc7b5 100644 (file)
@@ -4,7 +4,7 @@ FastAPI๋Š” <dfn title='๋•Œ๋กœ๋Š” "exit code", "cleanup code", "teardown code", "
 
 ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด `return` ๋Œ€์‹  `yield`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ถ”๊ฐ€๋กœ ์‹คํ–‰ํ•  ๋‹จ๊ณ„ (์ฝ”๋“œ)๋ฅผ ๊ทธ ๋’ค์— ์ž‘์„ฑํ•˜์„ธ์š”.
 
-/// tip | ํŒ
+/// tip
 
 ๊ฐ ์˜์กด์„ฑ๋งˆ๋‹ค `yield`๋Š” ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -14,8 +14,8 @@ FastAPI๋Š” <dfn title='๋•Œ๋กœ๋Š” "exit code", "cleanup code", "teardown code", "
 
 ๋‹ค์Œ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜:
 
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ๋˜๋Š”
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
+* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ๋˜๋Š”
+* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
 
 ๋Š” **FastAPI**์˜ ์˜์กด์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -39,7 +39,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
 
 {* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *}
 
-/// tip | ํŒ
+/// tip
 
 `async` ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -87,7 +87,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
 
 /// note | ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ
 
-ํŒŒ์ด์ฌ์˜ <a href="https://docs.python.org/3/library/contextlib.html" class="external-link" target="_blank">Context Managers</a> ๋•๋ถ„์— ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
+ํŒŒ์ด์ฌ์˜ [Context Managers](https://docs.python.org/3/library/contextlib.html) ๋•๋ถ„์— ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
 
 **FastAPI**๋Š” ์ด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
 
@@ -101,7 +101,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
 
 ์˜ˆ๋ฅผ ๋“ค์–ด, `HTTPException` ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-/// tip | ํŒ
+/// tip
 
 ์ด๋Š” ๋‹ค์†Œ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜* ๋“ฑ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ (`HTTPException` ํฌํ•จ)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 
@@ -111,7 +111,7 @@ yield๋œ ๊ฐ’์€ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๋ฐ ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์— ์ฃผ์ž…๋˜๋Š” ๊ฐ’ ์ž…
 
 {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *}
 
-์˜ˆ์™ธ๋ฅผ ์žก๊ณ  ๊ทธ์— ๊ธฐ๋ฐ˜ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, [์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
+์˜ˆ์™ธ๋ฅผ ์žก๊ณ  ๊ทธ์— ๊ธฐ๋ฐ˜ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, [์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ](../handling-errors.md#install-custom-exception-handlers)๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
 
 ## `yield`์™€ `except`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ { #dependencies-with-yield-and-except }
 
@@ -170,7 +170,7 @@ participant tasks as Background tasks
     end
 ```
 
-/// info | ์ •๋ณด
+/// info
 
 ํด๋ผ์ด์–ธํŠธ์—๋Š” **ํ•˜๋‚˜์˜ ์‘๋‹ต**๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฅ˜ ์‘๋‹ต ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ๊ณ , *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์—์„œ ์ƒ์„ฑ๋œ ์‘๋‹ต์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -178,7 +178,7 @@ participant tasks as Background tasks
 
 ///
 
-/// tip | ํŒ
+/// tip
 
 *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜*์˜ ์ฝ”๋“œ์—์„œ ์–ด๋–ค ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด `HTTPException`์„ ํฌํ•จํ•ด `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ˆ์™ธ(๋˜๋Š” ์ƒˆ ์˜ˆ์™ธ)๋ฅผ `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ๋‹ค์‹œ ๋ฐœ์ƒ์‹œ์ผœ, ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -233,14 +233,14 @@ participant operation as Path Operation
 
 `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ณ  ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ „ํ•ด ์™”์Šต๋‹ˆ๋‹ค.
 
-FastAPI์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ์˜ [๊ณ ๊ธ‰ ์˜์กด์„ฑ - `yield`, `HTTPException`, `except` ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}์—์„œ ๋” ์ž์„ธํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+FastAPI์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ณ ๊ธ‰ ๊ฐ€์ด๋“œ์˜ [๊ณ ๊ธ‰ ์˜์กด์„ฑ - `yield`, `HTTPException`, `except` ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)์—์„œ ๋” ์ž์„ธํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 ## ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž { #context-managers }
 
 ### "์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž"๋ž€ { #what-are-context-managers }
 
 "์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž"๋Š” Python์—์„œ `with` ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
 
-์˜ˆ๋ฅผ ๋“ค์–ด, <a href="https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files" class="external-link" target="_blank">`with`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค</a>:
+์˜ˆ๋ฅผ ๋“ค์–ด, [with๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files):
 
 ```Python
 with open("./somefile.txt") as f:
@@ -256,7 +256,7 @@ with open("./somefile.txt") as f:
 
 ### `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์—์„œ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž ์‚ฌ์šฉํ•˜๊ธฐ { #using-context-managers-in-dependencies-with-yield }
 
-/// warning | ๊ฒฝ๊ณ 
+/// warning
 
 ์ด๊ฒƒ์€ ์–ด๋А ์ •๋„ "๊ณ ๊ธ‰" ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
 
@@ -264,19 +264,19 @@ with open("./somefile.txt") as f:
 
 ///
 
-Python์—์„œ๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <a href="https://docs.python.org/3/reference/datamodel.html#context-managers" class="external-link" target="_blank"> ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค: `__enter__()` and `__exit__()`</a>.
+Python์—์„œ๋Š” [๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ: `__enter__()`์™€ `__exit__()`๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ](https://docs.python.org/3/reference/datamodel.html#context-managers) ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 **FastAPI**์˜ `yield`๊ฐ€ ์žˆ๋Š” ์˜์กด์„ฑ ๋‚ด์—์„œ
 `with` ๋˜๋Š” `async with`๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 {* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *}
 
-/// tip | ํŒ
+/// tip
 
 ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ๋˜๋Š”
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
+* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ๋˜๋Š”
+* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
 
 ์ด๋“ค์€ ๋‹จ์ผ `yield`๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๊พธ๋ฏธ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
index 8b000a3a43133b5bfca31591889c5626f1a1a319..6d4c43eb6c5fc980d141c9004e792945d1893be9 100644 (file)
@@ -2,14 +2,14 @@
 
 ๋ช‡๋ช‡ ์œ ํ˜•์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-[*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ทธ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md)์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ `FastAPI` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ทธ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:
 
 {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *}
 
-๊ทธ๋ฆฌ๊ณ  [*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ์„น์…˜์˜ ๋ชจ๋“  ์•„์ด๋””์–ด๋Š” ์—ฌ์ „ํžˆ ์ ์šฉ๋˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋Š” ์•ฑ์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  [*๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ*์— `dependencies` ์ถ”๊ฐ€ํ•˜๊ธฐ](dependencies-in-path-operation-decorators.md) ์„น์…˜์˜ ๋ชจ๋“  ์•„์ด๋””์–ด๋Š” ์—ฌ์ „ํžˆ ์ ์šฉ๋˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
 
 ## *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์˜์กด์„ฑ { #dependencies-for-groups-of-path-operations }
 
-๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md){.internal-link target=_blank})์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
+๋‚˜์ค‘์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฒ•([๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ - ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค](../../tutorial/bigger-applications.md))์„ ์ฝ์„ ๋•Œ, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋‹จ์ผ `dependencies` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
index f7d8d5982c25316583a4692c0f18e6a267881d88..4b540b779e7e77cbf2818965d7d77505fa1d3089 100644 (file)
@@ -57,7 +57,7 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „๋ถ€ํ„ฐ `Annotated`์— ๋Œ€ํ•œ ์ง€์›์„ (๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ
 
 ์˜›๋‚  ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋งž์ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
-`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ํ•˜์„ธ์š”.
+`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../../deployment/versions.md#upgrading-the-fastapi-versions)๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ํ•˜์„ธ์š”.
 
 ///
 
@@ -152,7 +152,7 @@ commons: Annotated[dict, Depends(common_parameters)]
 
 /// note | ์ฐธ๊ณ 
 
-์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด, [Async: *"In a hurry?"*](../../async.md#in-a-hurry){.internal-link target=_blank} ๋ฌธ์„œ์—์„œ `async`์™€ `await`์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด, [Async: *"In a hurry?"*](../../async.md#in-a-hurry) ๋ฌธ์„œ์—์„œ `async`์™€ `await`์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
index d820f6e44d53120bd80bb5ef3c9ba5e1a9993d4c..9ed7a13cd8a76f4bc2c2f17cdc2049009108e722 100644 (file)
@@ -12,7 +12,7 @@ JSON ํ˜ธํ™˜ ๊ฐ€๋Šฅ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์‹ ํ•˜๋Š” `fake_db` ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์กด
 
 ์˜ˆ๋ฅผ ๋“ค๋ฉด, `datetime` ๊ฐ์ฒด๋Š” JSON๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-๋”ฐ๋ผ์„œ `datetime` ๊ฐ์ฒด๋Š” <a href="https://en.wikipedia.org/wiki/ISO_8601" class="external-link" target="_blank">ISO ํ˜•์‹</a>์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” `str`๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+๋”ฐ๋ผ์„œ `datetime` ๊ฐ์ฒด๋Š” [ISO ํ˜•์‹](https://en.wikipedia.org/wiki/ISO_8601)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” `str`๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
 ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Pydantic ๋ชจ๋ธ(์†์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด)์„ ๋ฐ›์ง€ ์•Š๊ณ , `dict`๋งŒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
 
@@ -24,7 +24,7 @@ Pydantic ๋ชจ๋ธ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ณ  JSON ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ๋ฐ˜ํ™˜
 
 ์ด ์˜ˆ์‹œ์—์„œ๋Š” Pydantic ๋ชจ๋ธ์„ `dict`๋กœ, `datetime`์„ `str`๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
-์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€์ธ <a href="https://docs.python.org/3/library/json.html#json.dumps" class="external-link" target="_blank">`json.dumps()`</a>๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€์ธ [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps)๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 JSON ํ˜•์‹(๋ฌธ์ž์—ด)์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํฐ `str`์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JSON๊ณผ ๋ชจ๋‘ ํ˜ธํ™˜๋˜๋Š” ๊ฐ’๊ณผ ํ•˜์œ„ ๊ฐ’์ด ์žˆ๋Š” ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(์˜ˆ: `dict`)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
index 4a51e9286151ac05d3e09a885943aa782f037f66..da62a399273a094c4615f6b7b136229890f9dc7a 100644 (file)
@@ -36,7 +36,7 @@
 * `datetime.timedelta`:
     * ํŒŒ์ด์ฌ์˜ `datetime.timedelta`.
     * ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ ์ „์ฒด ์ดˆ(seconds)์˜ `float`๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
-    * Pydantic์€ "ISO 8601 time diff encoding"์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. <a href="https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers" class="external-link" target="_blank">๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”</a>.
+    * Pydantic์€ "ISO 8601 time diff encoding"์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. [๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
 * `frozenset`:
     * ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ `set`์™€ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค:
         * ์š”์ฒญ ์‹œ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฝ์–ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  `set`๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
@@ -49,7 +49,7 @@
 * `Decimal`:
     * ํ‘œ์ค€ ํŒŒ์ด์ฌ์˜ `Decimal`.
     * ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ `float`์™€ ๋™์ผํ•˜๊ฒŒ ๋‹ค๋ค„์ง‘๋‹ˆ๋‹ค.
-* ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ์œ ํšจํ•œ Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: <a href="https://docs.pydantic.dev/latest/usage/types/types/" class="external-link" target="_blank">Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•</a>.
+* ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ์œ ํšจํ•œ Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [Pydantic ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•](https://docs.pydantic.dev/latest/usage/types/types/).
 
 ## ์˜ˆ์‹œ { #example }
 
index 70d7f8bffc6615a1900194ccd4035a8b1d43fc28..157549f92fc48cf3a6a2ec187e145f33390e47bb 100644 (file)
@@ -12,7 +12,7 @@
 
 ์ ˆ๋Œ€ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•ญ์ƒ ์ดํ›„์— ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ "์•ˆ์ „ํ•œ ํ•ด์‹œ(secure hash)"๋กœ ์ €์žฅํ•˜์„ธ์š”.
 
-๋งŒ์•ฝ ์ด๊ฒŒ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, [๋ณด์•ˆ ์žฅ](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}์—์„œ "password hash"๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋งŒ์•ฝ ์ด๊ฒŒ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, [๋ณด์•ˆ ์žฅ](security/simple-oauth2.md#password-hashing)์—์„œ "password hash"๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -162,11 +162,11 @@ UserInDB(
 
 OpenAPI์—์„œ๋Š” ์ด๋ฅผ `anyOf`๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
 
-์ด๋ฅผ ์œ„ํ•ด ํ‘œ์ค€ Python ํƒ€์ž… ํžŒํŠธ์ธ <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+์ด๋ฅผ ์œ„ํ•ด ํ‘œ์ค€ Python ํƒ€์ž… ํžŒํŠธ์ธ [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 /// note
 
-<a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a>์„ ์ •์˜ํ•  ๋•Œ๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋จผ์ € ํฌํ•จํ•˜๊ณ , ๋œ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๊ทธ ๋’ค์— ๋‚˜์—ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” `Union[PlaneItem, CarItem]`์—์„œ ๋” ๊ตฌ์ฒด์ ์ธ `PlaneItem`์ด `CarItem`๋ณด๋‹ค ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
+[`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions)์„ ์ •์˜ํ•  ๋•Œ๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋จผ์ € ํฌํ•จํ•˜๊ณ , ๋œ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๊ทธ ๋’ค์— ๋‚˜์—ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” `Union[PlaneItem, CarItem]`์—์„œ ๋” ๊ตฌ์ฒด์ ์ธ `PlaneItem`์ด `CarItem`๋ณด๋‹ค ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
 
 ///
 
index e3d372ba42ec87f479ce5deb8ddf963c381c1f8c..cc3d6c6182559a0564bb9d1957821fe9f17f769e 100644 (file)
@@ -11,7 +11,7 @@
 <div class="termy">
 
 ```console
-$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+$ <font color="#4E9A06">fastapi</font> dev
 
   <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span>  Starting development server ๐Ÿš€
 
@@ -58,7 +58,7 @@ INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 
 ### ํ™•์ธํ•˜๊ธฐ { #check-it }
 
-๋ธŒ๋ผ์šฐ์ €๋กœ <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>๋ฅผ ์—ฌ์„ธ์š”.
+๋ธŒ๋ผ์šฐ์ €๋กœ [http://127.0.0.1:8000](http://127.0.0.1:8000)๋ฅผ ์—ฌ์„ธ์š”.
 
 ์•„๋ž˜์™€ ๊ฐ™์€ JSON ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -68,17 +68,17 @@ INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 
 ### ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ { #interactive-api-docs }
 
-์ด์ œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค.
+์ด์ œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค.
 
-์ž๋™ ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> ์ œ๊ณต):
+์ž๋™ ๋Œ€ํ™”ํ˜• API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ([Swagger UI](https://github.com/swagger-api/swagger-ui) ์ œ๊ณต):
 
 ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
 
 ### ๋Œ€์•ˆ API ๋ฌธ์„œ { #alternative-api-docs }
 
-๊ทธ๋ฆฌ๊ณ  ์ด์ œ, <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  ์ด์ œ, [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ๊ฐ€๋ด…๋‹ˆ๋‹ค.
 
-๋Œ€์•ˆ ์ž๋™ ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> ์ œ๊ณต):
+๋Œ€์•ˆ ์ž๋™ ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ([ReDoc](https://github.com/Rebilly/ReDoc) ์ œ๊ณต):
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
 
@@ -92,7 +92,7 @@ INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 
 #### API "์Šคํ‚ค๋งˆ" { #api-schema }
 
-<a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a>๋Š” API์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ๊ทœ๊ฒฉ์ž…๋‹ˆ๋‹ค.
+์ด ๊ฒฝ์šฐ, [OpenAPI](https://github.com/OAI/OpenAPI-Specification)๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ API ์Šคํ‚ค๋งˆ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋Š”์ง€ ์ง€์‹œํ•˜๋Š” ๊ทœ๊ฒฉ์ž…๋‹ˆ๋‹ค.
 
 ์ด ์Šคํ‚ค๋งˆ ์ •์˜๋Š” API ๊ฒฝ๋กœ, ๊ฐ€๋Šฅํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
 
@@ -110,7 +110,7 @@ OpenAPI๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ API์— ๋Œ€ํ•œ API ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 
 
 ๊ฐ€๊ณต๋˜์ง€ ์•Š์€ OpenAPI ์Šคํ‚ค๋งˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, FastAPI๋Š” ์ž๋™์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋“  API์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ JSON (์Šคํ‚ค๋งˆ)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
 
-์—ฌ๊ธฐ์—์„œ ์ง์ ‘ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: <a href="http://127.0.0.1:8000/openapi.json" class="external-link" target="_blank">http://127.0.0.1:8000/openapi.json</a>.
+์—ฌ๊ธฐ์—์„œ ์ง์ ‘ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
 
 ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๋Š” JSON์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -143,9 +143,58 @@ OpenAPI ์Šคํ‚ค๋งˆ๋Š” ํฌํ•จ๋œ ๋‘ ๊ฐœ์˜ ๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์‹œ์Šคํ…œ์„ ์ œ๊ณต
 
 API์™€ ํ†ต์‹ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ, ๋ชจ๋ฐ”์ผ, IoT ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ)๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
+### `pyproject.toml`์— ์•ฑ `entrypoint` ๊ตฌ์„ฑํ•˜๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
+
+๋‹ค์Œ๊ณผ ๊ฐ™์ด `pyproject.toml` ํŒŒ์ผ์—์„œ ์•ฑ์ด ์œ„์น˜ํ•œ ๊ณณ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+
+```toml
+[tool.fastapi]
+entrypoint = "main:app"
+```
+
+ํ•ด๋‹น `entrypoint`๋Š” `fastapi` ๋ช…๋ น์–ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฑ์„ ์ž„ํฌํŠธํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค:
+
+```python
+from main import app
+```
+
+์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด:
+
+```
+.
+โ”œโ”€โ”€ backend
+โ”‚ย ย  โ”œโ”€โ”€ main.py
+โ”‚ย ย  โ”œโ”€โ”€ __init__.py
+```
+
+๊ทธ๋Ÿผ `entrypoint`๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:
+
+```toml
+[tool.fastapi]
+entrypoint = "backend.main:app"
+```
+
+์ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค:
+
+```python
+from backend.main import app
+```
+
+### `fastapi dev`์— ๊ฒฝ๋กœ ์ง€์ •ํ•˜๊ธฐ { #fastapi-dev-with-path }
+
+`fastapi dev` ๋ช…๋ น์–ด์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉํ•  FastAPI app ๊ฐ์ฒด๋ฅผ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค:
+
+```console
+$ fastapi dev main.py
+```
+
+ํ•˜์ง€๋งŒ ๋งค๋ฒˆ `fastapi` ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+
+๋˜ํ•œ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด [VS Code ํ™•์žฅ](../editor-support.md)์ด๋‚˜ [FastAPI Cloud](https://fastapicloud.com)๊ฐ€ ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, `pyproject.toml`์˜ `entrypoint`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
+
 ### ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ(์„ ํƒ ์‚ฌํ•ญ) { #deploy-your-app-optional }
 
-์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋“ฑ๋กํ•˜๋Ÿฌ ๊ฐ€์„ธ์š”. ๐Ÿš€
+์„ ํƒ์ ์œผ๋กœ FastAPI ์•ฑ์„ [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์— ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋“ฑ๋กํ•˜๋Ÿฌ ๊ฐ€์„ธ์š”. ๐Ÿš€
 
 ์ด๋ฏธ **FastAPI Cloud** ๊ณ„์ •์ด ์žˆ๋‹ค๋ฉด(๋Œ€๊ธฐ์ž ๋ช…๋‹จ์—์„œ ์ดˆ๋Œ€ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰), ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -191,7 +240,7 @@ Deploying to FastAPI Cloud...
 
 `FastAPI`๋Š” `Starlette`๋ฅผ ์ง์ ‘ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
 
-`FastAPI`๋กœ <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`FastAPI`๋กœ [Starlette](https://www.starlette.dev/)์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -336,7 +385,7 @@ URL "`/`"์— ๋Œ€ํ•œ `GET` ์ž‘๋™์„ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค **Fa
 
 /// note | ์ฐธ๊ณ 
 
-์ฐจ์ด์ ์„ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด [Async: *"๋ฐ”์˜์‹  ๊ฒฝ์šฐ"*](../async.md#in-a-hurry){.internal-link target=_blank}๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+์ฐจ์ด์ ์„ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด [Async: *"๋ฐ”์˜์‹  ๊ฒฝ์šฐ"*](../async.md#in-a-hurry)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
@@ -352,11 +401,11 @@ JSON์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜๋Š” ๊ฐ์ฒด๋“ค๊ณผ ๋ชจ๋ธ๋“ค(ORM ๋“ฑ์„ ํฌํ•จํ•ด์„œ)
 
 ### 6 ๋‹จ๊ณ„: ๋ฐฐํฌํ•˜๊ธฐ { #step-6-deploy-it }
 
-ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ **<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**์— ์•ฑ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค: `fastapi deploy`. ๐ŸŽ‰
+ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ **[FastAPI Cloud](https://fastapicloud.com)**์— ์•ฑ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค: `fastapi deploy`. ๐ŸŽ‰
 
 #### FastAPI Cloud ์†Œ๊ฐœ { #about-fastapi-cloud }
 
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**๋Š” **FastAPI** ๋’ค์— ์žˆ๋Š” ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
+**[FastAPI Cloud](https://fastapicloud.com)**๋Š” **FastAPI** ๋’ค์— ์žˆ๋Š” ๋™์ผํ•œ ์ž‘์„ฑ์ž์™€ ํŒ€์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
 
 ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ API๋ฅผ **๋นŒ๋“œ**, **๋ฐฐํฌ**, **์ ‘๊ทผ**ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
 
index 115c3223634e0c5d03827a3b0c8d62d3ec3a4d86..efee108ef1ebf80a5aab9075f200328d44dd5da5 100644 (file)
@@ -81,7 +81,7 @@ HTTP ์˜ค๋ฅ˜์— ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์œ ์šฉํ•œ ์ƒํ™ฉ์ด 
 
 ## ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ ์„ค์น˜ํ•˜๊ธฐ { #install-custom-exception-handlers }
 
-<a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">Starlette์˜ ๋™์ผํ•œ ์˜ˆ์™ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ</a>๋ฅผ ์‚ฌ์šฉํ•ด ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[Starlette์˜ ๋™์ผํ•œ ์˜ˆ์™ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ](https://www.starlette.dev/exceptions/)๋ฅผ ์‚ฌ์šฉํ•ด ์ปค์Šคํ…€ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์—ฌ๋Ÿฌ๋ถ„(๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์ด `raise`ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ์˜ˆ์™ธ `UnicornException`์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.
 
index c44aac2d4ddb8018a5efdeb9a2d0a67c372642ba..7f8c3747258ccfbf85656854cdf64f7579afe932 100644 (file)
@@ -15,7 +15,7 @@
 <div class="termy">
 
 ```console
-$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+$ <font color="#4E9A06">fastapi</font> dev
 
   <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span>  Starting development server ๐Ÿš€
 
@@ -62,7 +62,7 @@ $ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid
 
 ์ฒซ ๋‹จ๊ณ„๋Š” FastAPI๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, **FastAPI๋ฅผ ์„ค์น˜**ํ•˜์„ธ์š”:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, **FastAPI๋ฅผ ์„ค์น˜**ํ•˜์„ธ์š”:
 
 <div class="termy">
 
@@ -76,7 +76,7 @@ $ pip install "fastapi[standard]"
 
 /// note | ์ฐธ๊ณ 
 
-`pip install "fastapi[standard]"`๋กœ ์„ค์น˜ํ•˜๋ฉด `fastapi-cloud-cli`๋ฅผ ํฌํ•จํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์„ ํƒ์  standard ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`pip install "fastapi[standard]"`๋กœ ์„ค์น˜ํ•˜๋ฉด `fastapi-cloud-cli`๋ฅผ ํฌํ•จํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์„ ํƒ์  standard ์˜์กด์„ฑ์ด ํ•จ๊ป˜ ์„ค์น˜๋˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด [FastAPI Cloud](https://fastapicloud.com)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ด๋Ÿฌํ•œ ์„ ํƒ์  ์˜์กด์„ฑ์ด ํ•„์š” ์—†๋‹ค๋ฉด `pip install fastapi`๋กœ ๋Œ€์‹  ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -84,6 +84,12 @@ standard ์˜์กด์„ฑ์€ ์„ค์น˜ํ•˜๋˜ `fastapi-cloud-cli` ์—†์ด ์„ค์น˜ํ•˜๋ ค๋ฉด `p
 
 ///
 
+/// tip | ํŒ
+
+FastAPI๋Š” VS Code(๋ฐ Cursor)์šฉ [๊ณต์‹ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ํƒ์ƒ‰๊ธฐ, ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ฒ€์ƒ‰, ํ…Œ์ŠคํŠธ์—์„œ์˜ CodeLens ํƒ์ƒ‰(ํ…Œ์ŠคํŠธ์—์„œ ์ •์˜๋กœ ๋ฐ”๋กœ ์ด๋™), FastAPI Cloud ๋ฐฐํฌ์™€ ๋กœ๊ทธ ๋“ฑ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์—๋””ํ„ฐ์—์„œ ๋ฐ”๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
+
+///
+
 ## ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ { #advanced-user-guide }
 
 ์ด **์ž์Šต์„œ - ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ**๋ฅผ ์ฝ์€ ๋’ค์— ๋‚˜์ค‘์— ์ฝ์„ ์ˆ˜ ์žˆ๋Š” **๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ**๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
index 2107ea90a7febbcc037c94d6b1687e674d7e814a..9220dc2b47656c1747bda9775787b81b19e4b87d 100644 (file)
@@ -14,7 +14,7 @@ OpenAPI ๋ช…์„ธ ๋ฐ ์ž๋™ํ™”๋œ API ๋ฌธ์„œ UI์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์Œ ํ•„๋“œ๋ฅผ 
 | `version` | `string` | 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์— ๋Œ€ํ•œ <a href="https://spdx.org/licenses/" class="external-link" target="_blank">SPDX</a> ๋ผ์ด์„ ์Šค ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. <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> |
+| `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> |
 
 ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
@@ -40,7 +40,7 @@ OpenAPI 3.1.0 ๋ฐ FastAPI 0.99.0๋ถ€ํ„ฐ `license_info`์— `url` ๋Œ€์‹  `identifie
 
 ## ํƒœ๊ทธ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ { #metadata-for-tags }
 
-`openapi_tags` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ํƒœ๊ทธ์— ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+`openapi_tags` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ํƒœ๊ทธ์— ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ํƒœ๊ทธ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
 
@@ -76,7 +76,7 @@ OpenAPI 3.1.0 ๋ฐ FastAPI 0.99.0๋ถ€ํ„ฐ `license_info`์— `url` ๋Œ€์‹  `identifie
 
 /// info | ์ •๋ณด
 
-ํƒœ๊ทธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ](path-operation-configuration.md#tags){.internal-link target=_blank}์—์„œ ์ฝ์–ด๋ณด์„ธ์š”.
+ํƒœ๊ทธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์„ฑ](path-operation-configuration.md#tags)์—์„œ ์ฝ์–ด๋ณด์„ธ์š”.
 
 ///
 
index 6c4f33fd986c1f3aad0dbf50bf8f0a0572b5cdef..b459f6434e93131b426851c585e12759a184ba73 100644 (file)
@@ -1,10 +1,10 @@
 # ๋ฏธ๋“ค์›จ์–ด { #middleware }
 
-รซยฏยธรซ\93ยครฌ\9bยจรฌ\96ยดรซยฅยผ **FastAPI** รฌ\9d\91รฌ\9aยฉ รญ\94\84รซยก\9cรชยทยธรซ\9eยจ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+รซยฏยธรซ\93ยครฌ\9bยจรฌ\96ยดรซยฅยผ **FastAPI** รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 "๋ฏธ๋“ค์›จ์–ด"๋Š” ํŠน์ • *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „, ๋ชจ๋“  **์š”์ฒญ**์— ๋Œ€ํ•ด์„œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  **์‘๋‹ต**์ด ๋ฐ˜ํ™˜๋˜๊ธฐ ์ „์—๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
 
-* รซยฏยธรซ\93ยครฌ\9bยจรฌ\96ยดรซ\8a\94 รฌ\9d\91รฌ\9aยฉ รญ\94\84รซยก\9cรชยทยธรซ\9eยจ์œผ๋กœ ์˜ค๋Š” ๊ฐ **์š”์ฒญ**์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
+* รซยฏยธรซ\93ยครฌ\9bยจรฌ\96ยดรซ\8a\94 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์œผ๋กœ ์˜ค๋Š” ๊ฐ **์š”์ฒญ**์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
 * ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น **์š”์ฒญ**์— ๋Œ€ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 * ๊ทธ๋Ÿฐ ๋‹ค์Œ **์š”์ฒญ**์„ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์–ด๋–ค *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€)์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
 * ๊ทธ๋Ÿฐ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์–ด๋–ค *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€)์ด ์ƒ์„ฑํ•œ **์‘๋‹ต**์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
@@ -15,7 +15,7 @@
 
 `yield`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด, exit ์ฝ”๋“œ๋Š” ๋ฏธ๋“ค์›จ์–ด *ํ›„์—* ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
 
-๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…(๋’ค์—์„œ ๋ณด๊ฒŒ ๋  [๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…](background-tasks.md){.internal-link target=_blank} ์„น์…˜์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค)์ด ์žˆ๋‹ค๋ฉด, ๋ชจ๋“  ๋ฏธ๋“ค์›จ์–ด *ํ›„์—* ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
+๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…(๋’ค์—์„œ ๋ณด๊ฒŒ ๋  [๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…](background-tasks.md) ์„น์…˜์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค)์ด ์žˆ๋‹ค๋ฉด, ๋ชจ๋“  ๋ฏธ๋“ค์›จ์–ด *ํ›„์—* ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
 
 ///
 
@@ -35,9 +35,9 @@
 
 /// tip | ํŒ
 
-์‚ฌ์šฉ์ž ์ •์˜ ๋…์  ํ—ค๋”๋Š” <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">`X-` ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉ</a>ํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
+์‚ฌ์šฉ์ž ์ •์˜ ๋…์  ํ—ค๋”๋Š” [`X-` ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)ํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
 
-ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”๊ฐ€ ์žˆ๋‹ค๋ฉด, <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starlette์˜ CORS ๋ฌธ์„œ</a>์— ๋ฌธ์„œํ™”๋œ `expose_headers` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด CORS ์„ค์ •([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank})์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”๊ฐ€ ์žˆ๋‹ค๋ฉด, [CORS (Cross-Origin Resource Sharing)](cors.md) ์„ค์ •์— [Starlette์˜ CORS ๋ฌธ์„œ](https://www.starlette.dev/middleware/#corsmiddleware)์— ๋ฌธ์„œํ™”๋œ `expose_headers` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
 ///
 
@@ -61,7 +61,7 @@
 
 /// tip | ํŒ
 
-์—ฌ๊ธฐ์„œ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋” ์ •ํ™•ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `time.time()` ๋Œ€์‹  <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a>๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
+์—ฌ๊ธฐ์„œ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋” ์ •ํ™•ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `time.time()` ๋Œ€์‹  [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“
 
 ///
 
@@ -90,6 +90,6 @@ app.add_middleware(MiddlewareB)
 
 ## ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด { #other-middlewares }
 
-๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋‚˜์ค‘์— [์ˆ™๋ จ๋œ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ: ํ–ฅ์ƒ๋œ ๋ฏธ๋“ค์›จ์–ด](../advanced/middleware.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋‚˜์ค‘์— [์ˆ™๋ จ๋œ ์‚ฌ์šฉ์ž ์•ˆ๋‚ด์„œ: ํ–ฅ์ƒ๋œ ๋ฏธ๋“ค์›จ์–ด](../advanced/middleware.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๋‹ค์Œ ์„น์…˜์—์„œ ๋ฏธ๋“ค์›จ์–ด๋กœ <abbr title="Cross-Origin Resource Sharing - ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ">CORS</abbr>๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
index 0d6a0d4229c0ce414fbf3aadebc7763a5579c37b..ebdf6f918fdc2e21371acf084b2ff226548a621e 100644 (file)
@@ -58,7 +58,7 @@
 
 ์„ค๋ช…์€ ๋ณดํ†ต ๊ธธ์–ด์ง€๊ณ  ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ* ์„ค๋ช…์„ ํ•จ์ˆ˜ <dfn title="๋ฌธ์„œํ™”์— ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์ฒซ ํ‘œํ˜„์‹์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌธ์ž์—ด(์–ด๋–ค ๋ณ€์ˆ˜์—๋„ ํ• ๋‹น๋˜์ง€ ์•Š์Œ)">๋…์ŠคํŠธ๋ง</dfn>์— ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, **FastAPI**๋Š” ๊ทธ๊ณณ์—์„œ ์ด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
 
-๋…์ŠคํŠธ๋ง์—๋Š” <a href="https://en.wikipedia.org/wiki/Markdown" class="external-link" target="_blank">Markdown</a>์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, (๋…์ŠคํŠธ๋ง์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ) ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„๋˜๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
+๋…์ŠคํŠธ๋ง์—๋Š” [Markdown](https://en.wikipedia.org/wiki/Markdown)์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, (๋…์ŠคํŠธ๋ง์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ) ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„๋˜๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
 
 {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *}
 
index 51f9fe2c14c37dcfa407948c2bcc4e58de422f4c..2ff56c46e7be3e9b69da1eeae887e0da8345acf6 100644 (file)
@@ -14,7 +14,7 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด
 
 ๋” ์˜ค๋ž˜๋œ ๋ฒ„์ „์ด ์žˆ๋‹ค๋ฉด `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
 
-`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1๊นŒ์ง€ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}๋ฅผ ๊ผญ ํ•˜์„ธ์š”.
+`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1๊นŒ์ง€ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../deployment/versions.md#upgrading-the-fastapi-versions)๋ฅผ ๊ผญ ํ•˜์„ธ์š”.
 
 ///
 
@@ -81,7 +81,7 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด
 
 ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ `*`๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.
 
-ํŒŒ์ด์ฌ์€ `*`์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋’ค๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ‚ค์›Œ๋“œ ์ธ์ž(ํ‚ค-๊ฐ’ ์Œ)๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•จ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” <abbr title="From: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด ์—†๋”๋ผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
+ํŒŒ์ด์ฌ์€ `*`์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋’ค๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ‚ค์›Œ๋“œ ์ธ์ž(ํ‚ค-๊ฐ’ ์Œ)๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•จ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” <abbr title="์ถœ์ฒ˜: K-ey W-ord Arg-uments - ํ‚ค์›Œ๋“œ ์ธ์ž"><code>kwargs</code></abbr>๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด ์—†๋”๋ผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
 
 {* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
 
@@ -112,17 +112,17 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด
 
 ์ˆซ์ž ๊ฒ€์ฆ์€ `float` ๊ฐ’์—๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
 
-์—ฌ๊ธฐ์—์„œ <abbr title="greater than"><code>gt</code></abbr>๋ฅผ, <abbr title="greater than or equal"><code>ge</code></abbr>๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ’์ด `1`๋ณด๋‹ค ์ž‘๋”๋ผ๋„, ๋ฐ˜๋“œ์‹œ `0`๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์—ฌ๊ธฐ์—์„œ <abbr title="greater than - ๋ณด๋‹ค ํผ"><code>gt</code></abbr>๋ฅผ, <abbr title="greater than or equal - ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ"><code>ge</code></abbr>๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ’์ด `1`๋ณด๋‹ค ์ž‘๋”๋ผ๋„, ๋ฐ˜๋“œ์‹œ `0`๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ์ฆ‰, `0.5`๋Š” ์œ ํšจํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ `0.0` ๋˜๋Š” `0`์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-<abbr title="less than"><code>lt</code></abbr> ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
+<abbr title="less than - ๋ณด๋‹ค ์ž‘์Œ"><code>lt</code></abbr> ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
 
 {* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *}
 
 ## ์š”์•ฝ { #recap }
 
-`Query`, `Path`(์•„์ง ๋ณด์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด [์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฌธ์ž์—ด ๊ฒ€์ฆ](query-params-str-validations.md){.internal-link target=_blank}์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์ž์—ด ๊ฒ€์ฆ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`Query`, `Path`(์•„์ง ๋ณด์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด [์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฌธ์ž์—ด ๊ฒ€์ฆ](query-params-str-validations.md)์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฌธ์ž์—ด ๊ฒ€์ฆ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ทธ๋ฆฌ๊ณ  ์ˆซ์ž ๊ฒ€์ฆ ๋˜ํ•œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
index c6e973709a7f9d53dadda827b21b27fb0891d559..c6ea6b7c1655ac96d362ebda0e3f39d2248413f3 100644 (file)
@@ -6,7 +6,7 @@
 
 ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ `item_id`์˜ ๊ฐ’์€ ํ•จ์ˆ˜์˜ `item_id` ์ธ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
 
-๊ทธ๋ž˜์„œ ์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+๊ทธ๋ž˜์„œ ์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo)๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ```JSON
 {"item_id":"foo"}
@@ -28,7 +28,7 @@
 
 ## ๋ฐ์ดํ„ฐ <dfn title="๋‹ค์Œ์œผ๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค: ์ง๋ ฌํ™”, ํŒŒ์‹ฑ, ๋งˆ์ƒฌ๋ง">๋ณ€ํ™˜</dfn> { #data-conversion }
 
-์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>์„ ์—ด๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3)์„ ์—ด๋ฉด, ๋‹ค์Œ ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ```JSON
 {"item_id":3}
@@ -44,7 +44,7 @@
 
 ## ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ { #data-validation }
 
-ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo)๋กœ ์ด๋™ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 ```JSON
 {
@@ -64,7 +64,7 @@
 
 ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ `item_id`๊ฐ€ `int`๊ฐ€ ์•„๋‹Œ `"foo"` ๊ฐ’์„ ๊ฐ€์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
 
-`int` ๋Œ€์‹  `float`์„ ์ œ๊ณตํ•˜๋ฉด(์˜ˆ: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>) ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
+`int` ๋Œ€์‹  `float`์„ ์ œ๊ณตํ•˜๋ฉด(์˜ˆ: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)) ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
 
 /// check | ํ™•์ธ
 
@@ -78,7 +78,7 @@
 
 ## ๋ฌธ์„œํ™” { #documentation }
 
-๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>๋ฅผ ์—ด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž๋™ ๋Œ€ํ™”์‹ API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)๋ฅผ ์—ด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž๋™ ๋Œ€ํ™”์‹ API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/path-params/image01.png">
 
@@ -92,9 +92,9 @@
 
 ## ํ‘œ์ค€ ๊ธฐ๋ฐ˜์˜ ์ด์ , ๋Œ€์ฒด ๋ฌธ์„œ { #standards-based-benefits-alternative-documentation }
 
-๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ์Šคํ‚ค๋งˆ๋Š” <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md" class="external-link" target="_blank">OpenAPI</a> ํ‘œ์ค€์—์„œ ๋‚˜์˜จ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜๋˜๋Š” ๋„๊ตฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
+๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ์Šคํ‚ค๋งˆ๋Š” [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md) ํ‘œ์ค€์—์„œ ๋‚˜์˜จ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜๋˜๋Š” ๋„๊ตฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ด ๋•๋ถ„์— **FastAPI** ์ž์ฒด์—์„œ <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” (ReDoc์„ ์‚ฌ์šฉํ•˜๋Š”) ๋Œ€์ฒด API ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
+์ด ๋•๋ถ„์— **FastAPI** ์ž์ฒด์—์„œ [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” (ReDoc์„ ์‚ฌ์šฉํ•˜๋Š”) ๋Œ€์ฒด API ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
 
 <img src="/img/tutorial/path-params/image02.png">
 
 
 ## Pydantic { #pydantic }
 
-๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์€ <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>์— ์˜ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ด๋กœ ์ธํ•œ ์ด์ ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ด€๋ฆฌ๋ฅผ ์ž˜ ๋ฐ›๊ณ  ์žˆ์Œ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์€ [Pydantic](https://docs.pydantic.dev/)์— ์˜ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ด๋กœ ์ธํ•œ ์ด์ ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ด€๋ฆฌ๋ฅผ ์ž˜ ๋ฐ›๊ณ  ์žˆ์Œ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 `str`, `float`, `bool`, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์„ ์–ธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 
 ## ์‚ฌ์ „์ •์˜ ๊ฐ’ { #predefined-values }
 
-๋งŒ์•ฝ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜*๋ฅผ ๋ฐ›๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ์ง€๋งŒ, ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜* ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์ด์ฌ ํ‘œ์ค€ <abbr title="์—ด๊ฑฐํ˜•">`Enum`</abbr>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋งŒ์•ฝ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜*๋ฅผ ๋ฐ›๋Š” *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*๊ฐ€ ์žˆ์ง€๋งŒ, ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜* ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์ด์ฌ ํ‘œ์ค€ <abbr title="Enumeration - ์—ด๊ฑฐํ˜•">`Enum`</abbr>์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ### `Enum` ํด๋ž˜์Šค ์ƒ์„ฑ { #create-an-enum-class }
 
 
 ### *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜* ์„ ์–ธ { #declare-a-path-parameter }
 
-์ƒ์„ฑํ•œ ์—ด๊ฑฐํ˜• ํด๋ž˜์Šค(`ModelName`)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜*๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค:
+์ƒ์„ฑํ•œ ์—ด๊ฑฐํ˜• ํด๋ž˜์Šค(`ModelName`)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ *๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ* ๋งŒ๋“ญ๋‹ˆ๋‹ค:
 
 {* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
 
index 2b608fd1d5234f03414a0561971d823830fd4588..d4acff151dbf76c066182d5b3387c1b1441c1669 100644 (file)
@@ -35,13 +35,13 @@ FastAPI๋Š” 0.95.0 ๋ฒ„์ „์—์„œ `Annotated` ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด
 
 ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
 
-`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1 ๋ฒ„์ „์œผ๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”.
+`Annotated`๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ตœ์†Œ 0.95.1 ๋ฒ„์ „์œผ๋กœ [FastAPI ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ](../deployment/versions.md#upgrading-the-fastapi-versions)๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”.
 
 ///
 
 ## `q` ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์— `Annotated` ์‚ฌ์šฉํ•˜๊ธฐ { #use-annotated-in-the-type-for-the-q-parameter }
 
-์ด์ „์— [Python ํƒ€์ž… ์†Œ๊ฐœ](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}์—์„œ `Annotated`๋ฅผ ์‚ฌ์šฉํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”?
+์ด์ „์— [Python ํƒ€์ž… ์†Œ๊ฐœ](../python-types.md#type-hints-with-metadata-annotations)์—์„œ `Annotated`๋ฅผ ์‚ฌ์šฉํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”?
 
 ์ด์ œ FastAPI์—์„œ ์‚ฌ์šฉํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ๐Ÿš€
 
@@ -158,7 +158,7 @@ FastAPI ์—†์ด๋„ **๋‹ค๋ฅธ ๊ณณ์—์„œ** ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ **ํ˜ธ์ถœ**ํ•  ์ˆ˜ ์žˆ๊ณ 
 
 `Annotated`๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  **(์ด์ „) ๊ธฐ๋ณธ๊ฐ’ ์Šคํƒ€์ผ**์„ ์‚ฌ์šฉํ•˜๋ฉด, FastAPI ์—†์ด **๋‹ค๋ฅธ ๊ณณ์—์„œ** ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋„ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ **๊ธฐ์–ต**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฐ’์ด ๊ธฐ๋Œ€์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: `str` ๋Œ€์‹  `QueryInfo` ๊ฐ™์€ ๊ฒƒ). ๊ทธ๋ฆฌ๊ณ  ํŽธ์ง‘๊ธฐ๋„ ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š๊ณ  Python๋„ ๊ทธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์˜ค์ง ๋‚ด๋ถ€ ๋™์ž‘์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งŒ ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.
 
-`Annotated`๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ œ <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">Typer</a> ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์—์„œ๋„ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€
+`Annotated`๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ œ [Typer](https://typer.tiangolo.com/) ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์—์„œ๋„ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€
 
 ## ๊ฒ€์ฆ ๋” ์ถ”๊ฐ€ํ•˜๊ธฐ { #add-more-validations }
 
@@ -370,11 +370,11 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
 
 ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒ€์ฆ(์˜ˆ: ๊ฐ’์ด `str`์ธ์ง€ ๊ฒ€์ฆํ•œ ๋’ค) ์ดํ›„์— ์ ์šฉ๋˜๋Š” **์ปค์Šคํ…€ ๊ฒ€์ฆ ํ•จ์ˆ˜**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-`Annotated` ์•ˆ์—์„œ <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator" class="external-link" target="_blank">Pydantic์˜ `AfterValidator`</a>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`Annotated` ์•ˆ์—์„œ [Pydantic์˜ `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
-Pydantic์—๋Š” <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator" class="external-link" target="_blank">`BeforeValidator`</a>์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
+Pydantic์—๋Š” [BeforeValidator](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator)์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค“
 
 ///
 
index 0a6b1f922cde554e515aaf4cf993c62b0b8b7344..4dffc90570ddb673e51c844989a362cf63b091e1 100644 (file)
@@ -183,6 +183,6 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
 
 /// tip
 
-[๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜](path-params.md#predefined-values){.internal-link target=_blank}์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `Enum`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜](path-params.md#predefined-values)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `Enum`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
index 3ee0fa74c3c6d5cb99139103dbc1ba636d4bfe6b..49522ac252531fb39369bb49c33a24015ebf50ce 100644 (file)
@@ -4,9 +4,9 @@
 
 /// info | ์ •๋ณด
 
-์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ „๋‹ฌ๋ฐ›๊ธฐ ์œ„ํ•ด ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
+์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ „๋‹ฌ๋ฐ›๊ธฐ ์œ„ํ•ด ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
 
 ```console
 $ pip install python-multipart
@@ -63,8 +63,8 @@ File์˜ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณธ
     *  ์ตœ๋Œ€ ํฌ๊ธฐ ์ œํ•œ๊นŒ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฉฐ, ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ๋””์Šคํฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
 * ๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€, ๋™์˜์ƒ, ํฐ ์ด์ง„์ฝ”๋“œ์™€ ๊ฐ™์€ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ๋“ค์„ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
 * ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-* <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a>  `async` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
-* file-like object๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ด์ฌ <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
+* [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
+* file-like object๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ด์ฌ [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 
 ### `UploadFile` { #uploadfile }
 
@@ -72,7 +72,7 @@ File์˜ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณธ
 
 * `filename` : ๋ฌธ์ž์—ด(`str`)๋กœ ๋œ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ํŒŒ์ผ๋ช…์ž…๋‹ˆ๋‹ค (์˜ˆ: `myimage.jpg`).
 * `content_type` : ๋ฌธ์ž์—ด(`str`)๋กœ ๋œ ํŒŒ์ผ ํ˜•์‹(MIME type / media type)์ž…๋‹ˆ๋‹ค (์˜ˆ:ย `image/jpeg`).
-* `file` :  <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> (a <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> object)์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "file-like" ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ํŒŒ์ด์ฌ ํŒŒ์ผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
+* `file` :  [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (a [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) object)์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "file-like" ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ํŒŒ์ด์ฌ ํŒŒ์ผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
 
 `UploadFile` ์—๋Š” ๋‹ค์Œ์˜ `async` ๋ฉ”์†Œ๋“œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋‚ด๋ถ€์ ์ธ `SpooledTemporaryFile` ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
 
@@ -121,7 +121,7 @@ HTML์˜ ํผ๋“ค(`<form></form>`)์ด ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์€
 
 ํ•˜์ง€๋งŒ ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. `File`์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด, **FastAPI**๋Š” ๋ณธ๋ฌธ์˜ ์ ํ•ฉํ•œ ๋ถ€๋ถ„์—์„œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•ฉ๋‹ˆ๋‹ค.
 
-์ธ์ฝ”๋”ฉ๊ณผ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> web docs for <code>POST</code></a>๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
+์ธ์ฝ”๋”ฉ๊ณผ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด, [<abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> ์›น ๋ฌธ์„œ์˜ `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
 
 ///
 
index 20a2e95972433757cbb28dee2cb93d725ee9e565..4a5c3e1a75383f366ebc7387e8e09e4530c3c407 100644 (file)
@@ -4,9 +4,9 @@ FastAPI์—์„œ **Pydantic ๋ชจ๋ธ**์„ ์ด์šฉํ•˜์—ฌ **ํผ ํ•„๋“œ**๋ฅผ ์„ ์–ธํ•  
 
 /// info | ์ •๋ณด
 
-ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
+ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
 
 ```console
 $ pip install python-multipart
index 4c2d12bc068fd0d4a76f505ca88f41136fc03fb0..fa8fdae7e88e4ef209afbca1d77c72c045156849 100644 (file)
@@ -2,11 +2,11 @@
 
 `File` ๊ณผ `Form` ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๊ณผ ํผ ํ•„๋“œ๋ฅผ ๋™์‹œ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-/// info | ์ •๋ณด
+/// info
 
-์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฐ/๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฐ/๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:
 
 ```console
 $ pip install python-multipart
@@ -28,7 +28,7 @@ $ pip install python-multipart
 
 ๋˜ํ•œ ์ผ๋ถ€ ํŒŒ์ผ์€ `bytes`๋กœ, ์ผ๋ถ€ ํŒŒ์ผ์€ `UploadFile`๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-/// warning | ๊ฒฝ๊ณ 
+/// warning
 
 ๋‹ค์ˆ˜์˜ `File`๊ณผ `Form` ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•œ *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์š”์ฒญ์˜ ๋ณธ๋ฌธ์ด `application/json`๊ฐ€ ์•„๋‹Œ `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— JSON์œผ๋กœ ๋ฐ›๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” `Body` ํ•„๋“œ๋ฅผ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
 
index a830bc5f8a67336b12d8f04a1d4a42dea132c78b..4a618f5873cf0d0720441d7118559576ebcd39ce 100644 (file)
@@ -4,9 +4,9 @@ JSON ๋Œ€์‹  ํผ ํ•„๋“œ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ `Form`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต
 
 /// info | ์ •๋ณด
 
-ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
+ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € [`python-multipart`](https://github.com/Kludex/python-multipart)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•˜์„ธ์š”:
 
 ```console
 $ pip install python-multipart
@@ -40,7 +40,7 @@ $ pip install python-multipart
 
 /// tip | ํŒ
 
-ํผ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œ, รญ\8fยผรฌ\9dยด รฌ\97\86รฌ\9cยผรซยฉยด รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รชยฐ\80 รฌยฟยผรซยฆยฌ รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รซ\82\98 รซยณยธรซยฌยธ(JSON) รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รซยก\9c รญ\95ยดรฌ\84\9d(interpret)รซ\90\98รชยธยฐ รซ\95\8cรซยฌยธรฌ\97\90 `Form`รฌ\9d\84 รซยช\85รฌ\8b\9cรฌย \81รฌ\9cยผรซยก\9c รฌ\82ยฌรฌ\9aยฉรญ\95ยดรฌ\95ยผ รญ\95ยฉรซ\8b\88รซ\8bยค.
+ํผ ๋ณธ๋ฌธ์„ ์„ ์–ธํ•  ๋•Œรซ\8a\94 `Form`รฌ\9d\84 รซยช\85รฌ\8b\9cรฌย \81รฌ\9cยผรซยก\9c รฌ\82ยฌรฌ\9aยฉรญ\95ยดรฌ\95ยผ รญ\95ยฉรซ\8b\88รซ\8bยค. รชยทยธรซย \87รฌยง\80 รฌ\95\8aรฌ\9cยผรซยฉยด รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รชยฐ\80 รฌยฟยผรซยฆยฌ รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รซ\82\98 รซยณยธรซยฌยธ(JSON) รซยงยครชยฐ\9cรซยณ\80รฌ\88\98รซยก\9c รญ\95ยดรฌ\84\9dรซ\90ยฉรซ\8b\88รซ\8bยค.
 
 ///
 
@@ -56,7 +56,7 @@ HTML ํผ(`<form></form>`)์ด ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์€ ์ผ๋ฐ˜
 
 ๊ทธ๋Ÿฌ๋‚˜ ํผ์— ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, `multipart/form-data`๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์žฅ์—์„œ ํŒŒ์ผ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ฝ์„ ๊ฒ๋‹ˆ๋‹ค.
 
-์ด๋Ÿฌํ•œ ์ธ์ฝ”๋”ฉ ๋ฐ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์ฝ๊ณ  ์‹ถ๋‹ค๋ฉด, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - Mozilla ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> ์›น ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” <code>POST</code>์— ๋Œ€ํ•œ</a>.
+์ด๋Ÿฌํ•œ ์ธ์ฝ”๋”ฉ ๋ฐ ํผ ํ•„๋“œ์— ๋Œ€ํ•ด ๋” ์ฝ๊ณ  ์‹ถ๋‹ค๋ฉด, [`POST`์— ๋Œ€ํ•œ <abbr title="Mozilla Developer Network - Mozilla ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr> ์›น ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
 
 ///
 
index 942901e7cce62ed6861d241c9f566577780c4d86..f3d1046267927b7161770d2413b3394ffa182c2d 100644 (file)
@@ -13,6 +13,7 @@ FastAPI๋Š” ์ด ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ:
 * OpenAPI *๊ฒฝ๋กœ ์ฒ˜๋ฆฌ*์˜ ์‘๋‹ต์— **JSON Schema**๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
     * ์ด๋Š” **์ž๋™ ๋ฌธ์„œ**์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
     * ๋˜ํ•œ ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
+* ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์„ ์‚ฌ์šฉํ•ด JSON์œผ๋กœ **์ง๋ ฌํ™”**ํ•ฉ๋‹ˆ๋‹ค. Pydantic์€ **Rust**๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด **ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค**.
 
 ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€:
 
@@ -73,9 +74,9 @@ FastAPI๋Š” ์ด `response_model`์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ๋ฌธ์„œํ™”, ๊ฒ€์ฆ ๋“ฑ์„
 
 /// info | ์ •๋ณด
 
-`EmailStr`์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email-validator`</a>๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
+`EmailStr`์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € [`email-validator`](https://github.com/JoshData/python-email-validator)๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.
 
-[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
 
 ```console
 $ pip install email-validator
@@ -181,7 +182,7 @@ FastAPI๋Š” Pydantic์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ํด๋ž˜
 
 ### ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ธฐ { #return-a-response-directly }
 
-๊ฐ€์žฅ ํ”ํ•œ ๊ฒฝ์šฐ๋Š” [๊ณ ๊ธ‰ ๋ฌธ์„œ์—์„œ ๋‚˜์ค‘์— ์„ค๋ช…ํ•˜๋Š” ๋Œ€๋กœ Response๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ](../advanced/response-directly.md){.internal-link target=_blank}์ž…๋‹ˆ๋‹ค.
+๊ฐ€์žฅ ํ”ํ•œ ๊ฒฝ์šฐ๋Š” [๊ณ ๊ธ‰ ๋ฌธ์„œ์—์„œ ๋‚˜์ค‘์— ์„ค๋ช…ํ•˜๋Š” ๋Œ€๋กœ Response๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ](../advanced/response-directly.md)์ž…๋‹ˆ๋‹ค.
 
 {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
 
@@ -257,7 +258,7 @@ FastAPI๋Š” Pydantic์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ํด๋ž˜
 * `response_model_exclude_defaults=True`
 * `response_model_exclude_none=True`
 
-`exclude_defaults` ๋ฐ `exclude_none`์— ๋Œ€ํ•ด <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">Pydantic ๋ฌธ์„œ</a>์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+`exclude_defaults` ๋ฐ `exclude_none`์— ๋Œ€ํ•ด [Pydantic ๋ฌธ์„œ](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict)์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
index c81132dfb92b3ae204fb9a98676887d8e41f9356..68db66e3388d7176be3221b836efde8bcc31cd06 100644 (file)
@@ -20,7 +20,7 @@
 
 /// info | ์ •๋ณด
 
-`status_code` ๋Š” ํŒŒ์ด์ฌ์˜ <a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a> ์™€ ๊ฐ™์€ `IntEnum` ์„ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
+`status_code` ๋Š” ํŒŒ์ด์ฌ์˜ [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) ์™€ ๊ฐ™์€ `IntEnum` ์„ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -43,7 +43,7 @@ FastAPI๋Š” ์ด๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ์‘๋‹ต ๋ณธ๋ฌธ์ด ์—†๋‹ค๊ณ  ๋ช…์‹œํ•˜๋Š” Open
 
 /// note | ์ฐธ๊ณ 
 
-รซยง\8cรฌ\95ยฝ HTTP รฌ\83\81รญ\83\9c รฌยฝ\94รซ\93\9cรชยฐ\80 รซยฌยดรฌ\97\87รฌ\9dยธรฌยง\80 รฌ\9dยดรซยฏยธ รฌ\95\8cรชยณย  รฌ\9e\88รซ\8bยครซยฉยด, รซ\8bยครฌ\9d\8c รฌ\84ยก์…˜์œผ๋กœ ๋„˜์–ด๊ฐ€์„ธ์š”.
+รซยง\8cรฌ\95ยฝ HTTP รฌ\83\81รญ\83\9c รฌยฝ\94รซ\93\9cรชยฐ\80 รซยฌยดรฌ\97\87รฌ\9dยธรฌยง\80 รฌ\9dยดรซยฏยธ รฌ\95\8cรชยณย  รฌ\9e\88รซ\8bยครซยฉยด, รซ\8bยครฌ\9d\8c รฌ\84ยน์…˜์œผ๋กœ ๋„˜์–ด๊ฐ€์„ธ์š”.
 
 ///
 
@@ -66,7 +66,7 @@ HTTP์—์„œ๋Š” ์‘๋‹ต์˜ ์ผ๋ถ€๋กœ 3์ž๋ฆฌ ์ˆซ์ž ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
-๊ฐ ์ƒํƒœ ์ฝ”๋“œ์™€ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์šฉ๋„์ธ์ง€ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr>์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ์— ๊ด€ํ•œ ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+๊ฐ ์ƒํƒœ ์ฝ”๋“œ์™€ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์šฉ๋„์ธ์ง€ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด [<abbr title="Mozilla Developer Network - ๋ชจ์งˆ๋ผ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ">MDN</abbr>์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ์— ๊ด€ํ•œ ๋ฌธ์„œ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 ///
 
@@ -98,4 +98,4 @@ HTTP์—์„œ๋Š” ์‘๋‹ต์˜ ์ผ๋ถ€๋กœ 3์ž๋ฆฌ ์ˆซ์ž ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
 
 ## ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ { #changing-the-default }
 
-๋‚˜์ค‘์— [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์ง€์นจ์„œ](../advanced/response-change-status-code.md){.internal-link target=_blank}์—์„œ, ์—ฌ๊ธฐ์„œ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’๊ณผ ๋‹ค๋ฅธ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋‚˜์ค‘์— [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ์ง€์นจ์„œ](../advanced/response-change-status-code.md)์—์„œ, ์—ฌ๊ธฐ์„œ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’๊ณผ ๋‹ค๋ฅธ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
index a1d0c846895f5f2e5c99af85841cac9a276073d4..ffa97375dfe811a2615bad180c6586ca09d650da 100644 (file)
@@ -2,7 +2,7 @@
 
 ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์˜ˆ์ œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์—ฌ๊ธฐ ์ด๋ฅผ ์œ„ํ•œ ๋ช‡๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
+์—ฌ๊ธฐ ์ด๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## Pydantic ๋ชจ๋ธ ์† ์ถ”๊ฐ€ JSON ์Šคํ‚ค๋งˆ ๋ฐ์ดํ„ฐ { #extra-json-schema-data-in-pydantic-models }
 
@@ -12,7 +12,7 @@
 
 ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ๋ชจ๋ธ์˜ **JSON ์Šคํ‚ค๋งˆ** ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€๋˜๊ณ , API ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
 
-<a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">Pydantic ๋ฌธ์„œ: Configuration</a>์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ `dict`๋ฅผ ๋ฐ›๋Š” `model_config` ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[Pydantic ๋ฌธ์„œ: Configuration](https://docs.pydantic.dev/latest/api/config/)์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ `dict`๋ฅผ ๋ฐ›๋Š” `model_config` ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 `"json_schema_extra"`๋ฅผ ์ƒ์„ฑ๋œ JSON ์Šคํ‚ค๋งˆ์—์„œ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ์™€ `examples`๋ฅผ ํฌํ•จํ•˜๋Š” `dict`์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -145,12 +145,12 @@ JSON ์Šคํ‚ค๋งˆ๋Š” `examples`๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์•˜๊ณ , ๋”ฐ๋ผ์„œ OpenAPI๋Š”
 
 OpenAPI๋Š” ๋˜ํ•œ `example`๊ณผ `examples` ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค:
 
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object" class="external-link" target="_blank">`Parameter Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)</a>๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค:
+* [`Parameter Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object)๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค:
     * `Path()`
     * `Query()`
     * `Header()`
     * `Cookie()`
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object" class="external-link" target="_blank">`Request Body Object`, `Media Type Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)์˜ `content` ํ•„๋“œ์— ์žˆ๋Š”</a>๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค:
+* [`Request Body Object`, `Media Type Object` (๋ช…์„ธ์„œ์— ์žˆ๋Š”)์˜ `content` ํ•„๋“œ์— ์žˆ๋Š”](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object)๋Š” FastAPI์˜ ๋‹ค์Œ ๊ธฐ๋Šฅ์—์„œ ์“ฐ์˜€์Šต๋‹ˆ๋‹ค:
     * `Body()`
     * `File()`
     * `Form()`
@@ -163,7 +163,7 @@ OpenAPI๋Š” ๋˜ํ•œ `example`๊ณผ `examples` ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„
 
 ### JSON ์Šคํ‚ค๋งˆ์˜ `examples` ํ•„๋“œ { #json-schemas-examples-field }
 
-ํ•˜์ง€๋งŒ, ํ›„์— JSON ์Šคํ‚ค๋งˆ๋Š” <a href="https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5" class="external-link" target="_blank">`examples`</a> ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ์ƒˆ ๋ฒ„์ „์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
+ํ•˜์ง€๋งŒ, ํ›„์— JSON ์Šคํ‚ค๋งˆ๋Š” [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) ํ•„๋“œ๋ฅผ ๋ช…์„ธ์„œ์˜ ์ƒˆ ๋ฒ„์ „์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
 
 ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด OpenAPI 3.1.0์€ ์ด ์ƒˆ๋กœ์šด `examples` ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ์ตœ์‹  ๋ฒ„์ „ (JSON ์Šคํ‚ค๋งˆ 2020-12)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.
 
index 57b336d52dc76b503b004a95f5c93ffbc2a87be8..8b7563ec3e9eb181a934f0bab6f7bb3cdaa1abc2 100644 (file)
 
 /// info | ์ •๋ณด
 
-<a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> ํŒจํ‚ค์ง€๋Š” `pip install "fastapi[standard]"` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด **FastAPI**์™€ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
+[`python-multipart`](https://github.com/Kludex/python-multipart) ํŒจํ‚ค์ง€๋Š” `pip install "fastapi[standard]"` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด **FastAPI**์™€ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
 
 ํ•˜์ง€๋งŒ `pip install fastapi` ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด `python-multipart` ํŒจํ‚ค์ง€๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์•„๋ž˜๋กœ ์„ค์น˜ํ•˜์„ธ์š”:
+์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, ์•„๋ž˜๋กœ ์„ค์น˜ํ•˜์„ธ์š”:
 
 ```console
 $ pip install python-multipart
@@ -45,7 +45,7 @@ $ pip install python-multipart
 <div class="termy">
 
 ```console
-$ fastapi dev main.py
+$ fastapi dev
 
 <span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
@@ -54,7 +54,7 @@ $ fastapi dev main.py
 
 ## ํ™•์ธํ•˜๊ธฐ { #check-it }
 
-๋Œ€ํ™”ํ˜• ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์„ธ์š”: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
+๋Œ€ํ™”ํ˜• ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์„ธ์š”: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
 
 ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ํ™”๋ฉด์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
 
@@ -140,7 +140,7 @@ OAuth2๋Š” backend ๋˜๋Š” API๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋Š” ์„œ๋ฒ„์™€ ๋…๋ฆฝ์ ์ผ
 
 ์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด API๊ฐ€ `https://example.com/`์— ์žˆ๋‹ค๋ฉด `https://example.com/token`์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ API๊ฐ€ `https://example.com/api/v1/`์— ์žˆ๋‹ค๋ฉด `https://example.com/api/v1/token`์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
 
-์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ [ํ”„๋ก์‹œ ๋’ค์—์„œ](../../advanced/behind-a-proxy.md){.internal-link target=_blank} ๊ฐ™์€ ๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์† ๋™์ž‘ํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
+์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ [ํ”„๋ก์‹œ ๋’ค์—์„œ](../../advanced/behind-a-proxy.md) ๊ฐ™์€ ๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์† ๋™์ž‘ํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
 
 ///
 
index f9c4cc2ff35677ea334ed6b3f41d8aacdeaeae5e..3c3b93e3a6b7413e0ad3e6993f7774e0b8591c26 100644 (file)
@@ -24,13 +24,13 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4
 
 1์ฃผ์ผ ๋’ค์—๋Š” ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ณ  ์‚ฌ์šฉ์ž๋Š” ์ธ๊ฐ€๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒˆ ํ† ํฐ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž(๋˜๋Š” ์ œ3์ž)๊ฐ€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ํ† ํฐ์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์„œ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-JWT ํ† ํฐ์„ ์ง์ ‘ ๋‹ค๋ค„๋ณด๊ณ  ๋™์ž‘ ๋ฐฉ์‹์„ ํ™•์ธํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://jwt.io/" class="external-link" target="_blank">https://jwt.io</a>๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
+JWT ํ† ํฐ์„ ์ง์ ‘ ๋‹ค๋ค„๋ณด๊ณ  ๋™์ž‘ ๋ฐฉ์‹์„ ํ™•์ธํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด [https://jwt.io](https://jwt.io/)๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
 
 ## `PyJWT` ์„ค์น˜ { #install-pyjwt }
 
 Python์—์„œ JWT ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋ ค๋ฉด `PyJWT`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-[๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ `pyjwt`๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:
+[๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ `pyjwt`๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:
 
 <div class="termy">
 
@@ -46,7 +46,7 @@ $ pip install pyjwt
 
 RSA๋‚˜ ECDSA ๊ฐ™์€ ์ „์ž ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด๋ผ๋ฉด, cryptography ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์ธ `pyjwt[crypto]`๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://pyjwt.readthedocs.io/en/latest/installation.html" class="external-link" target="_blank">PyJWT Installation docs</a>์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [PyJWT ์„ค์น˜ ๋ฌธ์„œ](https://pyjwt.readthedocs.io/en/latest/installation.html)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -72,7 +72,7 @@ pwdlib๋Š” ํŒจ์Šค์›Œ๋“œ ํ•ด์‹œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ Python ํŒจํ‚ค์ง€์ž…
 
 ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ "Argon2"์ž…๋‹ˆ๋‹ค.
 
-[๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank}์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ Argon2์™€ ํ•จ๊ป˜ pwdlib๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:
+[๊ฐ€์ƒํ™˜๊ฒฝ](../../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ Argon2์™€ ํ•จ๊ป˜ pwdlib๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:
 
 <div class="termy">
 
@@ -200,7 +200,7 @@ JWT๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ API์—์„œ ์ง์ ‘ ์ž‘์—…์„ ์ˆ˜ํ–‰
 
 ## ํ™•์ธํ•˜๊ธฐ { #check-it }
 
-์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
+์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
 
 ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
 
index 918c94b25f078557ddaf672dc819fea9df2acfe7..48361de83d05e0a69ae6723e19efe6fc31dd8c47 100644 (file)
@@ -146,7 +146,7 @@ UserInDB(
 
 /// info | ์ •๋ณด
 
-`**user_dict`์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ [**์ถ”๊ฐ€ ๋ชจ๋ธ** ๋ฌธ์„œ](../extra-models.md#about-user-in-dict){.internal-link target=_blank}๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด์„ธ์š”.
+`**user_dict`์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ [**์ถ”๊ฐ€ ๋ชจ๋ธ** ๋ฌธ์„œ](../extra-models.md#about-user-in-dict)๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด์„ธ์š”.
 
 ///
 
@@ -216,7 +216,7 @@ UserInDB(
 
 ## ํ™•์ธํ•˜๊ธฐ { #see-it-in-action }
 
-๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์—ด๊ธฐ: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
+๋Œ€ํ™”ํ˜• ๋ฌธ์„œ ์—ด๊ธฐ: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
 
 ### ์ธ์ฆํ•˜๊ธฐ { #authenticate }
 
index 20c13671642c9d1c266f546b645c1bf7df4560b0..b046d14b530a824b85251f25382bc0df1fd60e33 100644 (file)
@@ -2,9 +2,9 @@
 
 **FastAPI**์—์„œ SQL(๊ด€๊ณ„ํ˜•) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์ด ์›ํ•˜๋Š” **์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ ** ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์—ฌ๊ธฐ์„œ๋Š” <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel</a>์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
+์—ฌ๊ธฐ์„œ๋Š” [SQLModel](https://sqlmodel.tiangolo.com/)์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
 
-**SQLModel**์€ <a href="https://www.sqlalchemy.org/" class="external-link" target="_blank">SQLAlchemy</a>์™€ Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. **SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์™„๋ฒฝํžˆ ์–ด์šธ๋ฆฌ๋„๋ก **FastAPI**์™€ ๊ฐ™์€ ์ œ์ž‘์ž๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
+**SQLModel**์€ [SQLAlchemy](https://www.sqlalchemy.org/)์™€ Pydantic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. **SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์™„๋ฒฝํžˆ ์–ด์šธ๋ฆฌ๋„๋ก **FastAPI**์™€ ๊ฐ™์€ ์ œ์ž‘์ž๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
 
 /// tip | ํŒ
 
@@ -26,15 +26,15 @@ SQLModel์€ SQLAlchemy๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ, SQLAlchemy์—์„œ **์ง€์›ํ•˜
 
 /// tip | ํŒ
 
-ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋” ๋งŽ์€ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•˜์—ฌ **FastAPI**์™€ **PostgreSQL**์„ ํฌํ•จํ•œ ๊ณต์‹ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: <a href="https://github.com/fastapi/full-stack-fastapi-template" class="external-link" target="_blank">https://github.com/fastapi/full-stack-fastapi-template</a>
+ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋” ๋งŽ์€ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•˜์—ฌ **FastAPI**์™€ **PostgreSQL**์„ ํฌํ•จํ•œ ๊ณต์‹ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)
 
 ///
 
-์ด ํŠœํ† ๋ฆฌ์–ผ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์งง์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ๊ฐœ๋…, SQL, ๋˜๋Š” ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+์ด ํŠœํ† ๋ฆฌ์–ผ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์งง์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ๊ฐœ๋…, SQL, ๋˜๋Š” ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, [SQLModel ๋ฌธ์„œ](https://sqlmodel.tiangolo.com/)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 ## `SQLModel` ์„ค์น˜ํ•˜๊ธฐ { #install-sqlmodel }
 
-๋จผ์ €, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `sqlmodel`์„ ์„ค์น˜ํ•˜์„ธ์š”:
+๋จผ์ €, [๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ, `sqlmodel`์„ ์„ค์น˜ํ•˜์„ธ์š”:
 
 <div class="termy">
 
@@ -65,7 +65,7 @@ $ pip install sqlmodel
 
 * `Field(primary_key=True)`๋Š” SQLModel์— `id`๊ฐ€ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ **๊ธฐ๋ณธ ํ‚ค**์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค (SQL ๊ธฐ๋ณธ ํ‚ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ SQLModel ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”).
 
-    **์ฐธ๊ณ :** ๊ธฐ๋ณธ ํ‚ค ํ•„๋“œ์— `int | None`์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, Python ์ฝ”๋“œ์—์„œ *`id` ์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ*ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค(`id=None`). ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ *์ €์žฅํ•  ๋•Œ ์ƒ์„ฑํ•ด ์ค„ ๊ฒƒ*์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. SQLModel์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ `id`๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์—์„œ *ํ•ด๋‹น ์—ด์„ null์ด ์•„๋‹Œ `INTEGER`*๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ <a href="https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id" class="external-link" target="_blank">๊ธฐ๋ณธ ํ‚ค์— ๋Œ€ํ•œ SQLModel ๋ฌธ์„œ</a>๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+    **์ฐธ๊ณ :** ๊ธฐ๋ณธ ํ‚ค ํ•„๋“œ์— `int | None`์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, Python ์ฝ”๋“œ์—์„œ *`id` ์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ*ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค(`id=None`). ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ *์ €์žฅํ•  ๋•Œ ์ƒ์„ฑํ•ด ์ค„ ๊ฒƒ*์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. SQLModel์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ `id`๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์—์„œ *ํ•ด๋‹น ์—ด์„ null์ด ์•„๋‹Œ `INTEGER`*๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ธฐ๋ณธ ํ‚ค์— ๋Œ€ํ•œ SQLModel ๋ฌธ์„œ](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 * `Field(index=True)`๋Š” SQLModel์— ํ•ด๋‹น ์—ด์— ๋Œ€ํ•ด **SQL ์ธ๋ฑ์Šค**๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด ์—ด๋กœ ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ๋” ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
@@ -111,7 +111,7 @@ SQLModel์˜ `engine` (๋‚ด๋ถ€์ ์œผ๋กœ๋Š” SQLAlchemy `engine`)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด
 
 /// tip | ํŒ
 
-SQLModel์€ Alembic์„ ๊ฐ์‹ธ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ <a href="https://alembic.sqlalchemy.org/en/latest/" class="external-link" target="_blank">Alembic</a>์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+SQLModel์€ Alembic์„ ๊ฐ์‹ธ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ [Alembic](https://alembic.sqlalchemy.org/en/latest/)์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -152,7 +152,7 @@ SQLModel์€ Alembic์„ ๊ฐ์‹ธ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•  
 <div class="termy">
 
 ```console
-$ fastapi dev main.py
+$ fastapi dev
 
 <span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
@@ -337,7 +337,7 @@ hero **์‚ญ์ œ**๋Š” ์ด์ „๊ณผ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
 <div class="termy">
 
 ```console
-$ fastapi dev main.py
+$ fastapi dev
 
 <span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
@@ -352,6 +352,6 @@ $ fastapi dev main.py
 
 ## ์š”์•ฝ { #recap }
 
-<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">**SQLModel**</a>์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ , *๋ฐ์ดํ„ฐ ๋ชจ๋ธ* ๋ฐ *ํ…Œ์ด๋ธ” ๋ชจ๋ธ*๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[**SQLModel**](https://sqlmodel.tiangolo.com/)์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ , *๋ฐ์ดํ„ฐ ๋ชจ๋ธ* ๋ฐ *ํ…Œ์ด๋ธ” ๋ชจ๋ธ*๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
-๋” ๋งŽ์€ ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๋ ค๋ฉด **SQLModel** ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. **FastAPI**์™€ ํ•จ๊ป˜ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋” ๊ธด ๋ฏธ๋‹ˆ <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">ํŠœํ† ๋ฆฌ์–ผ</a>๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€
+๋” ๋งŽ์€ ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๋ ค๋ฉด **SQLModel** ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. **FastAPI**์™€ ํ•จ๊ป˜ SQLModel์„ ์‚ฌ์šฉํ•˜๋Š” ๋” ๊ธด ๋ฏธ๋‹ˆ [ํŠœํ† ๋ฆฌ์–ผ](https://sqlmodel.tiangolo.com/tutorial/fastapi/)๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€
index 0235d83c7f80a8afc2a2f9191d7ebcfb2d01b61e..d4c6f6c2d4738488c9bcf2e82a6a11fcb259fffb 100644 (file)
@@ -23,7 +23,7 @@
 
 ๋งˆ์šดํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ `APIRouter`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ OpenAPI ๋ฐ ๋ฌธ์„œ์—๋Š” ๋งˆ์šดํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด์šฉ ๋“ฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
 
-์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../advanced/index.md){.internal-link target=_blank}์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ž์„ธํ•œ ๋‚ด์šฉ์€ [๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ](../advanced/index.md)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## ์„ธ๋ถ€์‚ฌํ•ญ { #details }
 
@@ -37,4 +37,4 @@
 
 ## ์ถ”๊ฐ€ ์ •๋ณด { #more-info }
 
-์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ต์…˜์€ <a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">Starlette์˜ ์ •์  ํŒŒ์ผ ๋ฌธ์„œ</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ต์…˜์€ [Starlette์˜ ์ •์  ํŒŒ์ผ ๋ฌธ์„œ](https://www.starlette.dev/staticfiles/)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
index 57ab8115153cc7ada0f7632a857c85f4a9de8bfe..aab85580bb660fa839396c8627a476d25daa0925 100644 (file)
@@ -1,18 +1,18 @@
 # ํ…Œ์ŠคํŒ… { #testing }
 
-<a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">Starlette</a> ๋•๋ถ„์— **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ์€ ์‰ฝ๊ณ  ์ฆ๊ฑฐ์šด ์ผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
+[Starlette](https://www.starlette.dev/testclient/) ๋•๋ถ„์— **FastAPI** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ์€ ์‰ฝ๊ณ  ์ฆ๊ฑฐ์šด ์ผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
 
-์ด๋Š” <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ด๋Š” Requests๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์นœ์ˆ™ํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
+์ด๋Š” [HTTPX](https://www.python-httpx.org)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ด๋Š” Requests๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์นœ์ˆ™ํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
 
-์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **FastAPI**์—์„œ <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a>๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **FastAPI**์—์„œ [pytest](https://docs.pytest.org/)๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ## `TestClient` ์‚ฌ์šฉํ•˜๊ธฐ { #using-testclient }
 
 /// info | ์ •๋ณด
 
-`TestClient` ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์šฐ์„  <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+`TestClient` ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์šฐ์„  [`httpx`](https://www.python-httpx.org)๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
-[virtual environment](../virtual-environments.md){.internal-link target=_blank}๋ฅผ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™” ์‹œํ‚จ ๋’ค์— ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™”ํ•œ ๋’ค ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ:
 
 ```console
 $ pip install httpx
@@ -52,7 +52,7 @@ $ pip install httpx
 
 /// tip | ํŒ
 
-FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ `async` ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (์˜ˆ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•จ์ˆ˜), ์‹ฌํ™” ํŠœํ† ๋ฆฌ์–ผ์˜ [Async Tests](../advanced/async-tests.md){.internal-link target=_blank}๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
+FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ `async` ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (์˜ˆ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•จ์ˆ˜), ์‹ฌํ™” ํŠœํ† ๋ฆฌ์–ผ์˜ [๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ](../advanced/async-tests.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
 
 ///
 
@@ -64,7 +64,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
 
 ### **FastAPI** app ํŒŒ์ผ { #fastapi-app-file }
 
-[Bigger Applications](bigger-applications.md){.internal-link target=_blank}์— ๋ฌ˜์‚ฌ๋œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
+[๋” ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜](bigger-applications.md)์— ๋ฌ˜์‚ฌ๋œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
 
 ```
 .
@@ -142,13 +142,13 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
 * *ํ—ค๋”*๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด, `headers` ํŒŒ๋ผ๋ฏธํ„ฐ์— `dict`๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
 * *์ฟ ํ‚ค*๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด, `cookies` ํŒŒ๋ผ๋ฏธํ„ฐ์— `dict`๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
 
-๋ฐฑ์—”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ด๋Š”์ง€ ์ •๋ณด๋ฅผ ๋” ์–ป์œผ๋ ค๋ฉด (`httpx` ํ˜น์€ `TestClient`๋ฅผ ์ด์šฉํ•ด์„œ) <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX documentation</a>๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
+๋ฐฑ์—”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ด๋Š”์ง€ ์ •๋ณด๋ฅผ ๋” ์–ป์œผ๋ ค๋ฉด (`httpx` ํ˜น์€ `TestClient`๋ฅผ ์ด์šฉํ•ด์„œ) [HTTPX ๋ฌธ์„œ](https://www.python-httpx.org)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
 
 /// info | ์ •๋ณด
 
 `TestClient`๋Š” Pydantic ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ JSON์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
 
-๋งŒ์•ฝ ํ…Œ์ŠคํŠธ ์ค‘ Pydantic ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์ค‘์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด, [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}์— ์„ค๋ช…๋˜์–ด ์žˆ๋Š” `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+๋งŒ์•ฝ ํ…Œ์ŠคํŠธ ์ค‘ Pydantic ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์ค‘์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด, [JSON ํ˜ธํ™˜ ์ธ์ฝ”๋”](encoder.md)์— ์„ค๋ช…๋˜์–ด ์žˆ๋Š” `jsonable_encoder`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 ///
 
@@ -156,7 +156,7 @@ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์—๋„ ํ…Œ์ŠคํŠธ์—์„œ
 
 ๊ทธ ํ›„์—๋Š” `pytest`๋ฅผ ์„ค์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 
-[virtual environment](../virtual-environments.md){.internal-link target=_blank}๋ฅผ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™” ์‹œํ‚จ ๋’ค์— ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ:
+[๊ฐ€์ƒ ํ™˜๊ฒฝ](../virtual-environments.md)์„ ๋งŒ๋“ค๊ณ , ํ™œ์„ฑํ™” ์‹œํ‚จ ๋’ค์— ์„ค์น˜ํ•˜์„ธ์š”. ์˜ˆ์‹œ:
 
 <div class="termy">
 
index e6baef73b44f4fe0734bdd9cb6788ac34f93be11..7c2a59f81c1c58b3050854a53801ab7d3781b74a 100644 (file)
@@ -22,7 +22,7 @@ Python ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ•  ๋•Œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ**(๋˜๋Š” ์ด์™€ ์œ ์‚ฌ
 
 ์ด ํŽ˜์ด์ง€์—์„œ๋Š” **๊ฐ€์ƒ ํ™˜๊ฒฝ**์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ž‘๋™ ๋ฐฉ์‹์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.
 
-Python ์„ค์น˜๊นŒ์ง€ ํฌํ•จํ•ด **๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ**๋ฅผ ๋„์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
+Python ์„ค์น˜๊นŒ์ง€ ํฌํ•จํ•ด **๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ**๋ฅผ ๋„์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
 
 ///
 
@@ -86,7 +86,7 @@ $ python -m venv .venv
 
 //// tab | `uv`
 
-<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+[`uv`](https://github.com/astral-sh/uv)๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 <div class="termy">
 
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1
 
 //// tab | Windows Bash
 
-๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
+๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: [Git Bash](https://gitforwindows.org/))๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
 
 <div class="termy">
 
@@ -216,7 +216,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
 
 /// tip
 
-<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, `pip` ๋Œ€์‹  `uv`๋กœ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ `pip`์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž
+[`uv`](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, `pip` ๋Œ€์‹  `uv`๋กœ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ `pip`์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž
 
 ///
 
@@ -268,7 +268,7 @@ $ python -m ensurepip --upgrade
 
 /// tip
 
-<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๋กœ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด, ์ด๋ฏธ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
+[`uv`](https://github.com/astral-sh/uv)๋กœ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด, ์ด๋ฏธ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž
 
 ///
 
@@ -340,7 +340,7 @@ $ pip install "fastapi[standard]"
 
 //// tab | `uv`
 
-<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๊ฐ€ ์žˆ๋‹ค๋ฉด:
+[`uv`](https://github.com/astral-sh/uv)๊ฐ€ ์žˆ๋‹ค๋ฉด:
 
 <div class="termy">
 
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt
 
 //// tab | `uv`
 
-<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>๊ฐ€ ์žˆ๋‹ค๋ฉด:
+[`uv`](https://github.com/astral-sh/uv)๊ฐ€ ์žˆ๋‹ค๋ฉด:
 
 <div class="termy">
 
@@ -416,8 +416,8 @@ Hello World
 
 ์˜ˆ๋ฅผ ๋“ค๋ฉด:
 
-* <a href="https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment" class="external-link" target="_blank">VS Code</a>
-* <a href="https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html" class="external-link" target="_blank">PyCharm</a>
+* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment)
+* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html)
 
 /// tip
 
@@ -455,7 +455,7 @@ $ deactivate
 
 ## ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š” { #why-virtual-environments }
 
-FastAPI๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด <a href="https://www.python.org/" class="external-link" target="_blank">Python</a>์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+FastAPI๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด [Python](https://www.python.org/)์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
 ๊ทธ ๋‹ค์Œ FastAPI์™€ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋‹ค๋ฅธ **ํŒจํ‚ค์ง€**๋ฅผ **์„ค์น˜**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -564,7 +564,7 @@ $ pip install "fastapi[standard]"
 
 </div>
 
-FastAPI ์ฝ”๋“œ๋ฅผ ๋‹ด์€ ์••์ถ• ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต <a href="https://pypi.org/project/fastapi/" class="external-link" target="_blank">PyPI</a>์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.
+FastAPI ์ฝ”๋“œ๋ฅผ ๋‹ด์€ ์••์ถ• ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต [PyPI](https://pypi.org/project/fastapi/)์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.
 
 ๋˜ํ•œ FastAPI๊ฐ€ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์˜ ํŒŒ์ผ๋„ **๋‹ค์šด๋กœ๋“œ**ํ•ฉ๋‹ˆ๋‹ค.
 
@@ -627,7 +627,7 @@ $ .venv\Scripts\Activate.ps1
 
 //// tab | Windows Bash
 
-๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
+๋˜๋Š” Windows์—์„œ Bash(์˜ˆ: [Git Bash](https://gitforwindows.org/))๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:
 
 <div class="termy">
 
@@ -639,13 +639,13 @@ $ source .venv/Scripts/activate
 
 ////
 
-๋‹ค์Œ ๋ช…๋ น์–ด๋“ค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡๋ช‡ [ํ™˜๊ฒฝ ๋ณ€์ˆ˜](environment-variables.md){.internal-link target=_blank}๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
+๋‹ค์Œ ๋ช…๋ น์–ด๋“ค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡๋ช‡ [ํ™˜๊ฒฝ ๋ณ€์ˆ˜](environment-variables.md)๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
 
 ๊ทธ ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ `PATH` ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
 
 /// tip
 
-`PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [ํ™˜๊ฒฝ ๋ณ€์ˆ˜](environment-variables.md#path-environment-variable){.internal-link target=_blank} ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
+`PATH` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด [ํ™˜๊ฒฝ ๋ณ€์ˆ˜](environment-variables.md#path-environment-variable) ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
 
 ///
 
@@ -846,7 +846,7 @@ I solemnly swear ๐Ÿบ
 
 ๊ฐ€์ƒ ํ™˜๊ฒฝ, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ(requirements), ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋งŽ์€ **๋Œ€์•ˆ**์ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
-์ค€๋น„๊ฐ€ ๋˜์—ˆ๊ณ  **ํ”„๋กœ์ ํŠธ ์ „์ฒด**, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ, ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋“ฑ์„ **๊ด€๋ฆฌ**ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.
+์ค€๋น„๊ฐ€ ๋˜์—ˆ๊ณ  **ํ”„๋กœ์ ํŠธ ์ „์ฒด**, ํŒจํ‚ค์ง€ ์˜์กด์„ฑ, ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋“ฑ์„ **๊ด€๋ฆฌ**ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด [uv](https://github.com/astral-sh/uv)๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.
 
 `uv`๋Š” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด: