--- /dev/null
+# μμ² λ³Έλ¬Έ
+
+ν΄λΌμ΄μΈνΈ(λΈλΌμ°μ λΌκ³ ν΄λ΄
μλ€)λ‘λΆν° μ¬λ¬λΆμ APIλ‘ λ°μ΄ν°λ₯Ό 보λ΄μΌ ν λ, **μμ² λ³Έλ¬Έ**μΌλ‘ 보λ
λλ€.
+
+**μμ²** λ³Έλ¬Έμ ν΄λΌμ΄μΈνΈμμ APIλ‘ λ³΄λ΄μ§λ λ°μ΄ν°μ
λλ€. **μλ΅** λ³Έλ¬Έμ APIκ° ν΄λΌμ΄μΈνΈλ‘ 보λ΄λ λ°μ΄ν°μ
λλ€.
+
+μ¬λ¬λΆμ APIλ λλΆλΆμ κ²½μ° **μλ΅** λ³Έλ¬Έμ 보λ΄μΌ ν©λλ€. νμ§λ§ ν΄λΌμ΄μΈνΈλ **μμ²** λ³Έλ¬Έμ λ§€ λ² λ³΄λΌ νμκ° μμ΅λλ€.
+
+**μμ²** λ³Έλ¬Έμ μ μΈνκΈ° μν΄μ λͺ¨λ κ°λ ₯ν¨κ³Ό μ΄μ μ κ°μΆ <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> λͺ¨λΈμ μ¬μ©ν©λλ€.
+
+!!! μ 보
+ λ°μ΄ν°λ₯Ό 보λ΄κΈ° μν΄, (μ’ λ 보νΈμ μΈ) `POST`, `PUT`, `DELETE` νΉμ `PATCH` μ€μ νλλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
+
+ `GET` μμ²μ λ³Έλ¬Έμ λ΄μ 보λ΄λ κ²μ λͺ
μΈμμ μ μλμ§ μμ νλμ
λλ€. κ·ΈλΌμλ λΆκ΅¬νκ³ , μ΄ λ°©μμ μμ£Ό 볡μ‘ν/κ·Ήνμ μ¬μ© μν©μμλ§ FastAPIμ μν΄ μ§μλ©λλ€.
+
+ `GET` μμ²μ λ³Έλ¬Έμ λ΄λ κ²μ κΆμ₯λμ§ μκΈ°μ, Swagger UIκ°μ λνν λ¬Έμμμλ `GET` μ¬μ©μ λ΄κΈ°λ λ³Έλ¬Έμ λν λ¬Έμλ₯Ό νμνμ§ μμΌλ©°, μ€κ°μ μλ νλ‘μλ μ΄λ₯Ό μ§μνμ§ μμ μλ μμ΅λλ€.
+
+## Pydanticμ `BaseModel` μν¬νΈ
+
+λ¨Όμ `pydantic`μμ `BaseModel`λ₯Ό μν¬νΈν΄μΌ ν©λλ€:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="2"
+ {!> ../../../docs_src/body/tutorial001_py310.py!}
+ ```
+
+=== "Python 3.8+"
+
+ ```Python hl_lines="4"
+ {!> ../../../docs_src/body/tutorial001.py!}
+ ```
+
+## μ¬λ¬λΆμ λ°μ΄ν° λͺ¨λΈ λ§λ€κΈ°
+
+`BaseModel`λ₯Ό μμλ°μ ν΄λμ€λ‘ μ¬λ¬λΆμ λ°μ΄ν° λͺ¨λΈμ μ μΈν©λλ€.
+
+λͺ¨λ μ΄νΈλ¦¬λ·°νΈμ λν΄ νμ€ νμ΄μ¬ νμ
μ μ¬μ©ν©λλ€:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="5-9"
+ {!> ../../../docs_src/body/tutorial001_py310.py!}
+ ```
+
+=== "Python 3.8+"
+
+ ```Python hl_lines="7-11"
+ {!> ../../../docs_src/body/tutorial001.py!}
+ ```
+
+쿼리 λ§€κ°λ³μλ₯Ό μ μΈν λμ κ°μ΄, λͺ¨λΈ μ΄νΈλ¦¬λ·°νΈκ° κΈ°λ³Έ κ°μ κ°μ§κ³ μμ΄λ μ΄λ νμκ° μλλλ€. κ·ΈμΈμλ νμμ
λλ€. κ·Έμ `None`μ μ¬μ©νμ¬ μ νμ μΌλ‘ λ§λ€ μ μμ΅λλ€.
+
+μλ₯Ό λ€λ©΄, μμ μ΄ λͺ¨λΈμ JSON "`object`" (νΉμ νμ΄μ¬ `dict`)μ λ€μκ³Ό κ°μ΄ μ μΈν©λλ€:
+
+```JSON
+{
+ "name": "Foo",
+ "description": "μ νμ μΈ μ€λͺ
λ",
+ "price": 45.2,
+ "tax": 3.5
+}
+```
+
+...`description`κ³Ό `tax`λ (κΈ°λ³Έ κ°μ΄ `None`μΌλ‘ λμ΄ μμ΄) μ νμ μ΄κΈ° λλ¬Έμ, μ΄ JSON "`object`"λ λ€μκ³Ό κ°μ μν©μμλ μ ν¨ν©λλ€:
+
+```JSON
+{
+ "name": "Foo",
+ "price": 45.2
+}
+```
+
+## λ§€κ°λ³μλ‘μ μ μΈνκΈ°
+
+μ¬λ¬λΆμ *κ²½λ‘ μλ*μ μΆκ°νκΈ° μν΄, κ²½λ‘ λ§€κ°λ³μ κ·Έλ¦¬κ³ μΏΌλ¦¬ λ§€κ°λ³μμμ μ μΈνλ κ²κ³Ό κ°μ λ°©μμΌλ‘ μ μΈνλ©΄ λ©λλ€.
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="16"
+ {!> ../../../docs_src/body/tutorial001_py310.py!}
+ ```
+
+=== "Python 3.8+"
+
+ ```Python hl_lines="18"
+ {!> ../../../docs_src/body/tutorial001.py!}
+ ```
+
+...κ·Έλ¦¬κ³ λ§λ€μ΄λΈ λͺ¨λΈμΈ `Item`μΌλ‘ νμ
μ μ μΈν©λλ€.
+
+## κ²°κ³Ό
+
+μμμμ λ¨μν νμ΄μ¬ νμ
μ μΈμΌλ‘, **FastAPI**λ λ€μκ³Ό κ°μ΄ λμν©λλ€:
+
+* μμ²μ λ³Έλ¬Έμ JSONμΌλ‘ μ½μ΄ λ€μ
λλ€.
+* (νμνλ€λ©΄) λμλλ νμ
μΌλ‘ λ³νν©λλ€.
+* λ°μ΄ν°λ₯Ό κ²μ¦ν©λλ€.
+ * λ§μ½ λ°μ΄ν°κ° μ ν¨νμ§ μλ€λ©΄, μ νν μ΄λ€ κ²μ΄ κ·Έλ¦¬κ³ μ΄λμμ λ°μ΄ν°κ° μ λͺ» λμλμ§ μ§μνλ μΉμ νκ³ λͺ
λ£ν μλ¬λ₯Ό λ°νν κ²μ
λλ€.
+* λ§€κ°λ³μ `item`μ ν¬ν¨λ μμ λ°μ΄ν°λ₯Ό μ 곡ν©λλ€.
+ * ν¨μ λ΄μμ λ§€κ°λ³μλ₯Ό `Item` νμ
μΌλ‘ μ μΈνκΈ° λλ¬Έμ, λͺ¨λ μ΄νΈλ¦¬λ·°νΈμ κ·Έμ λν νμ
μ λν νΈμ§κΈ° μ§μ(μμ± λ±)μ λν λ°μ μ μμ΅λλ€.
+* μ¬λ¬λΆμ λͺ¨λΈμ μν <a href="https://json-schema.org" class="external-link" target="_blank">JSON μ€ν€λ§</a> μ μλ₯Ό μμ±ν©λλ€. μ¬λ¬λΆμ νλ‘μ νΈμ μ ν©νλ€λ©΄ μ¬λ¬λΆμ΄ μ¬μ©νκ³ μΆμ κ³³ μ΄λμμλ μ¬μ©ν μ μμ΅λλ€.
+* μ΄λ¬ν μ€ν€λ§λ, μμ±λ OpenAPI μ€ν€λ§ μΌλΆκ° λ κ²μ΄λ©°, μλ λ¬Έμν <abbr title="μ¬μ©μ μΈν°νμ΄μ€">UI</abbr>μ μ¬μ©λ©λλ€.
+
+## μλ λ¬Έμν
+
+λͺ¨λΈμ JSON μ€ν€λ§λ μμ±λ OpenAPI μ€ν€λ§μ ν¬ν¨λλ©° λνν API λ¬Έμμ νμλ©λλ€:
+
+<img src="/img/tutorial/body/image01.png">
+
+μ΄λ₯Ό νμλ‘ νλ κ°κ°μ *κ²½λ‘ μλ*λ΄λΆμ API λ¬Έμμλ μ¬μ©λ©λλ€:
+
+<img src="/img/tutorial/body/image02.png">
+
+## νΈμ§κΈ° μ§μ
+
+νΈμ§κΈ°μμ, ν¨μ λ΄μμ νμ
ννΈμ μμ±μ μ΄λμλ (λ§μ½ Pydantic model λμ μ `dict`μ λ°μ κ²½μ° λνλμ§ μμ μ μμ΅λλ€) λ°μ μ μμ΅λλ€:
+
+<img src="/img/tutorial/body/image03.png">
+
+μλͺ»λ νμ
μ°μ°μ λν μλ¬ νμΈλ λ°μ μ μμ΅λλ€:
+
+<img src="/img/tutorial/body/image04.png">
+
+λ¨μν μ°μ°μ΄ μλλλ€. νλ μμν¬ μ μ²΄κ° μ΄λ¬ν λμμΈμ μ€μ¬μΌλ‘ μ€κ³λμμ΅λλ€.
+
+κ·Έ μ΄λ€ μ€ν μ μ, λͺ¨λ νΈμ§κΈ°μμ μλν μ μλλ‘ λ³΄μ₯νκΈ° μν΄ μ€κ³ λ¨κ³μμ νΉλ
νκ² ν
μ€νΈλμμ΅λλ€.
+
+μ΄λ₯Ό μ§μνκΈ° μν΄ Pydantic μ체μμ λͺλͺ λ³κ²½μ μ΄ μμμ΅λλ€.
+
+μ΄μ μ€ν¬λ¦°μ·μ <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>μμ λ°μ μ μκ±°λ, λλΆλΆμ λ€λ₯Έ νΈμ§κΈ°μμλ λ°μ μ μμ΅λλ€:
+
+<img src="/img/tutorial/body/image05.png">
+
+!!! ν
+ λ§μ½ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>λ₯Ό νΈμ§κΈ°λ‘ μ¬μ©νλ€λ©΄, <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>μ μ¬μ©ν μ μμ΅λλ€.
+
+ λ€μ μ¬νμ ν¬ν¨ν΄ Pydantic λͺ¨λΈμ λν νΈμ§κΈ° μ§μμ ν₯μμν΅λλ€:
+
+ * μλ μμ±
+ * νμ
νμΈ
+ * 리ν©ν λ§
+ * κ²μ
+ * μ κ²
+
+## λͺ¨λΈ μ¬μ©νκΈ°
+
+ν¨μ μμμ λͺ¨λΈ κ°μ²΄μ λͺ¨λ μ΄νΈλ¦¬λ·°νΈμ μ§μ μ κ·Ό κ°λ₯ν©λλ€:
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="19"
+ {!> ../../../docs_src/body/tutorial002_py310.py!}
+ ```
+
+=== "Python 3.8+"
+
+ ```Python hl_lines="21"
+ {!> ../../../docs_src/body/tutorial002.py!}
+ ```
+
+## μμ² λ³Έλ¬Έ + κ²½λ‘ λ§€κ°λ³μ
+
+κ²½λ‘ λ§€κ°λ³μμ μμ² λ³Έλ¬Έμ λμμ μ μΈν μ μμ΅λλ€.
+
+**FastAPI**λ κ²½λ‘ λ§€κ°λ³μμ μΌμΉνλ ν¨μ λ§€κ°λ³μκ° **κ²½λ‘μμ κ°μ ΈμμΌ νλ€**λ κ²μ μΈμ§νλ©°, Pydantic λͺ¨λΈλ‘ μ μΈλ κ·Έ ν¨μ λ§€κ°λ³μλ **μμ² λ³Έλ¬Έμμ κ°μ ΈμμΌ νλ€**λ κ²μ μΈμ§ν κ²μ
λλ€.
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="15-16"
+ {!> ../../../docs_src/body/tutorial003_py310.py!}
+ ```
+
+=== "Python 3.8+"
+
+ ```Python hl_lines="17-18"
+ {!> ../../../docs_src/body/tutorial003.py!}
+ ```
+
+## μμ² λ³Έλ¬Έ + κ²½λ‘ + 쿼리 λ§€κ°λ³μ
+
+**λ³Έλ¬Έ**, **κ²½λ‘** κ·Έλ¦¬κ³ **쿼리** λ§€κ°λ³μ λͺ¨λ λμμ μ μΈν μλ μμ΅λλ€.
+
+**FastAPI**λ κ°κ°μ μΈμ§νκ³ λ°μ΄ν°λ₯Ό μ³λ°λ₯Έ μμΉμ κ°μ Έμ¬ κ²μ
λλ€.
+
+=== "Python 3.10+"
+
+ ```Python hl_lines="16"
+ {!> ../../../docs_src/body/tutorial004_py310.py!}
+ ```
+
+=== "Python 3.8+"
+
+ ```Python hl_lines="18"
+ {!> ../../../docs_src/body/tutorial004.py!}
+ ```
+
+ν¨μ λ§€κ°λ³μλ λ€μμ λ°λΌμ μΈμ§νκ² λ©λλ€:
+
+* λ§μ½ λ§€κ°λ³μκ° **κ²½λ‘**μλ μ μΈλμ΄ μλ€λ©΄, μ΄λ κ²½λ‘ λ§€κ°λ³μλ‘ μ¬μ©λ κ²μ
λλ€.
+* λ§μ½ λ§€κ°λ³μκ° (`int`, `float`, `str`, `bool` λ±κ³Ό κ°μ) **μ μΌν νμ
**μΌλ‘ λμ΄μμΌλ©΄, **쿼리** λ§€κ°λ³μλ‘ ν΄μλ κ²μ
λλ€.
+* λ§μ½ λ§€κ°λ³μκ° **Pydantic λͺ¨λΈ** νμ
μΌλ‘ μ μΈλμ΄ μμΌλ©΄, μμ² **λ³Έλ¬Έ**μΌλ‘ ν΄μλ κ²μ
λλ€.
+
+!!! μ°Έκ³
+ FastAPIλ `q`μ κ°μ΄ νμμμμ μκ² λ κ²μ
λλ€. κΈ°λ³Έ κ°μ΄ `= None`μ΄κΈ° λλ¬Έμ
λλ€.
+
+ `Union[str, None]`μ μλ `Union`μ FastAPIμ μν΄ μ¬μ©λ κ²μ΄ μλμ§λ§, νΈμ§κΈ°λ‘ νμ¬κΈ λ λμ μ§μκ³Ό μλ¬ νμ§λ₯Ό μ§μν κ²μ
λλ€.
+
+## Pydanticμμ΄
+
+λ§μ½ Pydantic λͺ¨λΈμ μ¬μ©νκ³ μΆμ§ μλ€λ©΄, **Body** λ§€κ°λ³μλ₯Ό μ¬μ©ν μλ μμ΅λλ€. [Body - λ€μ€ λ§€κ°λ³μ: λ³Έλ¬Έμ μλ μ μΌν κ°](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank} λ¬Έμλ₯Ό νμΈνμΈμ.