--- /dev/null
+# μΆκ° λͺ¨λΈ
+
+μ§λ μμ μ μ΄μ΄μ, μ°κ΄λ λͺ¨λΈμ μ¬λ¬κ° κ°λ κ²μ νν μΌμ
λλ€.
+
+νΉν μ¬μ©μ λͺ¨λΈμ κ²½μ°μ κ·Έλ¬νλ°, μλνλ©΄:
+
+* **μ
λ ₯ λͺ¨λΈ** μ λΉλ°λ²νΈλ₯Ό κ°μ ΈμΌ ν©λλ€.
+* **μΆλ ₯ λͺ¨λΈ** μ λΉλ°λ²νΈλ₯Ό κ°μ§λ©΄ μλ©λλ€.
+* **λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈ** μ ν΄μμ²λ¦¬λ λΉλ°λ²νΈλ₯Ό κ°μ§ κ²μ
λλ€.
+
+/// danger | μν
+
+μ λ μ¬μ©μμ λΉλ°λ²νΈλ₯Ό νλ¬ΈμΌλ‘ μ μ₯νμ§ λ§μΈμ. νμ μ΄νμ κ²μ¦ κ°λ₯ν "μμ ν ν΄μ(secure hash)"λ‘ μ μ₯νμΈμ.
+
+λ§μ½ μ΄κ² 무μμΈμ§ λͺ¨λ₯΄κ² λ€λ©΄, [security chapters](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.μμ λΉλ°λ²νΈ ν΄μμ λν΄ λ°°μΈ μ μμ΅λλ€.
+
+///
+
+## λ€μ€ λͺ¨λΈ
+
+μλλ λΉλ°λ²νΈ νλμ ν΄λΉ νλκ° μ¬μ©λλ μμΉλ₯Ό ν¬ν¨νμ¬, κ° λͺ¨λΈλ€μ΄ μ΄λ€ ννλ₯Ό κ°μ§ μ μλμ§ μ λ°μ μΈ μμμ
λλ€:
+
+{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
+
+
+/// info | μ 보
+
+Pydantic v1μμλ ν΄λΉ λ©μλκ° `.dict()`λ‘ λΆλ ΈμΌλ©°, Pydantic v2μμλ `.model_dump()`λ‘ μ΄λ¦μ΄ λ³κ²½λμμ΅λλ€. `.dict()`λ μ¬μ ν μ§μλμ§λ§ λ μ΄μ κΆμ₯λμ§ μμ΅λλ€.
+
+μ¬κΈ°μμ μ¬μ©νλ μμ λ Pydantic v1κ³Όμ νΈνμ±μ μν΄ `.dict()`λ₯Ό μ¬μ©νμ§λ§, Pydantic v2λ₯Ό μ¬μ©ν μ μλ€λ©΄ `.model_dump()`λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
+
+///
+
+### `**user_in.dict()` μ λνμ¬
+
+#### Pydanticμ `.dict()`
+
+`user_in`μ Pydantic λͺ¨λΈ ν΄λμ€μΈ `UserIn`μ
λλ€.
+
+Pydantic λͺ¨λΈμ λͺ¨λΈ λ°μ΄ν°λ₯Ό ν¬ν¨ν `dict`λ₯Ό λ°ννλ `.dict()` λ©μλλ₯Ό μ 곡ν©λλ€.
+
+λ°λΌμ, λ€μκ³Ό κ°μ΄ Pydantic κ°μ²΄ `user_in`μ μμ±ν μ μμ΅λλ€:
+
+```Python
+user_in = UserIn(username="john", password="secret", email="john.doe@example.com")
+```
+
+κ·Έ λ€μ, λ€μκ³Ό κ°μ΄ νΈμΆν©λλ€:
+
+```Python
+user_dict = user_in.dict()
+```
+
+μ΄μ λ³μ `user_dict`μ λ°μ΄ν°κ° ν¬ν¨λ `dict`λ₯Ό κ°μ§κ² λ©λλ€(μ΄λ Pydantic λͺ¨λΈ κ°μ²΄κ° μλ `dict`μ
λλ€).
+
+κ·Έλ¦¬κ³ λ€μκ³Ό κ°μ΄ νΈμΆνλ©΄:
+
+```Python
+print(user_dict)
+```
+
+Pythonμ `dict`κ° λ€μκ³Ό κ°μ΄ μΆλ ₯λ©λλ€:
+
+```Python
+{
+ 'username': 'john',
+ 'password': 'secret',
+ 'email': 'john.doe@example.com',
+ 'full_name': None,
+}
+```
+
+#### `dict` μΈν¨νΉ(Unpacking)
+
+`user_dict`μ κ°μ `dict`λ₯Ό ν¨μ(λλ ν΄λμ€)μ `**user_dict`λ‘ μ λ¬νλ©΄, Pythonμ μ΄λ₯Ό "μΈν©(unpack)"ν©λλ€. μ΄ κ³Όμ μμ `user_dict`μ ν€μ κ°μ κ°κ° ν€-κ° μΈμλ‘ μ§μ μ λ¬ν©λλ€.
+
+λ°λΌμ, μμμ μμ±ν `user_dict`λ₯Ό μ¬μ©νμ¬ λ€μκ³Ό κ°μ΄ μμ±νλ©΄:
+
+```Python
+UserInDB(**user_dict)
+```
+
+λ€μκ³Ό κ°μ κ²°κ³Όλ₯Ό μμ±ν©λλ€:
+
+```Python
+UserInDB(
+ username="john",
+ password="secret",
+ email="john.doe@example.com",
+ full_name=None,
+)
+```
+
+νΉμ λ μ νν λ§νμλ©΄, `user_dict`λ₯Ό μ§μ μ¬μ©νλ κ²μ, λμ€μ μ΄λ€ κ°μ΄ μΆκ°λλλΌλ μλμ λμΌν ν¨κ³Όλ₯Ό λ
λλ€:
+
+```Python
+UserInDB(
+ username = user_dict["username"],
+ password = user_dict["password"],
+ email = user_dict["email"],
+ full_name = user_dict["full_name"],
+)
+```
+
+#### λ€λ₯Έ λͺ¨λΈ λ°μ΄ν°λ‘ μ Pydantic λͺ¨λΈ μμ±
+
+μμ μμ μμ `user_in.dict()`λ‘λΆν° `user_dict`λ₯Ό μμ±ν κ²μ²λΌ, μλ μ½λλ:
+
+```Python
+user_dict = user_in.dict()
+UserInDB(**user_dict)
+```
+
+λ€μκ³Ό λμΌν©λλ€:
+
+```Python
+UserInDB(**user_in.dict())
+```
+
+...μλνλ©΄ `user_in.dict()`λ `dict`μ΄λ©°, μ΄λ₯Ό `**`λ‘ Pythonμ΄ "μΈν©(unpack)"νλλ‘ νμ¬ `UserInDB`μ μ λ¬νκΈ° λλ¬Έμ
λλ€.
+
+λ°λΌμ, λ€λ₯Έ Pydantic λͺ¨λΈμ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ μλ‘μ΄ Pydantic λͺ¨λΈμ μμ±ν μ μμ΅λλ€.
+
+#### `dict` μΈν¨νΉ(Unpacking)κ³Ό μΆκ° ν€μλ
+
+κ·Έλ¦¬κ³ λ€μκ³Ό κ°μ΄ μΆκ° ν€μλ μΈμ `hashed_password=hashed_password`λ₯Ό μΆκ°νλ©΄:
+
+```Python
+UserInDB(**user_in.dict(), hashed_password=hashed_password)
+```
+
+λ€μκ³Ό κ°μ κ²°κ³Όλ₯Ό μμ±ν©λλ€:
+
+```Python
+UserInDB(
+ username = user_dict["username"],
+ password = user_dict["password"],
+ email = user_dict["email"],
+ full_name = user_dict["full_name"],
+ hashed_password = hashed_password,
+)
+```
+
+/// warning | κ²½κ³
+
+μΆκ°μ μΌλ‘ μ 곡λ ν¨μ `fake_password_hasher`μ `fake_save_user`λ λ°μ΄ν° νλ¦μ μμ°νκΈ° μν μμ μΌ λΏμ΄λ©°, μ€μ 보μμ μ 곡νμ§ μμ΅λλ€.
+
+///
+
+## μ€λ³΅ μ€μ΄κΈ°
+
+μ½λ μ€λ³΅μ μ€μ΄λ κ²μ **FastAPI**μ ν΅μ¬ μμ΄λμ΄ μ€ νλμ
λλ€.
+
+μ½λ μ€λ³΅μ λ²κ·Έ, 보μ λ¬Έμ , μ½λ λΉλκΈ°ν λ¬Έμ (ν κ³³μ μ
λ°μ΄νΈλμμ§λ§ λ€λ₯Έ κ³³μ μ
λ°μ΄νΈλμ§ μλ λ¬Έμ ) λ±μ κ°λ₯μ±μ μ¦κ°μν΅λλ€.
+
+κ·Έλ¦¬κ³ μ΄ λͺ¨λΈλ€μ λ§μ λ°μ΄ν°λ₯Ό 곡μ νλ©΄μ μμ± μ΄λ¦κ³Ό νμ
μ μ€λ³΅νκ³ μμ΅λλ€.
+
+λ λμ λ°©λ²μ΄ μμ΅λλ€.
+
+`UserBase` λͺ¨λΈμ μ μΈνμ¬ λ€λ₯Έ λͺ¨λΈλ€μ κΈ°λ³Έ(base)μΌλ‘ μ¬μ©ν μ μμ΅λλ€. κ·Έλ° λ€μ μ΄ λͺ¨λΈμ μμλ°μ μμ±κ³Ό νμ
μ μΈ(μ ν μ μΈ, κ²μ¦ λ±)μ μμνλ μλΈν΄λμ€λ₯Ό λ§λ€ μ μμ΅λλ€.
+
+λͺ¨λ λ°μ΄ν° λ³ν, κ²μ¦, λ¬Έμν λ±μ μ μμ μΌλ‘ μλν κ²μ
λλ€.
+
+μ΄λ κ² νλ©΄ κ° λͺ¨λΈ κ°μ μ°¨μ΄μ λ§ μ μΈν μ μμ΅λλ€(νλ¬Έ `password`κ° μλ κ²½μ°, `hashed_password`λ§ μλ κ²½μ°, νΉμ λΉλ°λ²νΈκ° μλ κ²½μ°):
+
+{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *}
+
+## `Union` λλ `anyOf`
+
+λ κ°μ§ μ΄μμ νμ
μ ν¬ν¨νλ `Union`μΌλ‘ μλ΅μ μ μΈν μ μμ΅λλ€. μ΄λ μλ΅μ΄ κ·Έ μ€ νλμ νμ
μΌ μ μμμ μλ―Έν©λλ€.
+
+OpenAPIμμλ μ΄λ₯Ό `anyOf`λ‘ μ μν©λλ€.
+
+μ΄λ₯Ό μν΄ νμ€ Python νμ
ννΈμΈ <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>μ μ¬μ©ν μ μμ΅λλ€:
+
+/// note | μ°Έκ³
+
+<a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a>μ μ μν λλ λ ꡬ체μ μΈ νμ
μ λ¨Όμ ν¬ν¨νκ³ , λ ꡬ체μ μΈ νμ
μ κ·Έ λ€μ λμ΄ν΄μΌν©λλ€. μλ μμ μμλ `Union[PlaneItem, CarItem]` λ₯Ό 보면, λ ꡬ체μ μΈ `PlaneItem`μ΄ `CarItem`λ³΄λ€ μμ μμΉν©λλ€.
+
+///
+
+{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *}
+
+
+### Python 3.10μμ `Union`
+
+μμ μμ μμλ `response_model` μΈμ κ°μΌλ‘ `Union[PlaneItem, CarItem]`μ μ λ¬ν©λλ€.
+
+μ΄ κ²½μ°, μ΄λ₯Ό **νμ
μ΄λ
Έν
μ΄μ
(type annotation)** μ΄ μλ **μΈμ κ°(argument value)** μΌλ‘ μ λ¬νκ³ μκΈ° λλ¬Έμ Python 3.10μμλ `Union`μ μ¬μ©ν΄μΌ ν©λλ€.
+
+λ§μ½ νμ
μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ€λ©΄, λ€μκ³Ό κ°μ΄ μμ§ λ§λ(|)λ₯Ό μ¬μ©ν μ μμ΅λλ€:
+
+```Python
+some_variable: PlaneItem | CarItem
+```
+
+νμ§λ§ μ΄λ₯Ό `response_model=PlaneItem | CarItem`κ³Ό κ°μ΄ ν λΉνλ©΄ μλ¬κ° λ°μν©λλ€. μ΄λ Pythonμ΄ μ΄λ₯Ό νμ
μ΄λ
Έν
μ΄μ
μΌλ‘ ν΄μνμ§ μκ³ , `PlaneItem`κ³Ό `CarItem` μ¬μ΄μ **μλͺ»λ μ°μ°(invalid operation)**μ μλνκΈ° λλ¬Έμ
λλ€
+
+## λͺ¨λΈ 리μ€νΈ
+
+λ§μ°¬κ°μ§λ‘, κ°μ²΄ 리μ€νΈ ννμ μλ΅μ μ μΈν μλ μμ΅λλ€.
+
+μ΄λ₯Ό μν΄ νμ€ Pythonμ `typing.List`λ₯Ό μ¬μ©νμΈμ(λλ Python 3.9 μ΄μμμλ λ¨μν `list`λ₯Ό μ¬μ©ν μ μμ΅λλ€):
+
+{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *}
+
+
+## μμμ `dict` μλ΅
+
+Pydantic λͺ¨λΈμ μ¬μ©νμ§ μκ³ , ν€μ κ°μ νμ
λ§ μ μΈνμ¬ νλ²ν μμμ `dict`λ‘ μλ΅μ μ μΈν μλ μμ΅λλ€.
+
+μ΄λ Pydantic λͺ¨λΈμ νμν μ ν¨ν νλ/μμ± μ΄λ¦μ μ¬μ μ μ μ μλ κ²½μ°μ μ μ©ν©λλ€.
+
+μ΄ κ²½μ°, `typing.Dict`λ₯Ό μ¬μ©ν μ μμ΅λλ€(λλ Python 3.9 μ΄μμμλ λ¨μν `dict`λ₯Ό μ¬μ©ν μ μμ΅λλ€):
+
+{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *}
+
+
+## μμ½
+
+μ¬λ¬ Pydantic λͺ¨λΈμ μ¬μ©νκ³ , κ° κ²½μ°μ λ§κ² μμ λ‘κ² μμνμΈμ.
+
+μν°ν°κ° μλ‘ λ€λ₯Έ "μν"λ₯Ό κ°μ ΈμΌ νλ κ²½μ°, μν°ν°λΉ λ¨μΌ λ°μ΄ν° λͺ¨λΈμ μ¬μ©ν νμλ μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬μ©μ "μν°ν°"κ° `password`, `password_hash`, λλ λΉλ°λ²νΈκ° μλ μνλ₯Ό ν¬ν¨ν μ μλ κ²½μ°μ²λΌ λ§μ
λλ€.