committed by
GitHub
1 changed files with 213 additions and 0 deletions
@ -0,0 +1,213 @@ |
|||
# ์์ฒญ ๋ณธ๋ฌธ |
|||
|
|||
ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ๋ผ๊ณ ํด๋ด
์๋ค)๋ก๋ถํฐ ์ฌ๋ฌ๋ถ์ API๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ผ ํ ๋, **์์ฒญ ๋ณธ๋ฌธ**์ผ๋ก ๋ณด๋
๋๋ค. |
|||
|
|||
**์์ฒญ** ๋ณธ๋ฌธ์ ํด๋ผ์ด์ธํธ์์ API๋ก ๋ณด๋ด์ง๋ ๋ฐ์ดํฐ์
๋๋ค. **์๋ต** ๋ณธ๋ฌธ์ API๊ฐ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฐ์ดํฐ์
๋๋ค. |
|||
|
|||
์ฌ๋ฌ๋ถ์ API๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ **์๋ต** ๋ณธ๋ฌธ์ ๋ณด๋ด์ผ ํฉ๋๋ค. ํ์ง๋ง ํด๋ผ์ด์ธํธ๋ **์์ฒญ** ๋ณธ๋ฌธ์ ๋งค ๋ฒ ๋ณด๋ผ ํ์๊ฐ ์์ต๋๋ค. |
|||
|
|||
**์์ฒญ** ๋ณธ๋ฌธ์ ์ ์ธํ๊ธฐ ์ํด์ ๋ชจ๋ ๊ฐ๋ ฅํจ๊ณผ ์ด์ ์ ๊ฐ์ถ <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค. |
|||
|
|||
!!! ์ ๋ณด |
|||
๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด, (์ข ๋ ๋ณดํธ์ ์ธ) `POST`, `PUT`, `DELETE` ํน์ `PATCH` ์ค์ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. |
|||
|
|||
`GET` ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ด์ ๋ณด๋ด๋ ๊ฒ์ ๋ช
์ธ์์ ์ ์๋์ง ์์ ํ๋์
๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ด ๋ฐฉ์์ ์์ฃผ ๋ณต์กํ/๊ทนํ์ ์ฌ์ฉ ์ํฉ์์๋ง FastAPI์ ์ํด ์ง์๋ฉ๋๋ค. |
|||
|
|||
`GET` ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ด๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์๊ธฐ์, Swagger UI๊ฐ์ ๋ํํ ๋ฌธ์์์๋ `GET` ์ฌ์ฉ์ ๋ด๊ธฐ๋ ๋ณธ๋ฌธ์ ๋ํ ๋ฌธ์๋ฅผ ํ์ํ์ง ์์ผ๋ฉฐ, ์ค๊ฐ์ ์๋ ํ๋ก์๋ ์ด๋ฅผ ์ง์ํ์ง ์์ ์๋ ์์ต๋๋ค. |
|||
|
|||
## Pydantic์ `BaseModel` ์ํฌํธ |
|||
|
|||
๋จผ์ `pydantic`์์ `BaseModel`๋ฅผ ์ํฌํธํด์ผ ํฉ๋๋ค: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="2" |
|||
{!> ../../../docs_src/body/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="4" |
|||
{!> ../../../docs_src/body/tutorial001.py!} |
|||
``` |
|||
|
|||
## ์ฌ๋ฌ๋ถ์ ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ง๋ค๊ธฐ |
|||
|
|||
`BaseModel`๋ฅผ ์์๋ฐ์ ํด๋์ค๋ก ์ฌ๋ฌ๋ถ์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ธํฉ๋๋ค. |
|||
|
|||
๋ชจ๋ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํด ํ์ค ํ์ด์ฌ ํ์
์ ์ฌ์ฉํฉ๋๋ค: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="5-9" |
|||
{!> ../../../docs_src/body/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="7-11" |
|||
{!> ../../../docs_src/body/tutorial001.py!} |
|||
``` |
|||
|
|||
์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ ๋์ ๊ฐ์ด, ๋ชจ๋ธ ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ๊ธฐ๋ณธ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด๋ ์ด๋ ํ์๊ฐ ์๋๋๋ค. ๊ทธ์ธ์๋ ํ์์
๋๋ค. ๊ทธ์ `None`์ ์ฌ์ฉํ์ฌ ์ ํ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค๋ฉด, ์์ ์ด ๋ชจ๋ธ์ JSON "`object`" (ํน์ ํ์ด์ฌ `dict`)์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํฉ๋๋ค: |
|||
|
|||
```JSON |
|||
{ |
|||
"name": "Foo", |
|||
"description": "์ ํ์ ์ธ ์ค๋ช
๋", |
|||
"price": 45.2, |
|||
"tax": 3.5 |
|||
} |
|||
``` |
|||
|
|||
...`description`๊ณผ `tax`๋ (๊ธฐ๋ณธ ๊ฐ์ด `None`์ผ๋ก ๋์ด ์์ด) ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์, ์ด JSON "`object`"๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์๋ ์ ํจํฉ๋๋ค: |
|||
|
|||
```JSON |
|||
{ |
|||
"name": "Foo", |
|||
"price": 45.2 |
|||
} |
|||
``` |
|||
|
|||
## ๋งค๊ฐ๋ณ์๋ก์ ์ ์ธํ๊ธฐ |
|||
|
|||
์ฌ๋ฌ๋ถ์ *๊ฒฝ๋ก ์๋*์ ์ถ๊ฐํ๊ธฐ ์ํด, ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ ๊ทธ๋ฆฌ๊ณ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์์ ์ ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ธํ๋ฉด ๋ฉ๋๋ค. |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="16" |
|||
{!> ../../../docs_src/body/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="18" |
|||
{!> ../../../docs_src/body/tutorial001.py!} |
|||
``` |
|||
|
|||
...๊ทธ๋ฆฌ๊ณ ๋ง๋ค์ด๋ธ ๋ชจ๋ธ์ธ `Item`์ผ๋ก ํ์
์ ์ ์ธํฉ๋๋ค. |
|||
|
|||
## ๊ฒฐ๊ณผ |
|||
|
|||
์์์์ ๋จ์ํ ํ์ด์ฌ ํ์
์ ์ธ์ผ๋ก, **FastAPI**๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค: |
|||
|
|||
* ์์ฒญ์ ๋ณธ๋ฌธ์ JSON์ผ๋ก ์ฝ์ด ๋ค์
๋๋ค. |
|||
* (ํ์ํ๋ค๋ฉด) ๋์๋๋ ํ์
์ผ๋ก ๋ณํํฉ๋๋ค. |
|||
* ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํฉ๋๋ค. |
|||
* ๋ง์ฝ ๋ฐ์ดํฐ๊ฐ ์ ํจํ์ง ์๋ค๋ฉด, ์ ํํ ์ด๋ค ๊ฒ์ด ๊ทธ๋ฆฌ๊ณ ์ด๋์์ ๋ฐ์ดํฐ๊ฐ ์ ๋ชป ๋์๋์ง ์ง์ํ๋ ์น์ ํ๊ณ ๋ช
๋ฃํ ์๋ฌ๋ฅผ ๋ฐํํ ๊ฒ์
๋๋ค. |
|||
* ๋งค๊ฐ๋ณ์ `item`์ ํฌํจ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. |
|||
* ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์๋ฅผ `Item` ํ์
์ผ๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ทธ์ ๋ํ ํ์
์ ๋ํ ํธ์ง๊ธฐ ์ง์(์์ฑ ๋ฑ)์ ๋ํ ๋ฐ์ ์ ์์ต๋๋ค. |
|||
* ์ฌ๋ฌ๋ถ์ ๋ชจ๋ธ์ ์ํ <a href="https://json-schema.org" class="external-link" target="_blank">JSON ์คํค๋ง</a> ์ ์๋ฅผ ์์ฑํฉ๋๋ค. ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ ์ ํฉํ๋ค๋ฉด ์ฌ๋ฌ๋ถ์ด ์ฌ์ฉํ๊ณ ์ถ์ ๊ณณ ์ด๋์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
* ์ด๋ฌํ ์คํค๋ง๋, ์์ฑ๋ OpenAPI ์คํค๋ง ์ผ๋ถ๊ฐ ๋ ๊ฒ์ด๋ฉฐ, ์๋ ๋ฌธ์ํ <abbr title="์ฌ์ฉ์ ์ธํฐํ์ด์ค">UI</abbr>์ ์ฌ์ฉ๋ฉ๋๋ค. |
|||
|
|||
## ์๋ ๋ฌธ์ํ |
|||
|
|||
๋ชจ๋ธ์ JSON ์คํค๋ง๋ ์์ฑ๋ OpenAPI ์คํค๋ง์ ํฌํจ๋๋ฉฐ ๋ํํ API ๋ฌธ์์ ํ์๋ฉ๋๋ค: |
|||
|
|||
<img src="/img/tutorial/body/image01.png"> |
|||
|
|||
์ด๋ฅผ ํ์๋ก ํ๋ ๊ฐ๊ฐ์ *๊ฒฝ๋ก ์๋*๋ด๋ถ์ API ๋ฌธ์์๋ ์ฌ์ฉ๋ฉ๋๋ค: |
|||
|
|||
<img src="/img/tutorial/body/image02.png"> |
|||
|
|||
## ํธ์ง๊ธฐ ์ง์ |
|||
|
|||
ํธ์ง๊ธฐ์์, ํจ์ ๋ด์์ ํ์
ํํธ์ ์์ฑ์ ์ด๋์๋ (๋ง์ฝ Pydantic model ๋์ ์ `dict`์ ๋ฐ์ ๊ฒฝ์ฐ ๋ํ๋์ง ์์ ์ ์์ต๋๋ค) ๋ฐ์ ์ ์์ต๋๋ค: |
|||
|
|||
<img src="/img/tutorial/body/image03.png"> |
|||
|
|||
์๋ชป๋ ํ์
์ฐ์ฐ์ ๋ํ ์๋ฌ ํ์ธ๋ ๋ฐ์ ์ ์์ต๋๋ค: |
|||
|
|||
<img src="/img/tutorial/body/image04.png"> |
|||
|
|||
๋จ์ํ ์ฐ์ฐ์ด ์๋๋๋ค. ํ๋ ์์ํฌ ์ ์ฒด๊ฐ ์ด๋ฌํ ๋์์ธ์ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. |
|||
|
|||
๊ทธ ์ด๋ค ์คํ ์ ์, ๋ชจ๋ ํธ์ง๊ธฐ์์ ์๋ํ ์ ์๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด ์ค๊ณ ๋จ๊ณ์์ ํน๋
ํ๊ฒ ํ
์คํธ๋์์ต๋๋ค. |
|||
|
|||
์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด Pydantic ์์ฒด์์ ๋ช๋ช ๋ณ๊ฒฝ์ ์ด ์์์ต๋๋ค. |
|||
|
|||
์ด์ ์คํฌ๋ฆฐ์ท์ <a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a>๋ฅผ ์ฐ์ ๊ฒ์
๋๋ค. |
|||
|
|||
ํ์ง๋ง ๋๊ฐ์ ํธ์ง๊ธฐ ์ง์์ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>์์ ๋ฐ์ ์ ์๊ฑฐ๋, ๋๋ถ๋ถ์ ๋ค๋ฅธ ํธ์ง๊ธฐ์์๋ ๋ฐ์ ์ ์์ต๋๋ค: |
|||
|
|||
<img src="/img/tutorial/body/image05.png"> |
|||
|
|||
!!! ํ |
|||
๋ง์ฝ <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>๋ฅผ ํธ์ง๊ธฐ๋ก ์ฌ์ฉํ๋ค๋ฉด, <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ค์ ์ฌํญ์ ํฌํจํด Pydantic ๋ชจ๋ธ์ ๋ํ ํธ์ง๊ธฐ ์ง์์ ํฅ์์ํต๋๋ค: |
|||
|
|||
* ์๋ ์์ฑ |
|||
* ํ์
ํ์ธ |
|||
* ๋ฆฌํฉํ ๋ง |
|||
* ๊ฒ์ |
|||
* ์ ๊ฒ |
|||
|
|||
## ๋ชจ๋ธ ์ฌ์ฉํ๊ธฐ |
|||
|
|||
ํจ์ ์์์ ๋ชจ๋ธ ๊ฐ์ฒด์ ๋ชจ๋ ์ดํธ๋ฆฌ๋ทฐํธ์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="19" |
|||
{!> ../../../docs_src/body/tutorial002_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="21" |
|||
{!> ../../../docs_src/body/tutorial002.py!} |
|||
``` |
|||
|
|||
## ์์ฒญ ๋ณธ๋ฌธ + ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ |
|||
|
|||
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ์์ฒญ ๋ณธ๋ฌธ์ ๋์์ ์ ์ธํ ์ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ์ผ์นํ๋ ํจ์ ๋งค๊ฐ๋ณ์๊ฐ **๊ฒฝ๋ก์์ ๊ฐ์ ธ์์ผ ํ๋ค**๋ ๊ฒ์ ์ธ์งํ๋ฉฐ, Pydantic ๋ชจ๋ธ๋ก ์ ์ธ๋ ๊ทธ ํจ์ ๋งค๊ฐ๋ณ์๋ **์์ฒญ ๋ณธ๋ฌธ์์ ๊ฐ์ ธ์์ผ ํ๋ค**๋ ๊ฒ์ ์ธ์งํ ๊ฒ์
๋๋ค. |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="15-16" |
|||
{!> ../../../docs_src/body/tutorial003_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="17-18" |
|||
{!> ../../../docs_src/body/tutorial003.py!} |
|||
``` |
|||
|
|||
## ์์ฒญ ๋ณธ๋ฌธ + ๊ฒฝ๋ก + ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ |
|||
|
|||
**๋ณธ๋ฌธ**, **๊ฒฝ๋ก** ๊ทธ๋ฆฌ๊ณ **์ฟผ๋ฆฌ** ๋งค๊ฐ๋ณ์ ๋ชจ๋ ๋์์ ์ ์ธํ ์๋ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ ๊ฐ๊ฐ์ ์ธ์งํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ณ๋ฐ๋ฅธ ์์น์ ๊ฐ์ ธ์ฌ ๊ฒ์
๋๋ค. |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="16" |
|||
{!> ../../../docs_src/body/tutorial004_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="18" |
|||
{!> ../../../docs_src/body/tutorial004.py!} |
|||
``` |
|||
|
|||
ํจ์ ๋งค๊ฐ๋ณ์๋ ๋ค์์ ๋ฐ๋ผ์ ์ธ์งํ๊ฒ ๋ฉ๋๋ค: |
|||
|
|||
* ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ **๊ฒฝ๋ก**์๋ ์ ์ธ๋์ด ์๋ค๋ฉด, ์ด๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ๋ ๊ฒ์
๋๋ค. |
|||
* ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ (`int`, `float`, `str`, `bool` ๋ฑ๊ณผ ๊ฐ์) **์ ์ผํ ํ์
**์ผ๋ก ๋์ด์์ผ๋ฉด, **์ฟผ๋ฆฌ** ๋งค๊ฐ๋ณ์๋ก ํด์๋ ๊ฒ์
๋๋ค. |
|||
* ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ **Pydantic ๋ชจ๋ธ** ํ์
์ผ๋ก ์ ์ธ๋์ด ์์ผ๋ฉด, ์์ฒญ **๋ณธ๋ฌธ**์ผ๋ก ํด์๋ ๊ฒ์
๋๋ค. |
|||
|
|||
!!! ์ฐธ๊ณ |
|||
FastAPI๋ `q`์ ๊ฐ์ด ํ์์์์ ์๊ฒ ๋ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ด `= None`์ด๊ธฐ ๋๋ฌธ์
๋๋ค. |
|||
|
|||
`Union[str, None]`์ ์๋ `Union`์ FastAPI์ ์ํด ์ฌ์ฉ๋ ๊ฒ์ด ์๋์ง๋ง, ํธ์ง๊ธฐ๋ก ํ์ฌ๊ธ ๋ ๋์ ์ง์๊ณผ ์๋ฌ ํ์ง๋ฅผ ์ง์ํ ๊ฒ์
๋๋ค. |
|||
|
|||
## Pydantic์์ด |
|||
|
|||
๋ง์ฝ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด, **Body** ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. [Body - ๋ค์ค ๋งค๊ฐ๋ณ์: ๋ณธ๋ฌธ์ ์๋ ์ ์ผํ ๊ฐ](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank} ๋ฌธ์๋ฅผ ํ์ธํ์ธ์. |
Loadingโฆ
Reference in new issue