committed by
GitHub
1 changed files with 203 additions and 0 deletions
@ -0,0 +1,203 @@ |
|||
--- |
|||
hide: |
|||
- navigation |
|||
--- |
|||
|
|||
# ๊ธฐ๋ฅ |
|||
|
|||
## FastAPI์ ๊ธฐ๋ฅ |
|||
|
|||
**FastAPI**๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค: |
|||
|
|||
### ๊ฐ๋ฐฉํ ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก |
|||
|
|||
* <abbr title="์๋ํฌ์ธํธ, ๋ผ์ฐํธ๋ก๋ ์๋ ค์ ธ ์์ต๋๋ค">๊ฒฝ๋ก</abbr><abbr title="POST, GET, PUT, DELETE์ ๊ฐ์ HTTP ๋ฉ์๋๋ก ์๋ ค์ ธ ์์ต๋๋ค">์๋</abbr>, ๋งค๊ฐ๋ณ์, ๋ณธ๋ฌธ ์์ฒญ, ๋ณด์ ๊ทธ ์ธ์ ์ ์ธ์ ํฌํจํ API ์์ฑ์ ์ํ <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> |
|||
* <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (OpenAPI ์์ฒด๊ฐ JSON Schema๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ต๋๋ค)๋ฅผ ์ฌ์ฉํ ์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ฌธ์ํ. |
|||
* ๋จ์ํ ๋ ์ฌ๋ ค์ ๋ง๋ถ์ธ ๊ธฐ๋ฅ์ด ์๋๋๋ค. ์ธ์ฌํ ๊ฒํ ๋ฅผ ๊ฑฐ์น ํ, ์ด๋ฌํ ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. |
|||
* ์ด๋ ๋ํ ๋ค์ํ ์ธ์ด๋ก ์๋์ ์ธ **ํด๋ผ์ด์ธํธ ์ฝ๋ ์์ฑ**์ ์ฌ์ฉํ ์ ์๊ฒ ์ง์ํฉ๋๋ค. |
|||
|
|||
### ๋ฌธ์ ์๋ํ |
|||
|
|||
๋ํํ API ๋ฌธ์์ ์น ํ์ ์ ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ๋ ์์ํฌ๊ฐ OpenAPI๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ์, 2๊ฐ์ง ์ต์
์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด๊ฐ ์ฌ๋ฌ ์ต์
์ด ์กด์ฌํฉ๋๋ค. |
|||
|
|||
* ๋ํํ ํ์ <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>๋ฅผ ์ด์ฉํด, ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ์ฌ๋ฌ๋ถ์ API๋ฅผ ํธ์ถํ๊ฑฐ๋ ํ
์คํธํ ์ ์์ต๋๋ค. |
|||
|
|||
 |
|||
|
|||
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>์ ์ด์ฉํด API ๋ฌธ์ํ๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค. |
|||
|
|||
 |
|||
|
|||
### ๊ทธ์ ํ๋ ํ์ด์ฌ |
|||
|
|||
(Pydantic ๋๋ถ์) FastAPI๋ ํ์ค **ํ์ด์ฌ 3.6 ํ์
** ์ ์ธ์ ๊ธฐ๋ฐํ๊ณ ์์ต๋๋ค. ์๋ก ๋ฐฐ์ธ ๋ฌธ๋ฒ์ด ์์ต๋๋ค. ๊ทธ์ ํ์ค์ ์ธ ํ๋ ํ์ด์ฌ์
๋๋ค. |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ํ์ด์ฌ ํ์
์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์ ๋ํ 2๋ถ ์ ๋์ ๋ณต์ต์ด ํ์ํ๋ค๋ฉด (๋น๋ก ์ฌ๋ฌ๋ถ์ด FastAPI๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค ํ๋๋ผ๋), ๋ค์์ ์งง์ ์์ต์๋ฅผ ํ์ธํ์ธ์: [ํ์ด์ฌ ํ์
](python-types.md){.internal-link target=\_blank}. |
|||
|
|||
์ฌ๋ฌ๋ถ์ ํ์
์ ์ด์ฉํ ํ์ค ํ์ด์ฌ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ์ ์์ต๋๋ค: |
|||
|
|||
```Python |
|||
from datetime import date |
|||
|
|||
from pydantic import BaseModel |
|||
|
|||
# ๋ณ์๋ฅผ str๋ก ์ ์ธ |
|||
# ๊ทธ ํ ํจ์ ์์์ ํธ์ง๊ธฐ ์ง์์ ๋ฐ์ผ์ธ์ |
|||
def main(user_id: str): |
|||
return user_id |
|||
|
|||
|
|||
# Pydantic ๋ชจ๋ธ |
|||
class User(BaseModel): |
|||
id: int |
|||
name: str |
|||
joined: date |
|||
``` |
|||
|
|||
์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์ต๋๋ค: |
|||
|
|||
```Python |
|||
my_user: User = User(id=3, name="John Doe", joined="2018-07-19") |
|||
|
|||
second_user_data = { |
|||
"id": 4, |
|||
"name": "Mary", |
|||
"joined": "2018-11-30", |
|||
} |
|||
|
|||
my_second_user: User = User(**second_user_data) |
|||
``` |
|||
|
|||
!!! ์ ๋ณด |
|||
`**second_user_data`๊ฐ ๋ปํ๋ ๊ฒ: |
|||
|
|||
`second_user_data` ๋์
๋๋ฆฌ์ ํค์ ๊ฐ์ ํค-๊ฐ ์ธ์๋ก์ ๋ฐ๋ก ๋๊ฒจ์ค๋๋ค. ๋ค์๊ณผ ๋์ผํฉ๋๋ค: `User(id=4, name="Mary", joined="2018-11-30")` |
|||
|
|||
### ํธ์ง๊ธฐ ์ง์ |
|||
|
|||
๋ชจ๋ ํ๋ ์์ํฌ๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ์ข์ ๊ฐ๋ฐ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฐ๋ฐ์ ์์ํ๊ธฐ๋ ์ ์ ๋ชจ๋ ๊ฒฐ์ ๋ค์ ์ฌ๋ฌ ํธ์ง๊ธฐ์์ ํ
์คํธ๋ฉ๋๋ค. |
|||
|
|||
์ต๊ทผ ํ์ด์ฌ ๊ฐ๋ฐ์ ์ค๋ฌธ์กฐ์ฌ์์ <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">"์๋ ์์ฑ"์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ</a>์ด๋ผ๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. |
|||
|
|||
**FastAPI** ํ๋ ์์ํฌ์ ๋ชจ๋ ๋ถ๋ถ์ ์ด๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์๋์์ฑ์ ์ด๋ ๊ณณ์์๋ ์๋ํฉ๋๋ค. |
|||
|
|||
์ฌ๋ฌ๋ถ์ ๋ฌธ์๋ก ๋ค์ ๋์์ฌ ์ผ์ด ๊ฑฐ์ ์์ ๊ฒ๋๋ค. |
|||
|
|||
๋ค์์ ํธ์ง๊ธฐ๊ฐ ์ด๋ป๊ฒ ์ฌ๋ฌ๋ถ์ ๋์์ฃผ๋์ง ๋ณด์ฌ์ค๋๋ค: |
|||
|
|||
* <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>์์: |
|||
|
|||
 |
|||
|
|||
์ฌ๋ฌ๋ถ์ด ์ด์ ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ๊ณ ๋ คํ๋ ์ฝ๋๋ ์์ฑํ ์ ์์ ๊ฒ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ฒญ์์ ์ ๋ฌ๋๋ (์ค์ฒฉ๋ ์๋ ์๋)JSON ๋ณธ๋ฌธ ๋ด๋ถ์ ์๋ `price` ํค์
๋๋ค. |
|||
|
|||
์๋ชป๋ ํค ์ด๋ฆ์ ์ ์ ์ผ๋, ๋ฌธ์๋ฅผ ์๋ค ๊ฐ๋คํ ์ผ๋ ์์ผ๋ฉฐ, ํน์ ๋ง์ง๋ง์ผ๋ก `username` ๋๋ `user_name`์ ์ฌ์ฉํ๋์ง ์ฐพ๊ธฐ ์ํด ์ ์๋๋ก ์คํฌ๋กคํ ์ผ๋ ์์ต๋๋ค. |
|||
|
|||
### ํ ๋ง ์ ๋ณด |
|||
|
|||
์ด๋ ๊ณณ์์๋ ์ ํ์ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ด ์ค์ ๋์ด ์์ต๋๋ค. ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ ์ฌ๋ฌ๋ถ์ด ํ์ํ๊ฑฐ๋, ์ํ๋ API๋ฅผ ์ ์ํ๊ธฐ ์ํด ๋ฏธ์ธํ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ด "๊ทธ๋ฅ ์๋ํฉ๋๋ค". |
|||
|
|||
### ๊ฒ์ฆ |
|||
|
|||
* ๋ค์์ ํฌํจํ, ๋๋ถ๋ถ์ (ํน์ ๋ชจ๋ ?) ํ์ด์ฌ **๋ฐ์ดํฐ ํ์
** ๊ฒ์ฆํ ์ ์์ต๋๋ค: |
|||
* JSON ๊ฐ์ฒด (`dict`). |
|||
* ์์ดํ
ํ์
์ ์ ์ํ๋ JSON ๋ฐฐ์ด (`list`). |
|||
* ์ต์ ๊ธธ์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ์ํ๋ ๋ฌธ์์ด (`str`) ํ๋. |
|||
* ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ฐ์ง๋ ์ซ์ (`int`, `float`), ๊ทธ ์ธ. |
|||
|
|||
* ๋ค์๊ณผ ๊ฐ์ด ๋์ฑ ์ด์์ ์ธ ํ์
์ ๋ํด ๊ฒ์ฆํ ์ ์์ต๋๋ค: |
|||
* URL. |
|||
* ์ด๋ฉ์ผ. |
|||
* UUID. |
|||
* ...๋ค๋ฅธ ๊ฒ๋ค. |
|||
|
|||
๋ชจ๋ ๊ฒ์ฆ์ ๊ฒฌ๊ณ ํ๋ฉด์ ์ ํ๋ฆฝ๋ **Pydantic**์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. |
|||
|
|||
### ๋ณด์๊ณผ ์ธ์ฆ |
|||
|
|||
๋ณด์๊ณผ ์ธ์ฆ์ด ํตํฉ๋์ด ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ์ ํํ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ค์์ ํฌํจํ๋, ๋ชจ๋ ๋ณด์ ์คํค๋ง๊ฐ OpenAPI์ ์ ์๋์ด ์์ต๋๋ค. |
|||
|
|||
* HTTP Basic. |
|||
* **OAuth2** (**JWT tokens** ๋ํ ํฌํจ). [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=\_blank}์ ์๋ ์์ต์๋ฅผ ํ์ธํด ๋ณด์ธ์. |
|||
* ๋ค์์ ๋ค์ด ์๋ API ํค: |
|||
* ํค๋. |
|||
* ๋งค๊ฐ๋ณ์. |
|||
* ์ฟ ํค ๋ฐ ๊ทธ ์ธ. |
|||
|
|||
์ถ๊ฐ์ ์ผ๋ก (**์ธ์
์ฟ ํค**๋ฅผ ํฌํจํ) ๋ชจ๋ ๋ณด์ ๊ธฐ๋ฅ์ Starlette์ ์์ต๋๋ค. |
|||
|
|||
๋ชจ๋ ์ฌ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด์ ธ ์์ด ์ฌ๋ฌ๋ถ์ ์์คํ
, ๋ฐ์ดํฐ ์ ์ฅ์, ๊ด๊ณํ ๋ฐ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ๊ณผ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค. |
|||
|
|||
### ์์กด์ฑ ์ฃผ์
|
|||
|
|||
FastAPI๋ ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ๊ฐํธํ์ง๋ง, ์์ฒญ๋ <abbr title='"์ปดํฌ๋ํธ", "์์", "์๋น์ค", "์ ๊ณต์"๋ก๋ ์๋ ค์ง'><strong>์์กด์ฑ ์ฃผ์
</strong></abbr>์์คํ
์ ํฌํจํ๊ณ ์์ต๋๋ค. |
|||
|
|||
* ์์กด์ฑ์ ์์กด์ฑ์ ๊ฐ์ง์๋ ์์ด, ์ด๋ฅผ ํตํด ์์กด์ฑ์ ๊ณ์ธต์ด๋ **์์กด์ฑ์ "๊ทธ๋ํ"**๋ฅผ ํ์ฑํฉ๋๋ค. |
|||
* ๋ชจ๋ ๊ฒ์ด ํ๋ ์์ํฌ์ ์ํด **์๋์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค**. |
|||
* ๋ชจ๋ ์์กด์ฑ์ ์์ฒญ์์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ์ฌ ์๋ ๋ฌธ์ํ์ **๊ฒฝ๋ก ์๋ ์ ์ฝ์ ๊ฐํํ ์ ์์ต๋๋ค**. |
|||
* ์์กด์ฑ์์ ์ ์๋ _๊ฒฝ๋ก ์๋_ ๋งค๊ฐ๋ณ์์ ๋ํด์๋ **์๋ ๊ฒ์ฆ**์ด ์ด๋ฃจ์ด ์ง๋๋ค. |
|||
* ๋ณต์กํ ์ฌ์ฉ์์ ์ธ์ฆ ์์คํ
, **๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ**, ๋ฑ๋ฑ์ ์ง์ํฉ๋๋ค. |
|||
* ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ๋ก ํธ์๋ ๋ฑ๊ณผ ๊ด๋ จ๋์ด **ํํํ์ง ์์๋ ๋ฉ๋๋ค**. ํ์ง๋ง ๊ทธ ๋ชจ๋ ๊ฒ๊ณผ ์ฝ๊ฒ ํตํฉ์ด ๊ฐ๋ฅํฉ๋๋ค. |
|||
|
|||
### ์ ํ ์๋ "ํ๋ฌ๊ทธ์ธ" |
|||
|
|||
๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ ํ์ ์์ด ํ์ํ ์ฝ๋๋ง ์ํฌํธํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด๋ ํตํฉ๋ (์์กด์ฑ๊ณผ ํจ๊ป) ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ค๊ณ๋์ด ์์ด, *๊ฒฝ๋ก ์๋*์ ์ฌ์ฉ๋ ๊ฒ๊ณผ ๋์ผํ ๊ตฌ์กฐ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ 2์ค์ ์ฝ๋๋ก ์ฌ๋ฌ๋ถ์ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉํ "ํ๋ฌ๊ทธ์ธ"์ ๋ง๋ค ์ ์์ต๋๋ค. |
|||
|
|||
### ํ
์คํธ ๊ฒฐ๊ณผ |
|||
|
|||
* 100% <abbr title="์๋์ ์ผ๋ก ํ
์คํธ๋ ์ฝ๋์ ์">ํ
์คํธ ๋ฒ์</abbr>. |
|||
* 100% <abbr title="ํ์ด์ฌ์ ํ์
์ด๋
ธํ
์ด์
, ์ด๋ฅผ ํตํด ์ฌ๋ฌ๋ถ์ ํธ์ง๊ธฐ์ ์ธ๋ถ ๋๊ตฌ๋ ์ฌ๋ฌ๋ถ์๊ฒ ๋ ๋์ ์ง์์ ํ ์ ์์ต๋๋ค">ํ์
์ด ๋ช
์๋</abbr> ์ฝ๋ ๋ฒ ์ด์ค. |
|||
* ์์ฉ ์ดํ๋ฆฌ์ผ์ด์
์์์ ์ฌ์ฉ. |
|||
|
|||
## Starlette ๊ธฐ๋ฅ |
|||
|
|||
**FastAPI**๋ <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>Starlette</strong></a>๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ผ๋ฉฐ, ์ด์ ์์ ํ ํธํ๋ฉ๋๋ค. ๋ฐ๋ผ์, ์ฌ๋ฌ๋ถ์ด ๋ณด์ ํ๊ณ ์๋ ์ด๋ค ์ถ๊ฐ์ ์ธ Starlette ์ฝ๋๋ ์๋ํ ๊ฒ์
๋๋ค. |
|||
|
|||
`FastAPI`๋ ์ค์ ๋ก `Starlette`์ ํ์ ํด๋์ค์
๋๋ค. ๊ทธ๋์, ์ฌ๋ฌ๋ถ์ด ์ด๋ฏธ Starlette์ ์๊ณ ์๊ฑฐ๋ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด, ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ด ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ ๊ฒ์
๋๋ค. |
|||
|
|||
**FastAPI**๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ๋ถ์ **Starlette**์ ๊ธฐ๋ฅ ๋๋ถ๋ถ์ ์ป๊ฒ ๋ ๊ฒ์
๋๋ค(FastAPI๊ฐ ๋จ์ํ Starlette๋ฅผ ๊ฐํํ๊ธฐ ๋๋ฌธ์
๋๋ค): |
|||
|
|||
* ์์ฃผ ์ธ์์ ์ธ ์ฑ๋ฅ. ์ด๋ <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">**NodeJS**์ **Go**์ ๋๋ฑํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ด์ฌ ํ๋ ์์ํฌ ์ค ํ๋์
๋๋ค</a>. |
|||
* **WebSocket** ์ง์. |
|||
* ํ๋ก์ธ์ค ๋ด์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
. |
|||
* ์์๊ณผ ์ข
๋ฃ ์ด๋ฒคํธ. |
|||
* HTTPX ๊ธฐ๋ฐ ํ
์คํธ ํด๋ผ์ด์ธํธ. |
|||
* **CORS**, GZip, ์ ์ ํ์ผ, ์คํธ๋ฆฌ๋ฐ ์๋ต. |
|||
* **์ธ์
๊ณผ ์ฟ ํค** ์ง์. |
|||
* 100% ํ
์คํธ ๋ฒ์. |
|||
* 100% ํ์
์ด ๋ช
์๋ ์ฝ๋ ๋ฒ ์ด์ค. |
|||
|
|||
## Pydantic ๊ธฐ๋ฅ |
|||
|
|||
**FastAPI**๋ <a href="https://pydantic-docs.helpmanual.io" class="external-link" target="_blank"><strong>Pydantic</strong></a>์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ Pydantic๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋ฉ๋๋ค. ๊ทธ๋์ ์ด๋ ์ถ๊ฐ์ ์ธ Pydantic ์ฝ๋๋ฅผ ์ฌ๋ฌ๋ถ์ด ๊ฐ์ง๊ณ ์๋ ์๋ํ ๊ฒ์
๋๋ค. |
|||
|
|||
Pydantic์ ๊ธฐ๋ฐ์ผ๋ก ํ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ <abbr title="Object-Relational Mapper">ORM</abbr>, <abbr title="Object-Document Mapper">ODM</abbr>์ ํฌํจํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค. |
|||
|
|||
์ด๋ ๋ชจ๋ ๊ฒ์ด ์๋์ผ๋ก ๊ฒ์ฆ๋๊ธฐ ๋๋ฌธ์, ๋ง์ ๊ฒฝ์ฐ์์ ์์ฒญ์ ํตํด ์ป์ ๋์ผํ ๊ฐ์ฒด๋ฅผ, **์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก** ๋๊ฒจ์ค ์ ์์ต๋๋ค. |
|||
|
|||
๋ฐ๋๋ก๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ฉฐ, ๋ง์ ๊ฒฝ์ฐ์์ ์ฌ๋ฌ๋ถ์ **์ง์ ํด๋ผ์ด์ธํธ๋ก** ๊ทธ์ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค ์ ์์ต๋๋ค. |
|||
|
|||
**FastAPI**๋ฅผ ์ฌ์ฉํ๋ฉด (๋ชจ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด FastAPI๊ฐ Pydantic์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ์๊ธฐ์) **Pydantic**์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ป๊ฒ ๋ฉ๋๋ค: |
|||
|
|||
* **์ด๋ ต์ง ์์ ์ธ์ด**: |
|||
* ์๋ก์ด ์คํค๋ง ์ ์ ๋ง์ดํฌ๋ก ์ธ์ด๋ฅผ ๋ฐฐ์ฐ์ง ์์๋ ๋ฉ๋๋ค. |
|||
* ์ฌ๋ฌ๋ถ์ด ํ์ด์ฌ ํ์
์ ์๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ Pydantic์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์๋ ๊ฒ๋๋ค. |
|||
* ์ฌ๋ฌ๋ถ์ **<abbr title="ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ, ์ฝ๋ ํธ์ง๊ธฐ์ ๋น์ทํฉ๋๋ค">IDE</abbr>/<abbr title="์ฝ๋ ์๋ฌ๋ฅผ ํ์ธํ๋ ํ๋ก๊ทธ๋จ">๋ฆฐํฐ</abbr>/๋**์ ์ ์ด์ธ๋ฆฝ๋๋ค: |
|||
* Pydantic ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋จ์ ์ฌ๋ฌ๋ถ์ด ์ ์ํ ํด๋์ค์ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์, ์๋ ์์ฑ, ๋ฆฐํ
, mypy ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ์ ์ง๊ด๊น์ง ์ฌ๋ฌ๋ถ์ ๊ฒ์ฆ๋ ๋ฐ์ดํฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค. |
|||
* **๋ณต์กํ ๊ตฌ์กฐ**๋ฅผ ๊ฒ์ฆํฉ๋๋ค: |
|||
* ๊ณ์ธต์ ์ธ Pydantic ๋ชจ๋ธ, ํ์ด์ฌ `typing`์ `List`์ `Dict`, ๊ทธ ์ธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|||
* ๊ทธ๋ฆฌ๊ณ ๊ฒ์ฆ์๋ ๋ณต์กํ ๋ฐ์ดํฐ ์คํค๋ง๋ฅผ ๋ช
ํํ๊ณ ์ฝ๊ฒ ์ ์ ๋ฐ ํ์ธํ๋ฉฐ JSON ์คํค๋ง๋ก ๋ฌธ์ํํฉ๋๋ค. |
|||
* ์ฌ๋ฌ๋ถ์ ๊น๊ฒ **์ค์ฒฉ๋ JSON** ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ฒด ๋ชจ๋ ๊ฒ์ฆํ๊ณ ์ค๋ช
์ ๋ถ์ผ ์ ์์ต๋๋ค. |
|||
* **ํ์ฅ ๊ฐ๋ฅ์ฑ**: |
|||
* Pydantic์ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ํ์
์ ์ ์ํ ์ ์๊ฒ ํ๊ฑฐ๋, ๊ฒ์ฆ์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ถ์ ๋ชจ๋ธ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ฆ์ ํ์ฅํ ์ ์์ต๋๋ค. |
|||
* 100% ํ
์คํธ ๋ฒ์. |
Loadingโฆ
Reference in new issue