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