--- /dev/null
+# λ³Έλ¬Έ - μ€μ²© λͺ¨λΈ
+
+**FastAPI**λ₯Ό μ΄μ©νλ©΄ (Pydantic λλΆμ) λ¨λ
μΌλ‘ κΉμ΄ μ€μ²©λ λͺ¨λΈμ μ μ, κ²μ¦, λ¬Έμννλ©° μ¬μ©ν μ μμ΅λλ€.
+## 리μ€νΈ νλ
+
+μ΄νΈλ¦¬λ·°νΈλ₯Ό μλΈνμ
μΌλ‘ μ μν μ μμ΅λλ€. μλ₯Ό λ€μ΄ νμ΄μ¬ `list`λ:
+
+```Python hl_lines="14"
+{!../../../docs_src/body_nested_models/tutorial001.py!}
+```
+
+μ΄λ `tags`λ₯Ό νλͺ© 리μ€νΈλ‘ λ§λλλ€. κ° νλͺ©μ νμ
μ μ μΈνμ§ μλλΌλμ.
+
+## νμ
λ§€κ°λ³μκ° μλ 리μ€νΈ νλ
+
+νμ§λ§ νμ΄μ¬μ λ΄λΆμ νμ
μ΄λ "νμ
λ§€κ°λ³μ"λ₯Ό μ μΈν μ μλ νΉμ λ°©λ²μ΄ μμ΅λλ€:
+
+### typingμ `List` μν¬νΈ
+
+λ¨Όμ , νμ΄μ¬ νμ€ `typing` λͺ¨λμμ `List`λ₯Ό μν¬νΈν©λλ€:
+
+```Python hl_lines="1"
+{!../../../docs_src/body_nested_models/tutorial002.py!}
+```
+
+### νμ
λ§€κ°λ³μλ‘ `List` μ μΈ
+
+`list`, `dict`, `tuple`κ³Ό κ°μ νμ
λ§€κ°λ³μ(λ΄λΆ νμ
)λ₯Ό κ°λ νμ
μ μ μΈνλ €λ©΄:
+
+* `typing` λͺ¨λμμ μν¬νΈ
+* λκ΄νΈλ₯Ό μ¬μ©νμ¬ "νμ
λ§€κ°λ³μ"λ‘ λ΄λΆ νμ
μ λ¬: `[` λ° `]`
+
+```Python
+from typing import List
+
+my_list: List[str]
+```
+
+μ΄ λͺ¨λ κ²μ νμ
μ μΈμ μν νμ€ νμ΄μ¬ λ¬Έλ²μ
λλ€.
+
+λ΄λΆ νμ
μ κ°λ λͺ¨λΈ μ΄νΈλ¦¬λ·°νΈμ λν΄ λμΌν νμ€ λ¬Έλ²μ μ¬μ©νμΈμ.
+
+λ§μ°¬κ°μ§λ‘ μμ μμ `tags`λ₯Ό ꡬ체μ μΌλ‘ "λ¬Έμμ΄μ 리μ€νΈ"λ‘ λ§λ€ μ μμ΅λλ€:
+
+```Python hl_lines="14"
+{!../../../docs_src/body_nested_models/tutorial002.py!}
+```
+
+## μ§ν© νμ
+
+κ·Έλ°λ° μκ°ν΄λ³΄λ νκ·Έλ λ°λ³΅λλ©΄ μ λΌκ³ , κ³ μ ν(Unique) λ¬Έμμ΄μ΄μ΄μΌ ν κ² κ°μ΅λλ€.
+
+κ·Έλ¦¬κ³ νμ΄μ¬μ μ§ν©μ μν νΉλ³ν λ°μ΄ν° νμ
`set`μ΄ μμ΅λλ€.
+
+κ·Έλ λ€λ©΄ `Set`μ μν¬νΈ νκ³ `tags`λ₯Ό `str`μ `set`μΌλ‘ μ μΈν μ μμ΅λλ€:
+
+```Python hl_lines="1 14"
+{!../../../docs_src/body_nested_models/tutorial003.py!}
+```
+
+λλΆμ μ€λ³΅ λ°μ΄ν°κ° μλ μμ²μ μμ νλλΌλ κ³ μ ν νλͺ©λ€μ μ§ν©μΌλ‘ λ³νλ©λλ€.
+
+κ·Έλ¦¬κ³ ν΄λΉ λ°μ΄ν°λ₯Ό μΆλ ₯ ν λλ§λ€ μμ€μ μ€λ³΅μ΄ μλλΌλ κ³ μ ν νλͺ©λ€μ μ§ν©μΌλ‘ μΆλ ₯λ©λλ€.
+
+λν κ·Έμ λ°λΌ μ£Όμμ΄ μκΈ°κ³ λ¬Έμνλ©λλ€.
+
+## μ€μ²© λͺ¨λΈ
+
+Pydantic λͺ¨λΈμ κ° μ΄νΈλ¦¬λ·°νΈλ νμ
μ κ°μ΅λλ€.
+
+κ·Έλ°λ° ν΄λΉ νμ
μμ²΄λ‘ λλ€λ₯Έ Pydantic λͺ¨λΈμ νμ
μ΄ λ μ μμ΅λλ€.
+
+κ·Έλ¬λ―λ‘ νΉμ ν μ΄νΈλ¦¬λ·°νΈμ μ΄λ¦, νμ
, κ²μ¦μ μ¬μ©νμ¬ κΉκ² μ€μ²©λ JSON "κ°μ²΄"λ₯Ό μ μΈν μ μμ΅λλ€.
+
+λͺ¨λ κ²μ΄ λ¨λ
μΌλ‘ μ€μ²©λ©λλ€.
+
+### μλΈλͺ¨λΈ μ μ
+
+μλ₯Ό λ€μ΄, `Image` λͺ¨λΈμ μ μΈν μ μμ΅λλ€:
+
+```Python hl_lines="9-11"
+{!../../../docs_src/body_nested_models/tutorial004.py!}
+```
+
+### μλΈλͺ¨λμ νμ
μΌλ‘ μ¬μ©
+
+κ·Έλ¦¬κ³ μ΄νΈλ¦¬λ·°νΈμ νμ
μΌλ‘ μ¬μ©ν μ μμ΅λλ€:
+
+```Python hl_lines="20"
+{!../../../docs_src/body_nested_models/tutorial004.py!}
+```
+
+μ΄λ **FastAPI**κ° λ€μκ³Ό μ μ¬ν λ³Έλ¬Έμ κΈ°λνλ€λ κ²μ μλ―Έν©λλ€:
+
+```JSON
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2,
+ "tags": ["rock", "metal", "bar"],
+ "image": {
+ "url": "http://example.com/baz.jpg",
+ "name": "The Foo live"
+ }
+}
+```
+
+λ€μ νλ², **FastAPI**λ₯Ό μ¬μ©νμ¬ ν΄λΉ μ μΈμ ν¨μΌλ‘μ¨ μ»λ κ²μ:
+
+* μ€μ²© λͺ¨λΈλ νΈμ§κΈ° μ§μ(μλμμ± λ±)
+* λ°μ΄ν° λ³ν
+* λ°μ΄ν° κ²μ¦
+* μλ λ¬Έμν
+
+## νΉλ³ν νμ
κ³Ό κ²μ¦
+
+`str`, `int`, `float` λ±κ³Ό κ°μ λ¨μΌ νμ
κ³Όλ λ³κ°λ‘, `str`μ μμνλ λ 볡μ‘ν λ¨μΌ νμ
μ μ¬μ©ν μ μμ΅λλ€.
+
+λͺ¨λ μ΅μ
μ λ³΄λ €λ©΄, <a href="https://pydantic-docs.helpmanual.io/usage/types/" class="external-link" target="_blank">Pydantic's exotic types</a> λ¬Έμλ₯Ό νμΈνμΈμ. λ€μ μ₯μμ λͺκ°μ§ μμ λ₯Ό λ³Ό μ μμ΅λλ€.
+
+μλ₯Ό λ€μ΄ `Image` λͺ¨λΈ μμ `url` νλλ₯Ό `str` λμ Pydanticμ `HttpUrl`λ‘ μ μΈν μ μμ΅λλ€:
+
+```Python hl_lines="4 10"
+{!../../../docs_src/body_nested_models/tutorial005.py!}
+```
+
+μ΄ λ¬Έμμ΄μ΄ μ ν¨ν URLμΈμ§ κ²μ¬νκ³ JSON μ€ν€λ§/OpenAPIλ‘ λ¬Έμν λ©λλ€.
+
+## μλΈλͺ¨λΈ 리μ€νΈλ₯Ό κ°λ μ΄νΈλ¦¬λ·°νΈ
+
+`list`, `set` λ±μ μλΈνμ
μΌλ‘ Pydantic λͺ¨λΈμ μ¬μ©ν μλ μμ΅λλ€:
+
+```Python hl_lines="20"
+{!../../../docs_src/body_nested_models/tutorial006.py!}
+```
+
+μλμ κ°μ JSON λ³Έλ¬ΈμΌλ‘ μμ(λ³ν, κ²μ¦, λ¬Έμν λ±μ)ν©λλ€:
+
+```JSON hl_lines="11"
+{
+ "name": "Foo",
+ "description": "The pretender",
+ "price": 42.0,
+ "tax": 3.2,
+ "tags": [
+ "rock",
+ "metal",
+ "bar"
+ ],
+ "images": [
+ {
+ "url": "http://example.com/baz.jpg",
+ "name": "The Foo live"
+ },
+ {
+ "url": "http://example.com/dave.jpg",
+ "name": "The Baz"
+ }
+ ]
+}
+```
+
+!!! info "μ 보"
+ `images` ν€κ° μ΄λ»κ² μ΄λ―Έμ§ κ°μ²΄ 리μ€νΈλ₯Ό κ°λμ§ μ£Όλͺ©νμΈμ.
+
+## κΉκ² μ€μ²©λ λͺ¨λΈ
+
+λ¨λ
μΌλ‘ κΉκ² μ€μ²©λ λͺ¨λΈμ μ μν μ μμ΅λλ€:
+
+```Python hl_lines="9 14 20 23 27"
+{!../../../docs_src/body_nested_models/tutorial007.py!}
+```
+
+!!! info "μ 보"
+ `Offer`κ° μ νμ¬ν `Image` 리μ€νΈλ₯Ό μ°¨λ‘λ‘ κ°λ `Item` 리μ€νΈλ₯Ό μ΄λ»κ² κ°μ§κ³ μλμ§ μ£Όλͺ©νμΈμ
+
+## μμ 리μ€νΈμ λ³Έλ¬Έ
+
+μμλλ JSON λ³Έλ¬Έμ μ΅μμ κ°μ΄ JSON `array`(νμ΄μ¬ `list`)λ©΄, Pydantic λͺ¨λΈμμμ λ§μ°¬κ°μ§λ‘ ν¨μμ λ§€κ°λ³μμμ νμ
μ μ μΈν μ μμ΅λλ€:
+
+```Python
+images: List[Image]
+```
+
+μ΄λ₯Ό μλμ²λΌ:
+
+```Python hl_lines="15"
+{!../../../docs_src/body_nested_models/tutorial008.py!}
+```
+
+## μ΄λμλ νΈμ§κΈ° μ§μ
+
+κ·Έλ¦¬κ³ μ΄λμλ νΈμ§κΈ° μ§μμ λ°μμ μμ΅λλ€.
+
+리μ€νΈ λ΄λΆ νλͺ©μ κ²½μ°μλ:
+
+<img src="/img/tutorial/body-nested-models/image01.png">
+
+Pydantic λͺ¨λΈ λμ μ `dict`λ₯Ό μ§μ μ¬μ©νμ¬ μμ
ν κ²½μ°, μ΄λ¬ν νΈμ§κΈ° μ§μμ λ°μμ μμ΅λλ€.
+
+νμ§λ§ μμ ν λμ
λλ¦¬κ° μλμΌλ‘ λ³νλκ³ μΆλ ₯λ μλμΌλ‘ JSONμΌλ‘ λ³νλλ―λ‘ κ±±μ ν νμλ μμ΅λλ€.
+
+## λ¨λ
`dict`μ λ³Έλ¬Έ
+
+μΌλΆ νμ
μ ν€μ λ€λ₯Έ νμ
μ κ°μ μ¬μ©νμ¬ `dict`λ‘ λ³Έλ¬Έμ μ μΈν μ μμ΅λλ€.
+
+(Pydanticμ μ¬μ©ν κ²½μ°μ²λΌ) μ ν¨ν νλ/μ΄νΈλ¦¬λ·°νΈ μ΄λ¦μ΄ 무μμΈμ§ μ νμκ° μμ΅λλ€.
+
+μμ§ λͺ¨λ₯΄λ ν€λ₯Ό λ°μΌλ €λ κ²½μ° μ μ©ν©λλ€.
+
+---
+
+λ€λ₯Έ μ μ©ν κ²½μ°λ λ€λ₯Έ νμ
μ ν€λ₯Ό κ°μ§ λμ
λλ€. μ. `int`.
+
+μ¬κΈ°μ κ·Έ κ²½μ°λ₯Ό λ³Ό κ²μ
λλ€.
+
+μ΄ κ²½μ°, `float` κ°μ κ°μ§ `int` ν€κ° μλ λͺ¨λ `dict`λ₯Ό λ°μλ€μ
λλ€:
+
+```Python hl_lines="15"
+{!../../../docs_src/body_nested_models/tutorial009.py!}
+```
+
+!!! tip "ν"
+ JSONμ μ€μ§ `str`ν ν€λ§ μ§μνλ€λ κ²μ μΌλμ λμΈμ.
+
+ νμ§λ§ Pydanticμ μλ λ°μ΄ν° λ³νμ΄ μμ΅λλ€.
+
+ μ¦, API ν΄λΌμ΄μΈνΈκ° λ¬Έμμ΄μ ν€λ‘ 보λ΄λλΌλ ν΄λΉ λ¬Έμμ΄μ΄ μμν μ μλ₯Ό ν¬ν¨νλν Pydanticμ μ΄λ₯Ό λ³ννκ³ κ²μ¦ν©λλ€.
+
+ κ·Έλ¬λ―λ‘ `weights`λ‘ λ°μ `dict`λ μ€μ λ‘ `int` ν€μ `float` κ°μ κ°μ§λλ€.
+
+## μμ½
+
+**FastAPI**λ₯Ό μ¬μ©νλ©΄ Pydantic λͺ¨λΈμ΄ μ 곡νλ μ΅λ μ μ°μ±μ ν보νλ©΄μ μ½λλ₯Ό κ°λ¨νκ³ μ§§κ², κ·Έλ¦¬κ³ μ°μνκ² μ μ§ν μ μμ΅λλ€.
+
+λ¬Όλ‘ μλμ μ΄μ λ μμ΅λλ€:
+
+* νΈμ§κΈ° μ§μ (μλμμ±μ΄ μ΄λμλ!)
+* λ°μ΄ν° λ³ν (μΌλͺ
νμ±/μ§λ ¬ν)
+* λ°μ΄ν° κ²μ¦
+* μ€ν€λ§ λ¬Έμν
+* μλ λ¬Έμ