Skip to content

Commit

Permalink
๐ŸŒ Add Korean translation for `docs/ko/docs/tutorial/body-nested-modelโ€ฆ
Browse files Browse the repository at this point in the history
โ€ฆs.md` (#2506)
  • Loading branch information
hard-coders committed Jan 22, 2024
1 parent 896f171 commit 01d774d
Showing 1 changed file with 243 additions and 0 deletions.
243 changes: 243 additions & 0 deletions docs/ko/docs/tutorial/body-nested-models.md
Original file line number Diff line number Diff line change
@@ -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 ๋ชจ๋ธ์ด ์ œ๊ณตํ•˜๋Š” ์ตœ๋Œ€ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ณ  ์งง๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์•„๋ž˜์˜ ์ด์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

* ํŽธ์ง‘๊ธฐ ์ง€์› (์ž๋™์™„์„ฑ์ด ์–ด๋””์„œ๋‚˜!)
* ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ (์ผ๋ช… ํŒŒ์‹ฑ/์ง๋ ฌํ™”)
* ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
* ์Šคํ‚ค๋งˆ ๋ฌธ์„œํ™”
* ์ž๋™ ๋ฌธ์„œ

0 comments on commit 01d774d

Please sign in to comment.