Browse Source

๐ŸŒ Add Korean translation for `docs/ko/docs/tutorial/body-nested-models.md` (#2506)

pull/11011/head
Spike Ho Yeol Lee 1 year ago
committed by GitHub
parent
commit
01d774d38c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 243
      docs/ko/docs/tutorial/body-nested-models.md

243
docs/ko/docs/tutorial/body-nested-models.md

@ -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 ๋ชจ๋ธ์ด ์ œ๊ณตํ•˜๋Š” ์ตœ๋Œ€ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ณ  ์งง๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์•„๋ž˜์˜ ์ด์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
* ํŽธ์ง‘๊ธฐ ์ง€์› (์ž๋™์™„์„ฑ์ด ์–ด๋””์„œ๋‚˜!)
* ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ (์ผ๋ช… ํŒŒ์‹ฑ/์ง๋ ฌํ™”)
* ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
* ์Šคํ‚ค๋งˆ ๋ฌธ์„œํ™”
* ์ž๋™ ๋ฌธ์„œ
Loadingโ€ฆ
Cancel
Save