]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `docs/ko/docs/tutorial/body-nested-models.md` (#2506)
authorSpike Ho Yeol Lee <rurouni24@gmail.com>
Mon, 22 Jan 2024 19:31:27 +0000 (04:31 +0900)
committerGitHub <noreply@github.com>
Mon, 22 Jan 2024 19:31:27 +0000 (14:31 -0500)
docs/ko/docs/tutorial/body-nested-models.md [new file with mode: 0644]

diff --git a/docs/ko/docs/tutorial/body-nested-models.md b/docs/ko/docs/tutorial/body-nested-models.md
new file mode 100644 (file)
index 0000000..7b41aa3
--- /dev/null
@@ -0,0 +1,243 @@
+# λ³Έλ¬Έ - μ€‘첩 λͺ¨λΈ
+
+**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 λͺ¨λΈμ΄ μ œκ³΅ν•˜λŠ” μ΅œλŒ€ μœ μ—°μ„±μ„ ν™•λ³΄ν•˜λ©΄μ„œ μ½”λ“œλ₯Ό κ°„λ‹¨ν•˜κ³  μ§§κ²Œ, κ·Έλ¦¬κ³  μš°μ•„ν•˜κ²Œ μœ μ§€ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+λ¬Όλ‘  μ•„λž˜μ˜ μ΄μ λ„ μžˆμŠ΅λ‹ˆλ‹€:
+
+* νŽΈμ§‘κΈ° μ§€μ› (μžλ™μ™„μ„±μ΄ μ–΄λ””μ„œλ‚˜!)
+* λ°μ΄ν„° λ³€ν™˜ (일λͺ… νŒŒμ‹±/직렬화)
+* λ°μ΄ν„° κ²€μ¦
+* μŠ€ν‚€λ§ˆ λ¬Έμ„œν™”
+* μžλ™ λ¬Έμ„œ