--- /dev/null
+---
+hide:
+ - navigation
+---
+
+# κΈ°λ₯
+
+## FastAPIμ κΈ°λ₯
+
+**FastAPI**λ λ€μκ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€:
+
+### κ°λ°©ν νμ€μ κΈ°λ°μΌλ‘
+
+* <abbr title="μλν¬μΈνΈ, λΌμ°νΈλ‘λ μλ €μ Έ μμ΅λλ€">κ²½λ‘</abbr><abbr title="POST, GET, PUT, DELETEμ κ°μ HTTP λ©μλλ‘ μλ €μ Έ μμ΅λλ€">μλ</abbr>, λ§€κ°λ³μ, λ³Έλ¬Έ μμ², 보μ κ·Έ μΈμ μ μΈμ ν¬ν¨ν API μμ±μ μν <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a>
+* <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (OpenAPI μμ²΄κ° JSON Schemaλ₯Ό κΈ°λ°μΌλ‘ νκ³ μμ΅λλ€)λ₯Ό μ¬μ©ν μλ λ°μ΄ν° λͺ¨λΈ λ¬Έμν.
+* λ¨μν λ μ¬λ €μ λ§λΆμΈ κΈ°λ₯μ΄ μλλλ€. μΈμ¬ν κ²ν λ₯Ό κ±°μΉ ν, μ΄λ¬ν νμ€μ κΈ°λ°μΌλ‘ μ€κ³λμμ΅λλ€.
+* μ΄λ λν λ€μν μΈμ΄λ‘ μλμ μΈ **ν΄λΌμ΄μΈνΈ μ½λ μμ±**μ μ¬μ©ν μ μκ² μ§μν©λλ€.
+
+### λ¬Έμ μλν
+
+λνν API λ¬Έμμ μΉ νμ μ μ μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€. νλ μμν¬κ° OpenAPIλ₯Ό κΈ°λ°μΌλ‘ νκΈ°μ, 2κ°μ§ μ΅μ
μ΄ κΈ°λ³Έμ μΌλ‘ λ€μ΄κ° μ¬λ¬ μ΅μ
μ΄ μ‘΄μ¬ν©λλ€.
+
+* λνν νμ <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>λ₯Ό μ΄μ©ν΄, λΈλΌμ°μ μμ λ°λ‘ μ¬λ¬λΆμ APIλ₯Ό νΈμΆνκ±°λ ν
μ€νΈν μ μμ΅λλ€.
+
+
+
+* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>μ μ΄μ©ν΄ API λ¬Έμνλ₯Ό λ체ν μ μμ΅λλ€.
+
+
+
+### κ·Έμ νλ νμ΄μ¬
+
+(Pydantic λλΆμ) FastAPIλ νμ€ **νμ΄μ¬ 3.6 νμ
** μ μΈμ κΈ°λ°νκ³ μμ΅λλ€. μλ‘ λ°°μΈ λ¬Έλ²μ΄ μμ΅λλ€. κ·Έμ νμ€μ μΈ νλ νμ΄μ¬μ
λλ€.
+
+λ§μ½ μ¬λ¬λΆμ΄ νμ΄μ¬ νμ
μ μ΄λ»κ² μ¬μ©νλμ§μ λν 2λΆ μ λμ 볡μ΅μ΄ νμνλ€λ©΄ (λΉλ‘ μ¬λ¬λΆμ΄ FastAPIλ₯Ό μ¬μ©νμ§ μλλ€ νλλΌλ), λ€μμ μ§§μ μμ΅μλ₯Ό νμΈνμΈμ: [νμ΄μ¬ νμ
](python-types.md){.internal-link target=\_blank}.
+
+μ¬λ¬λΆμ νμ
μ μ΄μ©ν νμ€ νμ΄μ¬μ λ€μκ³Ό κ°μ΄ μ μ μ μμ΅λλ€:
+
+```Python
+from datetime import date
+
+from pydantic import BaseModel
+
+# λ³μλ₯Ό strλ‘ μ μΈ
+# κ·Έ ν ν¨μ μμμ νΈμ§κΈ° μ§μμ λ°μΌμΈμ
+def main(user_id: str):
+ return user_id
+
+
+# Pydantic λͺ¨λΈ
+class User(BaseModel):
+ id: int
+ name: str
+ joined: date
+```
+
+μμ μ½λλ λ€μκ³Ό κ°μ΄ μ¬μ©λ μ μμ΅λλ€:
+
+```Python
+my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
+
+second_user_data = {
+ "id": 4,
+ "name": "Mary",
+ "joined": "2018-11-30",
+}
+
+my_second_user: User = User(**second_user_data)
+```
+
+!!! μ 보
+ `**second_user_data`κ° λ»νλ κ²:
+
+ `second_user_data` λμ
λ리μ ν€μ κ°μ ν€-κ° μΈμλ‘μ λ°λ‘ λ겨μ€λλ€. λ€μκ³Ό λμΌν©λλ€: `User(id=4, name="Mary", joined="2018-11-30")`
+
+### νΈμ§κΈ° μ§μ
+
+λͺ¨λ νλ μμν¬λ μ¬μ©νκΈ° μ½κ³ μ§κ΄μ μΌλ‘ μ€κ³λμμΌλ©°, μ’μ κ°λ° κ²½νμ 보μ₯νκΈ° μν΄ κ°λ°μ μμνκΈ°λ μ μ λͺ¨λ κ²°μ λ€μ μ¬λ¬ νΈμ§κΈ°μμ ν
μ€νΈλ©λλ€.
+
+μ΅κ·Ό νμ΄μ¬ κ°λ°μ μ€λ¬Έμ‘°μ¬μμ <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">"μλ μμ±"μ΄ κ°μ₯ λ§μ΄ μ¬μ©λλ κΈ°λ₯</a>μ΄λΌλ κ²μ΄ λ°νμ‘μ΅λλ€.
+
+**FastAPI** νλ μμν¬μ λͺ¨λ λΆλΆμ μ΄λ₯Ό μΆ©μ‘±νκΈ° μν΄ μ€κ³λμμ΅λλ€. μλμμ±μ μ΄λ κ³³μμλ μλν©λλ€.
+
+μ¬λ¬λΆμ λ¬Έμλ‘ λ€μ λμμ¬ μΌμ΄ κ±°μ μμ κ²λλ€.
+
+λ€μμ νΈμ§κΈ°κ° μ΄λ»κ² μ¬λ¬λΆμ λμμ£Όλμ§ λ³΄μ¬μ€λλ€:
+
+* <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>μμ:
+
+
+
+* <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>μμ:
+
+
+
+μ¬λ¬λΆμ΄ μ΄μ μ λΆκ°λ₯νλ€κ³ κ³ λ €νλ μ½λλ μμ±ν μ μμ κ²λλ€. μλ₯Ό λ€μ΄, μμ²μμ μ λ¬λλ (μ€μ²©λ μλ μλ)JSON λ³Έλ¬Έ λ΄λΆμ μλ `price` ν€μ
λλ€.
+
+μλͺ»λ ν€ μ΄λ¦μ μ μ μΌλ, λ¬Έμλ₯Ό μλ€ κ°λ€ν μΌλ μμΌλ©°, νΉμ λ§μ§λ§μΌλ‘ `username` λλ `user_name`μ μ¬μ©νλμ§ μ°ΎκΈ° μν΄ μ μλλ‘ μ€ν¬λ‘€ν μΌλ μμ΅λλ€.
+
+### ν λ§ μ 보
+
+μ΄λ κ³³μμλ μ νμ ꡬμ±μ΄ κ°λ₯ν λͺ¨λ κ²μ ν©λ¦¬μ μΈ κΈ°λ³Έκ°μ΄ μ€μ λμ΄ μμ΅λλ€. λͺ¨λ λ§€κ°λ³μλ μ¬λ¬λΆμ΄ νμνκ±°λ, μνλ APIλ₯Ό μ μνκΈ° μν΄ λ―ΈμΈνκ² μ‘°μ ν μ μμ΅λλ€.
+
+νμ§λ§ κΈ°λ³Έμ μΌλ‘ λͺ¨λ κ²μ΄ "κ·Έλ₯ μλν©λλ€".
+
+### κ²μ¦
+
+* λ€μμ ν¬ν¨ν, λλΆλΆμ (νΉμ λͺ¨λ ?) νμ΄μ¬ **λ°μ΄ν° νμ
** κ²μ¦ν μ μμ΅λλ€:
+ * JSON κ°μ²΄ (`dict`).
+ * μμ΄ν
νμ
μ μ μνλ JSON λ°°μ΄ (`list`).
+ * μ΅μ κΈΈμ΄μ μ΅λ κΈΈμ΄λ₯Ό μ μνλ λ¬Έμμ΄ (`str`) νλ.
+ * μ΅μκ°κ³Ό μ΅λκ°μ κ°μ§λ μ«μ (`int`, `float`), κ·Έ μΈ.
+
+* λ€μκ³Ό κ°μ΄ λμ± μ΄μμ μΈ νμ
μ λν΄ κ²μ¦ν μ μμ΅λλ€:
+ * URL.
+ * μ΄λ©μΌ.
+ * UUID.
+ * ...λ€λ₯Έ κ²λ€.
+
+λͺ¨λ κ²μ¦μ κ²¬κ³ νλ©΄μ μ ν립λ **Pydantic**μ μν΄ μ²λ¦¬λ©λλ€.
+
+### 보μκ³Ό μΈμ¦
+
+보μκ³Ό μΈμ¦μ΄ ν΅ν©λμ΄ μμ΅λλ€. λ°μ΄ν°λ² μ΄μ€λ λ°μ΄ν° λͺ¨λΈκ³Όμ ννμμ΄ μ¬μ©ν μ μμ΅λλ€.
+
+λ€μμ ν¬ν¨νλ, λͺ¨λ 보μ μ€ν€λ§κ° OpenAPIμ μ μλμ΄ μμ΅λλ€.
+
+* HTTP Basic.
+* **OAuth2** (**JWT tokens** λν ν¬ν¨). [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=\_blank}μ μλ μμ΅μλ₯Ό νμΈν΄ 보μΈμ.
+* λ€μμ λ€μ΄ μλ API ν€:
+ * ν€λ.
+ * λ§€κ°λ³μ.
+ * μΏ ν€ λ° κ·Έ μΈ.
+
+μΆκ°μ μΌλ‘ (**μΈμ
μΏ ν€**λ₯Ό ν¬ν¨ν) λͺ¨λ 보μ κΈ°λ₯μ Starletteμ μμ΅λλ€.
+
+λͺ¨λ μ¬μ¬μ©ν μ μλ λꡬμ μ»΄ν¬λνΈλ‘ λ§λ€μ΄μ Έ μμ΄ μ¬λ¬λΆμ μμ€ν
, λ°μ΄ν° μ μ₯μ, κ΄κ³ν λ° NoSQL λ°μ΄ν°λ² μ΄μ€ λ±κ³Ό μ½κ² ν΅ν©ν μ μμ΅λλ€.
+
+### μμ‘΄μ± μ£Όμ
+
+FastAPIλ μ¬μ©νκΈ° λ§€μ° κ°νΈνμ§λ§, μμ²λ <abbr title='"μ»΄ν¬λνΈ", "μμ", "μλΉμ€", "μ 곡μ"λ‘λ μλ €μ§'><strong>μμ‘΄μ± μ£Όμ
</strong></abbr>μμ€ν
μ ν¬ν¨νκ³ μμ΅λλ€.
+
+* μμ‘΄μ±μ μμ‘΄μ±μ κ°μ§μλ μμ΄, μ΄λ₯Ό ν΅ν΄ μμ‘΄μ±μ κ³μΈ΅μ΄λ **μμ‘΄μ±μ "κ·Έλν"**λ₯Ό νμ±ν©λλ€.
+* λͺ¨λ κ²μ΄ νλ μμν¬μ μν΄ **μλμ μΌλ‘ μ²λ¦¬λ©λλ€**.
+* λͺ¨λ μμ‘΄μ±μ μμ²μμ λ°μ΄ν°λ₯Ό μꡬνμ¬ μλ λ¬Έμνμ **κ²½λ‘ μλ μ μ½μ κ°νν μ μμ΅λλ€**.
+* μμ‘΄μ±μμ μ μλ _κ²½λ‘ μλ_ λ§€κ°λ³μμ λν΄μλ **μλ κ²μ¦**μ΄ μ΄λ£¨μ΄ μ§λλ€.
+* 볡μ‘ν μ¬μ©μμ μΈμ¦ μμ€ν
, **λ°μ΄ν°λ² μ΄μ€ μ°κ²°**, λ±λ±μ μ§μν©λλ€.
+* λ°μ΄ν°λ² μ΄μ€, νλ‘ νΈμλ λ±κ³Ό κ΄λ ¨λμ΄ **νννμ§ μμλ λ©λλ€**. νμ§λ§ κ·Έ λͺ¨λ κ²κ³Ό μ½κ² ν΅ν©μ΄ κ°λ₯ν©λλ€.
+
+### μ ν μλ "νλ¬κ·ΈμΈ"
+
+λλ λ€λ₯Έ λ°©λ²μΌλ‘, κ·Έκ²λ€μ μ¬μ©ν νμ μμ΄ νμν μ½λλ§ μν¬νΈν μ μμ΅λλ€.
+
+μ΄λ ν΅ν©λ (μμ‘΄μ±κ³Ό ν¨κ») μ¬μ©νκΈ° μ½κ² μ€κ³λμ΄ μμ΄, *κ²½λ‘ μλ*μ μ¬μ©λ κ²κ³Ό λμΌν ꡬ쑰μ λ¬Έλ²μ μ¬μ©νμ¬ 2μ€μ μ½λλ‘ μ¬λ¬λΆμ μ΄ν리μΌμ΄μ
μ μ¬μ©ν "νλ¬κ·ΈμΈ"μ λ§λ€ μ μμ΅λλ€.
+
+### ν
μ€νΈ κ²°κ³Ό
+
+* 100% <abbr title="μλμ μΌλ‘ ν
μ€νΈλ μ½λμ μ">ν
μ€νΈ λ²μ</abbr>.
+* 100% <abbr title="νμ΄μ¬μ νμ
μ΄λ
Έν
μ΄μ
, μ΄λ₯Ό ν΅ν΄ μ¬λ¬λΆμ νΈμ§κΈ°μ μΈλΆ λꡬλ μ¬λ¬λΆμκ² λ λμ μ§μμ ν μ μμ΅λλ€">νμ
μ΄ λͺ
μλ</abbr> μ½λ λ² μ΄μ€.
+* μμ© μ΄ν리μΌμ΄μ
μμμ μ¬μ©.
+
+## Starlette κΈ°λ₯
+
+**FastAPI**λ <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>Starlette</strong></a>λ₯Ό κΈ°λ°μΌλ‘ ꡬμΆλμμΌλ©°, μ΄μ μμ ν νΈνλ©λλ€. λ°λΌμ, μ¬λ¬λΆμ΄ 보μ νκ³ μλ μ΄λ€ μΆκ°μ μΈ Starlette μ½λλ μλν κ²μ
λλ€.
+
+`FastAPI`λ μ€μ λ‘ `Starlette`μ νμ ν΄λμ€μ
λλ€. κ·Έλμ, μ¬λ¬λΆμ΄ μ΄λ―Έ Starletteμ μκ³ μκ±°λ μ¬μ©νκ³ μμΌλ©΄, λλΆλΆμ κΈ°λ₯μ΄ κ°μ λ°©μμΌλ‘ μλν κ²μ
λλ€.
+
+**FastAPI**λ₯Ό μ¬μ©νλ©΄ μ¬λ¬λΆμ **Starlette**μ κΈ°λ₯ λλΆλΆμ μ»κ² λ κ²μ
λλ€(FastAPIκ° λ¨μν Starletteλ₯Ό κ°ννκΈ° λλ¬Έμ
λλ€):
+
+* μμ£Ό μΈμμ μΈ μ±λ₯. μ΄λ <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">**NodeJS**μ **Go**μ λλ±νκ² μ¬μ© κ°λ₯ν κ°μ₯ λΉ λ₯Έ νμ΄μ¬ νλ μμν¬ μ€ νλμ
λλ€</a>.
+* **WebSocket** μ§μ.
+* νλ‘μΈμ€ λ΄μ λ°±κ·ΈλΌμ΄λ μμ
.
+* μμκ³Ό μ’
λ£ μ΄λ²€νΈ.
+* HTTPX κΈ°λ° ν
μ€νΈ ν΄λΌμ΄μΈνΈ.
+* **CORS**, GZip, μ μ νμΌ, μ€νΈλ¦¬λ° μλ΅.
+* **μΈμ
κ³Ό μΏ ν€** μ§μ.
+* 100% ν
μ€νΈ λ²μ.
+* 100% νμ
μ΄ λͺ
μλ μ½λ λ² μ΄μ€.
+
+## Pydantic κΈ°λ₯
+
+**FastAPI**λ <a href="https://pydantic-docs.helpmanual.io" class="external-link" target="_blank"><strong>Pydantic</strong></a>μ κΈ°λ°μΌλ‘ νλ©° Pydanticκ³Ό μλ²½νκ² νΈνλ©λλ€. κ·Έλμ μ΄λ μΆκ°μ μΈ Pydantic μ½λλ₯Ό μ¬λ¬λΆμ΄ κ°μ§κ³ μλ μλν κ²μ
λλ€.
+
+Pydanticμ κΈ°λ°μΌλ‘ νλ, λ°μ΄ν°λ² μ΄μ€λ₯Ό μν <abbr title="Object-Relational Mapper">ORM</abbr>, <abbr title="Object-Document Mapper">ODM</abbr>μ ν¬ν¨ν μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¬ν¨ν©λλ€.
+
+μ΄λ λͺ¨λ κ²μ΄ μλμΌλ‘ κ²μ¦λκΈ° λλ¬Έμ, λ§μ κ²½μ°μμ μμ²μ ν΅ν΄ μ»μ λμΌν κ°μ²΄λ₯Ό, **μ§μ λ°μ΄ν°λ² μ΄μ€λ‘** λκ²¨μ€ μ μμ΅λλ€.
+
+λ°λλ‘λ λ§μ°¬κ°μ§μ΄λ©°, λ§μ κ²½μ°μμ μ¬λ¬λΆμ **μ§μ ν΄λΌμ΄μΈνΈλ‘** κ·Έμ κ°μ²΄λ₯Ό λκ²¨μ€ μ μμ΅λλ€.
+
+**FastAPI**λ₯Ό μ¬μ©νλ©΄ (λͺ¨λ λ°μ΄ν° μ²λ¦¬λ₯Ό μν΄ FastAPIκ° Pydanticμ κΈ°λ°μΌλ‘ νκΈ° μκΈ°μ) **Pydantic**μ λͺ¨λ κΈ°λ₯μ μ»κ² λ©λλ€:
+
+* **μ΄λ ΅μ§ μμ μΈμ΄**:
+ * μλ‘μ΄ μ€ν€λ§ μ μ λ§μ΄ν¬λ‘ μΈμ΄λ₯Ό λ°°μ°μ§ μμλ λ©λλ€.
+ * μ¬λ¬λΆμ΄ νμ΄μ¬ νμ
μ μλ€λ©΄, μ¬λ¬λΆμ Pydanticμ μ΄λ»κ² μ¬μ©νλμ§ μλ κ²λλ€.
+* μ¬λ¬λΆμ **<abbr title="ν΅ν© κ°λ° νκ²½, μ½λ νΈμ§κΈ°μ λΉμ·ν©λλ€">IDE</abbr>/<abbr title="μ½λ μλ¬λ₯Ό νμΈνλ νλ‘κ·Έλ¨">λ¦°ν°</abbr>/λ**μ μ μ΄μΈλ¦½λλ€:
+ * Pydantic λ°μ΄ν° ꡬ쑰λ λ¨μ μ¬λ¬λΆμ΄ μ μν ν΄λμ€μ μΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ, μλ μμ±, λ¦°ν
, mypy κ·Έλ¦¬κ³ μ¬λ¬λΆμ μ§κ΄κΉμ§ μ¬λ¬λΆμ κ²μ¦λ λ°μ΄ν°μ μ¬λ°λ₯΄κ² μλν©λλ€.
+* **볡μ‘ν ꡬ쑰**λ₯Ό κ²μ¦ν©λλ€:
+ * κ³μΈ΅μ μΈ Pydantic λͺ¨λΈ, νμ΄μ¬ `typing`μ `List`μ `Dict`, κ·Έ μΈλ₯Ό μ¬μ©ν©λλ€.
+ * κ·Έλ¦¬κ³ κ²μ¦μλ 볡μ‘ν λ°μ΄ν° μ€ν€λ§λ₯Ό λͺ
ννκ³ μ½κ² μ μ λ° νμΈνλ©° JSON μ€ν€λ§λ‘ λ¬Έμνν©λλ€.
+ * μ¬λ¬λΆμ κΉκ² **μ€μ²©λ JSON** κ°μ²΄λ₯Ό κ°μ§ μ μμΌλ©°, μ΄ κ°μ²΄ λͺ¨λ κ²μ¦νκ³ μ€λͺ
μ λΆμΌ μ μμ΅λλ€.
+* **νμ₯ κ°λ₯μ±**:
+ * Pydanticμ μ¬μ©μ μ μ λ°μ΄ν° νμ
μ μ μν μ μκ² νκ±°λ, κ²μ¦μ λ°μ½λ μ΄ν°κ° λΆμ λͺ¨λΈμ λ©μλλ₯Ό μ¬μ©νμ¬ κ²μ¦μ νμ₯ν μ μμ΅λλ€.
+* 100% ν
μ€νΈ λ²μ.