Browse Source

๐ŸŒ Add Korean translation for `docs/ko/docs/features.md` (#10976)

pull/11016/head
Kani Kim 1 year ago
committed by GitHub
parent
commit
058044fdb1
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 203
      docs/ko/docs/features.md

203
docs/ko/docs/features.md

@ -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๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>์„ ์ด์šฉํ•ด API ๋ฌธ์„œํ™”๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
### ๊ทธ์ € ํ˜„๋Œ€ ํŒŒ์ด์ฌ
(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>์—์„œ:
![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
* <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>์—์„œ:
![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png)
์—ฌ๋Ÿฌ๋ถ„์ด ์ด์ „์— ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ณ ๋ คํ–ˆ๋˜ ์ฝ”๋“œ๋„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์ฒญ์—์„œ ์ „๋‹ฌ๋˜๋Š” (์ค‘์ฒฉ๋  ์ˆ˜๋„ ์žˆ๋Š”)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โ€ฆ
Cancel
Save