diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 2198fe668..77bce055c 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -91,13 +91,13 @@ jobs: run: uv sync --locked --no-dev --group docs - name: Update Languages run: uv run ./scripts/docs.py update-languages - - uses: actions/cache@v4 + - uses: actions/cache@v5 with: key: mkdocs-cards-${{ matrix.lang }}-${{ github.ref }} path: docs/${{ matrix.lang }}/.cache - name: Build Docs run: uv run ./scripts/docs.py build-lang ${{ matrix.lang }} - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@v6 with: name: docs-site-${{ matrix.lang }} path: ./site/** diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 79d7391c4..734fc244d 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -45,7 +45,7 @@ jobs: run: | rm -rf ./site mkdir ./site - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: path: ./site/ pattern: docs-site-* diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml index f40ec4dc4..2ae588da1 100644 --- a/.github/workflows/issue-manager.yml +++ b/.github/workflows/issue-manager.yml @@ -41,11 +41,15 @@ jobs: "message": "As this PR has been waiting for the original user for a while but seems to be inactive, it's now going to be closed. But if there's anyone interested, feel free to create a new PR.", "reminder": { "before": "P3D", - "message": "Heads-up: this will be closed in 3 days unless thereโs new activity." + "message": "Heads-up: this will be closed in 3 days unless there's new activity." } }, "invalid": { "delay": 0, "message": "This was marked as invalid and will be closed now. If this is an error, please provide additional details." + }, + "maybe-ai": { + "delay": 0, + "message": "This was marked as potentially AI generated and will be closed now. If this is an error, please provide additional details, make sure to read the docs about contributing and AI." } } diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml index 1a45174dc..f23b962b7 100644 --- a/.github/workflows/smokeshow.yml +++ b/.github/workflows/smokeshow.yml @@ -28,7 +28,7 @@ jobs: pyproject.toml uv.lock - run: uv sync --locked --no-dev --group github-actions - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: coverage-html path: htmlcov diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4d45c20eb..891f76717 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -84,7 +84,7 @@ jobs: # Do not store coverage for all possible combinations to avoid file size max errors in Smokeshow - name: Store coverage files if: matrix.coverage == 'coverage' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: coverage-${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/coverage/.coverage.*') }} path: coverage @@ -112,7 +112,7 @@ jobs: - name: Install Dependencies run: uv sync --locked --no-dev --group tests --extra all - name: Get coverage files - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: coverage-* path: coverage @@ -121,7 +121,7 @@ jobs: - run: uv run coverage combine coverage - run: uv run coverage html --title "Coverage for ${{ github.sha }}" - name: Store coverage HTML - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: coverage-html path: htmlcov diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 50b114530..f8085b452 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -65,9 +65,6 @@ bronze: # - url: https://testdriven.io/courses/tdd-fastapi/ # title: Learn to build high-quality web apps with best practices # img: https://fastapi.tiangolo.com/img/sponsors/testdriven.svg - - url: https://lambdatest.com/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage - title: LambdaTest, AI-Powered Cloud-based Test Orchestration Platform - img: https://fastapi.tiangolo.com/img/sponsors/lambdatest.png - - url: https://requestly.com/fastapi - title: All-in-one platform to Test, Mock and Intercept APIs. Built for speed, privacy and offline support. - img: https://fastapi.tiangolo.com/img/sponsors/requestly.png + - url: https://www.testmu.ai/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage + title: TestMu AI. The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering. + img: https://fastapi.tiangolo.com/img/sponsors/testmu.png diff --git a/docs/en/docs/contributing.md b/docs/en/docs/contributing.md index 18b7f60f7..a4d896109 100644 --- a/docs/en/docs/contributing.md +++ b/docs/en/docs/contributing.md @@ -177,252 +177,81 @@ as Uvicorn by default will use the port `8000`, the documentation on port `8008` ### Translations -/// warning | Attention - -**Update on Translations** - -We're updating the way we handle documentation translations. - -Until now, we invited community members to translate pages via pull requests, which were then reviewed by at least two native speakers. While this has helped bring FastAPI to many more users, weโve also run into several challenges - some languages have only a few translated pages, others are outdated and hard to maintain over time. -To improve this, weโre working on automation tools ๐ค to manage translations more efficiently. Once ready, documentation will be machine-translated and still reviewed by at least two native speakers โ before publishing. This will allow us to keep translations up-to-date while reducing the review burden on maintainers. - -Whatโs changing now: - -* ๐ซ Weโre no longer accepting new community-submitted translation PRs. - -* โณ Existing open PRs will be reviewed and can still be merged if completed within the next 3 weeks (since July 11 2025). - -* ๐ In the future, we will only support languages where at least three active native speakers are available to review and maintain translations. - -This transition will help us keep translations more consistent and timely while better supporting our contributors ๐. Thank you to everyone who has contributed so far โ your help has been invaluable! ๐ - -/// - - Help with translations is VERY MUCH appreciated! And it can't be done without the help from the community. ๐ ๐ Here are the steps to help with translations. -#### Tips and guidelines - -* Check the currently existing pull requests for your language. You can filter the pull requests by the ones with the label for your language. For example, for Spanish, the label is `lang-es`. - -* Review those pull requests, requesting changes or approving them. For the languages I don't speak, I'll wait for several others to review the translation before merging. +#### Review Translation PRs -/// tip - -You can add comments with change suggestions to existing pull requests. - -Check the docs about adding a pull request review to approve it or request changes. - -/// - -* Check if there's a GitHub Discussion to coordinate translations for your language. You can subscribe to it, and when there's a new pull request to review, an automatic comment will be added to the discussion. +Translation pull requests are made by LLMs guided with prompts designed by the FastAPI team together with the community of native speakers for each supported language. -* If you translate pages, add a single pull request per page translated. That will make it much easier for others to review it. - -* To check the 2-letter code for the language you want to translate, you can use the table List of ISO 639-1 codes. - -#### Existing language - -Let's say you want to translate a page for a language that already has translations for some pages, like Spanish. - -In the case of Spanish, the 2-letter code is `es`. So, the directory for Spanish translations is located at `docs/es/`. - -/// tip - -The main ("official") language is English, located at `docs/en/`. - -/// - -Now run the live server for the docs in Spanish: - -
+With great-* Do not change the paths in links to images, code files, Markdown documents. +Avoid inadvertently doing harm. -* However, when a Markdown document is translated, the `#hash-parts` in links to its headings may change. Update these links if possible. - * Search for such links in the translated document using the regex `#[^# ]`. - * Search in all documents already translated into your language for `your-translated-document.md`. For example VS Code has an option "Edit" -> "Find in Files". - * When translating a document, do not "pre-translate" `#hash-parts` that link to headings in untranslated documents. +You have amazing tools at hand, use them wisely to help effectively. diff --git a/docs/en/docs/fastapi-people.md b/docs/en/docs/fastapi-people.md index f2ca26013..2c07af764 100644 --- a/docs/en/docs/fastapi-people.md +++ b/docs/en/docs/fastapi-people.md @@ -196,31 +196,11 @@ They have contributed source code, documentation, etc. ๐ฆ There are hundreds of other contributors, you can see them all in the FastAPI GitHub Contributors page. ๐ท -## Top Translators - -These are the **Top Translators**. ๐ - -These users have created the most Pull Requests with [translations to other languages](contributing.md#translations){.internal-link target=_blank} that have been *merged*. - -powertools comes great responsibility. +
lt
+* XWT
+* PSGI
+
+### abbr๊ฐ ์ค๋ช
์ ์ ๊ณต { #the-abbr-gives-an-explanation }
+
+* cluster
+* Deep Learning
+
+### abbr๊ฐ ์ ์ฒด ๋ฌธ๊ตฌ์ ์ค๋ช
์ ์ ๊ณต { #the-abbr-gives-a-full-phrase-and-an-explanation }
+
+* MDN
+* I/O.
+
+////
+
+//// tab | ์ ๋ณด
+
+"abbr" ์์์ "title" ์์ฑ์ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์ง์นจ์ ๋ฐ๋ผ ๋ฒ์ญ๋ฉ๋๋ค.
+
+๋ฒ์ญ์์๋(์์ด ๋จ์ด๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํด) ์์ฒด "abbr" ์์๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, LLM์ ์ด๋ฅผ ์ ๊ฑฐํ๋ฉด ์ ๋ฉ๋๋ค.
+
+`scripts/translate.py`์ ์ผ๋ฐ ํ๋กฌํํธ์์ `### HTML abbr elements` ์น์
์ ์ฐธ๊ณ ํ์ธ์.
+
+////
+
+## ์ ๋ชฉ { #headings }
+
+//// tab | ํ
์คํธ
+
+### ์น์ฑ ๊ฐ๋ฐํ๊ธฐ - ํํ ๋ฆฌ์ผ { #develop-a-webapp-a-tutorial }
+
+์๋
ํ์ธ์.
+
+### ํ์
ํํธ์ -์ ๋ํ
์ด์
{ #type-hints-and-annotations }
+
+๋ค์ ์๋
ํ์ธ์.
+
+### super- ๋ฐ subclasses { #super-and-subclasses }
+
+๋ค์ ์๋
ํ์ธ์.
+
+////
+
+//// tab | ์ ๋ณด
+
+์ ๋ชฉ์ ๋ํ ์ ์ผํ ๊ฐํ ๊ท์น์, LLM์ด ์ค๊ดํธ ์์ ํด์ ๋ถ๋ถ์ ๋ณ๊ฒฝํ์ง ์์ ๋งํฌ๊ฐ ๊นจ์ง์ง ์๊ฒ ํ๋ ๊ฒ์
๋๋ค.
+
+`scripts/translate.py`์ ์ผ๋ฐ ํ๋กฌํํธ์์ `### Headings` ์น์
์ ์ฐธ๊ณ ํ์ธ์.
+
+์ธ์ด๋ณ ์ง์นจ์ ์๋ฅผ ๋ค์ด `docs/de/llm-prompt.md`์ `### Headings` ์น์
์ ์ฐธ๊ณ ํ์ธ์.
+
+////
+
+## ๋ฌธ์์์ ์ฌ์ฉ๋๋ ์ฉ์ด { #terms-used-in-the-docs }
+
+//// tab | ํ
์คํธ
+
+* ๋น์
+* ๋น์ ์
+
+* ์: (e.g.)
+* ๋ฑ (etc.)
+
+* `int`๋ก์์ `foo`
+* `str`๋ก์์ `bar`
+* `list`๋ก์์ `baz`
+
+* ํํ ๋ฆฌ์ผ - ์ฌ์ฉ์ ๊ฐ์ด๋
+* ๊ณ ๊ธ ์ฌ์ฉ์ ๊ฐ์ด๋
+* SQLModel ๋ฌธ์
+* API ๋ฌธ์
+* ์๋ ๋ฌธ์
+
+* Data Science
+* Deep Learning
+* Machine Learning
+* Dependency Injection
+* HTTP Basic authentication
+* HTTP Digest
+* ISO format
+* JSON Schema ํ์ค
+* JSON schema
+* schema definition
+* Password Flow
+* Mobile
+
+* deprecated
+* designed
+* invalid
+* on the fly
+* standard
+* default
+* case-sensitive
+* case-insensitive
+
+* ์ ํ๋ฆฌ์ผ์ด์
์ ์๋นํ๋ค
+* ํ์ด์ง๋ฅผ ์๋นํ๋ค
+
+* ์ฑ
+* ์ ํ๋ฆฌ์ผ์ด์
+
+* ์์ฒญ
+* ์๋ต
+* ์ค๋ฅ ์๋ต
+
+* ๊ฒฝ๋ก ์ฒ๋ฆฌ
+* ๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ
+* ๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์
+
+* body
+* ์์ฒญ body
+* ์๋ต body
+* JSON body
+* form body
+* file body
+* ํจ์ body
+
+* parameter
+* body parameter
+* path parameter
+* query parameter
+* cookie parameter
+* header parameter
+* form parameter
+* function parameter
+
+* event
+* startup event
+* ์๋ฒ startup
+* shutdown event
+* lifespan event
+
+* handler
+* event handler
+* exception handler
+* ์ฒ๋ฆฌํ๋ค
+
+* model
+* Pydantic model
+* data model
+* database model
+* form model
+* model object
+
+* class
+* base class
+* parent class
+* subclass
+* child class
+* sibling class
+* class method
+
+* header
+* headers
+* authorization header
+* `Authorization` header
+* forwarded header
+
+* dependency injection system
+* dependency
+* dependable
+* dependant
+
+* I/O bound
+* CPU bound
+* concurrency
+* parallelism
+* multiprocessing
+
+* env var
+* environment variable
+* `PATH`
+* `PATH` variable
+
+* authentication
+* authentication provider
+* authorization
+* authorization form
+* authorization provider
+* ์ฌ์ฉ์๊ฐ ์ธ์ฆํ๋ค
+* ์์คํ
์ด ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ค
+
+* CLI
+* command line interface
+
+* server
+* client
+
+* cloud provider
+* cloud service
+
+* development
+* development stages
+
+* dict
+* dictionary
+* enumeration
+* enum
+* enum member
+
+* encoder
+* decoder
+* encodeํ๋ค
+* decodeํ๋ค
+
+* exception
+* raiseํ๋ค
+
+* expression
+* statement
+
+* frontend
+* backend
+
+* GitHub discussion
+* GitHub issue
+
+* performance
+* performance optimization
+
+* return type
+* return value
+
+* security
+* security scheme
+
+* task
+* background task
+* task function
+
+* template
+* template engine
+
+* type annotation
+* type hint
+
+* server worker
+* Uvicorn worker
+* Gunicorn Worker
+* worker process
+* worker class
+* workload
+
+* deployment
+* deployํ๋ค
+
+* SDK
+* software development kit
+
+* `APIRouter`
+* `requirements.txt`
+* Bearer Token
+* breaking change
+* bug
+* button
+* callable
+* code
+* commit
+* context manager
+* coroutine
+* database session
+* disk
+* domain
+* engine
+* fake X
+* HTTP GET method
+* item
+* library
+* lifespan
+* lock
+* middleware
+* mobile application
+* module
+* mounting
+* network
+* origin
+* override
+* payload
+* processor
+* property
+* proxy
+* pull request
+* query
+* RAM
+* remote machine
+* status code
+* string
+* tag
+* web framework
+* wildcard
+* returnํ๋ค
+* validateํ๋ค
+
+////
+
+//// tab | ์ ๋ณด
+
+์ด๊ฒ์ ๋ฌธ์์์ ๋ณด์ด๋ (๋๋ถ๋ถ) ๊ธฐ์ ์ฉ์ด์ ๋ถ์์ ํ๊ณ ๋น๊ท๋ฒ์ ์ธ ๋ชฉ๋ก์
๋๋ค. ํ๋กฌํํธ ์ค๊ณ์๊ฐ ์ด๋ค ์ฉ์ด์ ๋ํด LLM์ ์ถ๊ฐ์ ์ธ ๋์์ด ํ์ํ์ง ํ์
ํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ข์ ๋ฒ์ญ์ ๊ณ์ ๋ ์ข์ ๋ฒ์ญ์ผ๋ก ๋๋๋ฆด ๋, ๋๋ ์ธ์ด์์ ์ฉ์ด์ ํ์ฉ/๋ณํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ ๋ ๋์์ด ๋ฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด `docs/de/llm-prompt.md`์ `### List of English terms and their preferred German translations` ์น์
์ ์ฐธ๊ณ ํ์ธ์.
+
+////
diff --git a/docs/ko/docs/advanced/additional-responses.md b/docs/ko/docs/advanced/additional-responses.md
new file mode 100644
index 000000000..a6f51f5b9
--- /dev/null
+++ b/docs/ko/docs/advanced/additional-responses.md
@@ -0,0 +1,247 @@
+# OpenAPI์์ ์ถ๊ฐ ์๋ต { #additional-responses-in-openapi }
+
+/// warning | ๊ฒฝ๊ณ
+
+์ด๋ ๊ฝค ๊ณ ๊ธ ์ฃผ์ ์
๋๋ค.
+
+**FastAPI**๋ฅผ ๋ง ์์ํ๋ค๋ฉด, ์ด ๋ด์ฉ์ด ํ์ ์์ ์๋ ์์ต๋๋ค.
+
+///
+
+์ถ๊ฐ ์ํ ์ฝ๋, ๋ฏธ๋์ด ํ์
, ์ค๋ช
๋ฑ์ ํฌํจํ ์ถ๊ฐ ์๋ต์ ์ ์ธํ ์ ์์ต๋๋ค.
+
+์ด๋ฌํ ์ถ๊ฐ ์๋ต์ OpenAPI ์คํค๋ง์ ํฌํจ๋๋ฏ๋ก API ๋ฌธ์์๋ ํ์๋ฉ๋๋ค.
+
+ํ์ง๋ง ์ด๋ฌํ ์ถ๊ฐ ์๋ต์ ๊ฒฝ์ฐ, ์ํ ์ฝ๋์ ์ฝํ
์ธ ๋ฅผ ํฌํจํ์ฌ `JSONResponse` ๊ฐ์ `Response`๋ฅผ ์ง์ ๋ฐํํ๋๋ก ๋ฐ๋์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
+
+## `model`์ ์ฌ์ฉํ ์ถ๊ฐ ์๋ต { #additional-response-with-model }
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์ `responses` ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
+
+์ด๋ `dict`๋ฅผ ๋ฐ์ต๋๋ค. ํค๋ ๊ฐ ์๋ต์ ์ํ ์ฝ๋(์: `200`)์ด๊ณ , ๊ฐ์ ๊ฐ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๋ค๋ฅธ `dict`์
๋๋ค.
+
+๊ฐ ์๋ต `dict`์๋ `response_model`์ฒ๋ผ Pydantic ๋ชจ๋ธ์ ๋ด๋ `model` ํค๊ฐ ์์ ์ ์์ต๋๋ค.
+
+**FastAPI**๋ ๊ทธ ๋ชจ๋ธ์ ์ฌ์ฉํด JSON Schema๋ฅผ ์์ฑํ๊ณ , OpenAPI์ ์ฌ๋ฐ๋ฅธ ์์น์ ํฌํจํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด, ์ํ ์ฝ๋ `404`์ Pydantic ๋ชจ๋ธ `Message`๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์๋ต์ ์ ์ธํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/additional_responses/tutorial001_py39.py hl[18,22] *}
+
+/// note | ์ฐธ๊ณ
+
+`JSONResponse`๋ฅผ ์ง์ ๋ฐํํด์ผ ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์.
+
+///
+
+/// info | ์ ๋ณด
+
+`model` ํค๋ OpenAPI์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
+
+**FastAPI**๋ ์ฌ๊ธฐ์์ Pydantic ๋ชจ๋ธ์ ๊ฐ์ ธ์ JSON Schema๋ฅผ ์์ฑํ๊ณ ์ฌ๋ฐ๋ฅธ ์์น์ ๋ฃ์ต๋๋ค.
+
+์ฌ๋ฐ๋ฅธ ์์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+* ๊ฐ์ผ๋ก ๋ ๋ค๋ฅธ JSON ๊ฐ์ฒด(`dict`)๋ฅผ ๊ฐ์ง๋ `content` ํค ์์:
+ * ๋ฏธ๋์ด ํ์
(์: `application/json`)์ ํค๋ก ๊ฐ์ง๋ฉฐ, ๊ฐ์ผ๋ก ๋ ๋ค๋ฅธ JSON ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ณ :
+ * `schema` ํค๊ฐ ์๊ณ , ๊ทธ ๊ฐ์ด ๋ชจ๋ธ์์ ์์ฑ๋ JSON Schema์
๋๋ค. ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์์น์
๋๋ค.
+ * **FastAPI**๋ ์ด๋ฅผ ์ง์ ํฌํจํ๋ ๋์ , OpenAPI์ ๋ค๋ฅธ ์์น์ ์๋ ์ ์ญ JSON Schemas๋ฅผ ์ฐธ์กฐํ๋๋ก ์ฌ๊ธฐ์์ reference๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ํด๋ผ์ด์ธํธ๊ฐ ๊ทธ JSON Schema๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๊ณ , ๋ ๋์ ์ฝ๋ ์์ฑ ๋๊ตฌ ๋ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
+
+///
+
+์ด *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๋ํด OpenAPI์ ์์ฑ๋๋ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+```JSON hl_lines="3-12"
+{
+ "responses": {
+ "404": {
+ "description": "Additional Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Message"
+ }
+ }
+ }
+ },
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Item"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+์คํค๋ง๋ OpenAPI ์คํค๋ง ๋ด๋ถ์ ๋ค๋ฅธ ์์น๋ฅผ ์ฐธ์กฐํฉ๋๋ค:
+
+```JSON hl_lines="4-16"
+{
+ "components": {
+ "schemas": {
+ "Message": {
+ "title": "Message",
+ "required": [
+ "message"
+ ],
+ "type": "object",
+ "properties": {
+ "message": {
+ "title": "Message",
+ "type": "string"
+ }
+ }
+ },
+ "Item": {
+ "title": "Item",
+ "required": [
+ "id",
+ "value"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "title": "Id",
+ "type": "string"
+ },
+ "value": {
+ "title": "Value",
+ "type": "string"
+ }
+ }
+ },
+ "ValidationError": {
+ "title": "ValidationError",
+ "required": [
+ "loc",
+ "msg",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "loc": {
+ "title": "Location",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "msg": {
+ "title": "Message",
+ "type": "string"
+ },
+ "type": {
+ "title": "Error Type",
+ "type": "string"
+ }
+ }
+ },
+ "HTTPValidationError": {
+ "title": "HTTPValidationError",
+ "type": "object",
+ "properties": {
+ "detail": {
+ "title": "Detail",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+## ์ฃผ์ ์๋ต์ ๋ํ ์ถ๊ฐ ๋ฏธ๋์ด ํ์
{ #additional-media-types-for-the-main-response }
+
+๊ฐ์ `responses` ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด ๋์ผํ ์ฃผ์ ์๋ต์ ๋ํด ๋ค๋ฅธ ๋ฏธ๋์ด ํ์
์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด, *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ JSON ๊ฐ์ฒด(๋ฏธ๋์ด ํ์
`application/json`) ๋๋ PNG ์ด๋ฏธ์ง(๋ฏธ๋์ด ํ์
`image/png`)๋ฅผ ๋ฐํํ ์ ์๋ค๊ณ ์ ์ธํ๊ธฐ ์ํด `image/png`๋ผ๋ ์ถ๊ฐ ๋ฏธ๋์ด ํ์
์ ์ถ๊ฐํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/additional_responses/tutorial002_py310.py hl[17:22,26] *}
+
+/// note | ์ฐธ๊ณ
+
+์ด๋ฏธ์ง๋ `FileResponse`๋ฅผ ์ฌ์ฉํด ์ง์ ๋ฐํํด์ผ ํ๋ค๋ ์ ์ ์ ์ํ์ธ์.
+
+///
+
+/// info | ์ ๋ณด
+
+`responses` ํ๋ผ๋ฏธํฐ์์ ๋ค๋ฅธ ๋ฏธ๋์ด ํ์
์ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ง ์๋ ํ, FastAPI๋ ์๋ต์ด ์ฃผ์ ์๋ต ํด๋์ค์ ๋์ผํ ๋ฏธ๋์ด ํ์
(๊ธฐ๋ณธ๊ฐ `application/json`)์ ๊ฐ์ง๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
+
+ํ์ง๋ง ์ปค์คํ
์๋ต ํด๋์ค๋ฅผ ์ง์ ํ๋ฉด์ ๋ฏธ๋์ด ํ์
์ `None`์ผ๋ก ์ค์ ํ๋ค๋ฉด, FastAPI๋ ์ฐ๊ฒฐ๋ ๋ชจ๋ธ์ด ์๋ ๋ชจ๋ ์ถ๊ฐ ์๋ต์ ๋ํด `application/json`์ ์ฌ์ฉํฉ๋๋ค.
+
+///
+
+## ์ ๋ณด ๊ฒฐํฉํ๊ธฐ { #combining-information }
+
+`response_model`, `status_code`, `responses` ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํด ์ฌ๋ฌ ์์น์ ์๋ต ์ ๋ณด๋ฅผ ๊ฒฐํฉํ ์๋ ์์ต๋๋ค.
+
+๊ธฐ๋ณธ ์ํ ์ฝ๋ `200`(๋๋ ํ์ํ๋ค๋ฉด ์ปค์คํ
์ฝ๋)์ ์ฌ์ฉํ์ฌ `response_model`์ ์ ์ธํ๊ณ , ๊ทธ์ ๋์ผํ ์๋ต์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ `responses`์์ OpenAPI ์คํค๋ง์ ์ง์ ์ ์ธํ ์ ์์ต๋๋ค.
+
+**FastAPI**๋ `responses`์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ์งํ๊ณ , ๋ชจ๋ธ์ JSON Schema์ ๊ฒฐํฉํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด, Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ์ปค์คํ
`description`์ ๊ฐ์ง ์ํ ์ฝ๋ `404` ์๋ต์ ์ ์ธํ ์ ์์ต๋๋ค.
+
+๋ํ `response_model`์ ์ฌ์ฉํ๋ ์ํ ์ฝ๋ `200` ์๋ต์ ์ ์ธํ๋, ์ปค์คํ
`example`์ ํฌํจํ ์๋ ์์ต๋๋ค:
+
+{* ../../docs_src/additional_responses/tutorial003_py39.py hl[20:31] *}
+
+์ด ๋ชจ๋ ๋ด์ฉ์ OpenAPI์ ๊ฒฐํฉ๋์ด ํฌํจ๋๊ณ , API ๋ฌธ์์ ํ์๋ฉ๋๋ค:
+
+
+
+## ๋ฏธ๋ฆฌ ์ ์๋ ์๋ต๊ณผ ์ปค์คํ
์๋ต ๊ฒฐํฉํ๊ธฐ { #combine-predefined-responses-and-custom-ones }
+
+์ฌ๋ฌ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์ ์ฉ๋๋ ๋ฏธ๋ฆฌ ์ ์๋ ์๋ต์ด ํ์ํ ์๋ ์์ง๋ง, ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ง๋ค ํ์ํ ์ปค์คํ
์๋ต๊ณผ ๊ฒฐํฉํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
+
+๊ทธ๋ฐ ๊ฒฝ์ฐ Python์ `dict` โunpackingโ ๊ธฐ๋ฒ์ธ `**dict_to_unpack`์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+```Python
+old_dict = {
+ "old key": "old value",
+ "second old key": "second old value",
+}
+new_dict = {**old_dict, "new key": "new value"}
+```
+
+์ฌ๊ธฐ์ `new_dict`๋ `old_dict`์ ๋ชจ๋ ํค-๊ฐ ์์ ๋ํด ์ ํค-๊ฐ ์๊น์ง ํฌํจํฉ๋๋ค:
+
+```Python
+{
+ "old key": "old value",
+ "second old key": "second old value",
+ "new key": "new value",
+}
+```
+
+์ด ๊ธฐ๋ฒ์ ์ฌ์ฉํด *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ ์ผ๋ถ ๋ฏธ๋ฆฌ ์ ์๋ ์๋ต์ ์ฌ์ฌ์ฉํ๊ณ , ์ถ๊ฐ ์ปค์คํ
์๋ต๊ณผ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด:
+
+{* ../../docs_src/additional_responses/tutorial004_py310.py hl[11:15,24] *}
+
+## OpenAPI ์๋ต์ ๋ํ ์ถ๊ฐ ์ ๋ณด { #more-information-about-openapi-responses }
+
+์๋ต์ ์ ํํ ๋ฌด์์ ํฌํจํ ์ ์๋์ง ๋ณด๋ ค๋ฉด, OpenAPI ์ฌ์์ ๋ค์ ์น์
์ ํ์ธํ์ธ์:
+
+* OpenAPI Responses Object: `Response Object`๋ฅผ ํฌํจํฉ๋๋ค.
+* OpenAPI Response Object: `responses` ํ๋ผ๋ฏธํฐ ์์ ๊ฐ ์๋ต์ ์ด๊ฒ์ ์ด๋ค ํญ๋ชฉ์ด๋ ์ง์ ํฌํจํ ์ ์์ต๋๋ค. `description`, `headers`, `content`(์ฌ๊ธฐ์์ ์๋ก ๋ค๋ฅธ ๋ฏธ๋์ด ํ์
๊ณผ JSON Schema๋ฅผ ์ ์ธํฉ๋๋ค), `links` ๋ฑ์ ํฌํจํ ์ ์์ต๋๋ค.
diff --git a/docs/ko/docs/advanced/behind-a-proxy.md b/docs/ko/docs/advanced/behind-a-proxy.md
new file mode 100644
index 000000000..92bddac51
--- /dev/null
+++ b/docs/ko/docs/advanced/behind-a-proxy.md
@@ -0,0 +1,466 @@
+# ํ๋ก์ ๋ค์์ ์คํํ๊ธฐ { #behind-a-proxy }
+
+๋ง์ ๊ฒฝ์ฐ FastAPI ์ฑ ์๋จ์ Traefik์ด๋ Nginx ๊ฐ์ **ํ๋ก์(proxy)**๋ฅผ ๋๊ณ ์ฌ์ฉํฉ๋๋ค.
+
+์ด๋ฐ ํ๋ก์๋ HTTPS ์ธ์ฆ์ ์ฒ๋ฆฌ ๋ฑ ์ฌ๋ฌ ์์
์ ๋ด๋นํ ์ ์์ต๋๋ค.
+
+## ํ๋ก์ ์ ๋ฌ ํค๋ { #proxy-forwarded-headers }
+
+์ ํ๋ฆฌ์ผ์ด์
์๋จ์ **ํ๋ก์**๋ ๋ณดํต **์๋ฒ**๋ก ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์, ํด๋น ์์ฒญ์ด ํ๋ก์์ ์ํด **์ ๋ฌ(forwarded)**๋์๋ค๋ ๊ฒ์ ์๋ฒ๊ฐ ์ ์ ์๋๋ก ๋ช๋ช ํค๋๋ฅผ ๋์ ์ผ๋ก ์ค์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ฒ๋ ๋๋ฉ์ธ์ ํฌํจํ ์๋์ (๊ณต๊ฐ) URL, HTTPS ์ฌ์ฉ ์ฌ๋ถ ๋ฑ ์ ๋ณด๋ฅผ ์ ์ ์์ต๋๋ค.
+
+**์๋ฒ** ํ๋ก๊ทธ๋จ(์: **FastAPI CLI**๋ฅผ ํตํด ์คํ๋๋ **Uvicorn**)์ ์ด๋ฐ ํค๋๋ฅผ ํด์ํ ์ ์๊ณ , ๊ทธ ์ ๋ณด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ๋ณด์์, ์๋ฒ๋ ์์ ์ด ์ ๋ขฐํ ์ ์๋ ํ๋ก์ ๋ค์ ์๋ค๋ ๊ฒ์ ๋ชจ๋ฅด๋ฉด ํด๋น ํค๋๋ฅผ ํด์ํ์ง ์์ต๋๋ค.
+
+/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+ํ๋ก์ ํค๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+* X-Forwarded-For
+* X-Forwarded-Proto
+* X-Forwarded-Host
+
+///
+
+### ํ๋ก์ ์ ๋ฌ ํค๋ ํ์ฑํํ๊ธฐ { #enable-proxy-forwarded-headers }
+
+FastAPI CLI๋ฅผ *CLI ์ต์
* `--forwarded-allow-ips`๋ก ์คํํ๊ณ , ์ ๋ฌ ํค๋๋ฅผ ์ฝ์ ์ ์๋๋ก ์ ๋ขฐํ IP ์ฃผ์๋ค์ ๋๊ธธ ์ ์์ต๋๋ค.
+
+`--forwarded-allow-ips="*"`๋ก ์ค์ ํ๋ฉด ๋ค์ด์ค๋ ๋ชจ๋ IP๋ฅผ ์ ๋ขฐํฉ๋๋ค.
+
+**์๋ฒ**๊ฐ ์ ๋ขฐํ ์ ์๋ **ํ๋ก์** ๋ค์ ์๊ณ ํ๋ก์๋ง ์๋ฒ์ ์ ๊ทผํ๋ค๋ฉด, ์ด๋ ํด๋น **ํ๋ก์**์ IP๊ฐ ๋ฌด์์ด๋ ๊ฐ์ ๋ฐ์๋ค์ด๊ฒ ๋ฉ๋๋ค.
+
+
+
+ํ์ง๋ง ํ๋ก์(ํฌํธ `9999`)๋ฅผ ์ฌ์ฉํด "๊ณต์" URL์ธ `/api/v1/docs`์์ docs UI์ ์ ๊ทผํ๋ฉด, ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํฉ๋๋ค! ๐
+
+http://127.0.0.1:9999/api/v1/docs์์ ํ์ธํ ์ ์์ต๋๋ค:
+
+
+
+์ํ๋ ๊ทธ๋๋ก์
๋๋ค. โ๏ธ
+
+์ด๋ FastAPI๊ฐ ์ด `root_path`๋ฅผ ์ฌ์ฉํด, OpenAPI์์ ๊ธฐ๋ณธ `server`๋ฅผ `root_path`๊ฐ ์ ๊ณตํ URL๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+## ์ถ๊ฐ ์๋ฒ { #additional-servers }
+
+/// warning | ๊ฒฝ๊ณ
+
+์ด๋ ๋ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค. ๊ฑด๋๋ฐ์ด๋ ๊ด์ฐฎ์ต๋๋ค.
+
+///
+
+๊ธฐ๋ณธ์ ์ผ๋ก **FastAPI**๋ OpenAPI ์คํค๋ง์์ `root_path`์ URL๋ก `server`๋ฅผ ์์ฑํฉ๋๋ค.
+
+ํ์ง๋ง ์๋ฅผ ๋ค์ด ๋์ผํ docs UI๊ฐ ์คํ
์ด์ง๊ณผ ํ๋ก๋์
ํ๊ฒฝ ๋ชจ๋์ ์ํธ์์ฉํ๋๋ก ํ๋ ค๋ฉด, ๋ค๋ฅธ ๋์ `servers`๋ฅผ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
+
+์ฌ์ฉ์ ์ ์ `servers` ๋ฆฌ์คํธ๋ฅผ ์ ๋ฌํ๊ณ `root_path`(API๊ฐ ํ๋ก์ ๋ค์ ์๊ธฐ ๋๋ฌธ)๊ฐ ์๋ค๋ฉด, **FastAPI**๋ ๋ฆฌ์คํธ์ ๋งจ ์์ ์ด `root_path`๋ฅผ ๊ฐ์ง "server"๋ฅผ ์ฝ์
ํฉ๋๋ค.
+
+์:
+
+{* ../../docs_src/behind_a_proxy/tutorial003_py39.py hl[4:7] *}
+
+๋ค์๊ณผ ๊ฐ์ OpenAPI ์คํค๋ง๋ฅผ ์์ฑํฉ๋๋ค:
+
+```JSON hl_lines="5-7"
+{
+ "openapi": "3.1.0",
+ // More stuff here
+ "servers": [
+ {
+ "url": "/api/v1"
+ },
+ {
+ "url": "https://stag.example.com",
+ "description": "Staging environment"
+ },
+ {
+ "url": "https://prod.example.com",
+ "description": "Production environment"
+ }
+ ],
+ "paths": {
+ // More stuff here
+ }
+}
+```
+
+/// tip | ํ
+
+`root_path`์์ ๊ฐ์ ธ์จ ๊ฐ์ธ `/api/v1`์ `url` ๊ฐ์ ๊ฐ์ง, ์๋ ์์ฑ๋ server์ ์ฃผ๋ชฉํ์ธ์.
+
+///
+
+http://127.0.0.1:9999/api/v1/docs์ docs UI์์๋ ๋ค์์ฒ๋ผ ๋ณด์
๋๋ค:
+
+
+
+/// tip | ํ
+
+docs UI๋ ์ ํํ server์ ์ํธ์์ฉํฉ๋๋ค.
+
+///
+
+/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+OpenAPI ์ฌ์์์ `servers` ์์ฑ์ ์ ํ ์ฌํญ์
๋๋ค.
+
+`servers` ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ์ง ์๊ณ `root_path`๊ฐ `/`์ ๊ฐ๋ค๋ฉด, ์์ฑ๋ OpenAPI ์คํค๋ง์ `servers` ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ํ ์๋ต๋๋ฉฐ, ์ด๋ `url` ๊ฐ์ด `/`์ธ ๋จ์ผ server์ ๋๋ฑํฉ๋๋ค.
+
+///
+
+### `root_path`์์ ์๋ server ๋นํ์ฑํํ๊ธฐ { #disable-automatic-server-from-root-path }
+
+**FastAPI**๊ฐ `root_path`๋ฅผ ์ฌ์ฉํ ์๋ server๋ฅผ ํฌํจํ์ง ์๊ฒ ํ๋ ค๋ฉด, `root_path_in_servers=False` ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/behind_a_proxy/tutorial004_py39.py hl[9] *}
+
+๊ทธ๋ฌ๋ฉด OpenAPI ์คํค๋ง์ ํฌํจ๋์ง ์์ต๋๋ค.
+
+## ์๋ธ ์ ํ๋ฆฌ์ผ์ด์
๋ง์ดํธํ๊ธฐ { #mounting-a-sub-application }
+
+ํ๋ก์์์ `root_path`๋ฅผ ์ฌ์ฉํ๋ฉด์๋, [์๋ธ ์ ํ๋ฆฌ์ผ์ด์
- ๋ง์ดํธ](sub-applications.md){.internal-link target=_blank}์ ์ค๋ช
๋ ๊ฒ์ฒ๋ผ ์๋ธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง์ดํธํด์ผ ํ๋ค๋ฉด, ๊ธฐ๋ํ๋ ๋๋ก ์ผ๋ฐ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
+
+FastAPI๊ฐ ๋ด๋ถ์ ์ผ๋ก `root_path`๋ฅผ ๋๋ํ๊ฒ ์ฌ์ฉํ๋ฏ๋ก, ๊ทธ๋ฅ ๋์ํฉ๋๋ค. โจ
diff --git a/docs/ko/docs/advanced/dataclasses.md b/docs/ko/docs/advanced/dataclasses.md
new file mode 100644
index 000000000..92ad5545b
--- /dev/null
+++ b/docs/ko/docs/advanced/dataclasses.md
@@ -0,0 +1,95 @@
+# Dataclasses ์ฌ์ฉํ๊ธฐ { #using-dataclasses }
+
+FastAPI๋ **Pydantic** ์์ ๊ตฌ์ถ๋์ด ์์ผ๋ฉฐ, ์ง๊ธ๊น์ง๋ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํด ์์ฒญ๊ณผ ์๋ต์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ ธ์ต๋๋ค.
+
+ํ์ง๋ง FastAPI๋ `dataclasses`๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค:
+
+{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
+
+์ด๋ **Pydantic** ๋๋ถ์ ์ฌ์ ํ ์ง์๋๋๋ฐ, Pydantic์ด `dataclasses`์ ๋ํ ๋ด๋ถ ์ง์์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+๋ฐ๋ผ์ ์ ์ฝ๋์ฒ๋ผ Pydantic์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋๋ผ๋, FastAPI๋ Pydantic์ ์ฌ์ฉํด ํ์ค dataclasses๋ฅผ Pydantic์ dataclasses ๋ณํ์ผ๋ก ๋ณํํฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ๋ ๋์ผํ๊ฒ ์ง์ํฉ๋๋ค:
+
+* ๋ฐ์ดํฐ ๊ฒ์ฆ
+* ๋ฐ์ดํฐ ์ง๋ ฌํ
+* ๋ฐ์ดํฐ ๋ฌธ์ํ ๋ฑ
+
+์ด๋ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ ๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ ๋ด๋ถ์ ์ผ๋ก๋ Pydantic์ ์ฌ์ฉํด ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
+
+/// info | ์ ๋ณด
+
+dataclasses๋ Pydantic ๋ชจ๋ธ์ด ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ํ ์๋ ์๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์.
+
+๊ทธ๋์ ์ฌ์ ํ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํด์ผ ํ ์๋ ์์ต๋๋ค.
+
+ํ์ง๋ง ์ด๋ฏธ ์ฌ๋ฌ dataclasses๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ด๊ฒ์ FastAPI๋ก ์น API๋ฅผ ๊ตฌ๋ํ๋ ๋ฐ ๊ทธ๊ฒ๋ค์ ํ์ฉํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค. ๐ค
+
+///
+
+## `response_model`์์ Dataclasses ์ฌ์ฉํ๊ธฐ { #dataclasses-in-response-model }
+
+`response_model` ๋งค๊ฐ๋ณ์์์๋ `dataclasses`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/dataclasses_/tutorial002_py310.py hl[1,6:12,18] *}
+
+dataclass๋ ์๋์ผ๋ก Pydantic dataclass๋ก ๋ณํ๋ฉ๋๋ค.
+
+์ด๋ ๊ฒ ํ๋ฉด ํด๋น ์คํค๋ง๊ฐ API docs ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ํ์๋ฉ๋๋ค:
+
+
+
+## ์ค์ฒฉ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ Dataclasses ์ฌ์ฉํ๊ธฐ { #dataclasses-in-nested-data-structures }
+
+`dataclasses`๋ฅผ ๋ค๋ฅธ ํ์
์ ๋ํ
์ด์
๊ณผ ์กฐํฉํด ์ค์ฒฉ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
+
+์ผ๋ถ ๊ฒฝ์ฐ์๋ Pydantic ๋ฒ์ ์ `dataclasses`๋ฅผ ์ฌ์ฉํด์ผ ํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ ์์ฑ๋ API ๋ฌธ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์
๋๋ค.
+
+๊ทธ๋ฐ ๊ฒฝ์ฐ ํ์ค `dataclasses`๋ฅผ ๋๋กญ์ธ ๋์ฒด์ฌ์ธ `pydantic.dataclasses`๋ก ๊ฐ๋จํ ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค:
+
+{* ../../docs_src/dataclasses_/tutorial003_py310.py hl[1,4,7:10,13:16,22:24,27] *}
+
+1. ํ์ค `dataclasses`์์ `field`๋ฅผ ๊ณ์ ์ํฌํธํฉ๋๋ค.
+
+2. `pydantic.dataclasses`๋ `dataclasses`์ ๋๋กญ์ธ ๋์ฒด์ฌ์
๋๋ค.
+
+3. `Author` dataclass์๋ `Item` dataclasses์ ๋ฆฌ์คํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
+
+4. `Author` dataclass๊ฐ `response_model` ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ๋ฉ๋๋ค.
+
+5. ์์ฒญ ๋ณธ๋ฌธ์ผ๋ก dataclasses์ ํจ๊ป ๋ค๋ฅธ ํ์ค ํ์
์ ๋ํ
์ด์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+ ์ด ๊ฒฝ์ฐ์๋ `Item` dataclasses์ ๋ฆฌ์คํธ์
๋๋ค.
+
+6. ์ฌ๊ธฐ์๋ dataclasses ๋ฆฌ์คํธ์ธ `items`๋ฅผ ํฌํจํ๋ ๋์
๋๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
+
+ FastAPI๋ ์ฌ์ ํ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก serializingํ ์ ์์ต๋๋ค.
+
+7. ์ฌ๊ธฐ์ `response_model`์ `Author` dataclasses ๋ฆฌ์คํธ์ ๋ํ ํ์
์ ๋ํ
์ด์
์ ์ฌ์ฉํฉ๋๋ค.
+
+ ๋ค์ ๋งํด, `dataclasses`๋ฅผ ํ์ค ํ์
์ ๋ํ
์ด์
๊ณผ ์กฐํฉํ ์ ์์ต๋๋ค.
+
+8. ์ด *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*๋ `async def` ๋์ ์ผ๋ฐ `def`๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์.
+
+ ์ธ์ ๋์ฒ๋ผ FastAPI์์๋ ํ์์ ๋ฐ๋ผ `def`์ `async def`๋ฅผ ์กฐํฉํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+ ์ด๋ค ๊ฒ์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง ๋ค์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด, [`async`์ `await`](../async.md#in-a-hurry){.internal-link target=_blank} ๋ฌธ์์ _"๊ธํ์ ๊ฐ์?"_ ์น์
์ ํ์ธํ์ธ์.
+
+9. ์ด *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*๋ dataclasses๋ฅผ(๋ฌผ๋ก ๋ฐํํ ์๋ ์์ง๋ง) ๋ฐํํ์ง ์๊ณ , ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋์
๋๋ฆฌ๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํฉ๋๋ค.
+
+ FastAPI๋ `response_model` ๋งค๊ฐ๋ณ์(dataclasses ํฌํจ)๋ฅผ ์ฌ์ฉํด ์๋ต์ ๋ณํํฉ๋๋ค.
+
+`dataclasses`๋ ๋ค๋ฅธ ํ์
์ ๋ํ
์ด์
๊ณผ ๋งค์ฐ ๋ค์ํ ์กฐํฉ์ผ๋ก ๊ฒฐํฉํด ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
+
+๋ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ์ ์ฝ๋ ๋ด ์ ๋ํ
์ด์
ํ์ ํ์ธํ์ธ์.
+
+## ๋ ์์๋ณด๊ธฐ { #learn-more }
+
+`dataclasses`๋ฅผ ๋ค๋ฅธ Pydantic ๋ชจ๋ธ๊ณผ ์กฐํฉํ๊ฑฐ๋, ์ด๋ฅผ ์์ํ๊ฑฐ๋, ์ฌ๋ฌ๋ถ์ ๋ชจ๋ธ์ ํฌํจํ๋ ๋ฑ์ ์์
๋ ํ ์ ์์ต๋๋ค.
+
+์์ธํ ๋ด์ฉ์ dataclasses์ ๊ดํ Pydantic ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
+
+## ๋ฒ์ { #version }
+
+์ด ๊ธฐ๋ฅ์ FastAPI `0.67.0` ๋ฒ์ ๋ถํฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๐
diff --git a/docs/ko/docs/advanced/generate-clients.md b/docs/ko/docs/advanced/generate-clients.md
new file mode 100644
index 000000000..1def3efe1
--- /dev/null
+++ b/docs/ko/docs/advanced/generate-clients.md
@@ -0,0 +1,208 @@
+# SDK ์์ฑํ๊ธฐ { #generating-sdks }
+
+**FastAPI**๋ **OpenAPI** ์ฌ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก, FastAPI์ API๋ ๋ง์ ๋๊ตฌ๊ฐ ์ดํดํ ์ ์๋ ํ์ค ํ์์ผ๋ก ์ค๋ช
ํ ์ ์์ต๋๋ค.
+
+๋๋ถ์ ์ฌ๋ฌ ์ธ์ด์ฉ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(**SDKs**), ์ต์ **๋ฌธ์**, ๊ทธ๋ฆฌ๊ณ ์ฝ๋์ ๋๊ธฐํ๋ **ํ
์คํธ** ๋๋ **์๋ํ ์ํฌํ๋ก**๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
+
+์ด ๊ฐ์ด๋์์๋ FastAPI ๋ฐฑ์๋์ฉ **TypeScript SDK**๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
+
+## ์คํ ์์ค SDK ์์ฑ๊ธฐ { #open-source-sdk-generators }
+
+๋ค์ํ๊ฒ ํ์ฉํ ์ ์๋ ์ต์
์ผ๋ก OpenAPI Generator๊ฐ ์์ผ๋ฉฐ, **๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด**๋ฅผ ์ง์ํ๊ณ OpenAPI ์ฌ์์ผ๋ก๋ถํฐ SDK๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
+
+**TypeScript ํด๋ผ์ด์ธํธ**์ ๊ฒฝ์ฐ Hey API๋ TypeScript ์ํ๊ณ์ ์ต์ ํ๋ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ชฉ์ ์ ๋ง๊ฒ ์ค๊ณ๋ ์๋ฃจ์
์
๋๋ค.
+
+๋ ๋ง์ SDK ์์ฑ๊ธฐ๋ OpenAPI.Tools์์ ํ์ธํ ์ ์์ต๋๋ค.
+
+/// tip | ํ
+
+FastAPI๋ **OpenAPI 3.1** ์ฌ์์ ์๋์ผ๋ก ์์ฑํ๋ฏ๋ก, ์ฌ์ฉํ๋ ๋๊ตฌ๋ ์ด ๋ฒ์ ์ ์ง์ํด์ผ ํฉ๋๋ค.
+
+///
+
+## FastAPI ์คํฐ์์ SDK ์์ฑ๊ธฐ { #sdk-generators-from-fastapi-sponsors }
+
+์ด ์น์
์์๋ FastAPI๋ฅผ ํ์ํ๋ ํ์ฌ๋ค์ด ์ ๊ณตํ๋ **๋ฒค์ฒ ํฌ์ ๊ธฐ๋ฐ** ๋ฐ **๊ธฐ์
์ง์** ์๋ฃจ์
์ ์๊ฐํฉ๋๋ค. ์ด ์ ํ๋ค์ ๊ณ ํ์ง๋ก ์์ฑ๋ SDK์ ๋ํด **์ถ๊ฐ ๊ธฐ๋ฅ**๊ณผ **ํตํฉ**์ ์ ๊ณตํฉ๋๋ค.
+
+โจ [**FastAPI ํ์ํ๊ธฐ**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} โจ๋ฅผ ํตํด, ์ด ํ์ฌ๋ค์ ํ๋ ์์ํฌ์ ๊ทธ **์ํ๊ณ**๊ฐ ๊ฑด๊ฐํ๊ณ **์ง์ ๊ฐ๋ฅ**ํ๊ฒ ์ ์ง๋๋๋ก ๋์ต๋๋ค.
+
+๋ํ ์ด๋ค์ ํ์์ FastAPI **์ปค๋ฎค๋ํฐ**(์ฌ๋ฌ๋ถ)์ ๋ํ ๊ฐํ ํ์ ์ ๋ณด์ฌ์ฃผ๋ฉฐ, **์ข์ ์๋น์ค**๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ฟ ์๋๋ผ, ๊ฒฌ๊ณ ํ๊ณ ํ๋ฐํ ํ๋ ์์ํฌ์ธ FastAPI๋ฅผ ์ง์ํ๋ ๋ฐ์๋ ๊ด์ฌ์ด ์์์ ๋ํ๋
๋๋ค. ๐
+
+์๋ฅผ ๋ค์ด ๋ค์์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค:
+
+* Speakeasy
+* Stainless
+* liblab
+
+์ด ์ค ์ผ๋ถ๋ ์คํ ์์ค์ด๊ฑฐ๋ ๋ฌด๋ฃ ํฐ์ด๋ฅผ ์ ๊ณตํ๋ฏ๋ก, ๋น์ฉ ๋ถ๋ด ์์ด ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์์ฉ SDK ์์ฑ๊ธฐ๋ ์์ผ๋ฉฐ ์จ๋ผ์ธ์์ ์ฐพ์ ์ ์์ต๋๋ค. ๐ค
+
+## TypeScript SDK ๋ง๋ค๊ธฐ { #create-a-typescript-sdk }
+
+๊ฐ๋จํ FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์์ํด ๋ณด๊ฒ ์ต๋๋ค:
+
+{* ../../docs_src/generate_clients/tutorial001_py39.py hl[7:9,12:13,16:17,21] *}
+
+*path operation*์์ ์์ฒญ ํ์ด๋ก๋์ ์๋ต ํ์ด๋ก๋์ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ `Item`, `ResponseMessage` ๋ชจ๋ธ๋ก ์ ์ํ๊ณ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์.
+
+### API ๋ฌธ์ { #api-docs }
+
+`/docs`๋ก ์ด๋ํ๋ฉด, ์์ฒญ์ผ๋ก ๋ณด๋ผ ๋ฐ์ดํฐ์ ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ์ ๋ํ **์คํค๋ง(schemas)**๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค:
+
+
+
+์ด ์คํค๋ง๋ ์ฑ์์ ๋ชจ๋ธ๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ ๋ณผ ์ ์์ต๋๋ค.
+
+๊ทธ ์ ๋ณด๋ ์ฑ์ **OpenAPI ์คํค๋ง**์์ ์ฌ์ฉํ ์ ์๊ณ , ์ดํ API ๋ฌธ์์ ํ์๋ฉ๋๋ค.
+
+OpenAPI์ ํฌํจ๋ ๋ชจ๋ธ์ ๋์ผํ ์ ๋ณด๊ฐ **ํด๋ผ์ด์ธํธ ์ฝ๋ ์์ฑ**์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
+
+### Hey API { #hey-api }
+
+๋ชจ๋ธ์ด ํฌํจ๋ FastAPI ์ฑ์ด ์ค๋น๋๋ฉด, Hey API๋ฅผ ์ฌ์ฉํด TypeScript ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ npx๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
+
+```sh
+npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
+```
+
+์ด ๋ช
๋ น์ `./src/client`์ TypeScript SDK๋ฅผ ์์ฑํฉ๋๋ค.
+
+`@hey-api/openapi-ts` ์ค์น ๋ฐฉ๋ฒ๊ณผ ์์ฑ๋ ๊ฒฐ๊ณผ๋ฌผ์ ํด๋น ์น์ฌ์ดํธ์์ ํ์ธํ ์ ์์ต๋๋ค.
+
+### SDK ์ฌ์ฉํ๊ธฐ { #using-the-sdk }
+
+์ด์ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ importํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋์ฒ๋ผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ฉ์๋์ ๋ํ ์๋ ์์ฑ์ด ์ ๊ณต๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค:
+
+
+
+๋ณด๋ผ ํ์ด๋ก๋์ ๋ํด์๋ ์๋ ์์ฑ์ด ์ ๊ณต๋ฉ๋๋ค:
+
+
+
+/// tip | ํ
+
+`name`๊ณผ `price`์ ๋ํ ์๋ ์์ฑ์ FastAPI ์ ํ๋ฆฌ์ผ์ด์
์์ `Item` ๋ชจ๋ธ์ ์ ์๋ ๋ด์ฉ์
๋๋ค.
+
+///
+
+์ ์กํ๋ ๋ฐ์ดํฐ์ ๋ํด ์ธ๋ผ์ธ ์ค๋ฅ๋ ํ์๋ฉ๋๋ค:
+
+
+
+์๋ต ๊ฐ์ฒด๋ ์๋ ์์ฑ์ ์ ๊ณตํฉ๋๋ค:
+
+
+
+## ํ๊ทธ๊ฐ ์๋ FastAPI ์ฑ { #fastapi-app-with-tags }
+
+๋๋ถ๋ถ์ ๊ฒฝ์ฐ FastAPI ์ฑ์ ๋ ์ปค์ง๊ณ , ์๋ก ๋ค๋ฅธ *path operations* ๊ทธ๋ฃน์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
+
+์๋ฅผ ๋ค์ด **items** ์น์
๊ณผ **users** ์น์
์ด ์๊ณ , ์ด๋ฅผ ํ๊ทธ๋ก ๋ถ๋ฆฌํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *}
+
+### ํ๊ทธ๋ก TypeScript ํด๋ผ์ด์ธํธ ์์ฑํ๊ธฐ { #generate-a-typescript-client-with-tags }
+
+ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ FastAPI ์ฑ์ ๋ํด ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๋ฉด, ์ผ๋ฐ์ ์ผ๋ก ์์ฑ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํ๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ๋ฉ๋๋ค.
+
+์ด๋ ๊ฒ ํ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋์์ ํญ๋ชฉ๋ค์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌ๋๊ณ ๊ทธ๋ฃนํ๋ฉ๋๋ค:
+
+
+
+์ด ๊ฒฝ์ฐ ๋ค์์ด ์์ต๋๋ค:
+
+* `ItemsService`
+* `UsersService`
+
+### ํด๋ผ์ด์ธํธ ๋ฉ์๋ ์ด๋ฆ { #client-method-names }
+
+ํ์ฌ `createItemItemsPost` ๊ฐ์ ์์ฑ๋ ๋ฉ์๋ ์ด๋ฆ์ ๊ทธ๋ค์ง ๊น๋ํ์ง ์์ต๋๋ค:
+
+```TypeScript
+ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
+```
+
+...์ด๋ ํด๋ผ์ด์ธํธ ์์ฑ๊ธฐ๊ฐ ๊ฐ *path operation*์ ๋ํด OpenAPI ๋ด๋ถ์ **operation ID**๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+OpenAPI๋ ๋ชจ๋ *path operations* ์ ์ฒด์์ operation ID๊ฐ ๊ฐ๊ฐ ์ ์ผํด์ผ ํ๋ค๊ณ ์๊ตฌํฉ๋๋ค. ๊ทธ๋์ FastAPI๋ operation ID๊ฐ ์ ์ผํ๋๋ก **ํจ์ ์ด๋ฆ**, **๊ฒฝ๋ก**, **HTTP method/operation**์ ์กฐํฉํด operation ID๋ฅผ ์์ฑํฉ๋๋ค.
+
+ํ์ง๋ง ๋ค์์์ ์ด๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๐ค
+
+## ์ปค์คํ
Operation ID์ ๋ ๋์ ๋ฉ์๋ ์ด๋ฆ { #custom-operation-ids-and-better-method-names }
+
+ํด๋ผ์ด์ธํธ์์ **๋ ๋จ์ํ ๋ฉ์๋ ์ด๋ฆ**์ ๊ฐ๋๋ก, operation ID๊ฐ **์์ฑ๋๋ ๋ฐฉ์**์ **์์ **ํ ์ ์์ต๋๋ค.
+
+์ด ๊ฒฝ์ฐ operation ID๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ **์ ์ผ**ํ๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด ๊ฐ *path operation*์ด ํ๊ทธ๋ฅผ ๊ฐ๋๋ก ํ ๋ค์, **ํ๊ทธ**์ *path operation* **์ด๋ฆ**(ํจ์ ์ด๋ฆ)์ ๊ธฐ๋ฐ์ผ๋ก operation ID๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
+
+### ์ ์ผ ID ์์ฑ ํจ์ ์ปค์คํฐ๋ง์ด์ง { #custom-generate-unique-id-function }
+
+FastAPI๋ ๊ฐ *path operation*์ ๋ํด **์ ์ผ ID**๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ด๋ **operation ID** ๋ฐ ์์ฒญ/์๋ต์ ํ์ํ ์ปค์คํ
๋ชจ๋ธ ์ด๋ฆ์๋ ์ฌ์ฉ๋ฉ๋๋ค.
+
+์ด ํจ์๋ฅผ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ต๋๋ค. ์ด ํจ์๋ `APIRoute`๋ฅผ ๋ฐ์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด ์๋์์๋ ์ฒซ ๋ฒ์งธ ํ๊ทธ(๋๋ถ๋ถ ํ๊ทธ๋ ํ๋๋ง ์์ ๊ฒ์
๋๋ค)์ *path operation* ์ด๋ฆ(ํจ์ ์ด๋ฆ)์ ์ฌ์ฉํฉ๋๋ค.
+
+๊ทธ ๋ค์ ์ด ์ปค์คํ
ํจ์๋ฅผ `generate_unique_id_function` ๋งค๊ฐ๋ณ์๋ก **FastAPI**์ ์ ๋ฌํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *}
+
+### ์ปค์คํ
Operation ID๋ก TypeScript ํด๋ผ์ด์ธํธ ์์ฑํ๊ธฐ { #generate-a-typescript-client-with-custom-operation-ids }
+
+์ด์ ํด๋ผ์ด์ธํธ๋ฅผ ๋ค์ ์์ฑํ๋ฉด, ๊ฐ์ ๋ ๋ฉ์๋ ์ด๋ฆ์ ํ์ธํ ์ ์์ต๋๋ค:
+
+
+
+๋ณด์๋ค์ํผ, ์ด์ ๋ฉ์๋ ์ด๋ฆ์ ํ๊ทธ ๋ค์์ ํจ์ ์ด๋ฆ์ด ์ค๋ฉฐ, URL ๊ฒฝ๋ก์ HTTP operation์ ์ ๋ณด๋ ํฌํจํ์ง ์์ต๋๋ค.
+
+### ํด๋ผ์ด์ธํธ ์์ฑ๊ธฐ๋ฅผ ์ํ OpenAPI ์ฌ์ ์ ์ฒ๋ฆฌ { #preprocess-the-openapi-specification-for-the-client-generator }
+
+์์ฑ๋ ์ฝ๋์๋ ์ฌ์ ํ ์ผ๋ถ **์ค๋ณต ์ ๋ณด**๊ฐ ์์ต๋๋ค.
+
+`ItemsService`(ํ๊ทธ์์ ๊ฐ์ ธ์ด)์ ์ด๋ฏธ **items**๊ฐ ํฌํจ๋์ด ์์ด ์ด ๋ฉ์๋๊ฐ items์ ๊ด๋ จ๋์ด ์์์ ์ ์ ์์ง๋ง, ๋ฉ์๋ ์ด๋ฆ์๋ ํ๊ทธ ์ด๋ฆ์ด ์ ๋์ฌ๋ก ๋ถ์ด ์์ต๋๋ค. ๐
+
+OpenAPI ์ ๋ฐ์์๋ operation ID๊ฐ **์ ์ผ**ํ๋ค๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ด ๋ฐฉ์์ ์ ์งํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ์์ฑ๋ ํด๋ผ์ด์ธํธ์์๋, ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๊ธฐ ์ง์ ์ OpenAPI operation ID๋ฅผ **์์ **ํด์ ๋ฉ์๋ ์ด๋ฆ์ ๋ ๋ณด๊ธฐ ์ข๊ณ **๊น๋ํ๊ฒ** ๋ง๋ค ์ ์์ต๋๋ค.
+
+OpenAPI JSON์ `openapi.json` ํ์ผ๋ก ๋ค์ด๋ก๋ํ ๋ค, ์๋์ ๊ฐ์ ์คํฌ๋ฆฝํธ๋ก **์ ๋์ฌ ํ๊ทธ๋ฅผ ์ ๊ฑฐ**ํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/generate_clients/tutorial004_py39.py *}
+
+//// tab | Node.js
+
+```Javascript
+{!> ../../docs_src/generate_clients/tutorial004.js!}
+```
+
+////
+
+์ด๋ ๊ฒ ํ๋ฉด operation ID๊ฐ `items-get_items` ๊ฐ์ ํํ์์ `get_items`๋ก ๋ณ๊ฒฝ๋์ด, ํด๋ผ์ด์ธํธ ์์ฑ๊ธฐ๊ฐ ๋ ๋จ์ํ ๋ฉ์๋ ์ด๋ฆ์ ์์ฑํ ์ ์์ต๋๋ค.
+
+### ์ ์ฒ๋ฆฌ๋ OpenAPI๋ก TypeScript ํด๋ผ์ด์ธํธ ์์ฑํ๊ธฐ { #generate-a-typescript-client-with-the-preprocessed-openapi }
+
+์ด์ ์ต์ข
๊ฒฐ๊ณผ๊ฐ `openapi.json` ํ์ผ์ ์์ผ๋ฏ๋ก, ์
๋ ฅ ์์น๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค:
+
+```sh
+npx @hey-api/openapi-ts -i ./openapi.json -o src/client
+```
+
+์ ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ ํ์๋ **๊น๋ํ ๋ฉ์๋ ์ด๋ฆ**์ ๊ฐ์ง๋ฉด์๋, **์๋ ์์ฑ**, **์ธ๋ผ์ธ ์ค๋ฅ** ๋ฑ์ ๊ทธ๋๋ก ์ ๊ณต๋ฉ๋๋ค:
+
+
+
+## ์ฅ์ { #benefits }
+
+์๋์ผ๋ก ์์ฑ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์์ ๋ํด **์๋ ์์ฑ**์ ๋ฐ์ ์ ์์ต๋๋ค:
+
+* ๋ฉ์๋
+* ๋ณธ๋ฌธ(body)์ ์์ฒญ ํ์ด๋ก๋, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ฑ
+* ์๋ต ํ์ด๋ก๋
+
+๋ํ ๋ชจ๋ ๊ฒ์ ๋ํด **์ธ๋ผ์ธ ์ค๋ฅ**๋ ํ์ธํ ์ ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ ๋ค ํ๋ก ํธ์๋๋ฅผ **์ฌ์์ฑ(regenerate)**ํ๋ฉด, ์ *path operations*๊ฐ ๋ฉ์๋๋ก ์ถ๊ฐ๋๊ณ ๊ธฐ์กด ๊ฒ์ ์ ๊ฑฐ๋๋ฉฐ, ๊ทธ ๋ฐ์ ๋ณ๊ฒฝ ์ฌํญ๋ ์์ฑ๋ ์ฝ๋์ ๋ฐ์๋ฉ๋๋ค. ๐ค
+
+์ด๋ ๋ฌด์ธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ทธ ๋ณ๊ฒฝ์ด ํด๋ผ์ด์ธํธ ์ฝ๋์๋ ์๋์ผ๋ก **๋ฐ์**๋๋ค๋ ๋ป์
๋๋ค. ๋ํ ํด๋ผ์ด์ธํธ๋ฅผ **๋น๋(build)**ํ๋ฉด ์ฌ์ฉ๋ ๋ฐ์ดํฐ๊ฐ **๋ถ์ผ์น(mismatch)**ํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
+
+๋ฐ๋ผ์ ์ด์ ํ๊ฒฝ์์ ์ต์ข
์ฌ์ฉ์์๊ฒ ์ค๋ฅ๊ฐ ๋
ธ์ถ๋ ๋ค ๋ฌธ์ ๋ฅผ ์ถ์ ํ๋ ๋์ , ๊ฐ๋ฐ ์ฌ์ดํด ์ด๊ธฐ์ **๋ง์ ์ค๋ฅ๋ฅผ ๋งค์ฐ ๋นจ๋ฆฌ ๊ฐ์ง**ํ ์ ์์ต๋๋ค. โจ
diff --git a/docs/ko/docs/advanced/middleware.md b/docs/ko/docs/advanced/middleware.md
new file mode 100644
index 000000000..be2c972a6
--- /dev/null
+++ b/docs/ko/docs/advanced/middleware.md
@@ -0,0 +1,97 @@
+# ๊ณ ๊ธ Middleware { #advanced-middleware }
+
+๋ฉ์ธ ํํ ๋ฆฌ์ผ์์ ์ ํ๋ฆฌ์ผ์ด์
์ [์ปค์คํ
Middleware](../tutorial/middleware.md){.internal-link target=_blank}๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฝ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ [`CORSMiddleware`๋ก CORS ์ฒ๋ฆฌํ๊ธฐ](../tutorial/cors.md){.internal-link target=_blank}๋ ์ฝ์์ต๋๋ค.
+
+์ด ์น์
์์๋ ๋ค๋ฅธ middleware๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## ASGI middleware ์ถ๊ฐํ๊ธฐ { #adding-asgi-middlewares }
+
+**FastAPI**๋ Starlette๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ASGI ์ฌ์์ ๊ตฌํํ๋ฏ๋ก, ์ด๋ค ASGI middleware๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+ASGI ์ฌ์์ ๋ฐ๋ฅด๊ธฐ๋ง ํ๋ฉด, FastAPI๋ Starlette๋ฅผ ์ํด ๋ง๋ค์ด์ง middleware๊ฐ ์๋์ด๋ ๋์ํฉ๋๋ค.
+
+์ผ๋ฐ์ ์ผ๋ก ASGI middleware๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ASGI ์ฑ์ ๋ฐ๋๋ก ๊ธฐ๋ํ๋ ํด๋์ค์
๋๋ค.
+
+๊ทธ๋์ ์๋ํํฐ ASGI middleware ๋ฌธ์์์๋ ์๋ง ๋ค์๊ณผ ๊ฐ์ด ํ๋ผ๊ณ ์๋ดํ ๊ฒ์
๋๋ค:
+
+```Python
+from unicorn import UnicornMiddleware
+
+app = SomeASGIApp()
+
+new_app = UnicornMiddleware(app, some_config="rainbow")
+```
+
+ํ์ง๋ง FastAPI(์ ํํ๋ Starlette)๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ด๋ถ middleware๊ฐ ์๋ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ปค์คํ
์์ธ ํธ๋ค๋ฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
+
+์ด๋ฅผ ์ํด(๊ทธ๋ฆฌ๊ณ CORS ์์ ์์์ฒ๋ผ) `app.add_middleware()`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+```Python
+from fastapi import FastAPI
+from unicorn import UnicornMiddleware
+
+app = FastAPI()
+
+app.add_middleware(UnicornMiddleware, some_config="rainbow")
+```
+
+`app.add_middleware()`๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก middleware ํด๋์ค๋ฅผ ๋ฐ๊ณ , ๊ทธ ๋ค์๋ middleware์ ์ ๋ฌํ ์ถ๊ฐ ์ธ์๋ค์ ๋ฐ์ต๋๋ค.
+
+## ํตํฉ middleware { #integrated-middlewares }
+
+**FastAPI**์๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ ์ฌ๋ฌ middleware๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ค์์์ ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+๋ค์ ์์ ์์๋ `from starlette.middleware.something import SomethingMiddleware`๋ฅผ ์ฌ์ฉํด๋ ๋ฉ๋๋ค.
+
+**FastAPI**๋ ๊ฐ๋ฐ์ ํธ์๋ฅผ ์ํด `fastapi.middleware`์ ์ฌ๋ฌ middleware๋ฅผ ์ ๊ณตํ์ง๋ง, ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ถ๋ถ์ middleware๋ Starlette์์ ์ง์ ์ ๊ณต๋ฉ๋๋ค.
+
+///
+
+## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware }
+
+๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ด `https` ๋๋ `wss`์ฌ์ผ ํ๋๋ก ๊ฐ์ ํฉ๋๋ค.
+
+`http` ๋๋ `ws`๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋์ ๋ณด์ ์คํด์ผ๋ก ๋ฆฌ๋๋ ์
๋ฉ๋๋ค.
+
+{* ../../docs_src/advanced_middleware/tutorial001_py39.py hl[2,6] *}
+
+## `TrustedHostMiddleware` { #trustedhostmiddleware }
+
+HTTP Host Header ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๊ธฐ ์ํด, ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋ `Host` ํค๋๊ฐ ์์ด์ผ ํ๋๋ก ๊ฐ์ ํฉ๋๋ค.
+
+{* ../../docs_src/advanced_middleware/tutorial002_py39.py hl[2,6:8] *}
+
+๋ค์ ์ธ์๋ค์ ์ง์ํฉ๋๋ค:
+
+* `allowed_hosts` - ํธ์คํธ๋ช
์ผ๋ก ํ์ฉํ ๋๋ฉ์ธ ์ด๋ฆ ๋ชฉ๋ก์
๋๋ค. `*.example.com` ๊ฐ์ ์์ผ๋์นด๋ ๋๋ฉ์ธ์ผ๋ก ์๋ธ๋๋ฉ์ธ์ ๋งค์นญํ๋ ๊ฒ๋ ์ง์ํฉ๋๋ค. ์ด๋ค ํธ์คํธ๋ช
์ด๋ ํ์ฉํ๋ ค๋ฉด `allowed_hosts=["*"]`๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ middleware๋ฅผ ์๋ตํ์ธ์.
+* `www_redirect` - True๋ก ์ค์ ํ๋ฉด, ํ์ฉ๋ ํธ์คํธ์ non-www ๋ฒ์ ์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ์ www ๋ฒ์ ์ผ๋ก ๋ฆฌ๋๋ ์
ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ `True`์
๋๋ค.
+
+๋ค์ด์ค๋ ์์ฒญ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒ์ฆ๋์ง ์์ผ๋ฉด `400` ์๋ต์ด ์ ์ก๋ฉ๋๋ค.
+
+## `GZipMiddleware` { #gzipmiddleware }
+
+`Accept-Encoding` ํค๋์ `"gzip"`์ด ํฌํจ๋ ์ด๋ค ์์ฒญ์ด๋ GZip ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค.
+
+์ด middleware๋ ์ผ๋ฐ ์๋ต๊ณผ ์คํธ๋ฆฌ๋ฐ ์๋ต์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
+
+{* ../../docs_src/advanced_middleware/tutorial003_py39.py hl[2,6] *}
+
+๋ค์ ์ธ์๋ค์ ์ง์ํฉ๋๋ค:
+
+* `minimum_size` - ๋ฐ์ดํธ ๋จ์๋ก ์ง์ ํ ์ต์ ํฌ๊ธฐ๋ณด๋ค ์์ ์๋ต์ GZip์ผ๋ก ์์ถํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ `500`์
๋๋ค.
+* `compresslevel` - GZip ์์ถ ์ค์ ์ฌ์ฉ๋ฉ๋๋ค. 1๋ถํฐ 9๊น์ง์ ์ ์์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ `9`์
๋๋ค. ๊ฐ์ด ๋ฎ์์๋ก ์์ถ์ ๋ ๋น ๋ฅด์ง๋ง ํ์ผ ํฌ๊ธฐ๋ ๋ ์ปค์ง๊ณ , ๊ฐ์ด ๋์์๋ก ์์ถ์ ๋ ๋๋ฆฌ์ง๋ง ํ์ผ ํฌ๊ธฐ๋ ๋ ์์์ง๋๋ค.
+
+## ๋ค๋ฅธ middleware { #other-middlewares }
+
+๋ค๋ฅธ ASGI middleware๋ ๋ง์ด ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด:
+
+* Uvicorn์ `ProxyHeadersMiddleware`
+* MessagePack
+
+์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ middleware๋ฅผ ๋ณด๋ ค๋ฉด Starlette์ Middleware ๋ฌธ์์ ASGI Awesome List๋ฅผ ํ์ธํ์ธ์.
diff --git a/docs/ko/docs/advanced/openapi-callbacks.md b/docs/ko/docs/advanced/openapi-callbacks.md
new file mode 100644
index 000000000..e4bdea9d6
--- /dev/null
+++ b/docs/ko/docs/advanced/openapi-callbacks.md
@@ -0,0 +1,186 @@
+# OpenAPI ์ฝ๋ฐฑ { #openapi-callbacks }
+
+๋ค๋ฅธ ์ฌ๋์ด ๋ง๋ *external API*(์๋ง๋ ๋น์ ์ API๋ฅผ *์ฌ์ฉ*ํ ๋์ผํ ๊ฐ๋ฐ์)๊ฐ ์์ฒญ์ ํธ๋ฆฌ๊ฑฐํ๋๋ก ๋ง๋๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๊ฐ์ง API๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
+
+๋น์ ์ API ์ฑ์ด *external API*๋ฅผ ํธ์ถํ ๋ ์ผ์ด๋๋ ๊ณผ์ ์ "callback"์ด๋ผ๊ณ ํฉ๋๋ค. ์ธ๋ถ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ํํธ์จ์ด๊ฐ ๋น์ ์ API๋ก ์์ฒญ์ ๋ณด๋ธ ๋ค์, ๋น์ ์ API๊ฐ ๋ค์ *external API*๋ก ์์ฒญ์ ๋ณด๋ด *๋๋๋ ค ํธ์ถ*ํ๊ธฐ ๋๋ฌธ์
๋๋ค(์๋ง๋ ๊ฐ์ ๊ฐ๋ฐ์๊ฐ ๋ง๋ API์ผ ๊ฒ์
๋๋ค).
+
+์ด ๊ฒฝ์ฐ, ๊ทธ *external API*๊ฐ ์ด๋ค ํํ์ฌ์ผ ํ๋์ง ๋ฌธ์ํํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์ด๋ค *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๊ฐ์ ธ์ผ ํ๋์ง, ์ด๋ค body๋ฅผ ๊ธฐ๋ํ๋์ง, ์ด๋ค ์๋ต์ ๋ฐํํด์ผ ํ๋์ง ๋ฑ์
๋๋ค.
+
+## ์ฝ๋ฐฑ์ด ์๋ ์ฑ { #an-app-with-callbacks }
+
+์์๋ก ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
+
+์ฒญ๊ตฌ์๋ฅผ ์์ฑํ ์ ์๋ ์ฑ์ ๊ฐ๋ฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์ธ์.
+
+์ด ์ฒญ๊ตฌ์๋ `id`, `title`(์ ํ ์ฌํญ), `customer`, `total`์ ๊ฐ์ต๋๋ค.
+
+๋น์ ์ API ์ฌ์ฉ์(์ธ๋ถ ๊ฐ๋ฐ์)๋ POST ์์ฒญ์ผ๋ก ๋น์ ์ API์์ ์ฒญ๊ตฌ์๋ฅผ ์์ฑํฉ๋๋ค.
+
+๊ทธ ๋ค์ ๋น์ ์ API๋(๊ฐ์ ํด ๋ณด๋ฉด):
+
+* ์ฒญ๊ตฌ์๋ฅผ ์ธ๋ถ ๊ฐ๋ฐ์์ ๊ณ ๊ฐ์๊ฒ ์ ์กํฉ๋๋ค.
+* ๋์ ์๊ธํฉ๋๋ค.
+* API ์ฌ์ฉ์(์ธ๋ถ ๊ฐ๋ฐ์)์ API๋ก ๋ค์ ์๋ฆผ์ ๋ณด๋
๋๋ค.
+ * ์ด๋ (๋น์ ์ API์์) ๊ทธ ์ธ๋ถ ๊ฐ๋ฐ์๊ฐ ์ ๊ณตํ๋ ์ด๋ค *external API*๋ก POST ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก ์ํ๋ฉ๋๋ค(์ด๊ฒ์ด "callback"์
๋๋ค).
+
+## ์ผ๋ฐ์ ์ธ **FastAPI** ์ฑ { #the-normal-fastapi-app }
+
+๋จผ์ ์ฝ๋ฐฑ์ ์ถ๊ฐํ๊ธฐ ์ , ์ผ๋ฐ์ ์ธ API ์ฑ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณด๊ฒ ์ต๋๋ค.
+
+`Invoice` body๋ฅผ ๋ฐ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์, ์ฝ๋ฐฑ์ ์ํ URL์ ๋ด๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ `callback_url`์ด ์์ ๊ฒ์
๋๋ค.
+
+์ด ๋ถ๋ถ์ ๊ฝค ์ผ๋ฐ์ ์ด๋ฉฐ, ๋๋ถ๋ถ์ ์ฝ๋๋ ์ด๋ฏธ ์ต์ํ ๊ฒ์
๋๋ค:
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[7:11,34:51] *}
+
+/// tip | ํ
+
+`callback_url` ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ Pydantic์ Url ํ์
์ ์ฌ์ฉํฉ๋๋ค.
+
+///
+
+์ ์ผํ๊ฒ ์๋ก์ด ๊ฒ์ *๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์ ์ธ์๋ก `callbacks=invoices_callback_router.routes`๊ฐ ๋ค์ด๊ฐ๋ค๋ ์ ์
๋๋ค. ์ด๊ฒ์ด ๋ฌด์์ธ์ง ๋ค์์์ ๋ณด๊ฒ ์ต๋๋ค.
+
+## ์ฝ๋ฐฑ ๋ฌธ์ํํ๊ธฐ { #documenting-the-callback }
+
+์ค์ ์ฝ๋ฐฑ ์ฝ๋๋ ๋น์ ์ API ์ฑ์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ฑ๋ง๋ค ๋ง์ด ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
+
+๋ค์์ฒ๋ผ ํ๋ ์ค์ ์ฝ๋์ผ ์๋ ์์ต๋๋ค:
+
+```Python
+callback_url = "https://example.com/api/v1/invoices/events/"
+httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
+```
+
+ํ์ง๋ง ์ฝ๋ฐฑ์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์, ๋น์ ์ API ์ฌ์ฉ์(์ธ๋ถ ๊ฐ๋ฐ์)๊ฐ ์ฝ๋ฐฑ ์์ฒญ body๋ก *๋น์ ์ API*๊ฐ ๋ณด๋ผ ๋ฐ์ดํฐ ๋ฑ์ ๋ง์ถฐ *external API*๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋๋ก ๋ณด์ฅํ๋ ๊ฒ์
๋๋ค.
+
+๊ทธ๋์ ๋ค์์ผ๋ก ํ ์ผ์, *๋น์ ์ API*์์ ๋ณด๋ด๋ ์ฝ๋ฐฑ์ ๋ฐ๊ธฐ ์ํด ๊ทธ *external API*๊ฐ ์ด๋ค ํํ์ฌ์ผ ํ๋์ง ๋ฌธ์ํํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
+
+๊ทธ ๋ฌธ์๋ ๋น์ ์ API์์ `/docs`์ Swagger UI์ ํ์๋๋ฉฐ, ์ธ๋ถ ๊ฐ๋ฐ์๋ค์ด *external API*๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค์ด์ผ ํ๋์ง ์ ์ ์๊ฒ ํด์ค๋๋ค.
+
+์ด ์์๋ ์ฝ๋ฐฑ ์์ฒด(ํ ์ค ์ฝ๋๋ก๋ ๋ ์ ์์)๋ฅผ ๊ตฌํํ์ง ์๊ณ , ๋ฌธ์ํ ๋ถ๋ถ๋ง ๊ตฌํํฉ๋๋ค.
+
+/// tip | ํ
+
+์ค์ ์ฝ๋ฐฑ์ ๋จ์ง HTTP ์์ฒญ์
๋๋ค.
+
+์ฝ๋ฐฑ์ ์ง์ ๊ตฌํํ ๋๋ HTTPX๋ Requests ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+///
+
+## ์ฝ๋ฐฑ ๋ฌธ์ํ ์ฝ๋ ์์ฑํ๊ธฐ { #write-the-callback-documentation-code }
+
+์ด ์ฝ๋๋ ์ฑ์์ ์คํ๋์ง ์์ต๋๋ค. ๊ทธ *external API*๊ฐ ์ด๋ค ํํ์ฌ์ผ ํ๋์ง *๋ฌธ์ํ*ํ๋ ๋ฐ๋ง ํ์ํฉ๋๋ค.
+
+ํ์ง๋ง **FastAPI**๋ก API์ ์๋ ๋ฌธ์๋ฅผ ์ฝ๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ์๊ณ ์์ต๋๋ค.
+
+๋ฐ๋ผ์ ๊ทธ์ ๊ฐ์ ์ง์์ ์ฌ์ฉํด *external API*๊ฐ ์ด๋ป๊ฒ ์๊ฒจ์ผ ํ๋์ง ๋ฌธ์ํํ ๊ฒ์
๋๋ค... ์ฆ ์ธ๋ถ API๊ฐ ๊ตฌํํด์ผ ํ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ(๋ค)*(๋น์ ์ API๊ฐ ํธ์ถํ ๊ฒ๋ค)์ ๋ง๋ค์ด์ ๋ง์
๋๋ค.
+
+/// tip | ํ
+
+์ฝ๋ฐฑ์ ๋ฌธ์ํํ๋ ์ฝ๋๋ฅผ ์์ฑํ ๋๋, ์์ ์ด ๊ทธ *์ธ๋ถ ๊ฐ๋ฐ์*๋ผ๊ณ ์์ํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ์ *๋น์ ์ API*๊ฐ ์๋๋ผ *external API*๋ฅผ ๊ตฌํํ๊ณ ์๋ค๊ณ ์๊ฐํด ๋ณด์ธ์.
+
+์ด ๊ด์ (์ธ๋ถ ๊ฐ๋ฐ์์ ๊ด์ )์ ์ ์ ์ฑํํ๋ฉด, ๊ทธ *external API*๋ฅผ ์ํด ํ๋ผ๋ฏธํฐ, body์ฉ Pydantic ๋ชจ๋ธ, ์๋ต ๋ฑ์ ์ด๋์ ๋์ด์ผ ํ๋์ง๊ฐ ๋ ๋ช
ํํ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค.
+
+///
+
+### ์ฝ๋ฐฑ `APIRouter` ์์ฑํ๊ธฐ { #create-a-callback-apirouter }
+
+๋จผ์ ํ๋ ์ด์์ ์ฝ๋ฐฑ์ ๋ด์ ์ `APIRouter`๋ฅผ ๋ง๋ญ๋๋ค.
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *}
+
+### ์ฝ๋ฐฑ *๊ฒฝ๋ก ์ฒ๋ฆฌ* ์์ฑํ๊ธฐ { #create-the-callback-path-operation }
+
+์ฝ๋ฐฑ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๋ง๋ค๋ ค๋ฉด ์์์ ๋ง๋ ๋์ผํ `APIRouter`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+์ผ๋ฐ์ ์ธ FastAPI *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ฒ๋ผ ๋ณด์ผ ๊ฒ์
๋๋ค:
+
+* ์๋ง๋ ๋ฐ์์ผ ํ body ์ ์ธ์ด ์์ ๊ฒ์
๋๋ค(์: `body: InvoiceEvent`).
+* ๊ทธ๋ฆฌ๊ณ ๋ฐํํด์ผ ํ ์๋ต ์ ์ธ๋ ์์ ์ ์์ต๋๋ค(์: `response_model=InvoiceEventReceived`).
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
+
+์ผ๋ฐ์ ์ธ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ ์ฃผ์ ์ฐจ์ด์ ์ 2๊ฐ์ง์
๋๋ค:
+
+* ์ค์ ์ฝ๋๋ฅผ ๊ฐ์ง ํ์๊ฐ ์์ต๋๋ค. ๋น์ ์ ์ฑ์ ์ด ์ฝ๋๋ฅผ ์ ๋ ํธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ *external API*๋ฅผ ๋ฌธ์ํํ๋ ๋ฐ๋ง ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํจ์๋ ๊ทธ๋ฅ `pass`๋ง ์์ด๋ ๋ฉ๋๋ค.
+* *path*์๋ OpenAPI 3 expression(์์ธํ ๋ด์ฉ์ ์๋ ์ฐธ๊ณ )์ด ํฌํจ๋ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด *๋น์ ์ API*๋ก ๋ณด๋ด์ง ์๋ ์์ฒญ์ ํ๋ผ๋ฏธํฐ์ ์ผ๋ถ ๊ฐ์ ๋ณ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+### ์ฝ๋ฐฑ ๊ฒฝ๋ก ํํ์ { #the-callback-path-expression }
+
+์ฝ๋ฐฑ *path*๋ *๋น์ ์ API*๋ก ๋ณด๋ด์ง ์๋ ์์ฒญ์ ์ผ๋ถ๋ฅผ ํฌํจํ ์ ์๋ OpenAPI 3 expression์ ๊ฐ์ง ์ ์์ต๋๋ค.
+
+์ด ๊ฒฝ์ฐ, ๋ค์ `str`์
๋๋ค:
+
+```Python
+"{$callback_url}/invoices/{$request.body.id}"
+```
+
+๋ฐ๋ผ์ ๋น์ ์ API ์ฌ์ฉ์(์ธ๋ถ ๊ฐ๋ฐ์)๊ฐ *๋น์ ์ API*๋ก ๋ค์ ์์ฒญ์ ๋ณด๋ด๊ณ :
+
+```
+https://yourapi.com/invoices/?callback_url=https://www.external.org/events
+```
+
+JSON body๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๋ฉด:
+
+```JSON
+{
+ "id": "2expen51ve",
+ "customer": "Mr. Richie Rich",
+ "total": "9999"
+}
+```
+
+๊ทธ๋ฌ๋ฉด *๋น์ ์ API*๋ ์ฒญ๊ตฌ์๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋์ค์ ์ด๋ ์์ ์์ `callback_url`(์ฆ *external API*)๋ก ์ฝ๋ฐฑ ์์ฒญ์ ๋ณด๋
๋๋ค:
+
+```
+https://www.external.org/events/invoices/2expen51ve
+```
+
+๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ JSON body๋ฅผ ํฌํจํ ๊ฒ์
๋๋ค:
+
+```JSON
+{
+ "description": "Payment celebration",
+ "paid": true
+}
+```
+
+๋ํ ๊ทธ *external API*๋ก๋ถํฐ ๋ค์๊ณผ ๊ฐ์ JSON body ์๋ต์ ๊ธฐ๋ํฉ๋๋ค:
+
+```JSON
+{
+ "ok": true
+}
+```
+
+/// tip | ํ
+
+์ฝ๋ฐฑ URL์๋ `callback_url` ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ URL(`https://www.external.org/events`)๋ฟ ์๋๋ผ, JSON body ์์ ์ฒญ๊ตฌ์ `id`(`2expen51ve`)๋ ํจ๊ป ์ฌ์ฉ๋๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์.
+
+///
+
+### ์ฝ๋ฐฑ ๋ผ์ฐํฐ ์ถ๊ฐํ๊ธฐ { #add-the-callback-router }
+
+์ด ์์ ์์, ์์์ ๋ง๋ ์ฝ๋ฐฑ ๋ผ์ฐํฐ ์์ *์ฝ๋ฐฑ ๊ฒฝ๋ก ์ฒ๋ฆฌ(๋ค)*(์ฆ *external developer*๊ฐ *external API*์ ๊ตฌํํด์ผ ํ๋ ๊ฒ๋ค)์ ์ค๋นํ์ต๋๋ค.
+
+์ด์ *๋น์ ์ API ๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์์ `callbacks` ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด, ๊ทธ ์ฝ๋ฐฑ ๋ผ์ฐํฐ์ `.routes` ์์ฑ(์ค์ ๋ก๋ routes/*๊ฒฝ๋ก ์ฒ๋ฆฌ*์ `list`)์ ์ ๋ฌํฉ๋๋ค:
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
+
+/// tip | ํ
+
+`callback=`์ ๋ผ์ฐํฐ ์์ฒด(`invoices_callback_router`)๋ฅผ ๋๊ธฐ๋ ๊ฒ์ด ์๋๋ผ, `invoices_callback_router.routes`์ฒ๋ผ `.routes` ์์ฑ์ ๋๊ธด๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์.
+
+///
+
+### ๋ฌธ์ ํ์ธํ๊ธฐ { #check-the-docs }
+
+์ด์ ์ฑ์ ์คํํ๊ณ http://127.0.0.1:8000/docs๋ก ์ด๋ํ์ธ์.
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๋ํด "Callbacks" ์น์
์ ํฌํจํ ๋ฌธ์๊ฐ ํ์๋๋ฉฐ, *external API*๊ฐ ์ด๋ค ํํ์ฌ์ผ ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค:
+
+
diff --git a/docs/ko/docs/advanced/openapi-webhooks.md b/docs/ko/docs/advanced/openapi-webhooks.md
new file mode 100644
index 000000000..89cacf7b7
--- /dev/null
+++ b/docs/ko/docs/advanced/openapi-webhooks.md
@@ -0,0 +1,55 @@
+# OpenAPI Webhooks { #openapi-webhooks }
+
+์ฑ์ด ์ด๋ค ๋ฐ์ดํฐ์ ํจ๊ป (์์ฒญ์ ๋ณด๋ด์) *์ฌ์ฉ์์* ์ฑ์ ํธ์ถํ ์ ์๊ณ , ๋ณดํต ์ด๋ค **์ด๋ฒคํธ**๋ฅผ **์๋ฆฌ๊ธฐ** ์ํด ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๋ ๊ฒ์ API **์ฌ์ฉ์**์๊ฒ ์๋ ค์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
+
+์ด๋ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ๋ถ์ API๋ก ์์ฒญ์ ๋ณด๋ด๋ ์ผ๋ฐ์ ์ธ ๊ณผ์ ๋์ , **์ฌ๋ฌ๋ถ์ API**(๋๋ ์ฑ)๊ฐ **์ฌ์ฉ์์ ์์คํ
**(์ฌ์ฉ์์ API, ์ฌ์ฉ์์ ์ฑ)์ผ๋ก **์์ฒญ์ ๋ณด๋ผ ์ ์๋ค**๋ ์๋ฏธ์
๋๋ค.
+
+์ด๋ฅผ ๋ณดํต **webhook**์ด๋ผ๊ณ ํฉ๋๋ค.
+
+## Webhooks ๋จ๊ณ { #webhooks-steps }
+
+์ผ๋ฐ์ ์ธ ๊ณผ์ ์, ์ฌ๋ฌ๋ถ์ด ์ฝ๋์์ ๋ณด๋ผ ๋ฉ์์ง, ์ฆ **์์ฒญ ๋ณธ๋ฌธ(body)**์ด ๋ฌด์์ธ์ง **์ ์**ํ๋ ๊ฒ์
๋๋ค.
+
+๋ํ ์ฌ๋ฌ๋ถ์ ์ฑ์ด ์ด๋ค **์์ **์ ๊ทธ ์์ฒญ(๋๋ ์ด๋ฒคํธ)์ ๋ณด๋ผ์ง๋ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ ์ํฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ **์ฌ์ฉ์**๋ (์: ์ด๋๊ฐ์ ์น ๋์๋ณด๋์์) ์ฌ๋ฌ๋ถ์ ์ฑ์ด ๊ทธ ์์ฒญ์ ๋ณด๋ด์ผ ํ **URL**์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ ์ํฉ๋๋ค.
+
+webhook์ URL์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ๊ณผ ์ค์ ๋ก ๊ทธ ์์ฒญ์ ๋ณด๋ด๋ ์ฝ๋์ ๋ํ ๋ชจ๋ **๋ก์ง**์ ์ฌ๋ฌ๋ถ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. **์ฌ๋ฌ๋ถ์ ์ฝ๋**์์ ์ํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ฉด ๋ฉ๋๋ค.
+
+## **FastAPI**์ OpenAPI๋ก webhooks ๋ฌธ์ํํ๊ธฐ { #documenting-webhooks-with-fastapi-and-openapi }
+
+**FastAPI**์์๋ OpenAPI๋ฅผ ์ฌ์ฉํด, ์ด๋ฌํ webhook์ ์ด๋ฆ, ์ฌ๋ฌ๋ถ์ ์ฑ์ด ๋ณด๋ผ ์ ์๋ HTTP ์์
ํ์
(์: `POST`, `PUT` ๋ฑ), ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ์ ์ฑ์ด ๋ณด๋ผ ์์ฒญ **๋ณธ๋ฌธ(body)**์ ์ ์ํ ์ ์์ต๋๋ค.
+
+์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ๋ถ์ **webhook** ์์ฒญ์ ๋ฐ๊ธฐ ์ํด **์์ ๋ค์ API๋ฅผ ๊ตฌํ**ํ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์์ง๊ณ , ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ์์ ์ API ์ฝ๋ ์ผ๋ถ๋ฅผ ์๋ ์์ฑํ ์๋ ์์ต๋๋ค.
+
+/// info | ์ ๋ณด
+
+Webhooks๋ OpenAPI 3.1.0 ์ด์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, FastAPI `0.99.0` ์ด์์์ ์ง์๋ฉ๋๋ค.
+
+///
+
+## webhooks๊ฐ ์๋ ์ฑ { #an-app-with-webhooks }
+
+**FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๋ฉด, *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ์ ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก(์: `@app.webhooks.post()`), *webhooks*๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ `webhooks` ์์ฑ์ด ์์ต๋๋ค.
+
+{* ../../docs_src/openapi_webhooks/tutorial001_py39.py hl[9:13,36:53] *}
+
+์ฌ๋ฌ๋ถ์ด ์ ์ํ webhook์ **OpenAPI** ์คํค๋ง์ ์๋ **docs UI**์ ํฌํจ๋ฉ๋๋ค.
+
+/// info | ์ ๋ณด
+
+`app.webhooks` ๊ฐ์ฒด๋ ์ค์ ๋ก `APIRouter`์ผ ๋ฟ์ด๋ฉฐ, ์ฌ๋ฌ ํ์ผ๋ก ์ฑ์ ๊ตฌ์กฐํํ ๋ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ํ์
์
๋๋ค.
+
+///
+
+webhook์์๋ ์ค์ ๋ก(`/items/` ๊ฐ์) *๊ฒฝ๋ก(path)*๋ฅผ ์ ์ธํ์ง ์๋๋ค๋ ์ ์ ์ ์ํ์ธ์. ๊ทธ๊ณณ์ ์ ๋ฌํ๋ ํ
์คํธ๋ webhook์ **์๋ณ์**(์ด๋ฒคํธ ์ด๋ฆ)์ผ ๋ฟ์
๋๋ค. ์๋ฅผ ๋ค์ด `@app.webhooks.post("new-subscription")`์์ webhook ์ด๋ฆ์ `new-subscription`์
๋๋ค.
+
+์ด๋ **์ฌ์ฉ์**๊ฐ webhook ์์ฒญ์ ๋ฐ๊ณ ์ถ์ ์ค์ **URL ๊ฒฝ๋ก**๋ฅผ ๋ค๋ฅธ ๋ฐฉ์(์: ์น ๋์๋ณด๋)์ผ๋ก ์ ์ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+### ๋ฌธ์ ํ์ธํ๊ธฐ { #check-the-docs }
+
+์ด์ ์ฑ์ ์คํํ๊ณ http://127.0.0.1:8000/docs๋ก ์ด๋ํ์ธ์.
+
+๋ฌธ์์ ์ผ๋ฐ์ ์ธ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ ๋ณด์ด๊ณ , ์ด์ ๋ ์ผ๋ถ **webhooks**๋ ํจ๊ป ๋ณด์ผ ๊ฒ์
๋๋ค:
+
+
diff --git a/docs/ko/docs/advanced/path-operation-advanced-configuration.md b/docs/ko/docs/advanced/path-operation-advanced-configuration.md
new file mode 100644
index 000000000..f20fa6d26
--- /dev/null
+++ b/docs/ko/docs/advanced/path-operation-advanced-configuration.md
@@ -0,0 +1,172 @@
+# ๊ฒฝ๋ก ์ฒ๋ฆฌ ๊ณ ๊ธ ๊ตฌ์ฑ { #path-operation-advanced-configuration }
+
+## OpenAPI operationId { #openapi-operationid }
+
+/// warning | ๊ฒฝ๊ณ
+
+OpenAPI โ์ ๋ฌธ๊ฐโ๊ฐ ์๋๋ผ๋ฉด, ์๋ง ์ด ๋ด์ฉ์ ํ์ํ์ง ์์ ๊ฒ์
๋๋ค.
+
+///
+
+๋งค๊ฐ๋ณ์ `operation_id`๋ฅผ ์ฌ์ฉํด *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์ฌ์ฉํ OpenAPI `operationId`๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
+
+๊ฐ ์์
๋ง๋ค ๊ณ ์ ํ๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค.
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial001_py39.py hl[6] *}
+
+### *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์* ์ด๋ฆ์ operationId๋ก ์ฌ์ฉํ๊ธฐ { #using-the-path-operation-function-name-as-the-operationid }
+
+API์ ํจ์ ์ด๋ฆ์ `operationId`๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ๋ชจ๋ API๋ฅผ ์ํํ๋ฉด์ `APIRoute.name`์ ์ฌ์ฉํด ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ `operation_id`๋ฅผ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
+
+๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ์ถ๊ฐํ ๋ค์ ์ํํด์ผ ํฉ๋๋ค.
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py39.py hl[2, 12:21, 24] *}
+
+/// tip | ํ
+
+`app.openapi()`๋ฅผ ์๋์ผ๋ก ํธ์ถํ๋ค๋ฉด, ๊ทธ ์ ์ `operationId`๋ค์ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
+
+///
+
+/// warning | ๊ฒฝ๊ณ
+
+์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ, ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์ ์ด๋ฆ์ด ๊ณ ์ ํ๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค.
+
+์๋ก ๋ค๋ฅธ ๋ชจ๋(ํ์ด์ฌ ํ์ผ)์ ์์ด๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
+
+///
+
+## OpenAPI์์ ์ ์ธํ๊ธฐ { #exclude-from-openapi }
+
+์์ฑ๋ OpenAPI ์คํค๋ง(๋ฐ๋ผ์ ์๋ ๋ฌธ์ํ ์์คํ
)์์ ํน์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ์ ์ธํ๋ ค๋ฉด, `include_in_schema` ๋งค๊ฐ๋ณ์๋ฅผ `False`๋ก ์ค์ ํ์ธ์:
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial003_py39.py hl[6] *}
+
+## docstring์์ ๊ณ ๊ธ ์ค๋ช
๊ฐ์ ธ์ค๊ธฐ { #advanced-description-from-docstring }
+
+OpenAPI์ ์ฌ์ฉํ *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์ docstring ์ค ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
+
+`\f`(์ด์ค์ผ์ดํ๋ "form feed" ๋ฌธ์)๋ฅผ ์ถ๊ฐํ๋ฉด **FastAPI**๋ ์ด ์ง์ ์์ OpenAPI์ ์ฌ์ฉํ ์ถ๋ ฅ ๋ด์ฉ์ ์๋ผ๋
๋๋ค.
+
+๋ฌธ์์๋ ํ์๋์ง ์์ง๋ง, Sphinx ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ๋ ๋๋จธ์ง ๋ถ๋ถ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial004_py310.py hl[17:27] *}
+
+## ์ถ๊ฐ ์๋ต { #additional-responses }
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๋ํด `response_model`๊ณผ `status_code`๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ๋ณด์
จ์ ๊ฒ์
๋๋ค.
+
+์ด๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๊ธฐ๋ณธ ์๋ต์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํฉ๋๋ค.
+
+๋ชจ๋ธ, ์ํ ์ฝ๋ ๋ฑ๊ณผ ํจ๊ป ์ถ๊ฐ ์๋ต๋ ์ ์ธํ ์ ์์ต๋๋ค.
+
+์ด์ ๋ํ ๋ฌธ์์ ์ ์ฒด ์ฅ์ด ์์ผ๋, [OpenAPI์ ์ถ๊ฐ ์๋ต](additional-responses.md){.internal-link target=_blank}์์ ์ฝ์ด๋ณด์ธ์.
+
+## OpenAPI Extra { #openapi-extra }
+
+์ ํ๋ฆฌ์ผ์ด์
์์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ์ ์ธํ๋ฉด, **FastAPI**๋ OpenAPI ์คํค๋ง์ ํฌํจ๋ ํด๋น *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๊ด๋ จ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
+
+/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+OpenAPI ๋ช
์ธ์์๋ ์ด๋ฅผ Operation Object๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
+
+///
+
+์ฌ๊ธฐ์๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๋ํ ๋ชจ๋ ์ ๋ณด๊ฐ ์์ผ๋ฉฐ, ์๋ ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
+
+`tags`, `parameters`, `requestBody`, `responses` ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
+
+์ด *๊ฒฝ๋ก ์ฒ๋ฆฌ* ์ ์ฉ OpenAPI ์คํค๋ง๋ ๋ณดํต **FastAPI**๊ฐ ์๋์ผ๋ก ์์ฑํ์ง๋ง, ํ์ฅํ ์๋ ์์ต๋๋ค.
+
+/// tip | ํ
+
+์ด๋ ์ ์์ค ํ์ฅ ์ง์ ์
๋๋ค.
+
+์ถ๊ฐ ์๋ต๋ง ์ ์ธํ๋ฉด ๋๋ค๋ฉด, ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ [OpenAPI์ ์ถ๊ฐ ์๋ต](additional-responses.md){.internal-link target=_blank}์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
+
+///
+
+`openapi_extra` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ OpenAPI ์คํค๋ง๋ฅผ ํ์ฅํ ์ ์์ต๋๋ค.
+
+### OpenAPI ํ์ฅ { #openapi-extensions }
+
+์๋ฅผ ๋ค์ด `openapi_extra`๋ [OpenAPI Extensions](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions)๋ฅผ ์ ์ธํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial005_py39.py hl[6] *}
+
+์๋ API ๋ฌธ์๋ฅผ ์ด๋ฉด, ํด๋น ํน์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ํ๋จ์ ํ์ฅ์ด ํ์๋ฉ๋๋ค.
+
+
+
+๋ํ API์ `/openapi.json`์์ ๊ฒฐ๊ณผ OpenAPI๋ฅผ ๋ณด๋ฉด, ํน์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์ผ๋ถ๋ก ํ์ฅ์ด ํฌํจ๋ ๊ฒ๋ ํ์ธํ ์ ์์ต๋๋ค:
+
+```JSON hl_lines="22"
+{
+ "openapi": "3.1.0",
+ "info": {
+ "title": "FastAPI",
+ "version": "0.1.0"
+ },
+ "paths": {
+ "/items/": {
+ "get": {
+ "summary": "Read Items",
+ "operationId": "read_items_items__get",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {}
+ }
+ }
+ }
+ },
+ "x-aperture-labs-portal": "blue"
+ }
+ }
+ }
+}
+```
+
+### ์ฌ์ฉ์ ์ ์ OpenAPI *๊ฒฝ๋ก ์ฒ๋ฆฌ* ์คํค๋ง { #custom-openapi-path-operation-schema }
+
+`openapi_extra`์ ๋์
๋๋ฆฌ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๋ํด ์๋์ผ๋ก ์์ฑ๋ OpenAPI ์คํค๋ง์ ๊น๊ฒ ๋ณํฉ๋ฉ๋๋ค.
+
+๋ฐ๋ผ์ ์๋ ์์ฑ๋ ์คํค๋ง์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ํ ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด Pydantic๊ณผ ํจ๊ป FastAPI์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๊ณ , ์์ฒด ์ฝ๋๋ก ์์ฒญ์ ์ฝ๊ณ ๊ฒ์ฆํ๊ธฐ๋ก ๊ฒฐ์ ํ ์๋ ์์ง๋ง, OpenAPI ์คํค๋ง์๋ ์ฌ์ ํ ๊ทธ ์์ฒญ์ ์ ์ํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
+
+๊ทธ๋ด ๋ `openapi_extra`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial006_py39.py hl[19:36, 39:40] *}
+
+์ด ์์์์๋ ์ด๋ค Pydantic ๋ชจ๋ธ๋ ์ ์ธํ์ง ์์์ต๋๋ค. ์ฌ์ค ์์ฒญ ๋ฐ๋๋ JSON์ผ๋ก parsed๋์ง๋ ์๊ณ , `bytes`๋ก ์ง์ ์ฝ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ `magic_data_reader()`๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ด๋ฅผ ํ์ฑํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค.
+
+๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์์ฒญ ๋ฐ๋์ ๋ํด ๊ธฐ๋ํ๋ ์คํค๋ง๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
+
+### ์ฌ์ฉ์ ์ ์ OpenAPI ์ฝํ
์ธ ํ์
{ #custom-openapi-content-type }
+
+๊ฐ์ ํธ๋ฆญ์ ์ฌ์ฉํ๋ฉด, Pydantic ๋ชจ๋ธ์ ์ด์ฉํด JSON Schema๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์ฌ์ฉ์ ์ ์ OpenAPI ์คํค๋ง ์น์
์ ํฌํจ์ํฌ ์ ์์ต๋๋ค.
+
+์์ฒญ์ ๋ฐ์ดํฐ ํ์
์ด JSON์ด ์๋๋๋ผ๋ ์ด๋ ๊ฒ ํ ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด ์ด ์ ํ๋ฆฌ์ผ์ด์
์์๋ Pydantic ๋ชจ๋ธ์์ JSON Schema๋ฅผ ์ถ์ถํ๋ FastAPI์ ํตํฉ ๊ธฐ๋ฅ๋, JSON์ ๋ํ ์๋ ๊ฒ์ฆ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ค์ ๋ก ์์ฒญ ์ฝํ
์ธ ํ์
์ JSON์ด ์๋๋ผ YAML๋ก ์ ์ธํฉ๋๋ค:
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[15:20, 22] *}
+
+๊ทธ๋ผ์๋ ๊ธฐ๋ณธ ํตํฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋๋ผ๋, YAML๋ก ๋ฐ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๋ํ JSON Schema๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ธฐ ์ํด Pydantic ๋ชจ๋ธ์ ์ฌ์ ํ ์ฌ์ฉํฉ๋๋ค.
+
+๊ทธ ๋ค์ ์์ฒญ์ ์ง์ ์ฌ์ฉํ๊ณ , ๋ฐ๋๋ฅผ `bytes`๋ก ์ถ์ถํฉ๋๋ค. ์ด๋ FastAPI๊ฐ ์์ฒญ ํ์ด๋ก๋๋ฅผ JSON์ผ๋ก ํ์ฑํ๋ ค๊ณ ์๋์กฐ์ฐจ ํ์ง ์๋๋ค๋ ๋ป์
๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ฝ๋์์ YAML ์ฝํ
์ธ ๋ฅผ ์ง์ ํ์ฑํ ๋ค, ๋ค์ ๊ฐ์ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํด YAML ์ฝํ
์ธ ๋ฅผ ๊ฒ์ฆํฉ๋๋ค:
+
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[24:31] *}
+
+/// tip | ํ
+
+์ฌ๊ธฐ์๋ ๊ฐ์ Pydantic ๋ชจ๋ธ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
+
+ํ์ง๋ง ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ฒ์ฆํ ์๋ ์์ต๋๋ค.
+
+///
diff --git a/docs/ko/docs/advanced/security/http-basic-auth.md b/docs/ko/docs/advanced/security/http-basic-auth.md
new file mode 100644
index 000000000..611aad795
--- /dev/null
+++ b/docs/ko/docs/advanced/security/http-basic-auth.md
@@ -0,0 +1,107 @@
+# HTTP Basic Auth { #http-basic-auth }
+
+๊ฐ์ฅ ๋จ์ํ ๊ฒฝ์ฐ์๋ HTTP Basic Auth๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+HTTP Basic Auth์์๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๊ฐ ๋ค์ด ์๋ ํค๋๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
+
+์ด๋ฅผ ๋ฐ์ง ๋ชปํ๋ฉด HTTP 401 "Unauthorized" ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๊ฐ์ด `Basic`์ด๊ณ ์ ํ์ ์ผ๋ก `realm` ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํ๋ `WWW-Authenticate` ํค๋๋ฅผ ๋ฐํํฉ๋๋ค.
+
+์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ ํตํฉ ํ๋กฌํํธ๋ฅผ ํ์ํ๋๋ก ์๋ ค์ค๋๋ค.
+
+๊ทธ๋ค์ ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ํด๋น ๊ฐ์ ํค๋์ ๋ด์ ์ ์กํฉ๋๋ค.
+
+## ๊ฐ๋จํ HTTP Basic Auth { #simple-http-basic-auth }
+
+* `HTTPBasic`๊ณผ `HTTPBasicCredentials`๋ฅผ ์ํฌํธํฉ๋๋ค.
+* `HTTPBasic`์ ์ฌ์ฉํด "`security` scheme"์ ์์ฑํฉ๋๋ค.
+* *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ dependency๋ก ํด๋น `security`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+* `HTTPBasicCredentials` ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค:
+ * ์ ์ก๋ `username`๊ณผ `password`๋ฅผ ํฌํจํฉ๋๋ค.
+
+{* ../../docs_src/security/tutorial006_an_py39.py hl[4,8,12] *}
+
+์ฒ์์ผ๋ก URL์ ์ด์ด๋ณด๋ฉด(๋๋ ๋ฌธ์์์ "Execute" ๋ฒํผ์ ํด๋ฆญํ๋ฉด) ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฌผ์ด๋ด
๋๋ค:
+
+
+
+## ์ฌ์ฉ์๋ช
ํ์ธํ๊ธฐ { #check-the-username }
+
+๋ ์์ ํ ์์์
๋๋ค.
+
+dependency๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ์ธ์.
+
+์ด๋ฅผ ์ํด Python ํ์ค ๋ชจ๋ `secrets`๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํฉ๋๋ค.
+
+`secrets.compare_digest()`๋ `bytes` ๋๋ ASCII ๋ฌธ์(์์ด์์ ์ฌ์ฉํ๋ ๋ฌธ์)๋ง ํฌํจํ `str`์ ๋ฐ์์ผ ํฉ๋๋ค. ์ฆ, `Sebastiรกn`์ `รก` ๊ฐ์ ๋ฌธ์๊ฐ ์์ผ๋ฉด ๋์ํ์ง ์์ต๋๋ค.
+
+์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋จผ์ `username`๊ณผ `password`๋ฅผ UTF-8๋ก ์ธ์ฝ๋ฉํด์ `bytes`๋ก ๋ณํํฉ๋๋ค.
+
+๊ทธ๋ฐ ๋ค์ `secrets.compare_digest()`๋ฅผ ์ฌ์ฉํด `credentials.username`์ด `"stanleyjobson"`์ด๊ณ `credentials.password`๊ฐ `"swordfish"`์ธ์ง ํ์คํ ํ์ธํ ์ ์์ต๋๋ค.
+
+{* ../../docs_src/security/tutorial007_an_py39.py hl[1,12:24] *}
+
+์ด๋ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค:
+
+```Python
+if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"):
+ # Return some error
+ ...
+```
+
+ํ์ง๋ง `secrets.compare_digest()`๋ฅผ ์ฌ์ฉํ๋ฉด "timing attacks"๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ ์ ํ์ ๊ณต๊ฒฉ์ ๋ํด ์์ ํด์ง๋๋ค.
+
+### Timing Attacks { #timing-attacks }
+
+๊ทธ๋ ๋ค๋ฉด "timing attack"์ด๋ ๋ฌด์์ผ๊น์?
+
+๊ณต๊ฒฉ์๋ค์ด ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ์ธกํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๋ช
`johndoe`, ๋น๋ฐ๋ฒํธ `love123`์ผ๋ก ์์ฒญ์ ๋ณด๋
๋๋ค.
+
+๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ Python ์ฝ๋๋ ๋๋ต ๋ค์๊ณผ ๊ฐ์ ๊ฒ์
๋๋ค:
+
+```Python
+if "johndoe" == "stanleyjobson" and "love123" == "swordfish":
+ ...
+```
+
+ํ์ง๋ง Python์ด `johndoe`์ ์ฒซ ๊ธ์ `j`๋ฅผ `stanleyjobson`์ ์ฒซ ๊ธ์ `s`์ ๋น๊ตํ๋ ์๊ฐ, ๋ ๋ฌธ์์ด์ด ๊ฐ์ง ์๋ค๋ ๊ฒ์ ์ด๋ฏธ ์๊ฒ ๋์ด `False`๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ โ๋๋จธ์ง ๊ธ์๋ค์ ๋น๊ตํ๋๋ผ ๊ณ์ฐ์ ๋ ๋ญ๋นํ ํ์๊ฐ ์๋คโ๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ "Incorrect username or password"๋ผ๊ณ ๋งํฉ๋๋ค.
+
+๊ทธ๋ฐ๋ฐ ๊ณต๊ฒฉ์๋ค์ด ์ฌ์ฉ์๋ช
์ `stanleyjobsox`, ๋น๋ฐ๋ฒํธ๋ฅผ `love123`์ผ๋ก ๋ค์ ์๋ํฉ๋๋ค.
+
+๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ ๋ค์๊ณผ ๋น์ทํ๊ฒ ๋์ํฉ๋๋ค:
+
+```Python
+if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
+ ...
+```
+
+Python์ ๋ ๋ฌธ์์ด์ด ๊ฐ์ง ์๋ค๋ ๊ฒ์ ์์์ฐจ๋ฆฌ๊ธฐ ์ ๊น์ง `stanleyjobsox`์ `stanleyjobson` ์์ชฝ์ `stanleyjobso` ์ ์ฒด๋ฅผ ๋น๊ตํด์ผ ํฉ๋๋ค. ๊ทธ๋์ "Incorrect username or password"๋ผ๊ณ ์๋ตํ๊ธฐ๊น์ง ์ถ๊ฐ๋ก ๋ช ๋ง์ดํฌ๋ก์ด๊ฐ ๋ ๊ฑธ๋ฆด ๊ฒ์
๋๋ค.
+
+#### ์๋ต ์๊ฐ์ ๊ณต๊ฒฉ์์๊ฒ ๋์์ด ๋ฉ๋๋ค { #the-time-to-answer-helps-the-attackers }
+
+์ด ์์ ์์ ์๋ฒ๊ฐ "Incorrect username or password" ์๋ต์ ๋ณด๋ด๋ ๋ฐ ๋ช ๋ง์ดํฌ๋ก์ด ๋ ๊ฑธ๋ ธ๋ค๋ ๊ฒ์ ์์์ฑ๋ฉด, ๊ณต๊ฒฉ์๋ค์ _๋ฌด์ธ๊ฐ_ ๋ง์๋ค๋ ๊ฒ(์ด๊ธฐ ๋ช ๊ธ์๊ฐ ๋ง์๋ค๋ ๊ฒ)์ ์๊ฒ ๋ฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ `johndoe`๋ณด๋ค๋ `stanleyjobsox`์ ๋ ๊ฐ๊น์ด ๊ฐ์ ์๋ํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ๋ค์ ์๋ํ ์ ์์ต๋๋ค.
+
+#### "์ ๋ฌธ์ ์ธ" ๊ณต๊ฒฉ { #a-professional-attack }
+
+๋ฌผ๋ก ๊ณต๊ฒฉ์๋ค์ ์ด๋ฐ ์์
์ ์์ผ๋ก ํ์ง ์์ต๋๋ค. ๋ณดํต ์ด๋น ์์ฒ~์๋ฐฑ๋ง ๋ฒ ํ
์คํธํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๊ฒ์ด๊ณ , ํ ๋ฒ์ ์ ๋ต ๊ธ์ ํ๋์ฉ ์ถ๊ฐ๋ก ์ป์ด๋ผ ์ ์์ต๋๋ค.
+
+๊ทธ๋ ๊ฒ ํ๋ฉด ๋ช ๋ถ ๋๋ ๋ช ์๊ฐ ๋ง์, ์๋ต์ ๊ฑธ๋ฆฐ ์๊ฐ๋ง์ ์ด์ฉํด(์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ โ๋์โ์ ๋ฐ์) ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ์ธกํ ์ ์๊ฒ ๋ฉ๋๋ค.
+
+#### `secrets.compare_digest()`๋ก ํด๊ฒฐํ๊ธฐ { #fix-it-with-secrets-compare-digest }
+
+ํ์ง๋ง ์ฐ๋ฆฌ ์ฝ๋๋ ์ค์ ๋ก `secrets.compare_digest()`๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
+
+์์ฝํ๋ฉด, `stanleyjobsox`์ `stanleyjobson`์ ๋น๊ตํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ `johndoe`์ `stanleyjobson`์ ๋น๊ตํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ๊ฐ์์ง๋๋ค. ๋น๋ฐ๋ฒํธ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
+
+์ด๋ ๊ฒ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์์ `secrets.compare_digest()`๋ฅผ ์ฌ์ฉํ๋ฉด, ์ด๋ฌํ ๋ฒ์์ ๋ณด์ ๊ณต๊ฒฉ ์ ๋ฐ์ ๋ํด ์์ ํด์ง๋๋ค.
+
+### ์ค๋ฅ ๋ฐํํ๊ธฐ { #return-the-error }
+
+์๊ฒฉ ์ฆ๋ช
์ด ์ฌ๋ฐ๋ฅด์ง ์๋ค๊ณ ํ๋จ๋๋ฉด, ์ํ ์ฝ๋ 401(์๊ฒฉ ์ฆ๋ช
์ด ์ ๊ณต๋์ง ์์์ ๋์ ๋์ผ)์ ์ฌ์ฉํ๋ `HTTPException`์ ๋ฐํํ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ก๊ทธ์ธ ํ๋กฌํํธ๋ฅผ ๋ค์ ํ์ํ๋๋ก `WWW-Authenticate` ํค๋๋ฅผ ์ถ๊ฐํ์ธ์:
+
+{* ../../docs_src/security/tutorial007_an_py39.py hl[26:30] *}
diff --git a/docs/ko/docs/advanced/security/index.md b/docs/ko/docs/advanced/security/index.md
new file mode 100644
index 000000000..4c7abfacc
--- /dev/null
+++ b/docs/ko/docs/advanced/security/index.md
@@ -0,0 +1,19 @@
+# ๊ณ ๊ธ ๋ณด์ { #advanced-security }
+
+## ์ถ๊ฐ ๊ธฐ๋ฅ { #additional-features }
+
+[ํํ ๋ฆฌ์ผ - ์ฌ์ฉ์ ๊ฐ์ด๋: ๋ณด์](../../tutorial/security/index.md){.internal-link target=_blank}์์ ๋ค๋ฃฌ ๋ด์ฉ ์ธ์๋, ๋ณด์์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
+
+/// tip | ํ
+
+๋ค์ ์น์
๋ค์ **๋ฐ๋์ "๊ณ ๊ธ"์ด๋ผ๊ณ ํ ์๋ ์์ต๋๋ค**.
+
+๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ, ๊ทธ์ค ํ๋์ ํด๊ฒฐ์ฑ
์ด ์์ ์๋ ์์ต๋๋ค.
+
+///
+
+## ๋จผ์ ํํ ๋ฆฌ์ผ ์ฝ๊ธฐ { #read-the-tutorial-first }
+
+๋ค์ ์น์
์ ์ฃผ์ [ํํ ๋ฆฌ์ผ - ์ฌ์ฉ์ ๊ฐ์ด๋: ๋ณด์](../../tutorial/security/index.md){.internal-link target=_blank}์ ์ด๋ฏธ ์ฝ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
+
+๋ชจ๋ ๋์ผํ ๊ฐ๋
์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง, ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
diff --git a/docs/ko/docs/advanced/security/oauth2-scopes.md b/docs/ko/docs/advanced/security/oauth2-scopes.md
new file mode 100644
index 000000000..0f90f92ae
--- /dev/null
+++ b/docs/ko/docs/advanced/security/oauth2-scopes.md
@@ -0,0 +1,274 @@
+# OAuth2 ์ค์ฝํ { #oauth2-scopes }
+
+**FastAPI**์์ OAuth2 ์ค์ฝํ๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์์ฐ์ค๋ฝ๊ฒ ๋์ํ๋๋ก ํตํฉ๋์ด ์์ต๋๋ค.
+
+์ด๋ฅผ ํตํด OAuth2 ํ์ค์ ๋ฐ๋ฅด๋ ๋ ์ธ๋ฐํ ๊ถํ ์์คํ
์ OpenAPI ์ ํ๋ฆฌ์ผ์ด์
(๋ฐ API ๋ฌธ์)์ ํตํฉํ ์ ์์ต๋๋ค.
+
+์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ OAuth2๋ Facebook, Google, GitHub, Microsoft, X(Twitter) ๋ฑ ๋ง์ ๋ํ ์ธ์ฆ ์ ๊ณต์๊ฐ ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ด๋ค์ ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๊ถํ์ ์ ๊ณตํฉ๋๋ค.
+
+Facebook, Google, GitHub, Microsoft, X(Twitter)๋ก โ๋ก๊ทธ์ธโํ ๋๋ง๋ค, ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ฝํ๊ฐ ์๋ OAuth2๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
+
+์ด ์น์
์์๋ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์์ ๋์ผํ โ์ค์ฝํ๊ฐ ์๋ OAuth2โ๋ก ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization)๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ธํฉ๋๋ค.
+
+/// warning | ๊ฒฝ๊ณ
+
+์ด ์น์
์ ๋ค์ ๊ณ ๊ธ ๋ด์ฉ์
๋๋ค. ์ด์ ๋ง ์์ํ๋ค๋ฉด ๊ฑด๋๋ฐ์ด๋ ๋ฉ๋๋ค.
+
+OAuth2 ์ค์ฝํ๊ฐ ๋ฐ๋์ ํ์ํ ๊ฒ์ ์๋๋ฉฐ, ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ์ค์ฝํ๊ฐ ์๋ OAuth2๋ (OpenAPI์ ํจ๊ป) API ๋ฐ API ๋ฌธ์์ ๊น๋ํ๊ฒ ํตํฉ๋ ์ ์์ต๋๋ค.
+
+๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ํด๋น ์ค์ฝํ(๋๋ ๊ทธ ๋ฐ์ ์ด๋ค ๋ณด์/์ธ๊ฐ ์๊ตฌ์ฌํญ์ด๋ )๋ ์ฝ๋์์ ํ์์ ๋ง๊ฒ ์ง์ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
+
+๋ง์ ๊ฒฝ์ฐ ์ค์ฝํ๊ฐ ์๋ OAuth2๋ ๊ณผํ ์ ํ์ผ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ํ์ํ๋ค๊ณ ์๊ณ ์๊ฑฐ๋ ๊ถ๊ธํ๋ค๋ฉด ๊ณ์ ์ฝ์ด๋ณด์ธ์.
+
+///
+
+## OAuth2 ์ค์ฝํ์ OpenAPI { #oauth2-scopes-and-openapi }
+
+OAuth2 ์ฌ์์ โ์ค์ฝํ(scopes)โ๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด ๋ชฉ๋ก์ผ๋ก ์ ์ํฉ๋๋ค.
+
+๊ฐ ๋ฌธ์์ด์ ๋ด์ฉ์ ์ด๋ค ํ์์ด๋ ๋ ์ ์์ง๋ง, ๊ณต๋ฐฑ์ ํฌํจํ๋ฉด ์ ๋ฉ๋๋ค.
+
+์ด ์ค์ฝํ๋ค์ โ๊ถํโ์ ๋ํ๋
๋๋ค.
+
+OpenAPI(์: API ๋ฌธ์)์์๋ โsecurity schemesโ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
+
+์ด security scheme ์ค ํ๋๊ฐ OAuth2๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ค์ฝํ๋ ์ ์ธํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+๊ฐ โ์ค์ฝํโ๋ (๊ณต๋ฐฑ ์๋) ๋ฌธ์์ด์ผ ๋ฟ์
๋๋ค.
+
+๋ณดํต ๋ค์๊ณผ ๊ฐ์ด ํน์ ๋ณด์ ๊ถํ์ ์ ์ธํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค:
+
+* `users:read` ๋๋ `users:write` ๋ ํํ ์์์
๋๋ค.
+* `instagram_basic` ๋ Facebook/Instagram์์ ์ฌ์ฉํฉ๋๋ค.
+* `https://www.googleapis.com/auth/drive` ๋ Google์์ ์ฌ์ฉํฉ๋๋ค.
+
+/// info | ์ ๋ณด
+
+OAuth2์์ โ์ค์ฝํโ๋ ํ์ํ ํน์ ๊ถํ์ ์ ์ธํ๋ ๋ฌธ์์ด์ผ ๋ฟ์
๋๋ค.
+
+`:` ๊ฐ์ ๋ค๋ฅธ ๋ฌธ์๊ฐ ์๊ฑฐ๋ URL์ด์ด๋ ์๊ด์์ต๋๋ค.
+
+๊ทธ๋ฐ ์ธ๋ถ์ฌํญ์ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
+
+OAuth2 ์
์ฅ์์๋ ๊ทธ์ ๋ฌธ์์ด์
๋๋ค.
+
+///
+
+## ์ ์ฒด ๊ฐ์ { #global-view }
+
+๋จผ์ , ๋ฉ์ธ **ํํ ๋ฆฌ์ผ - ์ฌ์ฉ์ ๊ฐ์ด๋**์ [๋น๋ฐ๋ฒํธ(๋ฐ ํด์ฑ)๋ฅผ ์ฌ์ฉํ๋ OAuth2, JWT ํ ํฐ์ ์ฌ์ฉํ๋ Bearer](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ์์ ์์ ์ด๋ค ๋ถ๋ถ์ด ๋ฐ๋๋์ง ๋น ๋ฅด๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด์ OAuth2 ์ค์ฝํ๋ฅผ ์ฌ์ฉํฉ๋๋ค:
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
+
+์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## OAuth2 ๋ณด์ ์คํด { #oauth2-security-scheme }
+
+์ฒซ ๋ฒ์งธ ๋ณ๊ฒฝ ์ฌํญ์ ์ด์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ค์ฝํ 2๊ฐ(`me`, `items`)๋ก OAuth2 ๋ณด์ ์คํด์ ์ ์ธํ๋ค๋ ์ ์
๋๋ค.
+
+`scopes` ๋งค๊ฐ๋ณ์๋ ๊ฐ ์ค์ฝํ๋ฅผ ํค๋ก ํ๊ณ , ์ค๋ช
์ ๊ฐ์ผ๋ก ํ๋ `dict`๋ฅผ ๋ฐ์ต๋๋ค:
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
+
+์ด์ ์ค์ฝํ๋ฅผ ์ ์ธํ๊ธฐ ๋๋ฌธ์, ๋ก๊ทธ์ธ/์ธ๊ฐํ ๋ API ๋ฌธ์์ ์ค์ฝํ๊ฐ ํ์๋ฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ ๊ทผ์ ํ์ฉํ ์ค์ฝํ๋ฅผ ์ ํํ ์ ์๊ฒ ๋ฉ๋๋ค: `me`์ `items`.
+
+์ด๋ Facebook, Google, GitHub ๋ฑ์ผ๋ก ๋ก๊ทธ์ธํ๋ฉด์ ๊ถํ์ ๋ถ์ฌํ ๋ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋์ผํ ๋ฉ์ปค๋์ฆ์
๋๋ค:
+
+
+
+## ์ค์ฝํ๋ฅผ ํฌํจํ JWT ํ ํฐ { #jwt-token-with-scopes }
+
+์ด์ ํ ํฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ์์ ํด, ์์ฒญ๋ ์ค์ฝํ๋ฅผ ๋ฐํํ๋๋ก ํฉ๋๋ค.
+
+์ฌ์ ํ ๋์ผํ `OAuth2PasswordRequestForm`์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์ฒญ์์ ๋ฐ์ ๊ฐ ์ค์ฝํ๋ฅผ ๋ด๋ `scopes` ์์ฑ์ด ์์ผ๋ฉฐ, ํ์
์ `str`์ `list`์
๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ JWT ํ ํฐ์ ์ผ๋ถ๋ก ์ค์ฝํ๋ฅผ ๋ฐํํฉ๋๋ค.
+
+/// danger | ์ํ
+
+๋จ์ํ๋ฅผ ์ํด, ์ฌ๊ธฐ์๋ ์์ฒญ์ผ๋ก ๋ฐ์ ์ค์ฝํ๋ฅผ ๊ทธ๋๋ก ํ ํฐ์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
+
+ํ์ง๋ง ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ๋ณด์์ ์ํด, ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ๊ฐ์ง ์ ์๋ ์ค์ฝํ๋ง(๋๋ ๋ฏธ๋ฆฌ ์ ์ํ ๊ฒ๋ง) ์ถ๊ฐํ๋๋ก ๋ฐ๋์ ํ์ธํด์ผ ํฉ๋๋ค.
+
+///
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
+
+## *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์์กด์ฑ์์ ์ค์ฝํ ์ ์ธํ๊ธฐ { #declare-scopes-in-path-operations-and-dependencies }
+
+์ด์ `/users/me/items/`์ ๋ํ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ ์ค์ฝํ `items`๋ฅผ ์๊ตฌํ๋ค๊ณ ์ ์ธํฉ๋๋ค.
+
+์ด๋ฅผ ์ํด `fastapi`์์ `Security`๋ฅผ importํ์ฌ ์ฌ์ฉํฉ๋๋ค.
+
+`Security`๋ (`Depends`์ฒ๋ผ) ์์กด์ฑ์ ์ ์ธํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ง๋ง, `Security`๋ ์ค์ฝํ(๋ฌธ์์ด) ๋ชฉ๋ก์ ๋ฐ๋ `scopes` ๋งค๊ฐ๋ณ์๋ ๋ฐ์ต๋๋ค.
+
+์ด ๊ฒฝ์ฐ, ์์กด์ฑ ํจ์ `get_current_active_user`๋ฅผ `Security`์ ์ ๋ฌํฉ๋๋ค(`Depends`๋ก ํ ๋์ ๊ฐ์ ๋ฐฉ์).
+
+ํ์ง๋ง ์ค์ฝํ `list`๋ ํจ๊ป ์ ๋ฌํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ค์ฝํ ํ๋๋ง: `items`(๋ ๋ง์ ์๋ ์์ต๋๋ค).
+
+๋ํ ์์กด์ฑ ํจ์ `get_current_active_user`๋ `Depends`๋ฟ ์๋๋ผ `Security`๋ก๋ ํ์ ์์กด์ฑ์ ์ ์ธํ ์ ์์ต๋๋ค. ์์ฒด ํ์ ์์กด์ฑ ํจ์(`get_current_user`)์ ์ถ๊ฐ ์ค์ฝํ ์๊ตฌ์ฌํญ์ ์ ์ธํฉ๋๋ค.
+
+์ด ๊ฒฝ์ฐ์๋ ์ค์ฝํ `me`๋ฅผ ์๊ตฌํฉ๋๋ค(์ฌ๋ฌ ์ค์ฝํ๋ฅผ ์๊ตฌํ ์๋ ์์ต๋๋ค).
+
+/// note | ์ฐธ๊ณ
+
+๋ฐ๋์ ์๋ก ๋ค๋ฅธ ๊ณณ์ ์๋ก ๋ค๋ฅธ ์ค์ฝํ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค.
+
+์ฌ๊ธฐ์๋ **FastAPI**๊ฐ ์๋ก ๋ค๋ฅธ ๋ ๋ฒจ์์ ์ ์ธ๋ ์ค์ฝํ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ด๋ ๊ฒ ํฉ๋๋ค.
+
+///
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
+
+/// info | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+`Security`๋ ์ค์ ๋ก `Depends`์ ์๋ธํด๋์ค์ด๋ฉฐ, ๋์ค์ ๋ณด๊ฒ ๋ ์ถ๊ฐ ๋งค๊ฐ๋ณ์ ํ๋๋ง ๋ ์์ต๋๋ค.
+
+ํ์ง๋ง `Depends` ๋์ `Security`๋ฅผ ์ฌ์ฉํ๋ฉด, **FastAPI**๋ ๋ณด์ ์ค์ฝํ๋ฅผ ์ ์ธํ ์ ์์์ ์๊ณ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฅผ ์ฌ์ฉํ๋ฉฐ, OpenAPI๋ก API๋ฅผ ๋ฌธ์ํํ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง `fastapi`์์ `Query`, `Path`, `Depends`, `Security` ๋ฑ์ importํ ๋, ์ด๊ฒ๋ค์ ์ค์ ๋ก ํน์ํ ํด๋์ค๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค.
+
+///
+
+## `SecurityScopes` ์ฌ์ฉํ๊ธฐ { #use-securityscopes }
+
+์ด์ ์์กด์ฑ `get_current_user`๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
+
+์ด๋ ์์ ์์กด์ฑ๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
+
+์ฌ๊ธฐ์์ ์์ ๋ง๋ ๋์ผํ OAuth2 ์คํด์ ์์กด์ฑ์ผ๋ก ์ ์ธํ์ฌ ์ฌ์ฉํฉ๋๋ค: `oauth2_scheme`.
+
+์ด ์์กด์ฑ ํจ์ ์์ฒด์๋ ์ค์ฝํ ์๊ตฌ์ฌํญ์ด ์๊ธฐ ๋๋ฌธ์, `oauth2_scheme`์ ํจ๊ป `Depends`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ณด์ ์ค์ฝํ๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ ๋๋ `Security`๋ฅผ ์ธ ํ์๊ฐ ์์ต๋๋ค.
+
+๋ํ `fastapi.security`์์ importํ `SecurityScopes` ํ์
์ ํน๋ณํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
+
+์ด `SecurityScopes` ํด๋์ค๋ `Request`์ ๋น์ทํฉ๋๋ค(`Request`๋ ์์ฒญ ๊ฐ์ฒด๋ฅผ ์ง์ ์ป๊ธฐ ์ํด ์ฌ์ฉํ์ต๋๋ค).
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
+
+## `scopes` ์ฌ์ฉํ๊ธฐ { #use-the-scopes }
+
+๋งค๊ฐ๋ณ์ `security_scopes`์ ํ์
์ `SecurityScopes`์
๋๋ค.
+
+์ฌ๊ธฐ์๋ `scopes` ์์ฑ์ด ์์ผ๋ฉฐ, ์๊ธฐ ์์ ๊ณผ ์ด ํจ์๋ฅผ ํ์ ์์กด์ฑ์ผ๋ก ์ฌ์ฉํ๋ ๋ชจ๋ ์์กด์ฑ์ด ์๊ตฌํ๋ ์ค์ฝํ ์ ์ฒด๋ฅผ ๋ด์ `list`๋ฅผ ๊ฐ์ง๋๋ค. ์ฆ, ๋ชจ๋ โdependantsโ... ๋ค์ ํท๊ฐ๋ฆด ์ ์๋๋ฐ, ์๋์์ ๋ค์ ์ค๋ช
ํฉ๋๋ค.
+
+`security_scopes` ๊ฐ์ฒด(`SecurityScopes` ํด๋์ค)์๋ ๋ํ `scope_str` ์์ฑ์ด ์๋๋ฐ, ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋จ์ผ ๋ฌธ์์ด๋ก ์ค์ฝํ๋ค์ ๋ด๊ณ ์์ต๋๋ค(์ด๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค).
+
+๋์ค์ ์ฌ๋ฌ ์ง์ ์์ ์ฌ์ฌ์ฉ(`raise`)ํ ์ ์๋ `HTTPException`์ ์์ฑํฉ๋๋ค.
+
+์ด ์์ธ์๋ ํ์ํ ์ค์ฝํ(์๋ค๋ฉด)๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด(`scope_str`)๋ก ํฌํจํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค์ฝํ ๋ฌธ์์ด์ `WWW-Authenticate` ํค๋์ ๋ฃ์ต๋๋ค(์ด๋ ์ฌ์์ ์ผ๋ถ์
๋๋ค).
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *}
+
+## `username`๊ณผ ๋ฐ์ดํฐ ํํ ๊ฒ์ฆํ๊ธฐ { #verify-the-username-and-data-shape }
+
+`username`์ ์ป์๋์ง ํ์ธํ๊ณ , ์ค์ฝํ๋ฅผ ์ถ์ถํฉ๋๋ค.
+
+๊ทธ๋ฐ ๋ค์ Pydantic ๋ชจ๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํฉ๋๋ค(`ValidationError` ์์ธ๋ฅผ ์ก์ต๋๋ค). JWT ํ ํฐ์ ์ฝ๊ฑฐ๋ Pydantic์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋๋ฉด, ์์์ ๋ง๋ `HTTPException`์ raiseํฉ๋๋ค.
+
+์ด๋ฅผ ์ํด Pydantic ๋ชจ๋ธ `TokenData`์ ์ ์์ฑ `scopes`๋ฅผ ์ถ๊ฐํฉ๋๋ค.
+
+Pydantic์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๋ฉด, ์๋ฅผ ๋ค์ด ์ค์ฝํ๊ฐ ์ ํํ `str`์ `list`์ด๊ณ `username`์ด `str`์ธ์ง ๋ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด `dict`๋ ๋ค๋ฅธ ํํ๋ผ๋ฉด, ๋์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ด๋ ์์ ์ ๊นจ์ง๋ฉด์ ๋ณด์ ์ํ์ด ๋ ์ ์์ต๋๋ค.
+
+๋ํ ํด๋น username์ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์๋์ง ํ์ธํ๊ณ , ์๋ค๋ฉด ์์์ ๋ง๋ ๋์ผํ ์์ธ๋ฅผ raiseํฉ๋๋ค.
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *}
+
+## `scopes` ๊ฒ์ฆํ๊ธฐ { #verify-the-scopes }
+
+์ด์ ์ด ์์กด์ฑ๊ณผ ๋ชจ๋ dependant( *๊ฒฝ๋ก ์ฒ๋ฆฌ* ํฌํจ)๊ฐ ์๊ตฌํ๋ ๋ชจ๋ ์ค์ฝํ๊ฐ, ๋ฐ์ ํ ํฐ์ ์ค์ฝํ์ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด `HTTPException`์ raiseํฉ๋๋ค.
+
+์ด๋ฅผ ์ํด, ๋ชจ๋ ์ค์ฝํ๋ฅผ `str`๋ก ๋ด๊ณ ์๋ `security_scopes.scopes`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[130:136] *}
+
+## ์์กด์ฑ ํธ๋ฆฌ์ ์ค์ฝํ { #dependency-tree-and-scopes }
+
+์ด ์์กด์ฑ ํธ๋ฆฌ์ ์ค์ฝํ๋ฅผ ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+`get_current_active_user` ์์กด์ฑ์ `get_current_user`๋ฅผ ํ์ ์์กด์ฑ์ผ๋ก ๊ฐ์ง๋ฏ๋ก, `get_current_active_user`์์ ์ ์ธ๋ ์ค์ฝํ `"me"`๋ `get_current_user`์ ์ ๋ฌ๋๋ `security_scopes.scopes`์ ์๊ตฌ ์ค์ฝํ ๋ชฉ๋ก์ ํฌํจ๋ฉ๋๋ค.
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ* ์์ฒด๋ ์ค์ฝํ `"items"`๋ฅผ ์ ์ธํ๋ฏ๋ก, ์ด๊ฒ ๋ํ `get_current_user`์ ์ ๋ฌ๋๋ `security_scopes.scopes` ๋ชฉ๋ก์ ํฌํจ๋ฉ๋๋ค.
+
+์์กด์ฑ๊ณผ ์ค์ฝํ์ ๊ณ์ธต ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+* *๊ฒฝ๋ก ์ฒ๋ฆฌ* `read_own_items`๋:
+ * ์์กด์ฑ๊ณผ ํจ๊ป ์๊ตฌ ์ค์ฝํ `["items"]`๋ฅผ ๊ฐ์ง๋๋ค:
+ * `get_current_active_user`:
+ * ์์กด์ฑ ํจ์ `get_current_active_user`๋:
+ * ์์กด์ฑ๊ณผ ํจ๊ป ์๊ตฌ ์ค์ฝํ `["me"]`๋ฅผ ๊ฐ์ง๋๋ค:
+ * `get_current_user`:
+ * ์์กด์ฑ ํจ์ `get_current_user`๋:
+ * ์์ฒด์ ์ผ๋ก๋ ์๊ตฌ ์ค์ฝํ๊ฐ ์์ต๋๋ค.
+ * `oauth2_scheme`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์ด ์์ต๋๋ค.
+ * `SecurityScopes` ํ์
์ `security_scopes` ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค:
+ * ์ด `security_scopes` ๋งค๊ฐ๋ณ์๋ ์์์ ์ ์ธ๋ ๋ชจ๋ ์ค์ฝํ๋ฅผ ๋ด์ `list`์ธ `scopes` ์์ฑ์ ๊ฐ์ง๋ฏ๋ก:
+ * *๊ฒฝ๋ก ์ฒ๋ฆฌ* `read_own_items`์ ๊ฒฝ์ฐ `security_scopes.scopes`์๋ `["me", "items"]`๊ฐ ๋ค์ด๊ฐ๋๋ค.
+ * *๊ฒฝ๋ก ์ฒ๋ฆฌ* `read_users_me`์ ๊ฒฝ์ฐ `security_scopes.scopes`์๋ `["me"]`๊ฐ ๋ค์ด๊ฐ๋๋ค. ์ด๋ ์์กด์ฑ `get_current_active_user`์์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
+ * *๊ฒฝ๋ก ์ฒ๋ฆฌ* `read_system_status`์ ๊ฒฝ์ฐ `security_scopes.scopes`์๋ `[]`(์์)๊ฐ ๋ค์ด๊ฐ๋๋ค. `scopes`๊ฐ ์๋ `Security`๋ฅผ ์ ์ธํ์ง ์์๊ณ , ๊ทธ ์์กด์ฑ์ธ `get_current_user`๋ `scopes`๋ฅผ ์ ์ธํ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+/// tip | ํ
+
+์ฌ๊ธฐ์ ์ค์ํ โ๋ง๋ฒ ๊ฐ์โ ์ ์ `get_current_user`๊ฐ ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ง๋ค ๊ฒ์ฌํด์ผ ํ๋ `scopes` ๋ชฉ๋ก์ด ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์
๋๋ค.
+
+์ด๋ ํน์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๋ํ ์์กด์ฑ ํธ๋ฆฌ์์, ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๊ฐ ์์กด์ฑ์ ์ ์ธ๋ `scopes`์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
+
+///
+
+## `SecurityScopes`์ ๋ํ ์ถ๊ฐ ์ค๋ช
{ #more-details-about-securityscopes }
+
+`SecurityScopes`๋ ์ด๋ ์ง์ ์์๋ , ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, โ๋ฃจํธโ ์์กด์ฑ์๋ง ์์ด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค.
+
+`SecurityScopes`๋ **ํด๋น ํน์ ** *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ **ํด๋น ํน์ ** ์์กด์ฑ ํธ๋ฆฌ์ ๋ํด, ํ์ฌ `Security` ์์กด์ฑ๊ณผ ๋ชจ๋ dependant์ ์ ์ธ๋ ๋ณด์ ์ค์ฝํ๋ฅผ ํญ์ ๊ฐ๊ณ ์์ต๋๋ค.
+
+`SecurityScopes`์๋ dependant๊ฐ ์ ์ธํ ๋ชจ๋ ์ค์ฝํ๊ฐ ํฌํจ๋๋ฏ๋ก, ์ค์์ ์์กด์ฑ ํจ์์์ ํ ํฐ์ด ํ์ํ ์ค์ฝํ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์ฆํ ๋ค์, ์๋ก ๋ค๋ฅธ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ ์๋ก ๋ค๋ฅธ ์ค์ฝํ ์๊ตฌ์ฌํญ์ ์ ์ธํ ์ ์์ต๋๋ค.
+
+์ด๋ค์ ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ง๋ค ๋
๋ฆฝ์ ์ผ๋ก ๊ฒ์ฌ๋ฉ๋๋ค.
+
+## ํ์ธํ๊ธฐ { #check-it }
+
+API ๋ฌธ์๋ฅผ ์ด๋ฉด, ์ธ์ฆํ๊ณ ์ธ๊ฐํ ์ค์ฝํ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
+
+
+
+์ด๋ค ์ค์ฝํ๋ ์ ํํ์ง ์์ผ๋ฉด โ์ธ์ฆโ์ ๋์ง๋ง, `/users/me/` ๋๋ `/users/me/items/`์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ๊ถํ์ด ์ถฉ๋ถํ์ง ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. `/status/`์๋ ์ฌ์ ํ ์ ๊ทผํ ์ ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ค์ฝํ `me`๋ ์ ํํ์ง๋ง ์ค์ฝํ `items`๋ ์ ํํ์ง ์์๋ค๋ฉด, `/users/me/`์๋ ์ ๊ทผํ ์ ์์ง๋ง `/users/me/items/`์๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
+
+์ด๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ผ๋ง๋ ๋ง์ ๊ถํ์ ๋ถ์ฌํ๋์ง์ ๋ฐ๋ผ, ์ 3์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ์๋ก๋ถํฐ ์ ๊ณต๋ฐ์ ํ ํฐ์ผ๋ก ์ด *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ค ์ค ํ๋์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ์ํฉ๊ณผ ๊ฐ์ต๋๋ค.
+
+## ์ 3์ ํตํฉ์ ๋ํด { #about-third-party-integrations }
+
+์ด ์์ ์์๋ OAuth2 โpasswordโ ํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
+
+์ด๋ ๋ณดํต ์์ฒด ํ๋ก ํธ์๋๊ฐ ์๋ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก๊ทธ์ธํ ๋ ์ ํฉํฉ๋๋ค.
+
+์ฐ๋ฆฌ๊ฐ ์ด๋ฅผ ํต์ ํ๋ฏ๋ก `username`๊ณผ `password`๋ฅผ ๋ฐ๋ ๊ฒ์ ์ ๋ขฐํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+ํ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฐ๊ฒฐํ OAuth2 ์ ํ๋ฆฌ์ผ์ด์
(์ฆ, Facebook, Google, GitHub ๋ฑ๊ณผ ๋๋ฑํ ์ธ์ฆ ์ ๊ณต์๋ฅผ ๋ง๋ค๊ณ ์๋ค๋ฉด)์ ๊ตฌ์ถํ๋ค๋ฉด, ๋ค๋ฅธ ํ๋ก์ฐ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
+
+๊ฐ์ฅ ํํ ๊ฒ์ implicit ํ๋ก์ฐ์
๋๋ค.
+
+๊ฐ์ฅ ์์ ํ ๊ฒ์ code ํ๋ก์ฐ์ด์ง๋ง, ๋ ๋ง์ ๋จ๊ณ๊ฐ ํ์ํด ๊ตฌํ์ด ๋ ๋ณต์กํฉ๋๋ค. ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์ ๊ณต์๋ implicit ํ๋ก์ฐ๋ฅผ ๊ถ์ฅํ๊ฒ ๋ฉ๋๋ค.
+
+/// note | ์ฐธ๊ณ
+
+์ธ์ฆ ์ ๊ณต์๋ง๋ค ์์ ๋ค์ ๋ธ๋๋์ ์ผ๋ถ๋ก ๋ง๋ค๊ธฐ ์ํด, ๊ฐ ํ๋ก์ฐ๋ฅผ ์๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ด๋ฆ ๋ถ์ด๋ ๊ฒฝ์ฐ๊ฐ ํํฉ๋๋ค.
+
+ํ์ง๋ง ๊ฒฐ๊ตญ, ๋์ผํ OAuth2 ํ์ค์ ๊ตฌํํ๊ณ ์๋ ๊ฒ์
๋๋ค.
+
+///
+
+**FastAPI**๋ `fastapi.security.oauth2`์ ์ด๋ฌํ ๋ชจ๋ OAuth2 ์ธ์ฆ ํ๋ก์ฐ๋ฅผ ์ํ ์ ํธ๋ฆฌํฐ๋ฅผ ํฌํจํฉ๋๋ค.
+
+## ๋ฐ์ฝ๋ ์ดํฐ `dependencies`์์์ `Security` { #security-in-decorator-dependencies }
+
+[๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ์ ์์กด์ฑ](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ ๋ฐ์ฝ๋ ์ดํฐ์ `dependencies` ๋งค๊ฐ๋ณ์์ `Depends`์ `list`๋ฅผ ์ ์ํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก, ๊ฑฐ๊ธฐ์์ `scopes`์ ํจ๊ป `Security`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
diff --git a/docs/ko/docs/advanced/settings.md b/docs/ko/docs/advanced/settings.md
new file mode 100644
index 000000000..6fa7c644c
--- /dev/null
+++ b/docs/ko/docs/advanced/settings.md
@@ -0,0 +1,302 @@
+# ์ค์ ๊ณผ ํ๊ฒฝ ๋ณ์ { #settings-and-environment-variables }
+
+๋ง์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์๋ ์ธ๋ถ ์ค์ ์ด๋ ๊ตฌ์ฑ(์: secret key, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๊ฒฉ ์ฆ๋ช
, ์ด๋ฉ์ผ ์๋น์ค ์๊ฒฉ ์ฆ๋ช
๋ฑ)์ด ํ์ํ ์ ์์ต๋๋ค.
+
+์ด๋ฌํ ์ค์ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค URL์ฒ๋ผ ๋ณ๋ ๊ฐ๋ฅ(๋ณ๊ฒฝ๋ ์ ์์)ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ ์ค์ ์ secret์ฒ๋ผ ๋ฏผ๊ฐํ ์ ์์ต๋๋ค.
+
+์ด ๋๋ฌธ์ ๋ณดํต ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฝ์ด๋ค์ด๋ ํ๊ฒฝ ๋ณ์๋ก ์ด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.
+
+/// tip | ํ
+
+ํ๊ฒฝ ๋ณ์๋ฅผ ์ดํดํ๋ ค๋ฉด [ํ๊ฒฝ ๋ณ์](../environment-variables.md){.internal-link target=_blank}๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+///
+
+## ํ์
๊ณผ ๊ฒ์ฆ { #types-and-validation }
+
+์ด ํ๊ฒฝ ๋ณ์๋ค์ Python ์ธ๋ถ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ๋ฐ ์์คํ
์ ๋๋จธ์ง ๋ถ๋ถ(๊ทธ๋ฆฌ๊ณ Linux, Windows, macOS ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ด์์ฒด์ ์๋)๊ณผ ํธํ๋์ด์ผ ํ๋ฏ๋ก, ํ
์คํธ ๋ฌธ์์ด๋ง ๋ค๋ฃฐ ์ ์์ต๋๋ค.
+
+์ฆ, Python์์ ํ๊ฒฝ ๋ณ์๋ก๋ถํฐ ์ฝ์ด์จ ์ด๋ค ๊ฐ์ด๋ `str`์ด ๋๋ฉฐ, ๋ค๋ฅธ ํ์
์ผ๋ก์ ๋ณํ์ด๋ ๊ฒ์ฆ์ ์ฝ๋์์ ์ํํด์ผ ํฉ๋๋ค.
+
+## Pydantic `Settings` { #pydantic-settings }
+
+๋คํํ Pydantic์ Pydantic: Settings management๋ฅผ ํตํด ํ๊ฒฝ ๋ณ์์์ ์ค๋ ์ด๋ฌํ ์ค์ ์ ์ฒ๋ฆฌํ ์ ์๋ ํ๋ฅญํ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+### `pydantic-settings` ์ค์นํ๊ธฐ { #install-pydantic-settings }
+
+๋จผ์ [๊ฐ์ ํ๊ฒฝ](../virtual-environments.md){.internal-link target=_blank}์ ๋ง๋ค๊ณ ํ์ฑํํ ๋ค์, `pydantic-settings` ํจํค์ง๋ฅผ ์ค์นํ์ธ์:
+
+
+
+---
+
+์ด์ **ํ๋ก์ธ์ค**์ **ํ๋ก๊ทธ๋จ**์ ์ฐจ์ด๋ฅผ ์์์ผ๋, ๋ฐฐํฌ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๊ณ์ํด ๋ณด๊ฒ ์ต๋๋ค.
+
+## ์์ ์ ์คํ { #running-on-startup }
+
+๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์น API๋ฅผ ๋ง๋ค๋ฉด, ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ ๋ ์ ๊ทผํ ์ ์๋๋ก **ํญ์ ์คํ**๋๊ณ ์ค๋จ๋์ง ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋ฌผ๋ก ํน์ ์ํฉ์์๋ง ์คํํ๊ณ ์ถ์ ํน๋ณํ ์ด์ ๊ฐ ์์ ์๋ ์์ง๋ง, ๋๋ถ๋ถ์ ์ง์์ ์ผ๋ก ์คํ๋๋ฉฐ **์ฌ์ฉ ๊ฐ๋ฅ**ํ ์ํ์ด๊ธฐ๋ฅผ ์ํฉ๋๋ค.
+
+### ์๊ฒฉ ์๋ฒ์์ { #in-a-remote-server }
+
+์๊ฒฉ ์๋ฒ(ํด๋ผ์ฐ๋ ์๋ฒ, ๊ฐ์ ๋จธ์ ๋ฑ)๋ฅผ ์ค์ ํ ๋, ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ๋ก์ปฌ ๊ฐ๋ฐ ๋์ฒ๋ผ ์๋์ผ๋ก `fastapi run`(Uvicorn์ ์ฌ์ฉํฉ๋๋ค)์ด๋ ๋น์ทํ ๋ช
๋ น์ ์คํํ๋ ๊ฒ์
๋๋ค.
+
+์ด ๋ฐฉ์์ ๋์ํ๊ณ , **๊ฐ๋ฐ ์ค์๋** ์ ์ฉํฉ๋๋ค.
+
+ํ์ง๋ง ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ฉด, ์คํ ์ค์ธ **ํ๋ก์ธ์ค**๋ ์๋ง ์ข
๋ฃ๋ ๊ฒ์
๋๋ค.
+
+๋ ์๋ฒ๊ฐ ์ฌ์์๋๋ฉด(์: ์
๋ฐ์ดํธ ์ดํ, ํน์ ํด๋ผ์ฐ๋ ์ ๊ณต์์ ๋ง์ด๊ทธ๋ ์ด์
์ดํ) ์ฌ๋ฌ๋ถ์ ์๋ง **์์์ฐจ๋ฆฌ์ง ๋ชปํ ** ๊ฒ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ๋ค์ ์์ํด์ผ ํ๋ค๋ ์ฌ์ค๋ ๋ชจ๋ฅด๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด API๋ ๊ทธ๋ฅ ์ฃฝ์ ์ํ๋ก ๋จ์ต๋๋ค. ๐ฑ
+
+### ์์ ์ ์๋ ์คํ { #run-automatically-on-startup }
+
+์ผ๋ฐ์ ์ผ๋ก ์๋ฒ ํ๋ก๊ทธ๋จ(์: Uvicorn)์ ์๋ฒ๊ฐ ์์๋ ๋ ์๋์ผ๋ก ์์๋๊ณ , **์ฌ๋์ ๊ฐ์
** ์์ด๋ FastAPI ์ฑ์ ์คํํ๋ ํ๋ก์ธ์ค๊ฐ ํญ์ ์คํ ์ค์ด๋๋ก(์: FastAPI ์ฑ์ ์คํํ๋ Uvicorn) ๊ตฌ์ฑํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
+
+### ๋ณ๋์ ํ๋ก๊ทธ๋จ { #separate-program }
+
+์ด๋ฅผ ์ํด ๋ณดํต ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ ์ ์คํ๋๋๋ก ๋ณด์ฅํ๋ **๋ณ๋์ ํ๋ก๊ทธ๋จ**์ ๋ก๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ์ ํ๋ฆฌ์ผ์ด์
๋ ํจ๊ป ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
+
+### ์์ ์ ์คํ์ ์ํ ๋๊ตฌ ์์ { #example-tools-to-run-at-startup }
+
+์ด ์ญํ ์ ํ ์ ์๋ ๋๊ตฌ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+* Docker
+* Kubernetes
+* Docker Compose
+* Swarm Mode์ Docker
+* Systemd
+* Supervisor
+* ํด๋ผ์ฐ๋ ์ ๊ณต์๊ฐ ์๋น์ค ์ผ๋ถ๋ก ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ
+* ๊ธฐํ...
+
+๋ค์ ์ฅ์์ ๋ ๊ตฌ์ฒด์ ์ธ ์์๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
+
+## ์ฌ์์ { #restarts }
+
+์ ํ๋ฆฌ์ผ์ด์
์ด ์์ ์ ์คํ๋๋๋ก ๋ณด์ฅํ๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ, ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ **์ฌ์์**๋๋๋ก ๋ณด์ฅํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
+
+### ์ฐ๋ฆฌ๋ ์ค์ํฉ๋๋ค { #we-make-mistakes }
+
+์ฌ๋์ ์ธ์ ๋ **์ค์**ํฉ๋๋ค. ์ํํธ์จ์ด์๋ ๊ฑฐ์ *ํญ์* ์ฌ๊ธฐ์ ๊ธฐ์ ์จ์ **๋ฒ๊ทธ**๊ฐ ์์ต๋๋ค. ๐
+
+๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๋ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์ ์ฝ๋๋ฅผ ๊ณ์ ๊ฐ์ ํฉ๋๋ค(์๋ก์ด ๋ฒ๊ทธ๋ ์ถ๊ฐํ ์ ์๊ฒ ์ฃ ๐
).
+
+### ์์ ์ค๋ฅ๋ ์๋์ผ๋ก ์ฒ๋ฆฌ๋จ { #small-errors-automatically-handled }
+
+FastAPI๋ก ์น API๋ฅผ ๋ง๋ค ๋ ์ฝ๋์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด, FastAPI๋ ๋ณดํต ๊ทธ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ ๋จ์ผ ์์ฒญ ์์๋ง ๋ฌธ์ ๋ฅผ ๊ฐ๋ก๋๋ค. ๐ก
+
+ํด๋ผ์ด์ธํธ๋ ํด๋น ์์ฒญ์ ๋ํด **500 Internal Server Error**๋ฅผ ๋ฐ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ํ ํฌ๋์ํ์ง ์๊ณ ๋ค์ ์์ฒญ๋ถํฐ๋ ๊ณ์ ๋์ํฉ๋๋ค.
+
+### ๋ ํฐ ์ค๋ฅ - ํฌ๋์ { #bigger-errors-crashes }
+
+๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๊ฐ **์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ํฌ๋์**์์ผ Uvicorn๊ณผ Python ์์ฒด๊ฐ ์ข
๋ฃ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค. ๐ฅ
+
+๊ทธ๋๋ ํ ๊ตฐ๋ฐ ์ค๋ฅ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฃฝ์ ์ฑ๋ก ๋จ์ ์๊ธฐ๋ฅผ ๋ฐ๋ผ์ง๋ ์์ ๊ฒ์
๋๋ค. ๋ง๊ฐ์ง ๊ฒฝ๋ก ์ฒ๋ฆฌ๋ฅผ ์ ์ธํ ๋๋จธ์ง *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ผ๋ **๊ณ์ ์คํ**๋๊ธฐ๋ฅผ ์ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
+
+### ํฌ๋์ ํ ์ฌ์์ { #restart-after-crash }
+
+ํ์ง๋ง ์คํ ์ค์ธ **ํ๋ก์ธ์ค**๊ฐ ํฌ๋์ํ๋ ์ ๋ง ์ฌ๊ฐํ ์ค๋ฅ์ ๊ฒฝ์ฐ์๋, ์ ์ด๋ ๋ช ๋ฒ์ ํ๋ก์ธ์ค๋ฅผ **์ฌ์์**ํ๋๋ก ๋ด๋นํ๋ ์ธ๋ถ ์ปดํฌ๋ํธ๊ฐ ํ์ํฉ๋๋ค...
+
+/// tip | ํ
+
+...๋ค๋ง ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด๊ฐ **์ฆ์ ๊ณ์ ํฌ๋์**ํ๋ค๋ฉด, ๋ฌดํํ ์ฌ์์ํ๋ ๊ฒ์ ์๋ง ์๋ฏธ๊ฐ ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ๊ฐ๋ฐ ์ค์, ๋๋ ์ต์ํ ๋ฐฐํฌ ์งํ์ ์์์ฐจ๋ฆด ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
+
+๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋, ํน์ ํ ๊ฒฝ์ฐ์๋ง ์ ์ฒด๊ฐ ํฌ๋์ํ ์ ์๊ณ **๋ฏธ๋**์๋ ๊ทธ๋ด ์ ์์ผ๋ฉฐ, ๊ทธ๋๋ ์ฌ์์ํ๋ ๊ฒ์ด ์๋ฏธ ์๋ ์ฃผ์ ์ฌ๋ก์ ์ง์คํด ๋ด
์๋ค.
+
+///
+
+์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์์ํ๋ ์ญํ ์ **์ธ๋ถ ์ปดํฌ๋ํธ**๊ฐ ๋งก๋ ํธ์ด ๋ณดํต ์ข์ต๋๋ค. ๊ทธ ์์ ์๋ Uvicorn๊ณผ Python์ ํฌํจํ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ด๋ฏธ ํฌ๋์ํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ ์ฑ์ ๊ฐ์ ์ฝ๋ ์์์ ์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+### ์๋ ์ฌ์์์ ์ํ ๋๊ตฌ ์์ { #example-tools-to-restart-automatically }
+
+๋๋ถ๋ถ์ ๊ฒฝ์ฐ **์์ ์ ์คํ**์ ์ฌ์ฉํ ๋๊ตฌ๊ฐ ์๋ **์ฌ์์**๋ ํจ๊ป ์ฒ๋ฆฌํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด ๋ค์์ด ๊ฐ๋ฅํฉ๋๋ค:
+
+* Docker
+* Kubernetes
+* Docker Compose
+* Swarm Mode์ Docker
+* Systemd
+* Supervisor
+* ํด๋ผ์ฐ๋ ์ ๊ณต์๊ฐ ์๋น์ค ์ผ๋ถ๋ก ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ
+* ๊ธฐํ...
+
+## ๋ณต์ - ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ { #replication-processes-and-memory }
+
+FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ Uvicorn์ ์คํํ๋ `fastapi` ๋ช
๋ น ๊ฐ์ ์๋ฒ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ฉด, **ํ๋์ ํ๋ก์ธ์ค**๋ก ์คํํ๋๋ผ๋ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ๋ง์ ๊ฒฝ์ฐ, ์ฌ๋ฌ ์์ปค ํ๋ก์ธ์ค๋ฅผ ๋์์ ์คํํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
+
+### ์ฌ๋ฌ ํ๋ก์ธ์ค - ์์ปค { #multiple-processes-workers }
+
+๋จ์ผ ํ๋ก์ธ์ค๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ๋ณด๋ค ํด๋ผ์ด์ธํธ๊ฐ ๋ ๋ง๊ณ (์: ๊ฐ์ ๋จธ์ ์ด ๊ทธ๋ฆฌ ํฌ์ง ์์ ๋), ์๋ฒ CPU์ **์ฌ๋ฌ ์ฝ์ด**๊ฐ ์๋ค๋ฉด, ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ **์ฌ๋ฌ ํ๋ก์ธ์ค**๋ฅผ ๋์์ ๋์ฐ๊ณ ์์ฒญ์ ๋ถ์ฐ์ํฌ ์ ์์ต๋๋ค.
+
+๊ฐ์ API ํ๋ก๊ทธ๋จ์ **์ฌ๋ฌ ํ๋ก์ธ์ค**๋ก ์คํํ ๋, ์ด ํ๋ก์ธ์ค๋ค์ ๋ณดํต **workers**๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
+
+### ์์ปค ํ๋ก์ธ์ค์ ํฌํธ { #worker-processes-and-ports }
+
+[HTTPS์ ๋ํ ๋ฌธ์](https.md){.internal-link target=_blank}์์, ์๋ฒ์์ ํ๋์ ํฌํธ์ IP ์ฃผ์ ์กฐํฉ์๋ ํ๋์ ํ๋ก์ธ์ค๋ง ๋ฆฌ์ค๋ํ ์ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์๋์?
+
+์ด๊ฒ์ ์ฌ์ ํ ์ฌ์ค์
๋๋ค.
+
+๋ฐ๋ผ์ **์ฌ๋ฌ ํ๋ก์ธ์ค**๋ฅผ ๋์์ ์คํํ๋ ค๋ฉด, ๋จผ์ **ํฌํธ์์ ๋ฆฌ์ค๋ํ๋ ๋จ์ผ ํ๋ก์ธ์ค**๊ฐ ์์ด์ผ ํ๊ณ , ๊ทธ ํ๋ก์ธ์ค๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๊ฐ ์์ปค ํ๋ก์ธ์ค๋ก ํต์ ์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
+
+### ํ๋ก์ธ์ค๋น ๋ฉ๋ชจ๋ฆฌ { #memory-per-process }
+
+์ด์ ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ก๋ํ๋ค๊ณ ํด๋ด
์๋ค. ์๋ฅผ ๋ค์ด ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ณ์์ ์ฌ๋ฆฌ๊ฑฐ๋ ํฐ ํ์ผ ๋ด์ฉ์ ๋ณ์์ ์ฌ๋ฆฌ๋ ๊ฒฝ์ฐ์
๋๋ค. ์ด๋ฐ ๊ฒ๋ค์ ์๋ฒ์ **๋ฉ๋ชจ๋ฆฌ(RAM)**๋ฅผ ์ด๋ ์ ๋ ์ฌ์ฉํฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ ๋ณดํต **๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์์ต๋๋ค**. ์ฆ, ๊ฐ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ ์์ฒด ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ต๋๋ค. ์ฝ๋์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๋ฉด, **๊ฐ ํ๋ก์ธ์ค**๊ฐ ๊ทธ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
+
+### ์๋ฒ ๋ฉ๋ชจ๋ฆฌ { #server-memory }
+
+์๋ฅผ ๋ค์ด ์ฝ๋๊ฐ ํฌ๊ธฐ **1 GB**์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ก๋ํ๋ค๊ณ ํด๋ด
์๋ค. API๋ฅผ ํ๋ก์ธ์ค ํ๋๋ก ์คํํ๋ฉด RAM์ ์ต์ 1GB ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ **4๊ฐ ํ๋ก์ธ์ค**(์์ปค 4๊ฐ)๋ฅผ ์์ํ๋ฉด ๊ฐ๊ฐ 1GB RAM์ ์ฌ์ฉํฉ๋๋ค. ์ฆ ์ด **4 GB RAM**์ ์ฌ์ฉํฉ๋๋ค.
+
+๊ทธ๋ฐ๋ฐ ์๊ฒฉ ์๋ฒ๋ ๊ฐ์ ๋จธ์ ์ RAM์ด 3GB๋ฟ์ด๋ผ๋ฉด, 4GB๋ฅผ ๋๊ฒ ๋ก๋ํ๋ ค๊ณ ํ ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค. ๐จ
+
+### ์ฌ๋ฌ ํ๋ก์ธ์ค - ์์ { #multiple-processes-an-example }
+
+์ด ์์์์๋ **Manager Process**๊ฐ ๋ ๊ฐ์ **Worker Processes**๋ฅผ ์์ํ๊ณ ์ ์ดํฉ๋๋ค.
+
+์ด Manager Process๋ ์๋ง IP์ **ํฌํธ**์์ ๋ฆฌ์ค๋ํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ํต์ ์ ์์ปค ํ๋ก์ธ์ค๋ก ์ ๋ฌํฉ๋๋ค.
+
+์์ปค ํ๋ก์ธ์ค๋ค์ด ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉฐ, **์์ฒญ**์ ๋ฐ์ **์๋ต**์ ๋ฐํํ๋ ์ฃผ์ ์ฐ์ฐ์ ์ํํ๊ณ , RAM์ ๋ณ์๋ก ๋ก๋ํ ๋ชจ๋ ๋ด์ฉ์ ๋ด์ต๋๋ค.
+
+
diff --git a/docs/ko/docs/how-to/general.md b/docs/ko/docs/how-to/general.md
new file mode 100644
index 000000000..a18dc68a2
--- /dev/null
+++ b/docs/ko/docs/how-to/general.md
@@ -0,0 +1,39 @@
+# ์ผ๋ฐ - ์ฌ์ฉ ๋ฐฉ๋ฒ - ๋ ์ํผ { #general-how-to-recipes }
+
+์ผ๋ฐ์ ์ด๊ฑฐ๋ ์์ฃผ ๋์ค๋ ์ง๋ฌธ์ ๋ํด, ๋ฌธ์์ ๋ค๋ฅธ ์์น๋ก ์๋ดํ๋ ๋ช ๊ฐ์ง ํฌ์ธํฐ๋ฅผ ์๊ฐํฉ๋๋ค.
+
+## ๋ฐ์ดํฐ ํํฐ๋ง - ๋ณด์ { #filter-data-security }
+
+๋ฐํํ๋ฉด ์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ณผ๋ํ๊ฒ ๋ฐํํ์ง ์๋๋ก ํ๋ ค๋ฉด, [ํํ ๋ฆฌ์ผ - ์๋ต ๋ชจ๋ธ - ๋ฐํ ํ์
](../tutorial/response-model.md){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## ๋ฌธ์ํ ํ๊ทธ - OpenAPI { #documentation-tags-openapi }
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ , ๋ฌธ์ UI์์ ์ด๋ฅผ ๊ทธ๋ฃนํํ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - ๊ฒฝ๋ก ์ฒ๋ฆฌ ๊ตฌ์ฑ - ํ๊ทธ](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## ๋ฌธ์ํ ์์ฝ ๋ฐ ์ค๋ช
- OpenAPI { #documentation-summary-and-description-openapi }
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์์ฝ๊ณผ ์ค๋ช
์ ์ถ๊ฐํ๊ณ , ๋ฌธ์ UI์ ํ์ํ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - ๊ฒฝ๋ก ์ฒ๋ฆฌ ๊ตฌ์ฑ - ์์ฝ ๋ฐ ์ค๋ช
](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## ๋ฌธ์ํ ์๋ต ์ค๋ช
- OpenAPI { #documentation-response-description-openapi }
+
+๋ฌธ์ UI์ ํ์๋๋ ์๋ต์ ์ค๋ช
์ ์ ์ํ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - ๊ฒฝ๋ก ์ฒ๋ฆฌ ๊ตฌ์ฑ - ์๋ต ์ค๋ช
](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## ๋ฌธ์ํ *๊ฒฝ๋ก ์ฒ๋ฆฌ* ์ง์ ์ค๋จํ๊ธฐ - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ์ง์ ์ค๋จ(deprecate)์ผ๋ก ํ์ํ๊ณ , ๋ฌธ์ UI์ ๋ณด์ฌ์ฃผ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - ๊ฒฝ๋ก ์ฒ๋ฆฌ ๊ตฌ์ฑ - ์ง์ ์ค๋จ](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## ์ด๋ค ๋ฐ์ดํฐ๋ JSON ํธํ์ผ๋ก ๋ณํํ๊ธฐ { #convert-any-data-to-json-compatible }
+
+์ด๋ค ๋ฐ์ดํฐ๋ JSON ํธํ ํ์์ผ๋ก ๋ณํํ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - JSON ํธํ ์ธ์ฝ๋](../tutorial/encoder.md){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## OpenAPI ๋ฉํ๋ฐ์ดํฐ - ๋ฌธ์ { #openapi-metadata-docs }
+
+๋ผ์ด์ ์ค, ๋ฒ์ , ์ฐ๋ฝ์ฒ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํด OpenAPI ์คํค๋ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - ๋ฉํ๋ฐ์ดํฐ์ ๋ฌธ์ URL](../tutorial/metadata.md){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## OpenAPI ์ฌ์ฉ์ ์ ์ URL { #openapi-custom-url }
+
+OpenAPI URL์ ์ปค์คํฐ๋ง์ด์ฆ(๋๋ ์ ๊ฑฐ)ํ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - ๋ฉํ๋ฐ์ดํฐ์ ๋ฌธ์ URL](../tutorial/metadata.md#openapi-url){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
+
+## OpenAPI ๋ฌธ์ URL { #openapi-docs-urls }
+
+์๋์ผ๋ก ์์ฑ๋๋ ๋ฌธ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์์ ์ฌ์ฉํ๋ URL์ ์
๋ฐ์ดํธํ๋ ค๋ฉด [ํํ ๋ฆฌ์ผ - ๋ฉํ๋ฐ์ดํฐ์ ๋ฌธ์ URL](../tutorial/metadata.md#docs-urls){.internal-link target=_blank} ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
diff --git a/docs/ko/docs/how-to/graphql.md b/docs/ko/docs/how-to/graphql.md
new file mode 100644
index 000000000..3cc467eb7
--- /dev/null
+++ b/docs/ko/docs/how-to/graphql.md
@@ -0,0 +1,60 @@
+# GraphQL { #graphql }
+
+**FastAPI**๋ **ASGI** ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก, ASGI์๋ ํธํ๋๋ ์ด๋ค **GraphQL** ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค์ฐ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
+
+๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ผ๋ฐ FastAPI **๊ฒฝ๋ก ์ฒ๋ฆฌ**์ GraphQL์ ํจ๊ป ์กฐํฉํ ์ ์์ต๋๋ค.
+
+/// tip | ํ
+
+**GraphQL**์ ๋ช ๊ฐ์ง ๋งค์ฐ ํน์ ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํฉ๋๋ค.
+
+์ผ๋ฐ์ ์ธ **web API**์ ๋น๊ตํ์ ๋ **์ฅ์ **๊ณผ **๋จ์ **์ด ์์ต๋๋ค.
+
+์ฌ๋ฌ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์์ **์ด์ **์ด **๋จ์ **์ ์์ํ๋์ง ๊ผญ ํ๊ฐํด ๋ณด์ธ์. ๐ค
+
+///
+
+## GraphQL ๋ผ์ด๋ธ๋ฌ๋ฆฌ { #graphql-libraries }
+
+๋ค์์ **ASGI** ์ง์์ด ์๋ **GraphQL** ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์
๋๋ค. **FastAPI**์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+* Strawberry ๐
+ * FastAPI์ฉ ๋ฌธ์ ์ ๊ณต
+* Ariadne
+ * FastAPI์ฉ ๋ฌธ์ ์ ๊ณต
+* Tartiflette
+ * ASGI ํตํฉ์ ์ ๊ณตํ๊ธฐ ์ํด Tartiflette ASGI ์ฌ์ฉ
+* Graphene
+ * starlette-graphene3 ์ฌ์ฉ
+
+## Strawberry๋ก GraphQL ์ฌ์ฉํ๊ธฐ { #graphql-with-strawberry }
+
+**GraphQL**๋ก ์์
ํด์ผ ํ๊ฑฐ๋ ์์
ํ๊ณ ์ถ๋ค๋ฉด, **Strawberry**๋ฅผ **๊ถ์ฅ**ํฉ๋๋ค. **FastAPI**์ ์ค๊ณ์ ๊ฐ์ฅ ๊ฐ๊น๊ณ , ๋ชจ๋ ๊ฒ์ด **type annotations**์ ๊ธฐ๋ฐํด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํธํ ์๋ ์์ง๋ง, ์ ๊ฒ ๋ฌป๋๋ค๋ฉด ์๋ง **Strawberry**๋ฅผ ๋จผ์ ์๋ํด ๋ณด๋ผ๊ณ ์ ์ํ ๊ฒ์
๋๋ค.
+
+๋ค์์ Strawberry๋ฅผ FastAPI์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์
๋๋ค:
+
+{* ../../docs_src/graphql_/tutorial001_py39.py hl[3,22,25] *}
+
+Strawberry ๋ฌธ์์์ Strawberry์ ๋ํด ๋ ์์๋ณผ ์ ์์ต๋๋ค.
+
+๋ํ FastAPI์์ Strawberry ์ฌ์ฉ์ ๋ํ ๋ฌธ์๋ ํ์ธํด ๋ณด์ธ์.
+
+## Starlette์ ์์ `GraphQLApp` { #older-graphqlapp-from-starlette }
+
+์ด์ ๋ฒ์ ์ Starlette์๋ Graphene๊ณผ ํตํฉํ๊ธฐ ์ํ `GraphQLApp` ํด๋์ค๊ฐ ํฌํจ๋์ด ์์์ต๋๋ค.
+
+์ด๊ฒ์ Starlette์์ deprecated ๋์์ง๋ง, ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด ๊ฐ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๊ณ **๊ฑฐ์ ๋์ผํ ์ธํฐํ์ด์ค**๋ฅผ ๊ฐ์ง starlette-graphene3๋ก ์ฝ๊ฒ **๋ง์ด๊ทธ๋ ์ด์
**ํ ์ ์์ต๋๋ค.
+
+/// tip | ํ
+
+GraphQL์ด ํ์ํ๋ค๋ฉด, ์ปค์คํ
ํด๋์ค์ ํ์
๋์ type annotations์ ๊ธฐ๋ฐํ Strawberry๋ฅผ ์ฌ์ ํ ํ์ธํด ๋ณด์๊ธธ ๊ถ์ฅํฉ๋๋ค.
+
+///
+
+## ๋ ์์๋ณด๊ธฐ { #learn-more }
+
+๊ณต์ GraphQL ๋ฌธ์์์ **GraphQL**์ ๋ํด ๋ ์์๋ณผ ์ ์์ต๋๋ค.
+
+๋ํ ์์์ ์ค๋ช
ํ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ํด๋น ๋งํฌ์์ ๋ ์์ธํ ์ฝ์ด๋ณผ ์ ์์ต๋๋ค.
diff --git a/docs/ko/docs/how-to/index.md b/docs/ko/docs/how-to/index.md
new file mode 100644
index 000000000..9321c488b
--- /dev/null
+++ b/docs/ko/docs/how-to/index.md
@@ -0,0 +1,13 @@
+# How To - ๋ ์ํผ { #how-to-recipes }
+
+์ฌ๊ธฐ์์๋ **์ฌ๋ฌ ์ฃผ์ **์ ๋ํ ๋ค์ํ ๋ ์ํผ(โhow toโ ๊ฐ์ด๋)๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
+
+๋๋ถ๋ถ์ ์์ด๋์ด๋ ์ด๋ ์ ๋ **์๋ก ๋
๋ฆฝ์ **์ด๋ฉฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ **์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ**์ ์ง์ ์ ์ฉ๋๋ ๊ฒฝ์ฐ์๋ง ํ์ตํ๋ฉด ๋ฉ๋๋ค.
+
+ํ๋ก์ ํธ์ ํฅ๋ฏธ๋กญ๊ณ ์ ์ฉํด ๋ณด์ด๋ ๊ฒ์ด ์๋ค๋ฉด ํ์ธํด ๋ณด์ธ์. ๊ทธ๋ ์ง ์๋ค๋ฉด ์๋ง ๊ฑด๋๋ฐ์ด๋ ๋ฉ๋๋ค.
+
+/// tip | ํ
+
+**FastAPI๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ํ์ต**ํ๊ณ ์ถ๋ค๋ฉด(๊ถ์ฅ), ๋์ [ํํ ๋ฆฌ์ผ - ์ฌ์ฉ์ ๊ฐ์ด๋](../tutorial/index.md){.internal-link target=_blank}๋ฅผ ์ฅ๋ณ๋ก ์ฝ์ด๋ณด์ธ์.
+
+///
diff --git a/docs/ko/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/ko/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
new file mode 100644
index 000000000..6e528ecaf
--- /dev/null
+++ b/docs/ko/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
@@ -0,0 +1,135 @@
+# Pydantic v1์์ Pydantic v2๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ { #migrate-from-pydantic-v1-to-pydantic-v2 }
+
+์ค๋๋ FastAPI ์ฑ์ด ์๋ค๋ฉด Pydantic ๋ฒ์ 1์ ์ฌ์ฉํ๊ณ ์์ ์ ์์ต๋๋ค.
+
+FastAPI 0.100.0 ๋ฒ์ ์ Pydantic v1 ๋๋ v2 ์ค ํ๋๋ฅผ ์ง์ํ์ต๋๋ค. ์ค์น๋์ด ์๋ ์ชฝ์ ์ฌ์ฉํ์ต๋๋ค.
+
+FastAPI 0.119.0 ๋ฒ์ ์์๋ v2๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ ์ฝ๊ฒ ํ๊ธฐ ์ํด, Pydantic v2 ๋ด๋ถ์์ Pydantic v1์(`pydantic.v1`๋ก) ๋ถ๋ถ์ ์ผ๋ก ์ง์ํ๊ธฐ ์์ํ์ต๋๋ค.
+
+FastAPI 0.126.0 ๋ฒ์ ์์๋ Pydantic v1 ์ง์์ ์ค๋จํ์ง๋ง, `pydantic.v1`์ ์ ์ ๋์ ๊ณ์ ์ง์ํ์ต๋๋ค.
+
+/// warning | ๊ฒฝ๊ณ
+
+Pydantic ํ์ **Python 3.14**๋ถํฐ ์ต์ Python ๋ฒ์ ์์ Pydantic v1 ์ง์์ ์ค๋จํ์ต๋๋ค.
+
+์ฌ๊ธฐ์๋ `pydantic.v1`๋ ํฌํจ๋๋ฉฐ, Python 3.14 ์ด์์์๋ ๋ ์ด์ ์ง์๋์ง ์์ต๋๋ค.
+
+Python์ ์ต์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด Pydantic v2๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
+
+///
+
+Pydantic v1์ ์ฌ์ฉํ๋ ์ค๋๋ FastAPI ์ฑ์ด ์๋ค๋ฉด, ์ฌ๊ธฐ์๋ ์ด๋ฅผ Pydantic v2๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
์ ๋๋ **FastAPI 0.119.0์ ๊ธฐ๋ฅ**์ ์๊ฐํ๊ฒ ์ต๋๋ค.
+
+## ๊ณต์ ๊ฐ์ด๋ { #official-guide }
+
+Pydantic์๋ v1์์ v2๋ก์ ๊ณต์ Migration Guide๊ฐ ์์ต๋๋ค.
+
+์ฌ๊ธฐ์๋ ๋ฌด์์ด ๋ฐ๋์๋์ง, ๊ฒ์ฆ์ด ์ด์ ์ด๋ป๊ฒ ๋ ์ ํํ๊ณ ์๊ฒฉํด์ก๋์ง, ๊ฐ๋ฅํ ์ฃผ์์ฌํญ ๋ฑ๋ ํฌํจ๋์ด ์์ต๋๋ค.
+
+๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๋ ์ ์ดํดํ๊ธฐ ์ํด ์ฝ์ด๋ณด๋ฉด ์ข์ต๋๋ค.
+
+## ํ
์คํธ { #tests }
+
+์ฑ์ ๋ํ [tests](../tutorial/testing.md){.internal-link target=_blank}๊ฐ ์๋์ง ํ์ธํ๊ณ , ์ง์์ ํตํฉ(CI)์์ ํ
์คํธ๋ฅผ ์คํํ์ธ์.
+
+์ด๋ ๊ฒ ํ๋ฉด ์
๊ทธ๋ ์ด๋๋ฅผ ์งํํ๋ฉด์๋ ๋ชจ๋ ๊ฒ์ด ๊ธฐ๋ํ ๋๋ก ๊ณ์ ๋์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
+
+## `bump-pydantic` { #bump-pydantic }
+
+๋ง์ ๊ฒฝ์ฐ, ์ปค์คํฐ๋ง์ด์ง ์์ด ์ผ๋ฐ์ ์ธ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด Pydantic v1์์ Pydantic v2๋ก์ ๋ง์ด๊ทธ๋ ์ด์
๊ณผ์ ๋๋ถ๋ถ์ ์๋ํํ ์ ์์ต๋๋ค.
+
+๊ฐ์ Pydantic ํ์ด ์ ๊ณตํ๋ `bump-pydantic`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+์ด ๋๊ตฌ๋ ๋ณ๊ฒฝํด์ผ ํ๋ ์ฝ๋์ ๋๋ถ๋ถ์ ์๋์ผ๋ก ๋ฐ๊พธ๋ ๋ฐ ๋์์ ์ค๋๋ค.
+
+๊ทธ ๋ค์ ํ
์คํธ๋ฅผ ์คํํด์ ๋ชจ๋ ๊ฒ์ด ๋์ํ๋์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค. ์ ๋๋ค๋ฉด ๋์
๋๋ค. ๐
+
+## v2 ์์ Pydantic v1 { #pydantic-v1-in-v2 }
+
+Pydantic v2๋ Pydantic v1์ ๋ชจ๋ ๊ฒ์ ์๋ธ๋ชจ๋ `pydantic.v1`๋ก ํฌํจํฉ๋๋ค. ํ์ง๋ง ์ด๋ Python 3.13๋ณด๋ค ๋์ ๋ฒ์ ์์๋ ๋ ์ด์ ์ง์๋์ง ์์ต๋๋ค.
+
+์ฆ, Pydantic v2์ ์ต์ ๋ฒ์ ์ ์ค์นํ ๋ค, ์ด ์๋ธ๋ชจ๋์์ ์์ Pydantic v1 ๊ตฌ์ฑ ์์๋ฅผ importํ์ฌ ์์ Pydantic v1์ ์ค์นํ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *}
+
+### v2 ์์ Pydantic v1์ ๋ํ FastAPI ์ง์ { #fastapi-support-for-pydantic-v1-in-v2 }
+
+FastAPI 0.119.0๋ถํฐ๋ v2๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ ์ฝ๊ฒ ํ๊ธฐ ์ํด, Pydantic v2 ๋ด๋ถ์ Pydantic v1์ ๋ํด์๋ ๋ถ๋ถ์ ์ธ ์ง์์ด ์์ต๋๋ค.
+
+๋ฐ๋ผ์ Pydantic์ ์ต์ v2๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ , import๋ฅผ `pydantic.v1` ์๋ธ๋ชจ๋์ ์ฌ์ฉํ๋๋ก ๋ฐ๊พธ๋ฉด, ๋ง์ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋์ํฉ๋๋ค.
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *}
+
+/// warning | ๊ฒฝ๊ณ
+
+Pydantic ํ์ด Python 3.14๋ถํฐ ์ต์ Python ๋ฒ์ ์์ Pydantic v1์ ๋ ์ด์ ์ง์ํ์ง ์์ผ๋ฏ๋ก, `pydantic.v1`์ ์ฌ์ฉํ๋ ๊ฒ ์ญ์ Python 3.14 ์ด์์์๋ ์ง์๋์ง ์๋๋ค๋ ์ ์ ์ผ๋์ ๋์ธ์.
+
+///
+
+### ๊ฐ์ ์ฑ์์ Pydantic v1๊ณผ v2 ํจ๊ป ์ฌ์ฉํ๊ธฐ { #pydantic-v1-and-v2-on-the-same-app }
+
+Pydantic์์๋ Pydantic v2 ๋ชจ๋ธ์ ํ๋๋ฅผ Pydantic v1 ๋ชจ๋ธ๋ก ์ ์ํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ํ๋ ๊ฒ์ **์ง์ํ์ง ์์ต๋๋ค**.
+
+```mermaid
+graph TB
+ subgraph "โ Not Supported"
+ direction TB
+ subgraph V2["Pydantic v2 Model"]
+ V1Field["Pydantic v1 Model"]
+ end
+ subgraph V1["Pydantic v1 Model"]
+ V2Field["Pydantic v2 Model"]
+ end
+ end
+
+ style V2 fill:#f9fff3
+ style V1 fill:#fff6f0
+ style V1Field fill:#fff6f0
+ style V2Field fill:#f9fff3
+```
+
+...ํ์ง๋ง ๊ฐ์ ์ฑ์์ Pydantic v1๊ณผ v2๋ฅผ ์ฌ์ฉํ๋, ๋ชจ๋ธ์ ๋ถ๋ฆฌํด์ ๋ ์๋ ์์ต๋๋ค.
+
+```mermaid
+graph TB
+ subgraph "โ
Supported"
+ direction TB
+ subgraph V2["Pydantic v2 Model"]
+ V2Field["Pydantic v2 Model"]
+ end
+ subgraph V1["Pydantic v1 Model"]
+ V1Field["Pydantic v1 Model"]
+ end
+ end
+
+ style V2 fill:#f9fff3
+ style V1 fill:#fff6f0
+ style V1Field fill:#fff6f0
+ style V2Field fill:#f9fff3
+```
+
+์ด๋ค ๊ฒฝ์ฐ์๋ FastAPI ์ฑ์ ๊ฐ์ **๊ฒฝ๋ก ์ฒ๋ฆฌ**์์ Pydantic v1๊ณผ v2 ๋ชจ๋ธ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค:
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *}
+
+์ ์์ ์์ ์
๋ ฅ ๋ชจ๋ธ์ Pydantic v1 ๋ชจ๋ธ์ด๊ณ , ์ถ๋ ฅ ๋ชจ๋ธ(`response_model=ItemV2`๋ก ์ ์๋จ)์ Pydantic v2 ๋ชจ๋ธ์
๋๋ค.
+
+### Pydantic v1 ํ๋ผ๋ฏธํฐ { #pydantic-v1-parameters }
+
+Pydantic v1 ๋ชจ๋ธ๊ณผ ํจ๊ป `Body`, `Query`, `Form` ๋ฑ ํ๋ผ๋ฏธํฐ์ฉ FastAPI ์ ์ฉ ๋๊ตฌ ์ผ๋ถ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, Pydantic v2๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ง์น ๋๊น์ง `fastapi.temp_pydantic_v1_params`์์ importํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *}
+
+### ๋จ๊ณ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ { #migrate-in-steps }
+
+/// tip | ํ
+
+๋จผ์ `bump-pydantic`๋ก ์๋ํด ๋ณด์ธ์. ํ
์คํธ๊ฐ ํต๊ณผํ๊ณ ์ ๋์ํ๋ค๋ฉด, ํ ๋ฒ์ ๋ช
๋ น์ผ๋ก ๋์
๋๋ค. โจ
+
+///
+
+`bump-pydantic`๊ฐ ์ฌ๋ฌ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง์ง ์๋๋ค๋ฉด, ๊ฐ์ ์ฑ์์ Pydantic v1๊ณผ v2 ๋ชจ๋ธ์ ๋ชจ๋ ์ง์ํ๋ ๊ธฐ๋ฅ์ ์ด์ฉํด Pydantic v2๋ก ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ์ ์์ต๋๋ค.
+
+๋จผ์ Pydantic์ ์ต์ v2๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ , ๋ชจ๋ ๋ชจ๋ธ์ import๋ฅผ `pydantic.v1`์ ์ฌ์ฉํ๋๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
+
+๊ทธ ๋ค์ Pydantic v1์์ v2๋ก ๋ชจ๋ธ์ ๊ทธ๋ฃน ๋จ์๋ก, ์ ์ง์ ์ธ ๋จ๊ณ๋ก ๋ง์ด๊ทธ๋ ์ด์
์ ์์ํ๋ฉด ๋ฉ๋๋ค. ๐ถ
diff --git a/docs/ko/docs/how-to/separate-openapi-schemas.md b/docs/ko/docs/how-to/separate-openapi-schemas.md
new file mode 100644
index 000000000..055429c26
--- /dev/null
+++ b/docs/ko/docs/how-to/separate-openapi-schemas.md
@@ -0,0 +1,102 @@
+# ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ํด OpenAPI ์คํค๋ง๋ฅผ ๋ถ๋ฆฌํ ์ง ์ฌ๋ถ { #separate-openapi-schemas-for-input-and-output-or-not }
+
+**Pydantic v2**๊ฐ ๋ฆด๋ฆฌ์ค๋ ์ดํ, ์์ฑ๋๋ OpenAPI๋ ์ด์ ๋ณด๋ค ์กฐ๊ธ ๋ ์ ํํ๊ณ **์ฌ๋ฐ๋ฅด๊ฒ** ๋ง๋ค์ด์ง๋๋ค. ๐
+
+์ค์ ๋ก ์ด๋ค ๊ฒฝ์ฐ์๋, ๊ฐ์ Pydantic ๋ชจ๋ธ์ ๋ํด OpenAPI ์์ **๋ ๊ฐ์ JSON Schema**๊ฐ ์๊ธฐ๊ธฐ๋ ํฉ๋๋ค. **๊ธฐ๋ณธ๊ฐ(default value)**์ด ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ, ์
๋ ฅ์ฉ๊ณผ ์ถ๋ ฅ์ฉ์ผ๋ก ๋๋ฉ๋๋ค.
+
+์ด๊ฒ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ํ์ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ณ๊ฒฝํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ํ Pydantic ๋ชจ๋ธ { #pydantic-models-for-input-and-output }
+
+์๋ฅผ ๋ค์ด, ๋ค์์ฒ๋ผ ๊ธฐ๋ณธ๊ฐ์ด ์๋ Pydantic ๋ชจ๋ธ์ด ์๋ค๊ณ ํด๋ณด๊ฒ ์ต๋๋ค:
+
+{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:7] hl[7] *}
+
+### ์
๋ ฅ์ฉ ๋ชจ๋ธ { #model-for-input }
+
+์ด ๋ชจ๋ธ์ ๋ค์์ฒ๋ผ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ฉด:
+
+{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:15] hl[14] *}
+
+...`description` ํ๋๋ **ํ์๊ฐ ์๋๋๋ค**. `None`์ด๋ผ๋ ๊ธฐ๋ณธ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+### ๋ฌธ์์์์ ์
๋ ฅ ๋ชจ๋ธ { #input-model-in-docs }
+
+๋ฌธ์์์ `description` ํ๋์ **๋นจ๊ฐ ๋ณํ**๊ฐ ์๊ณ , ํ์๋ก ํ์๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค:
+
+
+
+
+
+
+
+
+## ๊ฐ์ router๋ฅผ ๋ค๋ฅธ `prefix`๋ก ์ฌ๋ฌ ๋ฒ ํฌํจํ๊ธฐ { #include-the-same-router-multiple-times-with-different-prefix }
+
+`.include_router()`๋ฅผ ์ฌ์ฉํด *๊ฐ์* router๋ฅผ ์๋ก ๋ค๋ฅธ prefix๋ก ์ฌ๋ฌ ๋ฒ ํฌํจํ ์๋ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด `/api/v1`๊ณผ `/api/latest`์ฒ๋ผ ์๋ก ๋ค๋ฅธ prefix๋ก ๋์ผํ API๋ฅผ ๋
ธ์ถํ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
+
+์ด๋ ๊ณ ๊ธ ์ฌ์ฉ ๋ฐฉ์์ด๋ผ ์ค์ ๋ก ํ์ํ์ง ์์ ์๋ ์์ง๋ง, ํ์ํ ๋๋ฅผ ์ํด ์ ๊ณต๋ฉ๋๋ค.
+
+## `APIRouter`์ ๋ค๋ฅธ `APIRouter` ํฌํจํ๊ธฐ { #include-an-apirouter-in-another }
+
+`APIRouter`๋ฅผ `FastAPI` ์ ํ๋ฆฌ์ผ์ด์
์ ํฌํจํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก, ๋ค์์ ์ฌ์ฉํด `APIRouter`๋ฅผ ๋ค๋ฅธ `APIRouter`์ ํฌํจํ ์ ์์ต๋๋ค:
+
+```Python
+router.include_router(other_router)
+```
+
+`FastAPI` ์ฑ์ `router`๋ฅผ ํฌํจํ๊ธฐ ์ ์ ์ํํด์ผ ํ๋ฉฐ, ๊ทธ๋์ผ `other_router`์ *path operations*๋ ํจ๊ป ํฌํจ๋ฉ๋๋ค.
diff --git a/docs/ko/docs/tutorial/body-updates.md b/docs/ko/docs/tutorial/body-updates.md
new file mode 100644
index 000000000..3719e1ffa
--- /dev/null
+++ b/docs/ko/docs/tutorial/body-updates.md
@@ -0,0 +1,100 @@
+# Body - ์
๋ฐ์ดํธ { #body-updates }
+
+## `PUT`์ผ๋ก ๊ต์ฒด ์
๋ฐ์ดํธํ๊ธฐ { #update-replacing-with-put }
+
+ํญ๋ชฉ์ ์
๋ฐ์ดํธํ๋ ค๋ฉด HTTP `PUT` ์์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+`jsonable_encoder`๋ฅผ ์ฌ์ฉํด ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์ ์ฅํ ์ ์๋ ๋ฐ์ดํฐ๋ก ๋ณํํ ์ ์์ต๋๋ค(์: NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ ์). ์๋ฅผ ๋ค์ด `datetime`์ `str`๋ก ๋ณํํ๋ ๊ฒฝ์ฐ์
๋๋ค.
+
+{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
+
+`PUT`์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ **๋์ฒด**ํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
+
+### ๋์ฒด ์ ์ฃผ์์ฌํญ { #warning-about-replacing }
+
+์ฆ, `PUT`์ผ๋ก ํญ๋ชฉ `bar`๋ฅผ ์
๋ฐ์ดํธํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ body๋ฅผ ๋ณด๋ธ๋ค๋ฉด:
+
+```Python
+{
+ "name": "Barz",
+ "price": 3,
+ "description": None,
+}
+```
+
+์ด๋ฏธ ์ ์ฅ๋ ์์ฑ `"tax": 20.2`๊ฐ ํฌํจ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์, ์
๋ ฅ ๋ชจ๋ธ์ `"tax": 10.5`๋ผ๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ ๊ทธ โ์๋ก์ดโ `tax` ๊ฐ `10.5`๋ก ์ ์ฅ๋ฉ๋๋ค.
+
+## `PATCH`๋ก ๋ถ๋ถ ์
๋ฐ์ดํธํ๊ธฐ { #partial-updates-with-patch }
+
+HTTP `PATCH` ์์
์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ *๋ถ๋ถ์ ์ผ๋ก* ์
๋ฐ์ดํธํ ์๋ ์์ต๋๋ค.
+
+์ด๋ ์
๋ฐ์ดํธํ๋ ค๋ ๋ฐ์ดํฐ๋ง ๋ณด๋ด๊ณ , ๋๋จธ์ง๋ ๊ทธ๋๋ก ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
+
+/// note | ์ฐธ๊ณ
+
+`PATCH`๋ `PUT`๋ณด๋ค ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ๋ ์๋ ค์ ธ ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋ง์ ํ์ด ๋ถ๋ถ ์
๋ฐ์ดํธ์๋ `PUT`๋ง ์ฌ์ฉํฉ๋๋ค.
+
+์ฌ๋ฌ๋ถ์ ์ํ๋ ๋ฐฉ์์ผ๋ก **์์ ๋กญ๊ฒ** ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, **FastAPI**๋ ์ด๋ค ์ ํ๋ ๊ฐ์ ํ์ง ์์ต๋๋ค.
+
+๋ค๋ง ์ด ๊ฐ์ด๋๋ ์๋๋ ์ฌ์ฉ ๋ฐฉ์์ด ๋๋ต ์ด๋ป๊ฒ ๋๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
+
+///
+
+### Pydantic์ `exclude_unset` ํ๋ผ๋ฏธํฐ ์ฌ์ฉํ๊ธฐ { #using-pydantics-exclude-unset-parameter }
+
+๋ถ๋ถ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ผ๋ ค๋ฉด Pydantic ๋ชจ๋ธ์ `.model_dump()`์์ `exclude_unset` ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
+
+์: `item.model_dump(exclude_unset=True)`.
+
+์ด๋ `item` ๋ชจ๋ธ์ ๋ง๋ค ๋ ์ค์ ๋ก ์ค์ ๋ ๋ฐ์ดํฐ๋ง ํฌํจํ๋ `dict`๋ฅผ ์์ฑํ๊ณ , ๊ธฐ๋ณธ๊ฐ์ ์ ์ธํฉ๋๋ค.
+
+๊ทธ ๋ค์ ์ด๋ฅผ ์ฌ์ฉํด (์์ฒญ์์ ์ ์ก๋์ด) ์ค์ ๋ ๋ฐ์ดํฐ๋ง ํฌํจํ๊ณ ๊ธฐ๋ณธ๊ฐ์ ์๋ตํ `dict`๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค:
+
+{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
+
+### Pydantic์ `update` ํ๋ผ๋ฏธํฐ ์ฌ์ฉํ๊ธฐ { #using-pydantics-update-parameter }
+
+์ด์ `.model_copy()`๋ฅผ ์ฌ์ฉํด ๊ธฐ์กด ๋ชจ๋ธ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ , ์
๋ฐ์ดํธํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ `dict`๋ฅผ `update` ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
+
+์: `stored_item_model.model_copy(update=update_data)`:
+
+{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
+
+### ๋ถ๋ถ ์
๋ฐ์ดํธ ์์ฝ { #partial-updates-recap }
+
+์ ๋ฆฌํ๋ฉด, ๋ถ๋ถ ์
๋ฐ์ดํธ๋ฅผ ์ ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค:
+
+* (์ ํ ์ฌํญ) `PUT` ๋์ `PATCH`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+* ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
+* ๊ทธ ๋ฐ์ดํฐ๋ฅผ Pydantic ๋ชจ๋ธ์ ๋ฃ์ต๋๋ค.
+* ์
๋ ฅ ๋ชจ๋ธ์์ ๊ธฐ๋ณธ๊ฐ์ด ์ ์ธ๋ `dict`๋ฅผ ์์ฑํฉ๋๋ค(`exclude_unset` ์ฌ์ฉ).
+ * ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ธ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ ๋ฎ์ด์ฐ์ง ์๊ณ , ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์ค์ ํ ๊ฐ๋ง ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
+* ์ ์ฅ๋ ๋ชจ๋ธ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ , ๋ฐ์ ๋ถ๋ถ ์
๋ฐ์ดํธ๋ก ํด๋น ์์ฑ๋ค์ ๊ฐฑ์ ํฉ๋๋ค(`update` ํ๋ผ๋ฏธํฐ ์ฌ์ฉ).
+* ๋ณต์ฌํ ๋ชจ๋ธ์ DB์ ์ ์ฅํ ์ ์๋ ํํ๋ก ๋ณํํฉ๋๋ค(์: `jsonable_encoder` ์ฌ์ฉ).
+ * ์ด๋ ๋ชจ๋ธ์ `.model_dump()` ๋ฉ์๋๋ฅผ ๋ค์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํ์ง๋ง, JSON์ผ๋ก ๋ณํ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ์
์ผ๋ก ๊ฐ์ด ํ์คํ ๋ณํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค(์: `datetime` โ `str`).
+* ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฅํฉ๋๋ค.
+* ์
๋ฐ์ดํธ๋ ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค.
+
+{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *}
+
+/// tip | ํ
+
+๋์ผํ ๊ธฐ๋ฒ์ HTTP `PUT` ์์
์์๋ ์ค์ ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ์ฌ๊ธฐ์ ์์๋ ์ด๋ฐ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํด ๋ง๋ค์ด์ง `PATCH`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+///
+
+/// note | ์ฐธ๊ณ
+
+์
๋ ฅ ๋ชจ๋ธ์ ์ฌ์ ํ ๊ฒ์ฆ๋๋ค๋ ์ ์ ์ ์ํ์ธ์.
+
+๋ฐ๋ผ์ ๋ชจ๋ ์์ฑ์ ์๋ตํ ์ ์๋ ๋ถ๋ถ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ผ๋ ค๋ฉด, ๋ชจ๋ ์์ฑ์ด optional๋ก ํ์๋(๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง๊ฑฐ๋ `None`์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ง๋) ๋ชจ๋ธ์ด ํ์ํฉ๋๋ค.
+
+**์
๋ฐ์ดํธ**๋ฅผ ์ํ โ๋ชจ๋ ๊ฐ์ด optional์ธโ ๋ชจ๋ธ๊ณผ, **์์ฑ**์ ์ํ โํ์ ๊ฐ์ด ์๋โ ๋ชจ๋ธ์ ๊ตฌ๋ถํ๋ ค๋ฉด [์ถ๊ฐ ๋ชจ๋ธ](extra-models.md){.internal-link target=_blank}์ ์ค๋ช
๋ ์์ด๋์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+///
diff --git a/docs/ko/docs/tutorial/dependencies/sub-dependencies.md b/docs/ko/docs/tutorial/dependencies/sub-dependencies.md
new file mode 100644
index 000000000..d81ccf00d
--- /dev/null
+++ b/docs/ko/docs/tutorial/dependencies/sub-dependencies.md
@@ -0,0 +1,105 @@
+# ํ์ ์์กด์ฑ { #sub-dependencies }
+
+**ํ์ ์์กด์ฑ**์ ๊ฐ์ง๋ ์์กด์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค.
+
+ํ์ํ ๋งํผ **๊น๊ฒ** ์ค์ฒฉํ ์๋ ์์ต๋๋ค.
+
+์ด๊ฒ์ ํด๊ฒฐํ๋ ์ผ์ **FastAPI**๊ฐ ์์์ ์ฒ๋ฆฌํฉ๋๋ค.
+
+## ์ฒซ ๋ฒ์งธ ์์กด์ฑ "dependable" { #first-dependency-dependable }
+
+๋ค์๊ณผ ๊ฐ์ด ์ฒซ ๋ฒ์งธ ์์กด์ฑ("dependable")์ ๋ง๋ค ์ ์์ต๋๋ค:
+
+{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
+
+์ด ์์กด์ฑ์ ์ ํ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ `q`๋ฅผ `str`๋ก ์ ์ธํ๊ณ , ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
+
+๋งค์ฐ ๋จ์ํ ์์(๊ทธ๋ค์ง ์ ์ฉํ์ง ์์)์ด์ง๋ง, ํ์ ์์กด์ฑ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง์ ์ง์คํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+
+## ๋ ๋ฒ์งธ ์์กด์ฑ "dependable"๊ณผ "dependant" { #second-dependency-dependable-and-dependant }
+
+๊ทธ๋ค์, ๋ ๋ค๋ฅธ ์์กด์ฑ ํจ์("dependable")๋ฅผ ๋ง๋ค ์ ์๋๋ฐ, ์ด ํจ์๋ ๋์์ ์๊ธฐ ์์ ์ ์์กด์ฑ๋ ์ ์ธํฉ๋๋ค(๊ทธ๋์ "dependant"์ด๊ธฐ๋ ํฉ๋๋ค):
+
+{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[13] *}
+
+์ ์ธ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
+
+* ์ด ํจ์ ์์ฒด๊ฐ ์์กด์ฑ("dependable")์ด์ง๋ง, ๋ค๋ฅธ ์์กด์ฑ๋ ํ๋ ์ ์ธํฉ๋๋ค(์ฆ, ๋ค๋ฅธ ๋ฌด์ธ๊ฐ์ "์์กด"ํฉ๋๋ค).
+ * `query_extractor`์ ์์กดํ๋ฉฐ, ๊ทธ ๋ฐํ๊ฐ์ ํ๋ผ๋ฏธํฐ `q`์ ํ ๋นํฉ๋๋ค.
+* ๋ํ ์ ํ์ `last_query` ์ฟ ํค๋ฅผ `str`๋ก ์ ์ธํฉ๋๋ค.
+ * ์ฌ์ฉ์๊ฐ ์ฟผ๋ฆฌ `q`๋ฅผ ์ ๊ณตํ์ง ์์๋ค๋ฉด, ์ด์ ์ ์ฟ ํค์ ์ ์ฅํด ๋ ๋ง์ง๋ง ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+## ์์กด์ฑ ์ฌ์ฉํ๊ธฐ { #use-the-dependency }
+
+๊ทธ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ์์กด์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
+
+/// info | ์ ๋ณด
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์๋ `query_or_cookie_extractor`๋ผ๋ ์์กด์ฑ ํ๋๋ง ์ ์ธํ๊ณ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์.
+
+ํ์ง๋ง **FastAPI**๋ `query_or_cookie_extractor`๋ฅผ ํธ์ถํ๋ ๋์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด, ๋จผ์ `query_extractor`๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
+
+///
+
+```mermaid
+graph TB
+
+query_extractor(["query_extractor"])
+query_or_cookie_extractor(["query_or_cookie_extractor"])
+
+read_query["/items/"]
+
+query_extractor --> query_or_cookie_extractor --> read_query
+```
+
+## ๊ฐ์ ์์กด์ฑ์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๊ธฐ { #using-the-same-dependency-multiple-times }
+
+๊ฐ์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๋ํด ์์กด์ฑ ์ค ํ๋๊ฐ ์ฌ๋ฌ ๋ฒ ์ ์ธ๋๋ ๊ฒฝ์ฐ(์: ์ฌ๋ฌ ์์กด์ฑ์ด ๊ณตํต ํ์ ์์กด์ฑ์ ๊ฐ๋ ๊ฒฝ์ฐ), **FastAPI**๋ ๊ทธ ํ์ ์์กด์ฑ์ ์์ฒญ๋น ํ ๋ฒ๋ง ํธ์ถํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์์ฒญ์ ๋ํด ๋์ผํ ์์กด์ฑ์ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ ๋์ , ๋ฐํ๊ฐ์ "cache"์ ์ ์ฅํ๊ณ , ๊ทธ ์์ฒญ์์ ํด๋น ๊ฐ์ด ํ์ํ ๋ชจ๋ "dependants"์ ์ ๋ฌํฉ๋๋ค.
+
+๊ณ ๊ธ ์๋๋ฆฌ์ค๋ก, ๊ฐ์ ์์ฒญ์์ "cached" ๊ฐ์ ์ฐ๋ ๋์ ๋งค ๋จ๊ณ๋ง๋ค(์๋ง๋ ์ฌ๋ฌ ๋ฒ) ์์กด์ฑ์ด ํธ์ถ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด, `Depends`๋ฅผ ์ฌ์ฉํ ๋ `use_cache=False` ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค:
+
+//// tab | Python 3.9+
+
+```Python hl_lines="1"
+async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]):
+ return {"fresh_value": fresh_value}
+```
+
+////
+
+//// tab | Python 3.9+ ๋น Annotated
+
+/// tip | ํ
+
+๊ฐ๋ฅํ๋ค๋ฉด `Annotated` ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
+
+///
+
+```Python hl_lines="1"
+async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
+ return {"fresh_value": fresh_value}
+```
+
+////
+
+## ์ ๋ฆฌ { #recap }
+
+์ฌ๊ธฐ์ ์ฌ์ฉํ ๊ทธ๋ด๋ฏํ ์ฉ์ด๋ค์ ์ ์ธํ๋ฉด, **Dependency Injection** ์์คํ
์ ๊ฝค ๋จ์ํฉ๋๋ค.
+
+*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์ ๊ฐ์ ํํ์ ํจ์๋ค์ผ ๋ฟ์
๋๋ค.
+
+ํ์ง๋ง ์ฌ์ ํ ๋งค์ฐ ๊ฐ๋ ฅํ๋ฉฐ, ์์๋ก ๊น๊ฒ ์ค์ฒฉ๋ ์์กด์ฑ "๊ทธ๋ํ"(ํธ๋ฆฌ)๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
+
+/// tip | ํ
+
+์ด ๋จ์ํ ์์๋ง ๋ณด๋ฉด ๊ทธ๋ค์ง ์ ์ฉํด ๋ณด์ด์ง ์์ ์๋ ์์ต๋๋ค.
+
+ํ์ง๋ง **๋ณด์**์ ๊ดํ ์ฑํฐ์์ ์ด๊ฒ์ด ์ผ๋ง๋ ์ ์ฉํ์ง ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค.
+
+๋ํ ์ผ๋ง๋ ๋ง์ ์ฝ๋๋ฅผ ์๊ปด์ฃผ๋์ง๋ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค.
+
+///
diff --git a/docs/ko/docs/tutorial/handling-errors.md b/docs/ko/docs/tutorial/handling-errors.md
new file mode 100644
index 000000000..7cc37e80c
--- /dev/null
+++ b/docs/ko/docs/tutorial/handling-errors.md
@@ -0,0 +1,244 @@
+# ์ค๋ฅ ์ฒ๋ฆฌ { #handling-errors }
+
+API๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ์ค๋ฅ๋ฅผ ์๋ ค์ผ ํ๋ ์ํฉ์ ๋ง์ด ์์ต๋๋ค.
+
+์ด ํด๋ผ์ด์ธํธ๋ ํ๋ก ํธ์๋๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ์ผ ์๋ ์๊ณ , ๋ค๋ฅธ ์ฌ๋์ด ์์ฑํ ์ฝ๋์ผ ์๋ ์๊ณ , IoT ์ฅ์น์ผ ์๋ ์์ต๋๋ค.
+
+ํด๋ผ์ด์ธํธ์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ์๋ ค์ผ ํ ์๋ ์์ต๋๋ค:
+
+* ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์์
์ ์ํํ ์ถฉ๋ถํ ๊ถํ์ด ์์ต๋๋ค.
+* ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
+* ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ทผํ๋ ค๊ณ ํ ํญ๋ชฉ์ด ์กด์ฌํ์ง ์์ต๋๋ค.
+* ๋ฑ๋ฑ.
+
+์ด๋ฐ ๊ฒฝ์ฐ ๋ณดํต **400**๋ฒ๋(400์์ 499) ๋ฒ์์ **HTTP ์ํ ์ฝ๋**๋ฅผ ๋ฐํํฉ๋๋ค.
+
+์ด๋ 200๋ฒ๋ HTTP ์ํ ์ฝ๋(200์์ 299)์ ๋น์ทํฉ๋๋ค. "200" ์ํ ์ฝ๋๋ ์ด๋ค ํํ๋ก๋ ์์ฒญ์ด "์ฑ๊ณต"ํ์์ ์๋ฏธํฉ๋๋ค.
+
+400๋ฒ๋ ์ํ ์ฝ๋๋ ํด๋ผ์ด์ธํธ ์ธก์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ์๋ฏธํฉ๋๋ค.
+
+**"404 Not Found"** ์ค๋ฅ(๊ทธ๋ฆฌ๊ณ ๋๋ด๋ค)๋ ๋ค๋ค ๊ธฐ์ตํ์์ฃ ?
+
+## `HTTPException` ์ฌ์ฉํ๊ธฐ { #use-httpexception }
+
+ํด๋ผ์ด์ธํธ์ ์ค๋ฅ๊ฐ ํฌํจ๋ HTTP ์๋ต์ ๋ฐํํ๋ ค๋ฉด `HTTPException`์ ์ฌ์ฉํฉ๋๋ค.
+
+### `HTTPException` ๊ฐ์ ธ์ค๊ธฐ { #import-httpexception }
+
+{* ../../docs_src/handling_errors/tutorial001_py39.py hl[1] *}
+
+### ์ฝ๋์์ `HTTPException` ๋ฐ์์ํค๊ธฐ { #raise-an-httpexception-in-your-code }
+
+`HTTPException`์ API์ ๊ด๋ จ๋ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ผ๋ฐ์ ์ธ Python ์์ธ์
๋๋ค.
+
+Python ์์ธ์ด๋ฏ๋ก `return` ํ๋ ๊ฒ์ด ์๋๋ผ `raise` ํฉ๋๋ค.
+
+์ด๋ ๋ํ, *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์* ๋ด๋ถ์์ ํธ์ถํ๋ ์ ํธ๋ฆฌํฐ ํจ์ ์์์ `HTTPException`์ `raise`ํ๋ฉด, *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์ ๋๋จธ์ง ์ฝ๋๋ ์คํ๋์ง ์๊ณ ์ฆ์ ํด๋น ์์ฒญ์ด ์ข
๋ฃ๋๋ฉฐ `HTTPException`์ HTTP ์ค๋ฅ๊ฐ ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๋ค๋ ๋ป์
๋๋ค.
+
+๊ฐ์ ๋ฐํํ๋ ๊ฒ๋ณด๋ค ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ์ด์ ์ ์์กด์ฑ๊ณผ ๋ณด์์ ๋ํ ์น์
์์ ๋ ๋ถ๋ช
ํด์ง๋๋ค.
+
+์ด ์์์์๋, ํด๋ผ์ด์ธํธ๊ฐ ์กด์ฌํ์ง ์๋ ID๋ก ํญ๋ชฉ์ ์์ฒญํ๋ฉด ์ํ ์ฝ๋ `404`๋ก ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค:
+
+{* ../../docs_src/handling_errors/tutorial001_py39.py hl[11] *}
+
+### ๊ฒฐ๊ณผ ์๋ต { #the-resulting-response }
+
+ํด๋ผ์ด์ธํธ๊ฐ `http://example.com/items/foo`( `item_id` `"foo"`)๋ฅผ ์์ฒญํ๋ฉด, HTTP ์ํ ์ฝ๋ 200๊ณผ ๋ค์ JSON ์๋ต์ ๋ฐ์ต๋๋ค:
+
+```JSON
+{
+ "item": "The Foo Wrestlers"
+}
+```
+
+ํ์ง๋ง ํด๋ผ์ด์ธํธ๊ฐ `http://example.com/items/bar`(์กด์ฌํ์ง ์๋ `item_id` `"bar"`)๋ฅผ ์์ฒญํ๋ฉด, HTTP ์ํ ์ฝ๋ 404("not found" ์ค๋ฅ)์ ๋ค์ JSON ์๋ต์ ๋ฐ์ต๋๋ค:
+
+```JSON
+{
+ "detail": "Item not found"
+}
+```
+
+/// tip | ํ
+
+`HTTPException`์ ๋ฐ์์ํฌ ๋ `detail` ํ๋ผ๋ฏธํฐ๋ก `str`๋ง ์ ๋ฌํ ์ ์๋ ๊ฒ์ด ์๋๋ผ, JSON์ผ๋ก ๋ณํํ ์ ์๋ ์ด๋ค ๊ฐ์ด๋ ์ ๋ฌํ ์ ์์ต๋๋ค.
+
+`dict`, `list` ๋ฑ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
+
+์ด๋ค์ **FastAPI**๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํด JSON์ผ๋ก ๋ณํํฉ๋๋ค.
+
+///
+
+## ์ปค์คํ
ํค๋ ์ถ๊ฐํ๊ธฐ { #add-custom-headers }
+
+HTTP ์ค๋ฅ์ ์ปค์คํ
ํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฉด ์ ์ฉํ ์ํฉ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํน์ ๋ณด์ ์ ํ์์ ๊ทธ๋ ์ต๋๋ค.
+
+์๋ง ์ฝ๋์์ ์ง์ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์์ ๊ฒ์
๋๋ค.
+
+ํ์ง๋ง ๊ณ ๊ธ ์๋๋ฆฌ์ค์์ ํ์ํ๋ค๋ฉด ์ปค์คํ
ํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/handling_errors/tutorial002_py39.py hl[14] *}
+
+## ์ปค์คํ
์์ธ ํธ๋ค๋ฌ ์ค์นํ๊ธฐ { #install-custom-exception-handlers }
+
+Starlette์ ๋์ผํ ์์ธ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํด ์ปค์คํ
์์ธ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
+
+์ฌ๋ฌ๋ถ(๋๋ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ด `raise`ํ ์ ์๋ ์ปค์คํ
์์ธ `UnicornException`์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ด ์์ธ๋ฅผ FastAPI์์ ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๊ณ ํด๋ด
์๋ค.
+
+`@app.exception_handler()`๋ก ์ปค์คํ
์์ธ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/handling_errors/tutorial003_py39.py hl[5:7,13:18,24] *}
+
+์ฌ๊ธฐ์ `/unicorns/yolo`๋ฅผ ์์ฒญํ๋ฉด, *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ `UnicornException`์ `raise`ํฉ๋๋ค.
+
+ํ์ง๋ง `unicorn_exception_handler`๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
+
+๋ฐ๋ผ์ HTTP ์ํ ์ฝ๋ `418`๊ณผ ๋ค์ JSON ๋ด์ฉ์ ๊ฐ์ง ๊น๋ํ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค:
+
+```JSON
+{"message": "Oops! yolo did something. There goes a rainbow..."}
+```
+
+/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+`from starlette.requests import Request`์ `from starlette.responses import JSONResponse`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
+
+**FastAPI**๋ ๊ฐ๋ฐ์์ ํธ์๋ฅผ ์ํด `starlette.responses`๋ฅผ `fastapi.responses`๋ก๋ ๋์ผํ๊ฒ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ถ๋ถ์ ์๋ต์ Starlette์์ ์ง์ ์ต๋๋ค. `Request`๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
+
+///
+
+## ๊ธฐ๋ณธ ์์ธ ํธ๋ค๋ฌ ์ค๋ฒ๋ผ์ด๋ํ๊ธฐ { #override-the-default-exception-handlers }
+
+**FastAPI**์๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์์ธ ํธ๋ค๋ฌ๊ฐ ์์ต๋๋ค.
+
+์ด ํธ๋ค๋ฌ๋ค์ `HTTPException`์ `raise`ํ์ ๋, ๊ทธ๋ฆฌ๊ณ ์์ฒญ์ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๊ธฐ๋ณธ JSON ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ํฉ๋๋ค.
+
+์ด ์์ธ ํธ๋ค๋ฌ๋ค์ ์ฌ๋ฌ๋ถ์ ๊ฒ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ํ ์ ์์ต๋๋ค.
+
+### ์์ฒญ ๊ฒ์ฆ ์์ธ ์ค๋ฒ๋ผ์ด๋ํ๊ธฐ { #override-request-validation-exceptions }
+
+์์ฒญ์ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋ฉด, **FastAPI**๋ ๋ด๋ถ์ ์ผ๋ก `RequestValidationError`๋ฅผ `raise`ํฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ์ด์ ๋ํ ๊ธฐ๋ณธ ์์ธ ํธ๋ค๋ฌ๋ ํฌํจ๋์ด ์์ต๋๋ค.
+
+์ด๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ ค๋ฉด `RequestValidationError`๋ฅผ ๊ฐ์ ธ์ค๊ณ , `@app.exception_handler(RequestValidationError)`๋ก ์์ธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ฝ๋ ์ดํธํด ์ฌ์ฉํ์ธ์.
+
+์์ธ ํธ๋ค๋ฌ๋ `Request`์ ์์ธ๋ฅผ ๋ฐ์ต๋๋ค.
+
+{* ../../docs_src/handling_errors/tutorial004_py39.py hl[2,14:19] *}
+
+์ด์ `/items/foo`๋ก ์ด๋ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ JSON ์ค๋ฅ ๋์ :
+
+```JSON
+{
+ "detail": [
+ {
+ "loc": [
+ "path",
+ "item_id"
+ ],
+ "msg": "value is not a valid integer",
+ "type": "type_error.integer"
+ }
+ ]
+}
+```
+
+๋ค์๊ณผ ๊ฐ์ ํ
์คํธ ๋ฒ์ ์ ๋ฐ๊ฒ ๋ฉ๋๋ค:
+
+```
+Validation errors:
+Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to parse string as an integer
+```
+
+### `HTTPException` ์ค๋ฅ ํธ๋ค๋ฌ ์ค๋ฒ๋ผ์ด๋ํ๊ธฐ { #override-the-httpexception-error-handler }
+
+๊ฐ์ ๋ฐฉ์์ผ๋ก `HTTPException` ํธ๋ค๋ฌ๋ ์ค๋ฒ๋ผ์ด๋ํ ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด, ์ด๋ฐ ์ค๋ฅ๋ค์ ๋ํด JSON ๋์ ์ผ๋ฐ ํ
์คํธ ์๋ต์ ๋ฐํํ๊ณ ์ถ์ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/handling_errors/tutorial004_py39.py hl[3:4,9:11,25] *}
+
+/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+`from starlette.responses import PlainTextResponse`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
+
+**FastAPI**๋ ๊ฐ๋ฐ์์ ํธ์๋ฅผ ์ํด `starlette.responses`๋ฅผ `fastapi.responses`๋ก๋ ๋์ผํ๊ฒ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ถ๋ถ์ ์๋ต์ Starlette์์ ์ง์ ์ต๋๋ค.
+
+///
+
+/// warning | ๊ฒฝ๊ณ
+
+`RequestValidationError`์๋ ๊ฒ์ฆ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์ผ ์ด๋ฆ๊ณผ ์ค ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ด, ์ํ๋ค๋ฉด ๊ด๋ จ ์ ๋ณด์ ํจ๊ป ๋ก๊ทธ์ ํ์ํ ์ ์๋ค๋ ์ ์ ์ ๋
ํ์ธ์.
+
+ํ์ง๋ง ์ด๋ ๋จ์ํ ๋ฌธ์์ด๋ก ๋ณํํด ๊ทธ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ฉด ์์คํ
์ ๋ํ ์ผ๋ถ ์ ๋ณด๋ฅผ ๋์คํ ์ ์๋ค๋ ๋ป์ด๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์ ์ฝ๋๋ ๊ฐ ์ค๋ฅ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์ถ์ถํด ๋ณด์ฌ์ค๋๋ค.
+
+///
+
+### `RequestValidationError`์ body ์ฌ์ฉํ๊ธฐ { #use-the-requestvalidationerror-body }
+
+`RequestValidationError`์๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ์ ํจ๊ป ๋ฐ์ `body`๊ฐ ํฌํจ๋ฉ๋๋ค.
+
+์ฑ์ ๊ฐ๋ฐํ๋ ๋์ body๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธฐ๊ณ ๋๋ฒ๊ทธํ๊ฑฐ๋, ์ฌ์ฉ์์๊ฒ ๋ฐํํ๋ ๋ฑ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+{* ../../docs_src/handling_errors/tutorial005_py39.py hl[14] *}
+
+์ด์ ๋ค์์ฒ๋ผ ์ ํจํ์ง ์์ item์ ๋ณด๋ด๋ณด์ธ์:
+
+```JSON
+{
+ "title": "towel",
+ "size": "XL"
+}
+```
+
+๋ฐ์ body๋ฅผ ํฌํจํด ๋ฐ์ดํฐ๊ฐ ์ ํจํ์ง ์๋ค๊ณ ์๋ ค์ฃผ๋ ์๋ต์ ๋ฐ๊ฒ ๋ฉ๋๋ค:
+
+```JSON hl_lines="12-15"
+{
+ "detail": [
+ {
+ "loc": [
+ "body",
+ "size"
+ ],
+ "msg": "value is not a valid integer",
+ "type": "type_error.integer"
+ }
+ ],
+ "body": {
+ "title": "towel",
+ "size": "XL"
+ }
+}
+```
+
+#### FastAPI์ `HTTPException` vs Starlette์ `HTTPException` { #fastapis-httpexception-vs-starlettes-httpexception }
+
+**FastAPI**์๋ ์์ฒด `HTTPException`์ด ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ **FastAPI**์ `HTTPException` ์ค๋ฅ ํด๋์ค๋ Starlette์ `HTTPException` ์ค๋ฅ ํด๋์ค๋ฅผ ์์ํฉ๋๋ค.
+
+์ ์ผํ ์ฐจ์ด๋ **FastAPI**์ `HTTPException`์ `detail` ํ๋์ JSON์ผ๋ก ๋ณํ ๊ฐ๋ฅํ ์ด๋ค ๋ฐ์ดํฐ๋ ๋ฐ์ ์ ์๋ ๋ฐ๋ฉด, Starlette์ `HTTPException`์ ๋ฌธ์์ด๋ง ๋ฐ์ ์ ์๋ค๋ ์ ์
๋๋ค.
+
+๋ฐ๋ผ์ ์ฝ๋์์๋ ํ์์ฒ๋ผ **FastAPI**์ `HTTPException`์ ๊ณ์ `raise`ํ๋ฉด ๋ฉ๋๋ค.
+
+ํ์ง๋ง ์์ธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ ๋๋ Starlette์ `HTTPException`์ ๋ํด ๋ฑ๋กํด์ผ ํฉ๋๋ค.
+
+์ด๋ ๊ฒ ํ๋ฉด Starlette ๋ด๋ถ ์ฝ๋์ ์ด๋ค ๋ถ๋ถ, ๋๋ Starlette ํ์ฅ/ํ๋ฌ๊ทธ์ธ์ด Starlette `HTTPException`์ `raise`ํ๋๋ผ๋, ์ฌ๋ฌ๋ถ์ ํธ๋ค๋ฌ๊ฐ ์ด๋ฅผ ์ก์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
+
+์ด ์์์์๋ ๋์ผํ ์ฝ๋์์ ๋ `HTTPException`์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋๋ก, Starlette์ ์์ธ๋ฅผ `StarletteHTTPException`์ผ๋ก ์ด๋ฆ์ ๋ฐ๊ฟ๋๋ค:
+
+```Python
+from starlette.exceptions import HTTPException as StarletteHTTPException
+```
+
+### **FastAPI**์ ์์ธ ํธ๋ค๋ฌ ์ฌ์ฌ์ฉํ๊ธฐ { #reuse-fastapis-exception-handlers }
+
+์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด์ **FastAPI**์ ๋์ผํ ๊ธฐ๋ณธ ์์ธ ํธ๋ค๋ฌ๋ ํจ๊ป ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, `fastapi.exception_handlers`์์ ๊ธฐ๋ณธ ์์ธ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+{* ../../docs_src/handling_errors/tutorial006_py39.py hl[2:5,15,21] *}
+
+์ด ์์์์๋ ๋งค์ฐ ํํ๋ ฅ ์๋ ๋ฉ์์ง๋ก ์ค๋ฅ๋ฅผ ์ถ๋ ฅ๋ง ํ๊ณ ์์ง๋ง, ์์ง๋ ์ดํดํ์
จ์ ๊ฒ๋๋ค. ์์ธ๋ฅผ ์ฌ์ฉํ ๋ค ๊ธฐ๋ณธ ์์ธ ํธ๋ค๋ฌ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
diff --git a/docs/ko/docs/tutorial/security/first-steps.md b/docs/ko/docs/tutorial/security/first-steps.md
new file mode 100644
index 000000000..4c9181b31
--- /dev/null
+++ b/docs/ko/docs/tutorial/security/first-steps.md
@@ -0,0 +1,203 @@
+# ๋ณด์ - ์ฒซ ๋จ๊ณ { #security-first-steps }
+
+์ด๋ค ๋๋ฉ์ธ์ **backend** API๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋๋ฉ์ธ์ **frontend**๊ฐ ์๊ฑฐ๋, ๊ฐ์ ๋๋ฉ์ธ์ ๋ค๋ฅธ ๊ฒฝ๋ก์ ์๊ฑฐ๋(๋๋ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์๋ ์์ต๋๋ค).
+
+๊ทธ๋ฆฌ๊ณ frontend๊ฐ **username**๊ณผ **password**๋ฅผ ์ฌ์ฉํด backend์ ์ธ์ฆํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๊ณ ํด๋ด
์๋ค.
+
+**FastAPI**์ ํจ๊ป **OAuth2**๋ฅผ ์ฌ์ฉํด์ ์ด๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ํ์ํ ์์ ์ ๋ณด ์กฐ๊ฐ๋ค์ ์ฐพ๊ธฐ ์ํด ๊ธธ๊ณ ๊ธด ์ ์ฒด ์คํ์ ์ฝ๋๋ผ ์๊ฐ์ ์ฐ์ง ์๋๋ก ํ๊ฒ ์ต๋๋ค.
+
+๋ณด์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด **FastAPI**๊ฐ ์ ๊ณตํ๋ ๋๊ตฌ๋ค์ ์ฌ์ฉํด ๋ด
์๋ค.
+
+## ์ด๋ป๊ฒ ๋ณด์ด๋์ง { #how-it-looks }
+
+๋จผ์ ์ฝ๋๋ฅผ ๊ทธ๋ฅ ์ฌ์ฉํด์ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ณด๊ณ , ๊ทธ๋ค์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ์ดํดํ๋ฌ ๋ค์ ๋์์ค๊ฒ ์ต๋๋ค.
+
+## `main.py` ๋ง๋ค๊ธฐ { #create-main-py }
+
+์์ ๋ฅผ ํ์ผ `main.py`์ ๋ณต์ฌํ์ธ์:
+
+{* ../../docs_src/security/tutorial001_an_py39.py *}
+
+## ์คํํ๊ธฐ { #run-it }
+
+/// info | ์ ๋ณด
+
+`python-multipart` ํจํค์ง๋ `pip install "fastapi[standard]"` ๋ช
๋ น์ ์คํํ๋ฉด **FastAPI**์ ํจ๊ป ์๋์ผ๋ก ์ค์น๋ฉ๋๋ค.
+
+ํ์ง๋ง `pip install fastapi` ๋ช
๋ น์ ์ฌ์ฉํ๋ฉด `python-multipart` ํจํค์ง๊ฐ ๊ธฐ๋ณธ์ผ๋ก ํฌํจ๋์ง ์์ต๋๋ค.
+
+์๋์ผ๋ก ์ค์นํ๋ ค๋ฉด, [๊ฐ์ ํ๊ฒฝ](../../virtual-environments.md){.internal-link target=_blank}์ ๋ง๋ค๊ณ ํ์ฑํํ ๋ค์, ์๋๋ก ์ค์นํ์ธ์:
+
+```console
+$ pip install python-multipart
+```
+
+์ด๋ **OAuth2**๊ฐ `username`๊ณผ `password`๋ฅผ ๋ณด๋ด๊ธฐ ์ํด "form data"๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+///
+
+๋ค์์ผ๋ก ์์ ๋ฅผ ์คํํ์ธ์:
+
+
+
+/// check | Authorize ๋ฒํผ!
+
+๋ฐ์ง์ด๋ ์ "Authorize" ๋ฒํผ์ด ์ด๋ฏธ ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์๋ ์ค๋ฅธ์ชฝ ์๋จ์ ํด๋ฆญํ ์ ์๋ ์์ ์๋ฌผ์ ๊ฐ ์์ต๋๋ค.
+
+///
+
+๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํด๋ฆญํ๋ฉด `username`๊ณผ `password`(๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ ํ์ ํ๋๋ค)๋ฅผ ์
๋ ฅํ ์ ์๋ ์์ ์ธ์ฆ ํผ์ด ๋ํ๋ฉ๋๋ค:
+
+
+
+/// note | ์ฐธ๊ณ
+
+ํผ์ ๋ฌด์์ ์
๋ ฅํ๋ ์์ง์ ๋์ํ์ง ์์ต๋๋ค. ํ์ง๋ง ๊ณง ์ฌ๊ธฐ๊น์ง ๊ตฌํํ ๊ฒ์
๋๋ค.
+
+///
+
+๋ฌผ๋ก ์ด๊ฒ์ ์ต์ข
์ฌ์ฉ์๋ฅผ ์ํ frontend๋ ์๋์ง๋ง, ๋ชจ๋ API๋ฅผ ๋ํํ์ผ๋ก ๋ฌธ์ํํ๋ ํ๋ฅญํ ์๋ ๋๊ตฌ์
๋๋ค.
+
+frontend ํ(๊ทธ๊ฒ ๋ณธ์ธ์ผ ์๋ ์์ต๋๋ค)์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+์๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์์คํ
์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋์ผํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฒ๊ทธํ๊ณ , ํ์ธํ๊ณ , ํ
์คํธํ๊ธฐ ์ํด ๋ณธ์ธ์ด ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
+
+## `password` ํ๋ก์ฐ { #the-password-flow }
+
+์ด์ ์กฐ๊ธ ๋์๊ฐ์ ์ด๊ฒ๋ค์ด ๋ฌด์์ธ์ง ์ดํดํด ๋ด
์๋ค.
+
+`password` "flow"๋ ๋ณด์๊ณผ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด OAuth2์์ ์ ์ํ ์ฌ๋ฌ ๋ฐฉ์("flows") ์ค ํ๋์
๋๋ค.
+
+OAuth2๋ backend ๋๋ API๊ฐ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ ์๋ฒ์ ๋
๋ฆฝ์ ์ผ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
+
+ํ์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ๊ฐ์ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์ด API์ ์ธ์ฆ์ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค.
+
+๋ฐ๋ผ์, ๋จ์ํ๋ ๊ด์ ์์ ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด:
+
+* ์ฌ์ฉ์๊ฐ frontend์์ `username`๊ณผ `password`๋ฅผ ์
๋ ฅํ๊ณ `Enter`๋ฅผ ๋๋ฆ
๋๋ค.
+* frontend(์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋จ)๋ ํด๋น `username`๊ณผ `password`๋ฅผ ์ฐ๋ฆฌ API์ ํน์ URL๋ก ๋ณด๋
๋๋ค(`tokenUrl="token"`๋ก ์ ์ธ๋จ).
+* API๋ `username`๊ณผ `password`๋ฅผ ํ์ธํ๊ณ "token"์ผ๋ก ์๋ตํฉ๋๋ค(์์ง ์๋ฌด๊ฒ๋ ๊ตฌํํ์ง ์์์ต๋๋ค).
+ * "token"์ ๋์ค์ ์ด ์ฌ์ฉ์๋ฅผ ๊ฒ์ฆํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ด๋ค ๋ด์ฉ์ด ๋ด๊ธด ๋ฌธ์์ด์ผ ๋ฟ์
๋๋ค.
+ * ๋ณดํต token์ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ง๋ฃ๋๋๋ก ์ค์ ํฉ๋๋ค.
+ * ๊ทธ๋์ ์ฌ์ฉ์๋ ๋์ค์ ์ด๋ ์์ ์ ๋ค์ ๋ก๊ทธ์ธํด์ผ ํฉ๋๋ค.
+ * ๊ทธ๋ฆฌ๊ณ token์ด ๋๋๋นํ๋๋ผ๋ ์ํ์ด ๋ ๋ฎ์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๊ตฌ์ ์ผ๋ก ํญ์ ๋์ํ๋ ํค์๋ ๋ค๋ฆ
๋๋ค.
+* frontend๋ ๊ทธ token์ ์์๋ก ์ด๋๊ฐ์ ์ ์ฅํฉ๋๋ค.
+* ์ฌ์ฉ์๊ฐ frontend์์ ํด๋ฆญํด์ frontend ์น ์ฑ์ ๋ค๋ฅธ ์น์
์ผ๋ก ์ด๋ํฉ๋๋ค.
+* frontend๋ API์์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
+ * ํ์ง๋ง ๊ทธ ํน์ endpoint์๋ ์ธ์ฆ์ด ํ์ํฉ๋๋ค.
+ * ๊ทธ๋์ ์ฐ๋ฆฌ API์ ์ธ์ฆํ๊ธฐ ์ํด `Authorization` ํค๋๋ฅผ, ๊ฐ์ `Bearer `์ token์ ๋ํ ํํ๋ก ๋ณด๋
๋๋ค.
+ * token์ `foobar`๊ฐ ๋ค์ด ์๋ค๋ฉด `Authorization` ํค๋์ ๋ด์ฉ์ `Bearer foobar`๊ฐ ๋ฉ๋๋ค.
+
+## **FastAPI**์ `OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer }
+
+**FastAPI**๋ ์ด๋ฐ ๋ณด์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด, ์๋ก ๋ค๋ฅธ ์ถ์ํ ์์ค์์ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+์ด ์์ ์์๋ **OAuth2**์ **Password** ํ๋ก์ฐ์ **Bearer** token์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ์ํด `OAuth2PasswordBearer` ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+/// info | ์ ๋ณด
+
+"bearer" token๋ง์ด ์ ์ผํ ์ ํ์ง๋ ์๋๋๋ค.
+
+ํ์ง๋ง ์ด ์ฌ์ฉ ์ฌ๋ก์๋ ๊ฐ์ฅ ์ ํฉํ ์ ํ์
๋๋ค.
+
+๋ํ OAuth2 ์ ๋ฌธ๊ฐ๋ก์ ์ ๋ค๋ฅธ ์ต์
์ด ๋ ์ ํฉํ์ง ์ ํํ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด, ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์๋ ๊ฐ์ฅ ์ ํฉํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
+
+๊ทธ๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ํด์๋ **FastAPI**๋ ์ด๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+///
+
+`OAuth2PasswordBearer` ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ `tokenUrl` ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด ํ๋ผ๋ฏธํฐ์๋ ํด๋ผ์ด์ธํธ(์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ frontend)๊ฐ token์ ๋ฐ๊ธฐ ์ํด `username`๊ณผ `password`๋ฅผ ๋ณด๋ผ URL์ด ๋ค์ด ์์ต๋๋ค.
+
+{* ../../docs_src/security/tutorial001_an_py39.py hl[8] *}
+
+/// tip | ํ
+
+์ฌ๊ธฐ์ `tokenUrl="token"`์ ์์ง ๋ง๋ค์ง ์์ ์๋ URL `token`์ ๊ฐ๋ฆฌํต๋๋ค. ์๋ URL์ด๋ฏ๋ก `./token`๊ณผ ๋์ผํฉ๋๋ค.
+
+์๋ URL์ ์ฌ์ฉํ๋ฏ๋ก, ์๋ฅผ ๋ค์ด API๊ฐ `https://example.com/`์ ์๋ค๋ฉด `https://example.com/token`์ ๊ฐ๋ฆฌํต๋๋ค. ํ์ง๋ง API๊ฐ `https://example.com/api/v1/`์ ์๋ค๋ฉด `https://example.com/api/v1/token`์ ๊ฐ๋ฆฌํต๋๋ค.
+
+์๋ URL์ ์ฌ์ฉํ๋ ๊ฒ์ [ํ๋ก์ ๋ค์์](../../advanced/behind-a-proxy.md){.internal-link target=_blank} ๊ฐ์ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก์์๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ณ์ ๋์ํ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
+
+///
+
+์ด ํ๋ผ๋ฏธํฐ๋ ๊ทธ endpoint / *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๋ง๋ค์ง๋ ์์ง๋ง, URL `/token`์ด ํด๋ผ์ด์ธํธ๊ฐ token์ ์ป๊ธฐ ์ํด ์ฌ์ฉํด์ผ ํ URL์ด๋ผ๊ณ ์ ์ธํฉ๋๋ค. ์ด ์ ๋ณด๋ OpenAPI์ ์ฌ์ฉ๋๊ณ , ์ด์ด์ ๋ํํ API ๋ฌธ์ ์์คํ
์์๋ ์ฌ์ฉ๋ฉ๋๋ค.
+
+๊ณง ์ค์ ๊ฒฝ๋ก ์ฒ๋ฆฌ๋ฅผ ๋ง๋ค ๊ฒ์
๋๋ค.
+
+/// info | ์ ๋ณด
+
+์๊ฒฉํ "Pythonista"๋ผ๋ฉด `token_url` ๋์ `tokenUrl` ๊ฐ์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ ์คํ์ผ์ด ๋ง์์ ๋ค์ง ์์ ์๋ ์์ต๋๋ค.
+
+์ด๋ OpenAPI ์คํ์์ ์ฌ์ฉํ๋ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ๋ง์ถ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋์ ์ด๋ฐ ๋ณด์ ์คํด์ ๋ํด ๋ ์กฐ์ฌํด์ผ ํ ๋, ๊ทธ๋๋ก ๋ณต์ฌํด์ ๋ถ์ฌ ๋ฃ์ด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
+
+///
+
+`oauth2_scheme` ๋ณ์๋ `OAuth2PasswordBearer`์ ์ธ์คํด์ค์ด์ง๋ง, "callable"์ด๊ธฐ๋ ํฉ๋๋ค.
+
+๋ค์์ฒ๋ผ ํธ์ถ๋ ์ ์์ต๋๋ค:
+
+```Python
+oauth2_scheme(some, parameters)
+```
+
+๋ฐ๋ผ์ `Depends`์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+### ์ฌ์ฉํ๊ธฐ { #use-it }
+
+์ด์ `Depends`๋ก `oauth2_scheme`๋ฅผ ์์กด์ฑ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
+
+{* ../../docs_src/security/tutorial001_an_py39.py hl[12] *}
+
+์ด ์์กด์ฑ์ `str`์ ์ ๊ณตํ๊ณ , ๊ทธ ๊ฐ์ *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์ ํ๋ผ๋ฏธํฐ `token`์ ํ ๋น๋ฉ๋๋ค.
+
+**FastAPI**๋ ์ด ์์กด์ฑ์ ์ฌ์ฉํด OpenAPI ์คํค๋ง(๋ฐ ์๋ API ๋ฌธ์)์ "security scheme"๋ฅผ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋ฉ๋๋ค.
+
+/// info | ๊ธฐ์ ์ธ๋ถ์ฌํญ
+
+**FastAPI**๋ (์์กด์ฑ์ ์ ์ธ๋) `OAuth2PasswordBearer` ํด๋์ค๋ฅผ ์ฌ์ฉํด OpenAPI์์ ๋ณด์ ์คํด์ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ด๋ `OAuth2PasswordBearer`๊ฐ `fastapi.security.oauth2.OAuth2`๋ฅผ ์์ํ๊ณ , ์ด๊ฒ์ด ๋ค์ `fastapi.security.base.SecurityBase`๋ฅผ ์์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+OpenAPI(๋ฐ ์๋ API ๋ฌธ์)์ ํตํฉ๋๋ ๋ชจ๋ ๋ณด์ ์ ํธ๋ฆฌํฐ๋ `SecurityBase`๋ฅผ ์์ํ๋ฉฐ, ๊ทธ๋์ **FastAPI**๊ฐ ์ด๋ฅผ OpenAPI์ ์ด๋ป๊ฒ ํตํฉํ ์ง ์ ์ ์์ต๋๋ค.
+
+///
+
+## ๋ฌด์์ ํ๋์ง { #what-it-does }
+
+์์ฒญ์์ `Authorization` ํค๋๋ฅผ ์ฐพ์, ๊ฐ์ด `Bearer `์ ์ด๋ค token์ด ๋ถ์ ํํ์ธ์ง ํ์ธํ ๋ค, ๊ทธ token์ `str`๋ก ๋ฐํํฉ๋๋ค.
+
+`Authorization` ํค๋๊ฐ ์๊ฑฐ๋, ๊ฐ์ `Bearer ` token์ด ์๋ค๋ฉด, ๊ณง๋ฐ๋ก 401 ์ํ ์ฝ๋ ์ค๋ฅ(`UNAUTHORIZED`)๋ก ์๋ตํฉ๋๋ค.
+
+์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ํด token์ด ์กด์ฌํ๋์ง ์ง์ ํ์ธํ ํ์์กฐ์ฐจ ์์ต๋๋ค. ํจ์๊ฐ ์คํ๋์๋ค๋ฉด ๊ทธ token์๋ `str`์ด ๋ค์ด ์๋ค๊ณ ํ์ ํ ์ ์์ต๋๋ค.
+
+๋ํํ ๋ฌธ์์์ ์ด๋ฏธ ์๋ํด ๋ณผ ์ ์์ต๋๋ค:
+
+
+
+์์ง token์ ์ ํจ์ฑ์ ๊ฒ์ฆํ์ง ์์ง๋ง, ์ด๊ฒ๋ง์ผ๋ก๋ ์์์ ๋ ์
์
๋๋ค.
+
+## ์์ฝ { #recap }
+
+์ฆ, ์ถ๊ฐ๋ก 3~4์ค๋ง์ผ๋ก๋ ์ด๋ฏธ ์์์ ์ธ ํํ์ ๋ณด์์ ๊ฐ์ถ๊ฒ ๋ฉ๋๋ค.
diff --git a/docs/ko/docs/tutorial/security/index.md b/docs/ko/docs/tutorial/security/index.md
new file mode 100644
index 000000000..2320b0657
--- /dev/null
+++ b/docs/ko/docs/tutorial/security/index.md
@@ -0,0 +1,106 @@
+# ๋ณด์ { #security }
+
+๋ณด์, ์ธ์ฆ(authentication), ์ธ๊ฐ(authorization)๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋ค์ํฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋ณดํต ๋ณต์กํ๊ณ "์ด๋ ค์ด" ์ฃผ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
+
+๋ง์ ํ๋ ์์ํฌ์ ์์คํ
์์ ๋ณด์๊ณผ ์ธ์ฆ๋ง ์ฒ๋ฆฌํ๋ ๋ฐ๋ ํฐ ๋
ธ๋ ฅ๊ณผ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค(๋ง์ ๊ฒฝ์ฐ ์์ฑ๋ ์ ์ฒด ์ฝ๋์ 50% ์ด์์ด ๋ ์๋ ์์ต๋๋ค).
+
+**FastAPI**๋ ๋ชจ๋ ๋ณด์ ๋ช
์ธ๋ฅผ ์ ๋ถ ๊ณต๋ถํ๊ณ ๋ฐฐ์ธ ํ์ ์์ด, ํ์ค์ ์ธ ๋ฐฉ์์ผ๋ก ์ฝ๊ณ ๋น ๋ฅด๊ฒ **๋ณด์(Security)** ์ ๋ค๋ฃฐ ์ ์๋๋ก ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+ํ์ง๋ง ๋จผ์ , ๋ช ๊ฐ์ง ์์ ๊ฐ๋
์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
+
+## ๊ธํ์ ๊ฐ์? { #in-a-hurry }
+
+์ด ์ฉ์ด๋ค์ ๊ด์ฌ์ด ์๊ณ ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํ ๋ณด์์ *์ง๊ธ ๋น์ฅ* ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ค๋ฉด, ๋ค์ ์ฅ๋ค๋ก ๋์ด๊ฐ์ธ์.
+
+## OAuth2 { #oauth2 }
+
+OAuth2๋ ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ๋ช
์ธ์
๋๋ค.
+
+์๋นํ ๋ฐฉ๋ํ ๋ช
์ธ์ด๋ฉฐ ์ฌ๋ฌ ๋ณต์กํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
+
+"์ 3์"๋ฅผ ์ฌ์ฉํด ์ธ์ฆํ๋ ๋ฐฉ๋ฒ๋ ํฌํจํฉ๋๋ค.
+
+๋ฐ๋ก `"Facebook, Google, X (Twitter), GitHub๋ก ๋ก๊ทธ์ธ"` ๊ฐ์ ์์คํ
๋ค์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์
๋๋ค.
+
+### OAuth 1 { #oauth-1 }
+
+OAuth 1๋ ์์๋๋ฐ, ์ด๋ OAuth2์ ๋งค์ฐ ๋ค๋ฅด๊ณ ํต์ ์ ์ํธํํ๋ ๋ฐฉ๋ฒ๊น์ง ์ง์ ๋ช
์ธ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋ ๋ณต์กํ์ต๋๋ค.
+
+์์ฆ์๋ ๊ทธ๋ค์ง ์ธ๊ธฐ ์๊ฑฐ๋ ์ฌ์ฉ๋์ง๋ ์์ต๋๋ค.
+
+OAuth2๋ ํต์ ์ ์ด๋ป๊ฒ ์ํธํํ ์ง๋ ๋ช
์ธํ์ง ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ด HTTPS๋ก ์ ๊ณต๋ ๊ฒ์ ๊ธฐ๋ํฉ๋๋ค.
+
+/// tip | ํ
+
+**๋ฐฐํฌ**์ ๋ํ ์น์
์์ Traefik๊ณผ Let's Encrypt๋ฅผ ์ฌ์ฉํด ๋ฌด๋ฃ๋ก HTTPS๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณผ ์ ์์ต๋๋ค.
+
+///
+
+## OpenID Connect { #openid-connect }
+
+OpenID Connect๋ **OAuth2**๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ ๋ค๋ฅธ ๋ช
์ธ์
๋๋ค.
+
+OAuth2์์ ๋น๊ต์ ๋ชจํธํ ๋ถ๋ถ์ ์ผ๋ถ ๊ตฌ์ฒดํํ์ฌ ์ํธ ์ด์ฉ์ฑ์ ๋์ด๋ ค๋ ํ์ฅ์
๋๋ค.
+
+์๋ฅผ ๋ค์ด, Google ๋ก๊ทธ์ธ์ OpenID Connect๋ฅผ ์ฌ์ฉํฉ๋๋ค(๋ด๋ถ์ ์ผ๋ก๋ OAuth2๋ฅผ ์ฌ์ฉ).
+
+ํ์ง๋ง Facebook ๋ก๊ทธ์ธ์ OpenID Connect๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ์์ฒด์ ์ธ ๋ณํ์ OAuth2๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+### OpenID("OpenID Connect"๊ฐ ์๋) { #openid-not-openid-connect }
+
+"OpenID"๋ผ๋ ๋ช
์ธ๋ ์์์ต๋๋ค. ์ด๋ **OpenID Connect**์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ์ง๋ง, OAuth2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์์์ต๋๋ค.
+
+๋ฐ๋ผ์ ์์ ํ ๋ณ๋์ ์ถ๊ฐ ์์คํ
์ด์์ต๋๋ค.
+
+์์ฆ์๋ ๊ทธ๋ค์ง ์ธ๊ธฐ ์๊ฑฐ๋ ์ฌ์ฉ๋์ง๋ ์์ต๋๋ค.
+
+## OpenAPI { #openapi }
+
+OpenAPI(์ด์ ์๋ Swagger๋ก ์๋ ค์ง)๋ API๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ณต๊ฐ ๋ช
์ธ์
๋๋ค(ํ์ฌ Linux Foundation์ ์ผ๋ถ).
+
+**FastAPI**๋ **OpenAPI**๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
+
+์ด ๋๋ถ์ ์ฌ๋ฌ ์๋ ๋ํํ ๋ฌธ์ ์ธํฐํ์ด์ค, ์ฝ๋ ์์ฑ ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+OpenAPI์๋ ์ฌ๋ฌ ๋ณด์ "scheme"์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
+
+์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ํํ ๋ฌธ์ ์์คํ
์ ํฌํจํด, ํ์ค ๊ธฐ๋ฐ ๋๊ตฌ๋ค์ ๋ชจ๋ ํ์ฉํ ์ ์์ต๋๋ค.
+
+OpenAPI๋ ๋ค์ ๋ณด์ scheme๋ค์ ์ ์ํฉ๋๋ค:
+
+* `apiKey`: ๋ค์์์ ์ ๋ฌ๋ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฉ ํค:
+ * ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
+ * ํค๋
+ * ์ฟ ํค
+* `http`: ํ์ค HTTP ์ธ์ฆ ์์คํ
, ์:
+ * `bearer`: `Authorization` ํค๋์ `Bearer ` + ํ ํฐ ๊ฐ์ ๋ฃ๋ ๋ฐฉ์. OAuth2์์ ์ ๋ํ์ต๋๋ค.
+ * HTTP Basic ์ธ์ฆ
+ * HTTP Digest ๋ฑ
+* `oauth2`: ๋ณด์์ ์ฒ๋ฆฌํ๋ ๋ชจ๋ OAuth2 ๋ฐฉ์(์ด๋ฅผ "flow"๋ผ๊ณ ๋ถ๋ฆ
๋๋ค).
+ * ์ด flow๋ค ์ค ์ฌ๋ฌ ๊ฐ๋ OAuth 2.0 ์ธ์ฆ ์ ๊ณต์(์: Google, Facebook, X (Twitter), GitHub ๋ฑ)๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉํฉ๋๋ค:
+ * `implicit`
+ * `clientCredentials`
+ * `authorizationCode`
+ * ํ์ง๋ง ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ง์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์๋ฒฝํ๊ฒ ์ฌ์ฉํ ์ ์๋ ํน์ "flow"๋ ํ๋ ์์ต๋๋ค:
+ * `password`: ๋ค์ ์ฅ๋ค์์ ์ด์ ๋ํ ์์๋ฅผ ๋ค๋ฃน๋๋ค.
+* `openIdConnect`: OAuth2 ์ธ์ฆ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ํ์(discover)ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
+ * ์ด ์๋ ํ์์ OpenID Connect ๋ช
์ธ์์ ์ ์๋ฉ๋๋ค.
+
+
+/// tip | ํ
+
+Google, Facebook, X (Twitter), GitHub ๋ฑ ๋ค๋ฅธ ์ธ์ฆ/์ธ๊ฐ ์ ๊ณต์๋ฅผ ํตํฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ ๋น๊ต์ ์ฝ์ต๋๋ค.
+
+๊ฐ์ฅ ๋ณต์กํ ๋ฌธ์ ๋ ๊ทธ๋ฐ ์ธ์ฆ/์ธ๊ฐ ์ ๊ณต์ ์์ฒด๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด์ง๋ง, **FastAPI**๋ ์ด๋ ค์ด ์์
์ ๋์ ์ฒ๋ฆฌํด ์ฃผ๋ฉด์ ์ด๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+///
+
+## **FastAPI** ์ ํธ๋ฆฌํฐ { #fastapi-utilities }
+
+FastAPI๋ `fastapi.security` ๋ชจ๋์์ ๊ฐ ๋ณด์ scheme์ ๋ํ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ฌํ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
+
+๋ค์ ์ฅ๋ค์์๋ **FastAPI**๊ฐ ์ ๊ณตํ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด API์ ๋ณด์์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค.
+
+๋ํ ๋ํํ ๋ฌธ์ ์์คํ
์ ์ด๋ป๊ฒ ์๋์ผ๋ก ํตํฉ๋๋์ง๋ ํ์ธํ๊ฒ ๋ฉ๋๋ค.
diff --git a/docs/pt/llm-prompt.md b/docs/pt/llm-prompt.md
index 3f5208e91..dd72e8d16 100644
--- a/docs/pt/llm-prompt.md
+++ b/docs/pt/llm-prompt.md
@@ -10,6 +10,26 @@ Keep existing translations as they are if the term is already translated.
When translating documentation into Portuguese, use neutral and widely understandable language. Although Portuguese originated in Portugal and has its largest number of speakers in Brazil, it is also an official language in several countries and regions, such as Equatorial Guinea, Mozambique, Angola, Cape Verde, and Sรฃo Tomรฉ and Prรญncipe. Avoid words or expressions that are specific to a single country or region.
+Only keep parentheses if they exist in the source text. Do not add parentheses to terms that do not have them.
+
+### Avoiding Repetition in Translation
+
+When translating sentences, avoid unnecessary repetition of words or phrases that are implied in context.
+- Merge repeated words naturally while keeping the meaning.
+- Do **not** introduce extra words to replace repeated phrases unnecessarily.
+- Keep translations fluent and concise, but maintain the original meaning.
+
+**Example:**
+
+Source:
+Let's see how that works and how to change it if you need to do that.
+
+Avoid translating literally as:
+Vamos ver como isso funciona e como alterar isso se vocรช precisar fazer isso.
+
+Better translation:
+Vamos ver como isso funciona e como alterar se vocรช precisar.
+
---
For the next terms, use the following translations:
@@ -22,10 +42,11 @@ For the next terms, use the following translations:
* /// note: /// note | Nota
* /// tip: /// tip | Dica
* /// warning: /// warning | Atenรงรฃo
-* (you should): (vocรช deveria)
+* you should: vocรช deveria
* async context manager: gerenciador de contexto assรญncrono
* autocomplete: autocompletar
* autocompletion: preenchimento automรกtico
+* auto-completion: preenchimento automรกtico
* bug: bug
* context manager: gerenciador de contexto
* cross domain: cross domain (do not translate to "domรญnio cruzado")
diff --git a/scripts/docs.py b/scripts/docs.py
index c350ee831..20bf1c168 100644
--- a/scripts/docs.py
+++ b/scripts/docs.py
@@ -130,14 +130,9 @@ def new_lang(lang: str = typer.Argument(..., callback=lang_callback)):
new_path.mkdir()
new_config_path: Path = Path(new_path) / mkdocs_name
new_config_path.write_text("INHERIT: ../en/mkdocs.yml\n", encoding="utf-8")
- new_config_docs_path: Path = new_path / "docs"
- new_config_docs_path.mkdir()
- en_index_path: Path = en_docs_path / "docs" / "index.md"
- new_index_path: Path = new_config_docs_path / "index.md"
- en_index_content = en_index_path.read_text(encoding="utf-8")
- new_index_content = f"{missing_translation_snippet}\n\n{en_index_content}"
- new_index_path.write_text(new_index_content, encoding="utf-8")
- typer.secho(f"Successfully initialized: {new_path}", color=typer.colors.GREEN)
+ new_llm_prompt_path: Path = new_path / "llm-prompt.md"
+ new_llm_prompt_path.write_text("", encoding="utf-8")
+ print(f"Successfully initialized: {new_path}")
update_languages()