์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
* ์ธ์ด๋ณ ํ๋กฌํํธ `docs/{language code}/llm-prompt.md`๋ฅผ ์ค๋นํฉ๋๋ค.
-* ์ด ๋ฌธ์๋ฅผ ์ํ๋ ๋์ ์ธ์ด๋ก ์๋ก ๋ฒ์ญํฉ๋๋ค(์: `translate.py`์ `translate-page` ๋ช
๋ น). ๊ทธ๋ฌ๋ฉด `docs/{language code}/docs/_llm-test.md` ์๋์ ๋ฒ์ญ์ด ์์ฑ๋ฉ๋๋ค.
+* ์ด ๋ฌธ์๋ฅผ ์ํ๋ ๋์ ์ธ์ด๋ก ์๋ก ๋ฒ์ญํฉ๋๋ค(์: `translate.py`์ `translate-page` ๋ช
๋ น์ด). ๊ทธ๋ฌ๋ฉด `docs/{language code}/docs/_llm-test.md` ์๋์ ๋ฒ์ญ์ด ์์ฑ๋ฉ๋๋ค.
* ๋ฒ์ญ์์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
* ํ์ํ๋ค๋ฉด ์ธ์ด๋ณ ํ๋กฌํํธ, ์ผ๋ฐ ํ๋กฌํํธ, ๋๋ ์์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํฉ๋๋ค.
* ๊ทธ๋ฐ ๋ค์ ๋ฒ์ญ์์ ๋จ์ ์๋ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ์์ ํด ์ข์ ๋ฒ์ญ์ด ๋๊ฒ ํฉ๋๋ค.
-* ์ข์ ๋ฒ์ญ์ ๋ ์ํ์์ ๋ค์ ๋ฒ์ญํฉ๋๋ค. ์ด์์ ์ธ ๊ฒฐ๊ณผ๋ LLM์ด ๋ ์ด์ ๋ฒ์ญ์ ๋ณ๊ฒฝ์ ๋ง๋ค์ง ์๋ ๊ฒ์
๋๋ค. ์ด๋ ์ผ๋ฐ ํ๋กฌํํธ์ ์ธ์ด๋ณ ํ๋กฌํํธ๊ฐ ๊ฐ๋ฅํ ํ ์ต์ ์ด๋ผ๋ ๋ป์
๋๋ค(๋๋๋ก ๋ช ๊ฐ์ง seemingly random ๋ณ๊ฒฝ์ ํ ์ ์๋๋ฐ, ๊ทธ ์ด์ ๋ [LLM์ ๊ฒฐ์ ๋ก ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๊ธฐ ๋๋ฌธ](https://doublespeak.chat/#/handbook#deterministic-output)์
๋๋ค).
+* ์ข์ ๋ฒ์ญ์ ๋ ์ํ์์ ๋ค์ ๋ฒ์ญํฉ๋๋ค. ์ด์์ ์ธ ๊ฒฐ๊ณผ๋ LLM์ด ๋ ์ด์ ๋ฒ์ญ์ ๋ณ๊ฒฝ์ ๋ง๋ค์ง ์๋ ๊ฒ์
๋๋ค. ์ด๋ ์ผ๋ฐ ํ๋กฌํํธ์ ์ธ์ด๋ณ ํ๋กฌํํธ๊ฐ ๊ฐ๋ฅํ ํ ์ต์ ์ด๋ผ๋ ๋ป์
๋๋ค(๋๋๋ก ๋ช ๊ฐ์ง ๊ฒ๋ณด๊ธฐ์ ๋ฌด์์์ธ ๋ณ๊ฒฝ์ ํ ์ ์๋๋ฐ, ๊ทธ ์ด์ ๋ [LLM์ ๊ฒฐ์ ๋ก ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๊ธฐ ๋๋ฌธ](https://doublespeak.chat/#/handbook#deterministic-output)์
๋๋ค).
ํ
์คํธ:
ํญ๊ณผ `Info`/`Note`/`Warning`/๋ฑ์ ๋ธ๋ก์ ์ ๋ชฉ ๋ฒ์ญ์ ์์ง ๋ง๋(`|`) ๋ค์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
-`scripts/translate.py`รฌ\9d\98 รฌ\9dยผรซยฐ\98 รญ\94\84รซยกยฌรญ\94\84รญ\8aยธรฌ\97\90รฌ\84\9c `### Special blocks`รฌ\99\80 `### Tab blocks` รฌ\84\9d์
์ ์ฐธ๊ณ ํ์ธ์.
+`scripts/translate.py`รฌ\9d\98 รฌ\9dยผรซยฐ\98 รญ\94\84รซยกยฌรญ\94\84รญ\8aยธรฌ\97\90รฌ\84\9c `### Special blocks`รฌ\99\80 `### Tab blocks` รฌ\84ยน์
์ ์ฐธ๊ณ ํ์ธ์.
////
`scripts/translate.py`์ ์ผ๋ฐ ํ๋กฌํํธ์์ `### Headings` ์น์
์ ์ฐธ๊ณ ํ์ธ์.
-รฌ\96ยธรฌ\96ยดรซยณ\84 รฌยง\80รฌยนยจรฌ\9d\80 รฌ\98\88รซยฅยผ รซ\93ยครฌ\96ยด `docs/de/llm-prompt.md`รฌ\9d\98 `### Headings` รฌ\84\9d์
์ ์ฐธ๊ณ ํ์ธ์.
+รฌ\96ยธรฌ\96ยดรซยณ\84 รฌยง\80รฌยนยจรฌ\9d\80 รฌ\98\88รซยฅยผ รซ\93ยครฌ\96ยด `docs/de/llm-prompt.md`รฌ\9d\98 `### Headings` รฌ\84ยน์
์ ์ฐธ๊ณ ํ์ธ์.
////
* ์ ํ๋ฆฌ์ผ์ด์
์ ์๋นํ๋ค
* ํ์ด์ง๋ฅผ ์๋นํ๋ค
-* รฌ\95ยฑ
+* รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98
* ์ ํ๋ฆฌ์ผ์ด์
* ์์ฒญ
์ด๊ฒ์ ๋ฌธ์์์ ๋ณด์ด๋ (๋๋ถ๋ถ) ๊ธฐ์ ์ฉ์ด์ ๋ถ์์ ํ๊ณ ๋น๊ท๋ฒ์ ์ธ ๋ชฉ๋ก์
๋๋ค. ํ๋กฌํํธ ์ค๊ณ์๊ฐ ์ด๋ค ์ฉ์ด์ ๋ํด LLM์ ์ถ๊ฐ์ ์ธ ๋์์ด ํ์ํ์ง ํ์
ํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ข์ ๋ฒ์ญ์ ๊ณ์ ๋ ์ข์ ๋ฒ์ญ์ผ๋ก ๋๋๋ฆด ๋, ๋๋ ์ธ์ด์์ ์ฉ์ด์ ํ์ฉ/๋ณํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ ๋ ๋์์ด ๋ฉ๋๋ค.
-รฌ\98\88รซยฅยผ รซ\93ยครฌ\96ยด `docs/de/llm-prompt.md`รฌ\9d\98 `### List of English terms and their preferred German translations` รฌ\84\9d์
์ ์ฐธ๊ณ ํ์ธ์.
+รฌ\98\88รซยฅยผ รซ\93ยครฌ\96ยด `docs/de/llm-prompt.md`รฌ\9d\98 `### List of English terms and their preferred German translations` รฌ\84ยน์
์ ์ฐธ๊ณ ํ์ธ์.
////
๊ธฐ๋ณธ ์ํ ์ฝ๋์ ๋ณ๋๋ก ์ถ๊ฐ ์ํ ์ฝ๋๋ฅผ ๋ฐํํ๋ ค๋ฉด `JSONResponse`์ ๊ฐ์ด `Response`๋ฅผ ์ง์ ๋ฐํํ๊ณ ์ถ๊ฐ ์ํ ์ฝ๋๋ฅผ ์ง์ ์ค์ ํ ์ ์์ต๋๋ค.
-์๋ฅผ ๋ค์ด ํญ๋ชฉ์ ์
๋ฐ์ดํธํ ์ ์๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ ์๊ณ ์ฑ๊ณต ์ 200 โOKโ์ HTTP ์ํ ์ฝ๋๋ฅผ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
+์๋ฅผ ๋ค์ด ํญ๋ชฉ์ ์
๋ฐ์ดํธํ ์ ์๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ ์๊ณ ์ฑ๊ณต ์ 200 "OK"์ HTTP ์ํ ์ฝ๋๋ฅผ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํ์ง๋ง ์๋ก์ด ํญ๋ชฉ์ ํ์ฉํ๊ธฐ๋ฅผ ์ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํญ๋ชฉ์ด ์ด์ ์ ์กด์ฌํ์ง ์์๋ค๋ฉด ์ด๋ฅผ ์์ฑํ๊ณ HTTP ์ํ ์ฝ๋ 201 "Created"๋ฅผ ๋ฐํํฉ๋๋ค.
### `yield`์ `scope`๊ฐ ์๋ ์์กด์ฑ { #dependencies-with-yield-and-scope }
-0.121.0 ๋ฒ์ ์์ FastAPI๋ `Depends(scope="function")` ์ง์์ ์ถ๊ฐํ์ต๋๋ค.
+0.121.0 ๋ฒ์ ์์ FastAPI๋ `yield`๊ฐ ์๋ ์์กด์ฑ์ ์ํ `Depends(scope="function")` ์ง์์ ์ถ๊ฐํ์ต๋๋ค.
`Depends(scope="function")`๋ฅผ ์ฌ์ฉํ๋ฉด, `yield` ์ดํ์ ์ข
๋ฃ ์ฝ๋๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*๊ฐ ๋๋ ์งํ(ํด๋ผ์ด์ธํธ์ ์๋ต์ด ๋ฐํ๋๊ธฐ ์ )์ ์คํ๋ฉ๋๋ค.
์ด๋ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ ๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ ๋ด๋ถ์ ์ผ๋ก๋ Pydantic์ ์ฌ์ฉํด ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
-/// note
+/// note | ์ฐธ๊ณ
dataclasses๋ Pydantic ๋ชจ๋ธ์ด ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ํ ์๋ ์๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์.
์ด ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ฒญ์ ๋ฐ๊ธฐ **์์**ํ๊ธฐ ์ ์ ์คํ๋๊ณ , ์์ฒญ ์ฒ๋ฆฌ๋ฅผ **๋๋ธ ์งํ**์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ **์๋ช
(lifespan)**์ ๋ค๋ฃน๋๋ค(์ ์ ํ "lifespan"์ด๋ผ๋ ๋จ์ด๊ฐ ์ค์ํด์ง๋๋ค ๐).
-รฌ\9dยดรซ\8a\94 รฌย \84รฌยฒยด รฌ\95ยฑ์์ ์ฌ์ฉํด์ผ ํ๋ **์์**์ ์ค์ ํ๊ณ , ์์ฒญ ๊ฐ์ **๊ณต์ ๋๋** ์์์ ์ค์ ํ๊ณ , ๊ทธ๋ฆฌ๊ณ /๋๋ ์ดํ์ **์ ๋ฆฌ**ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ ๋๋ ๊ณต์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ก๋ํ๋ ๊ฒฝ์ฐ์
๋๋ค.
+รฌ\9dยดรซ\8a\94 รฌย \84รฌยฒยด รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์์ ์ฌ์ฉํด์ผ ํ๋ **์์**์ ์ค์ ํ๊ณ , ์์ฒญ ๊ฐ์ **๊ณต์ ๋๋** ์์์ ์ค์ ํ๊ณ , ๊ทธ๋ฆฌ๊ณ /๋๋ ์ดํ์ **์ ๋ฆฌ**ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ ๋๋ ๊ณต์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ก๋ํ๋ ๊ฒฝ์ฐ์
๋๋ค.
## ์ฌ์ฉ ์ฌ๋ก { #use-case }
๋จผ์ **์ฌ์ฉ ์ฌ๋ก** ์์๋ก ์์ํ ๋ค์, ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
-์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๊ณ ์ถ์ **๋จธ์ ๋ฌ๋ ๋ชจ๋ธ**์ด ์๋ค๊ณ ์์ํด ๋ด
์๋ค. ๐ค
+์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๊ณ ์ถ์ ๋ช ๊ฐ์ง **๋จธ์ ๋ฌ๋ ๋ชจ๋ธ**์ด ์๋ค๊ณ ์์ํด ๋ด
์๋ค. ๐ค
-๋์ผํ ๋ชจ๋ธ์ด ์์ฒญ ๊ฐ์ ๊ณต์ ๋๋ฏ๋ก, ์์ฒญ๋ง๋ค ๋ชจ๋ธ์ด ํ๋์ฉ ์๊ฑฐ๋ ์ฌ์ฉ์๋ง๋ค ํ๋์ฉ ์๋ ๋ฑ์ ๋ฐฉ์์ด ์๋๋๋ค.
+๋์ผํ ๋ชจ๋ธ๋ค์ด ์์ฒญ ๊ฐ์ ๊ณต์ ๋๋ฏ๋ก, ์์ฒญ๋ง๋ค ๋ชจ๋ธ์ด ํ๋์ฉ ์๊ฑฐ๋ ์ฌ์ฉ์๋ง๋ค ํ๋์ฉ ์๋ ๋ฑ์ ๋ฐฉ์์ด ์๋๋๋ค.
๋ชจ๋ธ์ ๋ก๋ํ๋ ๋ฐ **์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ์์ํด ๋ด
์๋ค**, ์๋ํ๋ฉด ๋ชจ๋ธ์ด **๋์คํฌ์์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ผ** ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋์ ๋ชจ๋ ์์ฒญ๋ง๋ค ์ด๋ฅผ ์ํํ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
## Lifespan { #lifespan }
-`FastAPI` รฌ\95ยฑ์ `lifespan` ๋งค๊ฐ๋ณ์์ "์ปจํ
์คํธ ๋งค๋์ "๋ฅผ ์ฌ์ฉํ์ฌ *์์*๊ณผ *์ข
๋ฃ* ๋ก์ง์ ์ ์ํ ์ ์์ต๋๋ค(์ปจํ
์คํธ ๋งค๋์ ๊ฐ ๋ฌด์์ธ์ง ์ ์ ํ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค).
+`FastAPI` รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ `lifespan` ๋งค๊ฐ๋ณ์์ "์ปจํ
์คํธ ๋งค๋์ "๋ฅผ ์ฌ์ฉํ์ฌ *์์*๊ณผ *์ข
๋ฃ* ๋ก์ง์ ์ ์ํ ์ ์์ต๋๋ค(์ปจํ
์คํธ ๋งค๋์ ๊ฐ ๋ฌด์์ธ์ง ์ ์ ํ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค).
์์ ๋ก ์์ํ ๋ค์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
{* ../../docs_src/events/tutorial003_py310.py hl[16,19] *}
-์ฌ๊ธฐ์๋ `yield` ์ด์ ์ (๊ฐ์ง) ๋ชจ๋ธ ํจ์๋ฅผ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ๋ค์ด ์๋ ๋์
๋๋ฆฌ์ ๋ฃ์ด ๋ชจ๋ธ์ ๋ก๋ํ๋ ๋น์ฉ์ด ํฐ *์์* ์์
์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค. ์ด ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ด **์์ฒญ์ ๋ฐ๊ธฐ ์์ํ๊ธฐ ์ **, *์์* ๋์์ ์คํ๋ฉ๋๋ค.
+์ฌ๊ธฐ์๋ `yield` ์ด์ ์ (๊ฐ์ง) ๋ชจ๋ธ ํจ์๋ฅผ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ๋ค์ด ๋ค์ด ์๋ ๋์
๋๋ฆฌ์ ๋ฃ์ด ๋ชจ๋ธ์ ๋ก๋ํ๋ ๋น์ฉ์ด ํฐ *์์* ์์
์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค. ์ด ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ด **์์ฒญ์ ๋ฐ๊ธฐ ์์ํ๊ธฐ ์ **, *์์* ๋์์ ์คํ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ `yield` ์งํ์๋ ๋ชจ๋ธ์ ์ธ๋ก๋ํฉ๋๋ค. ์ด ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ด **์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๋ง์น ํ**, *์ข
๋ฃ* ์ง์ ์ ์คํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฉ๋ชจ๋ฆฌ๋ GPU ๊ฐ์ ์์์ ํด์ ํ ์ ์์ต๋๋ค.
์์ ์ฝ๋ ์์ ์์๋ ์ง์ ์ฌ์ฉํ์ง ์๊ณ , FastAPI์ ์ ๋ฌํ์ฌ FastAPI๊ฐ ์ด๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.
-`FastAPI` รฌ\95ยฑ์ `lifespan` ๋งค๊ฐ๋ณ์๋ **๋น๋๊ธฐ ์ปจํ
์คํธ ๋งค๋์ **๋ฅผ ๋ฐ์ผ๋ฏ๋ก, ์ `lifespan` ๋น๋๊ธฐ ์ปจํ
์คํธ ๋งค๋์ ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
+`FastAPI` รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ `lifespan` ๋งค๊ฐ๋ณ์๋ **๋น๋๊ธฐ ์ปจํ
์คํธ ๋งค๋์ **๋ฅผ ๋ฐ์ผ๋ฏ๋ก, ์ `lifespan` ๋น๋๊ธฐ ์ปจํ
์คํธ ๋งค๋์ ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
{* ../../docs_src/events/tutorial003_py310.py hl[22] *}
/// warning | ๊ฒฝ๊ณ
-*รฌ\8b\9cรฌ\9e\91*รชยณยผ *รฌยข\85รซยฃ\8c*รซยฅยผ รฌยฒ\98รซยฆยฌรญ\95\98รซ\8a\94 รชยถ\8cรฌ\9eยฅ รซยฐยฉรซยฒ\95รฌ\9d\80 รฌ\9c\84รฌ\97\90รฌ\84\9c รฌ\84ยครซยช\85รญ\95\9c รซ\8c\80รซยก\9c `FastAPI` รฌ\95ยฑ์ `lifespan` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. `lifespan` ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ๋ฉด `startup`๊ณผ `shutdown` ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋ ์ด์ ํธ์ถ๋์ง ์์ต๋๋ค. `lifespan`๋ง ์ฐ๊ฑฐ๋ ์ด๋ฒคํธ๋ง ์ฐ๊ฑฐ๋ ๋ ์ค ํ๋์ด์ง, ๋ ๋ค๋ ์๋๋๋ค.
+*รฌ\8b\9cรฌ\9e\91*รชยณยผ *รฌยข\85รซยฃ\8c*รซยฅยผ รฌยฒ\98รซยฆยฌรญ\95\98รซ\8a\94 รชยถ\8cรฌ\9eยฅ รซยฐยฉรซยฒ\95รฌ\9d\80 รฌ\9c\84รฌ\97\90รฌ\84\9c รฌ\84ยครซยช\85รญ\95\9c รซ\8c\80รซยก\9c `FastAPI` รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ `lifespan` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. `lifespan` ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ๋ฉด `startup`๊ณผ `shutdown` ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋ ์ด์ ํธ์ถ๋์ง ์์ต๋๋ค. `lifespan`๋ง ์ฐ๊ฑฐ๋ ์ด๋ฒคํธ๋ง ์ฐ๊ฑฐ๋ ๋ ์ค ํ๋์ด์ง, ๋ ๋ค๋ ์๋๋๋ค.
์ด ๋ถ๋ถ์ ์๋ง ๊ฑด๋๋ฐ์
๋ ๋ฉ๋๋ค.
///
-## FastAPI ์คํฐ์์ SDK ์์ฑ๊ธฐ { #sdk-generators-from-fastapi-sponsors }
-
-์ด ์น์
์์๋ FastAPI๋ฅผ ํ์ํ๋ ํ์ฌ๋ค์ด ์ ๊ณตํ๋ **๋ฒค์ฒ ํฌ์ ๊ธฐ๋ฐ** ๋ฐ **๊ธฐ์
์ง์** ์๋ฃจ์
์ ์๊ฐํฉ๋๋ค. ์ด ์ ํ๋ค์ ๊ณ ํ์ง๋ก ์์ฑ๋ SDK์ ๋ํด **์ถ๊ฐ ๊ธฐ๋ฅ**๊ณผ **ํตํฉ**์ ์ ๊ณตํฉ๋๋ค.
-
-โจ [**FastAPI ํ์ํ๊ธฐ**](../help-fastapi.md#sponsor-the-author) โจ๋ฅผ ํตํด, ์ด ํ์ฌ๋ค์ ํ๋ ์์ํฌ์ ๊ทธ **์ํ๊ณ**๊ฐ ๊ฑด๊ฐํ๊ณ **์ง์ ๊ฐ๋ฅ**ํ๊ฒ ์ ์ง๋๋๋ก ๋์ต๋๋ค.
-
-๋ํ ์ด๋ค์ ํ์์ FastAPI **์ปค๋ฎค๋ํฐ**(์ฌ๋ฌ๋ถ)์ ๋ํ ๊ฐํ ํ์ ์ ๋ณด์ฌ์ฃผ๋ฉฐ, **์ข์ ์๋น์ค**๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ฟ ์๋๋ผ, ๊ฒฌ๊ณ ํ๊ณ ํ๋ฐํ ํ๋ ์์ํฌ์ธ FastAPI๋ฅผ ์ง์ํ๋ ๋ฐ์๋ ๊ด์ฌ์ด ์์์ ๋ํ๋
๋๋ค. ๐
-
-์๋ฅผ ๋ค์ด ๋ค์์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค:
-
-* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-
-์ด ์ค ์ผ๋ถ๋ ์คํ ์์ค์ด๊ฑฐ๋ ๋ฌด๋ฃ ํฐ์ด๋ฅผ ์ ๊ณตํ๋ฏ๋ก, ๋น์ฉ ๋ถ๋ด ์์ด ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์์ฉ SDK ์์ฑ๊ธฐ๋ ์์ผ๋ฉฐ ์จ๋ผ์ธ์์ ์ฐพ์ ์ ์์ต๋๋ค. ๐ค
-
## TypeScript SDK ๋ง๋ค๊ธฐ { #create-a-typescript-sdk }
๊ฐ๋จํ FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์์ํด ๋ณด๊ฒ ์ต๋๋ค:
## Base64์ ํ์ผ { #base64-vs-files }
-๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์
๋ก๋์๋ [์์ฒญ ํ์ผ](../tutorial/request-files.md)์, ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์ก์๋ [์ปค์คํ
์๋ต - FileResponse](./custom-response.md#fileresponse--fileresponse-)๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ๋จผ์ ๊ณ ๋ คํ์ธ์. JSON์ผ๋ก ์ธ์ฝ๋ฉํ๋ ๋์ ๋ง์
๋๋ค.
+๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์
๋ก๋์๋ [์์ฒญ ํ์ผ](../tutorial/request-files.md)์, ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์ก์๋ [์ปค์คํ
์๋ต - FileResponse](./custom-response.md#fileresponse)๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ๋จผ์ ๊ณ ๋ คํ์ธ์. JSON์ผ๋ก ์ธ์ฝ๋ฉํ๋ ๋์ ๋ง์
๋๋ค.
JSON์ UTF-8๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด๋ง ํฌํจํ ์ ์์ผ๋ฏ๋ก, ์์ ๋ฐ์ดํธ๋ฅผ ๊ทธ๋๋ก ๋ด์ ์ ์์ต๋๋ค.
### ์ฝ๋ฐฑ ๋ผ์ฐํฐ ์ถ๊ฐํ๊ธฐ { #add-the-callback-router }
-์ด ์์ ์์, ์์์ ๋ง๋ ์ฝ๋ฐฑ ๋ผ์ฐํฐ ์์ *์ฝ๋ฐฑ ๊ฒฝ๋ก ์ฒ๋ฆฌ(๋ค)*(์ฆ *external developer*๊ฐ *external API*์ ๊ตฌํํด์ผ ํ๋ ๊ฒ๋ค)์ ์ค๋นํ์ต๋๋ค.
+์ด ์์ ์์, ์์์ ๋ง๋ ์ฝ๋ฐฑ ๋ผ์ฐํฐ ์์ *์ฝ๋ฐฑ ๊ฒฝ๋ก ์ฒ๋ฆฌ(๋ค)*(์ฆ *์ธ๋ถ ๊ฐ๋ฐ์*๊ฐ *external API*์ ๊ตฌํํด์ผ ํ๋ ๊ฒ๋ค)์ ์ค๋นํ์ต๋๋ค.
์ด์ *์ฌ๋ฌ๋ถ์ API ๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์์ `callbacks` ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด, ๊ทธ ์ฝ๋ฐฑ ๋ผ์ฐํฐ์ `.routes` ์์ฑ์ ์ ๋ฌํฉ๋๋ค:
# ์๋ต - ์ํ ์ฝ๋ ๋ณ๊ฒฝ { #response-change-status-code }
+
๊ธฐ๋ณธ [์๋ต ์ํ ์ฝ๋ ์ค์ ](../tutorial/response-status-code.md)์ด ๊ฐ๋ฅํ๋ค๋ ๊ฑธ ์ด๋ฏธ ์๊ณ ๊ณ์ค ๊ฒ๋๋ค.
ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๊ธฐ๋ณธ ์ค์ ๊ณผ ๋ค๋ฅธ ์ํ ์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ ๋๊ฐ ์์ต๋๋ค.
{* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *}
-/// tip
+/// tip | ํ
`Response` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ต์ ์ง์ ๋ฐํํ๋ ๊ฒฝ์ฐ, FastAPI๋ ์ด๋ฅผ ์ง์ ๋ฐํํ๋ค๋ ์ ์ ์ ์ํ์ธ์.
# ์๋ต ํค๋ { #response-headers }
+
## `Response` ๋งค๊ฐ๋ณ์ ์ฌ์ฉํ๊ธฐ { #use-a-response-parameter }
์ฌ๋ฌ๋ถ์ *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์ `Response` ํ์
์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค (์ฟ ํค์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค).
์ด๋ฅผ ํตํด OAuth2 ํ์ค์ ๋ฐ๋ฅด๋ ๋ ์ธ๋ฐํ ๊ถํ ์์คํ
์ OpenAPI ์ ํ๋ฆฌ์ผ์ด์
(๋ฐ API ๋ฌธ์)์ ํตํฉํ ์ ์์ต๋๋ค.
-์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ OAuth2๋ Facebook, Google, GitHub, Microsoft, X(Twitter) ๋ฑ ๋ง์ ๋ํ ์ธ์ฆ ์ ๊ณต์๊ฐ ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ด๋ค์ ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๊ถํ์ ์ ๊ณตํฉ๋๋ค.
+์ค์ฝํ๋ฅผ ์ฌ์ฉํ๋ OAuth2๋ Facebook, Google, GitHub, Microsoft, X (Twitter) ๋ฑ ๋ง์ ๋ํ ์ธ์ฆ ์ ๊ณต์๊ฐ ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ด๋ค์ ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๊ถํ์ ์ ๊ณตํฉ๋๋ค.
-Facebook, Google, GitHub, Microsoft, X(Twitter)๋ก โ๋ก๊ทธ์ธโํ ๋๋ง๋ค, ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ฝํ๊ฐ ์๋ OAuth2๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
+Facebook, Google, GitHub, Microsoft, X (Twitter)๋ก โ๋ก๊ทธ์ธโํ ๋๋ง๋ค, ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ฝํ๊ฐ ์๋ OAuth2๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ด ์น์
์์๋ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์์ ๋์ผํ โ์ค์ฝํ๊ฐ ์๋ OAuth2โ๋ก ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization)๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ธํฉ๋๋ค.
# ์ค์ ๊ณผ ํ๊ฒฝ ๋ณ์ { #settings-and-environment-variables }
+
๋ง์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์๋ ์ธ๋ถ ์ค์ ์ด๋ ๊ตฌ์ฑ(์: secret key, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๊ฒฉ ์ฆ๋ช
, ์ด๋ฉ์ผ ์๋น์ค ์๊ฒฉ ์ฆ๋ช
๋ฑ)์ด ํ์ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ค์ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค URL์ฒ๋ผ ๋ณ๋ ๊ฐ๋ฅ(๋ณ๊ฒฝ๋ ์ ์์)ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ ์ค์ ์ secret์ฒ๋ผ ๋ฏผ๊ฐํ ์ ์์ต๋๋ค.
JSON์ผ๋ก ๊ตฌ์กฐํํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ ค๋ฉด [JSON Lines ์คํธ๋ฆฌ๋ฐ](../tutorial/stream-json-lines.md)์ ์ฌ์ฉํ์ธ์.
-ํ์ง๋ง ์์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ ๋ฌธ์์ด์ ์คํธ๋ฆฌ๋ฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋ฉ๋๋ค.
+ํ์ง๋ง **์์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ**๋ ๋ฌธ์์ด์ ์คํธ๋ฆฌ๋ฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋ฉ๋๋ค.
/// note | ์ฐธ๊ณ
## ์ฌ์ฉ ์์ { #use-cases }
-์๋ฅผ ๋ค์ด AI LLM ์๋น์ค์ ์ถ๋ ฅ์์ ๋ฐ๋ก ์์ ๋ฌธ์์ด์ ์คํธ๋ฆฌ๋ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+์๋ฅผ ๋ค์ด **AI LLM** ์๋น์ค์ ์ถ๋ ฅ์์ ๋ฐ๋ก ์์ ๋ฌธ์์ด์ ์คํธ๋ฆฌ๋ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-๋ํ ํฐ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์คํธ๋ฆฌ๋ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ ๋ฒ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฝ์ง ์๊ณ , ์ฝ๋ ์ฆ์ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
+๋ํ **ํฐ ๋ฐ์ด๋๋ฆฌ ํ์ผ**์ ์คํธ๋ฆฌ๋ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ ๋ฒ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฝ์ง ์๊ณ , ์ฝ๋ ์ฆ์ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
-์ด ๋ฐฉ์์ผ๋ก ๋น๋์ค๋ ์ค๋์ค๋ฅผ ์คํธ๋ฆฌ๋ฐํ ์๋ ์์ผ๋ฉฐ, ์ฒ๋ฆฌํ๋ฉด์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณง๋ฐ๋ก ์ ์กํ ์๋ ์์ต๋๋ค.
+์ด ๋ฐฉ์์ผ๋ก **๋น๋์ค**๋ **์ค๋์ค**๋ฅผ ์คํธ๋ฆฌ๋ฐํ ์๋ ์์ผ๋ฉฐ, ์ฒ๋ฆฌํ๋ฉด์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณง๋ฐ๋ก ์ ์กํ ์๋ ์์ต๋๋ค.
## `yield`์ ํจ๊ป `StreamingResponse` ์ฌ์ฉํ๊ธฐ { #a-streamingresponse-with-yield }
-๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์์์ `response_class=StreamingResponse`๋ฅผ ์ ์ธํ๋ฉด `yield`๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
+*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์ `response_class=StreamingResponse`๋ฅผ ์ ์ธํ๋ฉด `yield`๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
FastAPI๋ ๊ฐ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์๋ ๊ทธ๋๋ก `StreamingResponse`์ ์ ๋ฌํ๋ฉฐ, JSON ๋ฑ์ผ๋ก ๋ณํํ๋ ค๊ณ ํ์ง ์์ต๋๋ค.
-### async๊ฐ ์๋ ๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์ { #non-async-path-operation-functions }
+### async๊ฐ ์๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์* { #non-async-path-operation-functions }
`async`๊ฐ ์๋ ์ผ๋ฐ `def` ํจ์์์๋ ๋์ผํ๊ฒ `yield`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
-์ด๋ ๊ณง `StreamingResponse`๋ฅผ ์ฌ์ฉํ ๋ ํ์
์ ๋ํ
์ด์
๊ณผ ๋ฌด๊ดํ๊ฒ, ์ ์ก ๊ธฐ์ค์ ๋ง์ถฐ ๋ฐ์ดํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ธ์ฝ๋ฉํ ์์ ์ ์ฑ
์์ด ์ฌ๋ฌ๋ถ์๊ฒ ์์์ ์๋ฏธํฉ๋๋ค. ๐ค
+์ด๋ ๊ณง `StreamingResponse`๋ฅผ ์ฌ์ฉํ ๋ ํ์
์ ๋ํ
์ด์
๊ณผ ๋ฌด๊ดํ๊ฒ, ์ ์ก ๊ธฐ์ค์ ๋ง์ถฐ ๋ฐ์ดํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ธ์ฝ๋ฉํ **์์ **์ **์ฑ
์**์ด ์ฌ๋ฌ๋ถ์๊ฒ ์์์ ์๋ฏธํฉ๋๋ค. ๐ค
### ๋ฐ์ดํธ ์คํธ๋ฆฌ๋ฐ { #stream-bytes }
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
-๊ทธ๋ฐ ๋ค์ ๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์์์ `response_class=PNGStreamingResponse`๋ก ์ด ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+๊ทธ๋ฐ ๋ค์ *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์ `response_class=PNGStreamingResponse`๋ก ์ด ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
///
-์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ธ๋กํน๋๋ ๊ฒ์ ํผํ๋ ค๋ฉด ๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์๋ฅผ `async def` ๋์ ์ผ๋ฐ `def`๋ก ์ ์ธํ์ธ์. ๊ทธ๋ฌ๋ฉด FastAPI๊ฐ ์ค๋ ๋ํ ์์ปค์์ ์คํํ์ฌ ๋ฉ์ธ ๋ฃจํ๊ฐ ๋งํ์ง ์๋๋ก ํฉ๋๋ค.
+์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ธ๋กํน๋๋ ๊ฒ์ ํผํ๋ ค๋ฉด *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*๋ฅผ `async def` ๋์ ์ผ๋ฐ `def`๋ก ์ ์ธํ์ธ์. ๊ทธ๋ฌ๋ฉด FastAPI๊ฐ ์ค๋ ๋ํ ์์ปค์์ ์คํํ์ฌ ๋ฉ์ธ ๋ฃจํ๊ฐ ๋งํ์ง ์๋๋ก ํฉ๋๋ค.
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
Hello, World from Flask!
```
-๊ทธ๋ฆฌ๊ณ [http://localhost:8000/v2](http://localhost:8000/v2)๋ก ์ด๋ํ๋ฉด **FastAPI**์ ์๋ต์ ๋ณผ ์ ์์ต๋๋ค:
+๊ทธ๋ฆฌ๊ณ [http://localhost:8000/v2](http://localhost:8000/v2)๋ก ์ด๋ํ๋ฉด FastAPI์ ์๋ต์ ๋ณผ ์ ์์ต๋๋ค:
```JSON
{
### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
-Django REST framework๋ Django๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Web API๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ ์ฐํ toolkit์ผ๋ก ๋ง๋ค์ด์ก๊ณ , Django์ API ๊ธฐ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ชฉ์ ์ด์์ต๋๋ค.
+Django REST Framework๋ Django๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Web API๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ ์ฐํ toolkit์ผ๋ก ๋ง๋ค์ด์ก๊ณ , Django์ API ๊ธฐ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ชฉ์ ์ด์์ต๋๋ค.
Mozilla, Red Hat, Eventbrite๋ฅผ ํฌํจํด ๋ง์ ํ์ฌ์์ ์ฌ์ฉํฉ๋๋ค.
///
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
์๋ API ๋ฌธ์ํ ์น ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ.
Flask์ ๋จ์ํจ์ ๊ณ ๋ คํ๋ฉด API๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ ๋ง๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๋ค์์ผ๋ก ์ฐพ๊ณ ์ ํ๋ ๊ฒ์ Flask์ฉ "Django REST Framework"์์ต๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
micro-framework๊ฐ ๋๊ธฐ. ํ์ํ ๋๊ตฌ์ ๊ตฌ์ฑ์์๋ฅผ ์ฝ๊ฒ ์กฐํฉํ ์ ์๋๋ก ํ๊ธฐ.
๊ทธ๋์ ๊ณต์ ์น์ฌ์ดํธ์์ ๋งํ๋ฏ์ด:
-> Requests is one of the most downloaded Python packages of all time
+> Requests๋ ์ญ๋ ๊ฐ์ฅ ๋ง์ด ๋ค์ด๋ก๋๋ Python ํจํค์ง ์ค ํ๋์
๋๋ค
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์๋ฅผ ๋ค์ด `GET` ์์ฒญ์ ํ๋ ค๋ฉด ๋ค์์ฒ๋ผ ์์ฑํฉ๋๋ค:
`requests.get(...)`์ `@app.get(...)`์ ์ ์ฌ์ฑ์ ํ์ธํด ๋ณด์ธ์.
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
* ๋จ์ํ๊ณ ์ง๊ด์ ์ธ API๋ฅผ ๊ฐ๊ธฐ.
* HTTP method ์ด๋ฆ(operations)์ ์ง์ , ์ง๊ด์ ์ด๊ณ ๋ช
ํํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ธฐ.
๊ทธ๋์ 2.0 ๋ฒ์ ์ ์ด์ผ๊ธฐํ ๋๋ "Swagger"๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๊ณ , 3+ ๋ฒ์ ์ "OpenAPI"๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
์ปค์คํ
schema ๋์ , API ์ฌ์์ ์ํ ์ด๋ฆฐ ํ์ค์ ์ฑํํ๊ณ ์ฌ์ฉํ๊ธฐ.
ํ์ง๋ง Python type hints๊ฐ ์กด์ฌํ๊ธฐ ์ ์ ๋ง๋ค์ด์ก์ต๋๋ค. ๊ทธ๋์ ๊ฐ <dfn title="๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์ผ ํ๋์ง์ ๋ํ ์ ์">์คํค๋ง</dfn>๋ฅผ ์ ์ํ๋ ค๋ฉด Marshmallow๊ฐ ์ ๊ณตํ๋ ํน์ ์ ํธ๋ฆฌํฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
๋ฐ์ดํฐ ํ์
๊ณผ ๊ฒ์ฆ์ ์ ๊ณตํ๋ "schema"๋ฅผ ์ฝ๋๋ก ์ ์ํ๊ณ , ์ด๋ฅผ ์๋์ผ๋ก ํ์ฉํ๊ธฐ.
///
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
๋ค์ด์ค๋ ์์ฒญ ๋ฐ์ดํฐ์ ์๋ ๊ฒ์ฆ์ ๊ฐ๊ธฐ.
///
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
API๋ฅผ ์ํ ์ด๋ฆฐ ํ์ค์ธ OpenAPI๋ฅผ ์ง์ํ๊ธฐ.
///
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
serialization๊ณผ validation์ ์ ์ํ๋ ๋์ผํ ์ฝ๋๋ก๋ถํฐ OpenAPI schema๋ฅผ ์๋ ์์ฑํ๊ธฐ.
์ค์ฒฉ ๋ชจ๋ธ์ ์ ์ฒ๋ฆฌํ์ง ๋ชปํฉ๋๋ค. ์ฆ, ์์ฒญ์ JSON body๊ฐ ๋ด๋ถ ํ๋๋ฅผ ๊ฐ์ง JSON ๊ฐ์ฒด์ด๊ณ ๊ทธ ๋ด๋ถ ํ๋๋ค์ด ๋ค์ ์ค์ฒฉ๋ JSON ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ, ์ ๋๋ก ๋ฌธ์ํํ๊ณ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
Python ํ์
์ ์ฌ์ฉํด ๋ฐ์ด๋ ์๋ํฐ ์ง์์ ์ ๊ณตํ๊ธฐ.
///
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
๋ฏธ์น ์ฑ๋ฅ์ ๋ผ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ.
Falcon์ ๋ ๋ค๋ฅธ ๊ณ ์ฑ๋ฅ Python framework๋ก, ์ต์ํ์ผ๋ก ์ค๊ณ๋์๊ณ Hug ๊ฐ์ ๋ค๋ฅธ framework์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
-ํจ์๊ฐ ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ(ํ๋๋ "request", ํ๋๋ "response")๋ฅผ ๋ฐ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ request์์ ์ผ๋ถ๋ฅผ "์ฝ๊ณ ", response์ ์ผ๋ถ๋ฅผ "์์ฑ"ํฉ๋๋ค. ์ด ์ค๊ณ ๋๋ฌธ์, ํ์ค Python type hints๋ฅผ ํจ์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํด ์์ฒญ ํ๋ผ๋ฏธํฐ์ body๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
+ํจ์๊ฐ ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ(ํ๋๋ "์์ฒญ", ํ๋๋ "์๋ต")๋ฅผ ๋ฐ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ฒญ์์ ์ผ๋ถ๋ฅผ "์ฝ๊ณ ", ์๋ต์ ์ผ๋ถ๋ฅผ "์์ฑ"ํฉ๋๋ค. ์ด ์ค๊ณ ๋๋ฌธ์, ํ์ค Python type hints๋ฅผ ํจ์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํด ์์ฒญ ํ๋ผ๋ฏธํฐ์ body๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
-๋ฐ๋ผ์ ๋ฐ์ดํฐ ๊ฒ์ฆ, serialization, ๋ฌธ์ํ๋ ์๋์ผ๋ก ๋์ง ์๊ณ ์ฝ๋๋ก ํด์ผ ํฉ๋๋ค. ๋๋ Hug์ฒ๋ผ Falcon ์์ framework๋ฅผ ์น์ด ๊ตฌํํด์ผ ํฉ๋๋ค. request ๊ฐ์ฒด ํ๋์ response ๊ฐ์ฒด ํ๋๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ Falcon์ ์ค๊ณ์์ ์๊ฐ์ ๋ฐ์ ๋ค๋ฅธ framework์์๋ ๊ฐ์ ๊ตฌ๋ถ์ด ๋ํ๋ฉ๋๋ค.
+๋ฐ๋ผ์ ๋ฐ์ดํฐ ๊ฒ์ฆ, serialization, ๋ฌธ์ํ๋ ์๋์ผ๋ก ๋์ง ์๊ณ ์ฝ๋๋ก ํด์ผ ํฉ๋๋ค. ๋๋ Hug์ฒ๋ผ Falcon ์์ framework๋ฅผ ์น์ด ๊ตฌํํด์ผ ํฉ๋๋ค. ์์ฒญ ๊ฐ์ฒด ํ๋์ ์๋ต ๊ฐ์ฒด ํ๋๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ Falcon์ ์ค๊ณ์์ ์๊ฐ์ ๋ฐ์ ๋ค๋ฅธ framework์์๋ ๊ฐ์ ๊ตฌ๋ถ์ด ๋ํ๋ฉ๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
ํ๋ฅญํ ์ฑ๋ฅ์ ์ป๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ.
Route๋ ํ ๊ณณ์์ ์ ์ธํ๊ณ , ๋ค๋ฅธ ๊ณณ์ ์ ์ธ๋ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค(์๋ํฌ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์ ๋ฐ๋ก ์์ ๋ ์ ์๋ decorator๋ฅผ ์ฌ์ฉํ๋ ๋์ ). ์ด๋ Flask(๋ฐ Starlette)๋ณด๋ค๋ Django ๋ฐฉ์์ ๊ฐ๊น์ต๋๋ค. ์ฝ๋์์ ์๋์ ์ผ๋ก ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ๊ฒ๋ค์ ๋ถ๋ฆฌํด ๋์ต๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
๋ชจ๋ธ ์์ฑ์ "default" ๊ฐ์ผ๋ก ๋ฐ์ดํฐ ํ์
์ ๋ํ ์ถ๊ฐ ๊ฒ์ฆ์ ์ ์ํ๊ธฐ. ์ด๋ ์๋ํฐ ์ง์์ ๊ฐ์ ํ๋ฉฐ, ์ด์ ์๋ Pydantic์ ์์์ต๋๋ค.
///
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์์ด๋์ด
Hug๋ APIStar์ ์ผ๋ถ์ ์๊ฐ์ ์ฃผ์๊ณ , ์ ๋ APIStar์ ํจ๊ป Hug๋ฅผ ๊ฐ์ฅ ์ ๋งํ ๋๊ตฌ ์ค ํ๋๋ก ๋ณด์์ต๋๋ค.
///
-/// tip | ํ
+/// tip | **FastAPI**์ ์๊ฐ์ ์ค ์
์กด์ฌํ๊ฒ ๋ง๋ค๊ธฐ.
Marshmallow์ ๋น๊ตํ ์ ์์ต๋๋ค. ๋ค๋ง benchmark์์ Marshmallow๋ณด๋ค ๋น ๋ฆ
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ผํ Python type hints๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก ์๋ํฐ ์ง์๋ ํ๋ฅญํฉ๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**๋ ์ด๋ฅผ ์ฌ์ฉํด
๋ชจ๋ ๋ฐ์ดํฐ ๊ฒ์ฆ, ๋ฐ์ดํฐ serialization, ์๋ ๋ชจ๋ธ ๋ฌธ์ํ(JSON Schema ๊ธฐ๋ฐ)๋ฅผ ์ฒ๋ฆฌํ๊ธฐ.
* ํ๋ก์ธ์ค ๋ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
.
* ์์ ๋ฐ ์ข
๋ฃ ์ด๋ฒคํธ.
* HTTPX ๊ธฐ๋ฐ์ ํ
์คํธ ํด๋ผ์ด์ธํธ.
-* CORS, GZip, Static Files, Streaming responses.
+* CORS, GZip, Static Files, ์คํธ๋ฆฌ๋ฐ ์๋ต.
* ์ธ์
๋ฐ ์ฟ ํค ์ง์.
* 100% ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง.
* 100% ํ์
์ฃผ์์ด ๋ฌ๋ฆฐ ์ฝ๋๋ฒ ์ด์ค.
///
-/// tip | ํ
+/// tip | **FastAPI**๋ ์ด๋ฅผ ์ฌ์ฉํด
ํต์ฌ ์น ๋ถ๋ถ์ ๋ชจ๋ ์ฒ๋ฆฌํ๊ธฐ. ๊ทธ ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ.
Starlette์ **FastAPI**์์ ๊ถ์ฅํ๋ ์๋ฒ์
๋๋ค.
-/// tip | ํ
+/// tip | **FastAPI**๋ ์ด๋ฅผ ๋ค์์ผ๋ก ๊ถ์ฅํฉ๋๋ค
**FastAPI** ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํ ์ฃผ์ ์น ์๋ฒ.
-๋ํ `--workers` ์ปค๋งจ๋๋ผ์ธ ์ต์
์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฉํฐํ๋ก์ธ์ค ์๋ฒ๋ก ์คํํ ์๋ ์์ต๋๋ค.
+๋ํ `--workers` ๋ช
๋ น์ค ์ต์
์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฉํฐํ๋ก์ธ์ค ์๋ฒ๋ก ์คํํ ์๋ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ [๋ฐฐํฌ](deployment/index.md) ์น์
์ ํ์ธํ์ธ์.
# ๋์์ฑ๊ณผ async / await { #concurrency-and-async-await }
+
*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์์์ `async def` ๋ฌธ๋ฒ์ ๋ํ ์ธ๋ถ์ฌํญ๊ณผ ๋น๋๊ธฐ ์ฝ๋, ๋์์ฑ ๋ฐ ๋ณ๋ ฌ์ฑ์ ๋ํ ๋ฐฐ๊ฒฝ
## ๋ฐ์์ ๊ฐ์? { #in-a-hurry }
์ต์ํ์ ๋
ธ๋ ฅ์ผ๋ก API๋ฅผ **๊ตฌ์ถ**, **๋ฐฐํฌ**, **์ ๊ทผ**ํ๋ ๊ณผ์ ์ ๊ฐ์ํํฉ๋๋ค.
-FastAPIรซยก\9c รฌ\95ยฑ์ ๋น๋ํ ๋์ ๋์ผํ **๊ฐ๋ฐ์ ๊ฒฝํ**์ ํด๋ผ์ฐ๋์ **๋ฐฐํฌ**ํ๋ ๋ฐ์๋ ์ ๊ณตํฉ๋๋ค. ๐
+FastAPIรซยก\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ๋น๋ํ ๋์ ๋์ผํ **๊ฐ๋ฐ์ ๊ฒฝํ**์ ํด๋ผ์ฐ๋์ **๋ฐฐํฌ**ํ๋ ๋ฐ์๋ ์ ๊ณตํฉ๋๋ค. ๐
FastAPI Cloud๋ *FastAPI and friends* ์คํ ์์ค ํ๋ก์ ํธ์ ์ฃผ์ ํ์์์ด์ ์๊ธ ์ ๊ณต์์
๋๋ค. โจ
## ํด๋ผ์ฐ๋ ์ ๊ณต์
์ฒด - ํ์์๋ค { #cloud-providers-sponsors }
-๋ค๋ฅธ ๋ช๋ช ํด๋ผ์ฐ๋ ์ ๊ณต์
์ฒด๋ค๋ โจ [**FastAPI๋ฅผ ํ์ํฉ๋๋ค**](../help-fastapi.md#sponsor-the-author) โจ. ๐
+๋ค๋ฅธ ๋ช๋ช ํด๋ผ์ฐ๋ ์ ๊ณต์
์ฒด๋ค๋ โจ [**FastAPI๋ฅผ ํ์ํฉ๋๋ค**](https://github.com/sponsors/tiangolo) โจ. ๐
๊ฐ์ด๋๋ฅผ ๋ฐ๋ผ ํ๊ณ ์๋น์ค๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ ์ํด ์ด๋ค๋ ๊ณ ๋ คํด๋ณผ ์ ์์ต๋๋ค:
### ์์ ์ ์๋ ์คํ { #run-automatically-on-startup }
-รฌ\9dยผรซยฐ\98รฌย \81รฌ\9cยผรซยก\9c รฌ\84\9cรซยฒ\84 รญ\94\84รซยก\9cรชยทยธรซ\9eยจ(รฌ\98\88: Uvicorn)รฌ\9d\80 รฌ\84\9cรซยฒ\84รชยฐ\80 รฌ\8b\9cรฌ\9e\91รซ\90ย รซ\95\8c รฌ\9e\90รซ\8f\99รฌ\9cยผรซยก\9c รฌ\8b\9cรฌ\9e\91รซ\90\98รชยณย , **รฌ\82ยฌรซ\9e\8cรฌ\9d\98 รชยฐ\9cรฌ\9e\85** รฌ\97\86รฌ\9dยดรซ\8f\84 FastAPI รฌ\95ยฑรฌ\9d\84 รฌ\8bยครญ\96\89รญ\95\98รซ\8a\94 รญ\94\84รซยก\9cรฌ\84ยธรฌ\8aยครชยฐ\80 รญ\95ยญรฌ\83\81 รฌ\8bยครญ\96\89 รฌยค\91รฌ\9dยดรซ\8f\84รซยก\9d(รฌ\98\88: FastAPI รฌ\95ยฑ์ ์คํํ๋ Uvicorn) ๊ตฌ์ฑํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
+รฌ\9dยผรซยฐ\98รฌย \81รฌ\9cยผรซยก\9c รฌ\84\9cรซยฒ\84 รญ\94\84รซยก\9cรชยทยธรซ\9eยจ(รฌ\98\88: Uvicorn)รฌ\9d\80 รฌ\84\9cรซยฒ\84รชยฐ\80 รฌ\8b\9cรฌ\9e\91รซ\90ย รซ\95\8c รฌ\9e\90รซ\8f\99รฌ\9cยผรซยก\9c รฌ\8b\9cรฌ\9e\91รซ\90\98รชยณย , **รฌ\82ยฌรซ\9e\8cรฌ\9d\98 รชยฐ\9cรฌ\9e\85** รฌ\97\86รฌ\9dยดรซ\8f\84 FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 รฌ\8bยครญ\96\89รญ\95\98รซ\8a\94 รญ\94\84รซยก\9cรฌ\84ยธรฌ\8aยครชยฐ\80 รญ\95ยญรฌ\83\81 รฌ\8bยครญ\96\89 รฌยค\91รฌ\9dยดรซ\8f\84รซยก\9d(รฌ\98\88: FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์คํํ๋ Uvicorn) ๊ตฌ์ฑํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
### ๋ณ๋์ ํ๋ก๊ทธ๋จ { #separate-program }
///
-รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 รฌ\9eยฌรฌ\8b\9cรฌ\9e\91รญ\95\98รซ\8a\94 รฌ\97ยญรญ\95ย รฌ\9d\80 **รฌ\99ยธรซยถ\80 รฌยปยดรญ\8fยฌรซ\84\8cรญ\8aยธ**รชยฐ\80 รซยงยกรซ\8a\94 รญ\8eยธรฌ\9dยด รซยณยดรญ\86ยต รฌยข\8bรฌ\8aยตรซ\8b\88รซ\8bยค. รชยทยธ รฌ\8b\9cรฌย \90รฌ\97\90รซ\8a\94 Uvicornรชยณยผ Pythonรฌ\9d\84 รญ\8fยฌรญ\95ยจรญ\95\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9dยด รฌ\9dยดรซยฏยธ รญ\81ยฌรซ\9e\98รฌ\8b\9cรญ\96\88รชยธยฐ รซ\95\8cรซยฌยธรฌ\97\90, รชยฐ\99รฌ\9d\80 รฌ\95ยฑ์ ๊ฐ์ ์ฝ๋ ์์์ ์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 รฌ\9eยฌรฌ\8b\9cรฌ\9e\91รญ\95\98รซ\8a\94 รฌ\97ยญรญ\95ย รฌ\9d\80 **รฌ\99ยธรซยถ\80 รฌยปยดรญ\8fยฌรซ\84\8cรญ\8aยธ**รชยฐ\80 รซยงยกรซ\8a\94 รญ\8eยธรฌ\9dยด รซยณยดรญ\86ยต รฌยข\8bรฌ\8aยตรซ\8b\88รซ\8bยค. รชยทยธ รฌ\8b\9cรฌย \90รฌ\97\90รซ\8a\94 Uvicornรชยณยผ Pythonรฌ\9d\84 รญ\8fยฌรญ\95ยจรญ\95\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9dยด รฌ\9dยดรซยฏยธ รญ\81ยฌรซ\9e\98รฌ\8b\9cรญ\96\88รชยธยฐ รซ\95\8cรซยฌยธรฌ\97\90, รชยฐ\99รฌ\9d\80 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ๊ฐ์ ์ฝ๋ ์์์ ์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
### ์๋ ์ฌ์์์ ์ํ ๋๊ตฌ ์์ { #example-tools-to-restart-automatically }
**์ปจํ
์ด๋**, Docker, Kubernetes์ ๋ํ ์ผ๋ถ ๋ด์ฉ์ด ์์ง์ ์ ์ดํด๋์ง ์์๋ ๊ด์ฐฎ์ต๋๋ค.
-๋ค์ ์ฅ์์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง, Docker, Kubernetes ๋ฑ์ ๋ ์ค๋ช
ํ๊ฒ ์ต๋๋ค: [์ปจํ
์ด๋์์ FastAPI - Docker](docker.md).
+ํฅํ ์ฅ์์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง, Docker, Kubernetes ๋ฑ์ ๋ ์ค๋ช
ํ๊ฒ ์ต๋๋ค: [์ปจํ
์ด๋์์ FastAPI - Docker](docker.md).
///
๊ฐ๋ฅํ ์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-* รฌ\95ยฑ ์ปจํ
์ด๋๋ณด๋ค ๋จผ์ ์คํ๋๋ Kubernetes์ โInit Containerโ
+* รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 ์ปจํ
์ด๋๋ณด๋ค ๋จผ์ ์คํ๋๋ Kubernetes์ โInit Containerโ
* ์ฌ์ ๋จ๊ณ๋ฅผ ์คํํ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ํ๋ bash ์คํฌ๋ฆฝํธ
* ์ด bash ์คํฌ๋ฆฝํธ๋ฅผ ์์/์ฌ์์ํ๊ณ , ์ค๋ฅ๋ฅผ ๊ฐ์งํ๋ ๋ฑ์ ๋ฐฉ๋ฒ๋ ์ฌ์ ํ ํ์ํฉ๋๋ค.
/// tip | ํ
-์ปจํ
์ด๋๋ก ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๊ตฌ์ฒด์ ์ธ ์์๋ ๋ค์ ์ฅ์์ ์ ๊ณตํ๊ฒ ์ต๋๋ค: [์ปจํ
์ด๋์์ FastAPI - Docker](docker.md).
+์ปจํ
์ด๋๋ก ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๊ตฌ์ฒด์ ์ธ ์์๋ ํฅํ ์ฅ์์ ์ ๊ณตํ๊ฒ ์ต๋๋ค: [์ปจํ
์ด๋์์ FastAPI - Docker](docker.md).
///
///
<details>
-<summary>Dockerfile Preview ๐</summary>
+<summary>Dockerfile ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๐</summary>
```Dockerfile
FROM python:3.14
**์ปจํ
์ด๋**๋ **์ปจํ
์ด๋ ์ด๋ฏธ์ง**์์ ์คํ๋ฉ๋๋ค.
-์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ ์ปจํ
์ด๋์ ์์ด์ผ ํ๋ ๋ชจ๋ ํ์ผ, ํ๊ฒฝ ๋ณ์, ๊ธฐ๋ณธ ๋ช
๋ น/ํ๋ก๊ทธ๋จ์ **์ ์ ** ๋ฒ์ ์
๋๋ค. ์ฌ๊ธฐ์ **์ ์ **์ด๋ผ๋ ๊ฒ์ ์ปจํ
์ด๋ **์ด๋ฏธ์ง**๊ฐ ์คํ ์ค์ด๊ฑฐ๋ ์ํ๋๋ ๊ฒ์ด ์๋๋ผ, ํจํค์ง๋ ํ์ผ๊ณผ ๋ฉํ๋ฐ์ดํฐ์ผ ๋ฟ์ด๋ผ๋ ๋ป์
๋๋ค.
+์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ ์ปจํ
์ด๋์ ์์ด์ผ ํ๋ ๋ชจ๋ ํ์ผ, ํ๊ฒฝ ๋ณ์, ๊ธฐ๋ณธ ๋ช
๋ น์ด/ํ๋ก๊ทธ๋จ์ **์ ์ ** ๋ฒ์ ์
๋๋ค. ์ฌ๊ธฐ์ **์ ์ **์ด๋ผ๋ ๊ฒ์ ์ปจํ
์ด๋ **์ด๋ฏธ์ง**๊ฐ ์คํ ์ค์ด๊ฑฐ๋ ์ํ๋๋ ๊ฒ์ด ์๋๋ผ, ํจํค์ง๋ ํ์ผ๊ณผ ๋ฉํ๋ฐ์ดํฐ์ผ ๋ฟ์ด๋ผ๋ ๋ป์
๋๋ค.
์ ์ฅ๋ ์ ์ ์ฝํ
์ธ ์ธ "**์ปจํ
์ด๋ ์ด๋ฏธ์ง**"์ ๋ฌ๋ฆฌ, "**์ปจํ
์ด๋**"๋ ๋ณดํต ์คํ ์ค์ธ ์ธ์คํด์ค, ์ฆ **์คํ๋๋** ๋์์ ์๋ฏธํฉ๋๋ค.
๋ํ [Docker Hub](https://hub.docker.com/)์๋ ๋ค์ํ ๋๊ตฌ, ํ๊ฒฝ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง **๊ณต์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง**๊ฐ ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
-์๋ฅผ ๋ค์ด, ๊ณต์ [Python Image](https://hub.docker.com/_/python)๊ฐ ์์ต๋๋ค.
+์๋ฅผ ๋ค์ด, ๊ณต์ [Python ์ด๋ฏธ์ง](https://hub.docker.com/_/python)๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ ๋ค์ํ ์ฉ๋์ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ ๋ง์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด:
## ์ปจํ
์ด๋์ ํ๋ก์ธ์ค { #containers-and-processes }
-**์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ ๋ณดํต **์ปจํ
์ด๋**๊ฐ ์์๋ ๋ ์คํ๋์ด์ผ ํ๋ ๊ธฐ๋ณธ ํ๋ก๊ทธ๋จ/๋ช
๋ น๊ณผ ํด๋น ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฉํ๋ฐ์ดํฐ์ ํฌํจํฉ๋๋ค. ์ปค๋งจ๋ ๋ผ์ธ์์ ์คํํ ๋์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
+**์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ ๋ณดํต **์ปจํ
์ด๋**๊ฐ ์์๋ ๋ ์คํ๋์ด์ผ ํ๋ ๊ธฐ๋ณธ ํ๋ก๊ทธ๋จ/๋ช
๋ น์ด์ ํด๋น ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฉํ๋ฐ์ดํฐ์ ํฌํจํฉ๋๋ค. ์ปค๋งจ๋ ๋ผ์ธ์์ ์คํํ ๋์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
-**์ปจํ
์ด๋**๊ฐ ์์๋๋ฉด ํด๋น ๋ช
๋ น/ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค(๋ค๋ง ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๋ค๋ฅธ ๋ช
๋ น/ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒ ํ ์๋ ์์ต๋๋ค).
+**์ปจํ
์ด๋**๊ฐ ์์๋๋ฉด ํด๋น ๋ช
๋ น์ด/ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค(๋ค๋ง ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๋ค๋ฅธ ๋ช
๋ น์ด/ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒ ํ ์๋ ์์ต๋๋ค).
-์ปจํ
์ด๋๋ **๋ฉ์ธ ํ๋ก์ธ์ค**(๋ช
๋ น ๋๋ ํ๋ก๊ทธ๋จ)๊ฐ ์คํ๋๋ ๋์ ์คํ๋ฉ๋๋ค.
+์ปจํ
์ด๋๋ **๋ฉ์ธ ํ๋ก์ธ์ค**(๋ช
๋ น์ด ๋๋ ํ๋ก๊ทธ๋จ)๊ฐ ์คํ๋๋ ๋์ ์คํ๋ฉ๋๋ค.
์ปจํ
์ด๋๋ ๋ณดํต **๋จ์ผ ํ๋ก์ธ์ค**๋ฅผ ๊ฐ์ง์ง๋ง, ๋ฉ์ธ ํ๋ก์ธ์ค์์ ์๋ธํ๋ก์ธ์ค๋ฅผ ์์ํ ์๋ ์์ผ๋ฉฐ, ๊ทธ๋ฌ๋ฉด ๊ฐ์ ์ปจํ
์ด๋์ **์ฌ๋ฌ ํ๋ก์ธ์ค**๊ฐ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง ๋น๋ ์๊ฐ์ ์ต์ ํํ๋ ค๋ฉด `Dockerfile`์ **๋๋ถ๋ถ ๊ทผ์ฒ**์ ๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
-6. ๋ด๋ถ์ ์ผ๋ก Uvicorn์ ์ฌ์ฉํ๋ `fastapi run`์ ์ฌ์ฉํ๋๋ก **๋ช
๋ น**์ ์ค์ ํฉ๋๋ค.
+6. ๋ด๋ถ์ ์ผ๋ก Uvicorn์ ์ฌ์ฉํ๋ `fastapi run`์ ์ฌ์ฉํ๋๋ก **๋ช
๋ น์ด**๋ฅผ ์ค์ ํฉ๋๋ค.
`CMD`๋ ๋ฌธ์์ด ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ฉฐ, ๊ฐ ๋ฌธ์์ด์ ์ปค๋งจ๋ ๋ผ์ธ์์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์
๋ ฅํ๋ ํญ๋ชฉ๋ค์
๋๋ค.
- รฌ\9dยด รซยช\85รซย ยนรฌ\9d\80 **ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ**์์ ์คํ๋๋ฉฐ, ์ด๋ ์์์ `WORKDIR /code`๋ก ์ค์ ํ `/code` ๋๋ ํฐ๋ฆฌ์ ๊ฐ์ต๋๋ค.
+ รฌ\9dยด รซยช\85รซย ยนรฌ\96ยดรซ\8a\94 **ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ**์์ ์คํ๋๋ฉฐ, ์ด๋ ์์์ `WORKDIR /code`๋ก ์ค์ ํ `/code` ๋๋ ํฐ๋ฆฌ์ ๊ฐ์ต๋๋ค.
/// tip | ํ
์์ธํ ๋ด์ฉ์ [shell and exec form์ ๋ํ Docker ๋ฌธ์](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form)๋ฅผ ์ฐธ๊ณ ํ์ธ์.
-์ด๋ `docker compose`๋ฅผ ์ฌ์ฉํ ๋ ๊ฝค ๋์ ๋ ์ ์์ต๋๋ค. ์ข ๋ ๊ธฐ์ ์ ์ธ ์์ธ ๋ด์ฉ์ Docker Compose FAQ ์น์
์ ์ฐธ๊ณ ํ์ธ์: [Why do my services take 10 seconds to recreate or stop?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
+์ด๋ `docker compose`๋ฅผ ์ฌ์ฉํ ๋ ๊ฝค ๋์ ๋ ์ ์์ต๋๋ค. ์ข ๋ ๊ธฐ์ ์ ์ธ ์์ธ ๋ด์ฉ์ Docker Compose FAQ ์น์
์ ์ฐธ๊ณ ํ์ธ์: [์ ๋ด ์๋น์ค๋ ๋ค์ ์์ฑ๋๊ฑฐ๋ ์ค์ง๋๋ ๋ฐ 10์ด๊ฐ ๊ฑธ๋ฆฌ๋์?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
#### ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ { #directory-structure }
2. ๋จ์ผ ํ์ผ `main.py`์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ณต(serve)ํ๊ธฐ ์ํด `fastapi run`์ ์ฌ์ฉํฉ๋๋ค.
-`fastapi run`รฌ\97\90 รญ\8c\8cรฌ\9dยผรฌ\9d\84 รฌย \84รซ\8bยฌรญ\95\98รซยฉยด, รฌ\9dยดรชยฒ\83รฌ\9dยด รญ\8cยจรญ\82ยครฌยง\80รฌ\9d\98 รฌ\9dยผรซยถ\80รชยฐ\80 รฌ\95\84รซ\8b\8c รซ\8bยจรฌ\9dยผ รญ\8c\8cรฌ\9dยผรฌ\9dยดรซ\9dยผรซ\8a\94 รชยฒ\83รฌ\9d\84 รฌ\9e\90รซ\8f\99รฌ\9cยผรซยก\9c รชยฐ\90รฌยง\80รญ\95\98รชยณย , รฌ\96ยดรซ\96ยปรชยฒ\8c รฌ\9e\84รญ\8fยฌรญ\8aยธรญ\95ยดรฌ\84\9c FastAPI รฌ\95ยฑ์ ์ ๊ณตํ ์ง ์์๋
๋๋ค. ๐
+`fastapi run`รฌ\97\90 รญ\8c\8cรฌ\9dยผรฌ\9d\84 รฌย \84รซ\8bยฌรญ\95\98รซยฉยด, รฌ\9dยดรชยฒ\83รฌ\9dยด รญ\8cยจรญ\82ยครฌยง\80รฌ\9d\98 รฌ\9dยผรซยถ\80รชยฐ\80 รฌ\95\84รซ\8b\8c รซ\8bยจรฌ\9dยผ รญ\8c\8cรฌ\9dยผรฌ\9dยดรซ\9dยผรซ\8a\94 รชยฒ\83รฌ\9d\84 รฌ\9e\90รซ\8f\99รฌ\9cยผรซยก\9c รชยฐ\90รฌยง\80รญ\95\98รชยณย , รฌ\96ยดรซ\96ยปรชยฒ\8c รฌ\9e\84รญ\8fยฌรญ\8aยธรญ\95ยดรฌ\84\9c FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์ ๊ณตํ ์ง ์์๋
๋๋ค. ๐
## ๋ฐฐํฌ ๊ฐ๋
{ #deployment-concepts }
///
-รซ\98\90รญ\95\9c รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88รซยก\9c รฌ\9e\91รฌ\97\85รญ\95ย รซ\95\8c, รฌ\9dยดรซยฅยผ รฌ\8b\9cรฌ\9e\91รญ\95\98รชยณย รชยด\80รซยฆยฌรญ\95\98รซ\8a\94 รฌ\8b\9cรฌ\8aยครญ\85\9cรฌ\9d\80 รฌ\9dยดรซยฏยธ รญ\95ยดรซ\8bยน **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**(รซ\98\90รซ\8a\94 **TLS รฌยข\85รซยฃ\8c รญ\94\84รซยก\9dรฌ\8b\9c**)รฌ\97\90รฌ\84\9c รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ยฑ์ด ์๋ ์ปจํ
์ด๋๋ก **๋คํธ์ํฌ ํต์ **(์: HTTP ์์ฒญ)์ ์ ๋ฌํ๋ ๋ด๋ถ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
+รซ\98\90รญ\95\9c รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88รซยก\9c รฌ\9e\91รฌ\97\85รญ\95ย รซ\95\8c, รฌ\9dยดรซยฅยผ รฌ\8b\9cรฌ\9e\91รญ\95\98รชยณย รชยด\80รซยฆยฌรญ\95\98รซ\8a\94 รฌ\8b\9cรฌ\8aยครญ\85\9cรฌ\9d\80 รฌ\9dยดรซยฏยธ รญ\95ยดรซ\8bยน **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**(รซ\98\90รซ\8a\94 **TLS รฌยข\85รซยฃ\8c รญ\94\84รซยก\9dรฌ\8b\9c**)รฌ\97\90รฌ\84\9c รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ์๋ ์ปจํ
์ด๋๋ก **๋คํธ์ํฌ ํต์ **(์: HTTP ์์ฒญ)์ ์ ๋ฌํ๋ ๋ด๋ถ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
### ํ๋์ ๋ก๋ ๋ฐธ๋ฐ์ - ์ฌ๋ฌ ์์ปค ์ปจํ
์ด๋ { #one-load-balancer-multiple-worker-containers }
-**Kubernetes** รชยฐ\99รฌ\9d\80 รซยถ\84รฌ\82ยฐ รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88 รชยด\80รซยฆยฌ รฌ\8b\9cรฌ\8aยครญ\85\9cรฌ\97\90รฌ\84\9cรซ\8a\94 รซ\82ยดรซยถ\80 รซ\84ยครญ\8aยธรฌ\9b\8cรญ\82ยน รซยฉ\94รฌยปยครซ\8b\88รฌยฆ\98รฌ\9d\84 รญ\86ยตรญ\95ยด, รซยฉ\94รฌ\9dยธ **รญ\8fยฌรญ\8aยธ**รฌ\97\90รฌ\84\9c รซ\8c\80รชยธยฐรญ\95\98รซ\8a\94 รซ\8bยจรฌ\9dยผ **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**รชยฐ\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ยฑ์ ์คํํ๋ **์ฌ๋ฌ ์ปจํ
์ด๋**๋ก ํต์ (์์ฒญ)์ ์ ๋ฌํ ์ ์์ต๋๋ค.
+**Kubernetes** รชยฐ\99รฌ\9d\80 รซยถ\84รฌ\82ยฐ รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88 รชยด\80รซยฆยฌ รฌ\8b\9cรฌ\8aยครญ\85\9cรฌ\97\90รฌ\84\9cรซ\8a\94 รซ\82ยดรซยถ\80 รซ\84ยครญ\8aยธรฌ\9b\8cรญ\82ยน รซยฉ\94รฌยปยครซ\8b\88รฌยฆ\98รฌ\9d\84 รญ\86ยตรญ\95ยด, รซยฉ\94รฌ\9dยธ **รญ\8fยฌรญ\8aยธ**รฌ\97\90รฌ\84\9c รซ\8c\80รชยธยฐรญ\95\98รซ\8a\94 รซ\8bยจรฌ\9dยผ **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**รชยฐ\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์คํํ๋ **์ฌ๋ฌ ์ปจํ
์ด๋**๋ก ํต์ (์์ฒญ)์ ์ ๋ฌํ ์ ์์ต๋๋ค.
-รฌ\95ยฑ์ ์คํํ๋ ๊ฐ ์ปจํ
์ด๋๋ ๋ณดํต **ํ๋ก์ธ์ค ํ๋๋ง** ๊ฐ์ง๋๋ค(์: FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ Uvicorn ํ๋ก์ธ์ค). ๋ชจ๋ ๊ฐ์ ๊ฒ์ ์คํํ๋ **๋์ผํ ์ปจํ
์ด๋**์ด์ง๋ง, ๊ฐ์ ๊ณ ์ ํ ํ๋ก์ธ์ค, ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ๊ฐ์ง๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด CPU์ **์๋ก ๋ค๋ฅธ ์ฝ์ด** ๋๋ **์๋ก ๋ค๋ฅธ ๋จธ์ **์์ **๋ณ๋ ฌํ**์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
+รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์คํํ๋ ๊ฐ ์ปจํ
์ด๋๋ ๋ณดํต **ํ๋ก์ธ์ค ํ๋๋ง** ๊ฐ์ง๋๋ค(์: FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ Uvicorn ํ๋ก์ธ์ค). ๋ชจ๋ ๊ฐ์ ๊ฒ์ ์คํํ๋ **๋์ผํ ์ปจํ
์ด๋**์ด์ง๋ง, ๊ฐ์ ๊ณ ์ ํ ํ๋ก์ธ์ค, ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ๊ฐ์ง๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด CPU์ **์๋ก ๋ค๋ฅธ ์ฝ์ด** ๋๋ **์๋ก ๋ค๋ฅธ ๋จธ์ **์์ **๋ณ๋ ฌํ**์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
-รชยทยธรซยฆยฌรชยณย **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**รชยฐ\80 รฌ\9e\88รซ\8a\94 รซยถ\84รฌ\82ยฐ รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88 รฌ\8b\9cรฌ\8aยครญ\85\9cรฌ\9d\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ยฑรฌ\9d\84 รฌ\8bยครญ\96\89รญ\95\98รซ\8a\94 รชยฐ\81 รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88รฌ\97\90 **รซยฒ\88รชยฐ\88รฌ\95\84รชยฐ\80รซยฉยฐ** รฌ\9a\94รฌยฒยญรฌ\9d\84 **รซยถ\84รฌ\82ยฐ**รญ\95ยฉรซ\8b\88รซ\8bยค. รซ\94ยฐรซ\9dยผรฌ\84\9c รชยฐ\81 รฌ\9a\94รฌยฒยญรฌ\9d\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ยฑ์ ์คํํ๋ ์ฌ๋ฌ **๋ณต์ ๋ ์ปจํ
์ด๋** ์ค ํ๋์์ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
+รชยทยธรซยฆยฌรชยณย **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**รชยฐ\80 รฌ\9e\88รซ\8a\94 รซยถ\84รฌ\82ยฐ รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88 รฌ\8b\9cรฌ\8aยครญ\85\9cรฌ\9d\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 รฌ\8bยครญ\96\89รญ\95\98รซ\8a\94 รชยฐ\81 รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88รฌ\97\90 **รซยฒ\88รชยฐ\88รฌ\95\84รชยฐ\80รซยฉยฐ** รฌ\9a\94รฌยฒยญรฌ\9d\84 **รซยถ\84รฌ\82ยฐ**รญ\95ยฉรซ\8b\88รซ\8bยค. รซ\94ยฐรซ\9dยผรฌ\84\9c รชยฐ\81 รฌ\9a\94รฌยฒยญรฌ\9d\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์คํํ๋ ์ฌ๋ฌ **๋ณต์ ๋ ์ปจํ
์ด๋** ์ค ํ๋์์ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
-รซ\98\90รญ\95\9c รซยณยดรญ\86ยต รฌ\9dยด **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**รซ\8a\94 รญ\81ยดรซ\9fยฌรฌ\8aยครญ\84ยฐ รซ\82ยด *รซ\8bยครซยฅยธ* รฌ\95ยฑ์ผ๋ก ๊ฐ๋ ์์ฒญ(์: ๋ค๋ฅธ ๋๋ฉ์ธ, ๋๋ ๋ค๋ฅธ URL ๊ฒฝ๋ก ์ ๋์ฌ ์๋๋ก ๊ฐ๋ ์์ฒญ)๋ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๊ทธ ํต์ ์ ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ *๊ทธ ๋ค๋ฅธ* ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ๋ฐ๋ฅธ ์ปจํ
์ด๋๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
+รซ\98\90รญ\95\9c รซยณยดรญ\86ยต รฌ\9dยด **รซยก\9cรซ\93\9c รซยฐยธรซ\9fยฐรฌ\84\9c**รซ\8a\94 รญ\81ยดรซ\9fยฌรฌ\8aยครญ\84ยฐ รซ\82ยด *รซ\8bยครซยฅยธ* รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ผ๋ก ๊ฐ๋ ์์ฒญ(์: ๋ค๋ฅธ ๋๋ฉ์ธ, ๋๋ ๋ค๋ฅธ URL ๊ฒฝ๋ก ์ ๋์ฌ ์๋๋ก ๊ฐ๋ ์์ฒญ)๋ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๊ทธ ํต์ ์ ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ *๊ทธ ๋ค๋ฅธ* ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ๋ฐ๋ฅธ ์ปจํ
์ด๋๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
### ์ปจํ
์ด๋๋น ํ๋์ ํ๋ก์ธ์ค { #one-process-per-container }
### ๋จ์ผ ์ปจํ
์ด๋ { #single-container }
-**รซ\8bยจรฌ\9dยผ รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88**รฌ\97\90รฌ\84\9c รฌ\97ยฌรซ\9fยฌ **รฌ\9b\8cรฌยปยค รญ\94\84รซยก\9cรฌ\84ยธรฌ\8aยค**(รซ\98\90รซ\8a\94 รซ\8bยจรฌ\9dยผ รญ\94\84รซยก\9cรฌ\84ยธรฌ\8aยค)รซยฅยผ รฌ\8b\9cรฌ\9e\91รญ\95\98รซ\8a\94 รซ\8bยจรฌ\88\9cรญ\95\9c รฌ\85\8bรฌ\97\85รฌ\9dยดรซ\9dยผรซยฉยด, รฌ\95ยฑ์ด ์๋ ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ธฐ ์ง์ ์ ๊ฐ์ ์ปจํ
์ด๋์์ ์์ ์ ์ฌ์ ๋จ๊ณ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
+**รซ\8bยจรฌ\9dยผ รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88**รฌ\97\90รฌ\84\9c รฌ\97ยฌรซ\9fยฌ **รฌ\9b\8cรฌยปยค รญ\94\84รซยก\9cรฌ\84ยธรฌ\8aยค**(รซ\98\90รซ\8a\94 รซ\8bยจรฌ\9dยผ รญ\94\84รซยก\9cรฌ\84ยธรฌ\8aยค)รซยฅยผ รฌ\8b\9cรฌ\9e\91รญ\95\98รซ\8a\94 รซ\8bยจรฌ\88\9cรญ\95\9c รฌ\85\8bรฌ\97\85รฌ\9dยดรซ\9dยผรซยฉยด, รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ์๋ ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ธฐ ์ง์ ์ ๊ฐ์ ์ปจํ
์ด๋์์ ์์ ์ ์ฌ์ ๋จ๊ณ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
### ๋ฒ ์ด์ค ๋์ปค ์ด๋ฏธ์ง { #base-docker-image }
์ด Docker ์ด๋ฏธ์ง๋ Uvicorn์ด ์ฃฝ์ ์์ปค๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์์ํ๋ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ ์๊ธฐ์ ๋ง๋ค์ด์ก์ต๋๋ค. ๊ทธ๋์ Gunicorn๊ณผ Uvicorn์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๊ณ , Gunicorn์ด Uvicorn ์์ปค ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์์ํ๋๋ก ํ๊ธฐ ์ํด ์๋นํ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋์์ต๋๋ค.
-ํ์ง๋ง ์ด์ Uvicorn(๊ทธ๋ฆฌ๊ณ `fastapi` ๋ช
๋ น)์ `--workers`๋ฅผ ์ง์ํ๋ฏ๋ก, ๋ฒ ์ด์ค ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ง์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค(์ฝ๋ ์๋ ์ฌ์ค์ ๊ฑฐ์ ๊ฐ์ต๋๋ค ๐
).
+ํ์ง๋ง ์ด์ Uvicorn(๊ทธ๋ฆฌ๊ณ `fastapi` ๋ช
๋ น์ด)์ `--workers`๋ฅผ ์ง์ํ๋ฏ๋ก, ๋ฒ ์ด์ค ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ง์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค(์ฝ๋ ์๋ ์ฌ์ค์ ๊ฑฐ์ ๊ฐ์ต๋๋ค ๐
).
///
## `uv`๋ฅผ ์ฌ์ฉํ๋ ๋์ปค ์ด๋ฏธ์ง { #docker-image-with-uv }
-ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด [uv](https://github.com/astral-sh/uv)๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, [uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/)๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
+ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด [uv](https://github.com/astral-sh/uv)๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, [uv Docker ๊ฐ์ด๋](https://docs.astral.sh/uv/guides/integration/docker/)๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
## ์์ฝ { #recap }
์ด์ **๊ฐ๋ฐ์ ๊ด์ **์์ HTTPS๋ฅผ ์๊ฐํ ๋ ์ผ๋์ ๋์ด์ผ ํ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
-* HTTPS๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, **์๋ฒ**๊ฐ **์ 3์**๊ฐ ๋ฐ๊ธํ **"์ธ์ฆ์(certificates)"**๋ฅผ **๋ณด์ **ํด์ผ ํฉ๋๋ค.
+* HTTPS๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, **์๋ฒ**๊ฐ **์ 3์**๊ฐ ์์ฑํ **"์ธ์ฆ์(certificates)"**๋ฅผ **๋ณด์ **ํด์ผ ํฉ๋๋ค.
* ์ด ์ธ์ฆ์๋ ์ค์ ๋ก '์์ฑ'๋๋ ๊ฒ์ด ์๋๋ผ ์ 3์๋ก๋ถํฐ **๋ฐ๊ธ/ํ๋**ํ๋ ๊ฒ์
๋๋ค.
* ์ธ์ฆ์์๋ **์ ํจ ๊ธฐ๊ฐ**์ด ์์ต๋๋ค.
* ์ฆ, **๋ง๋ฃ**๋ฉ๋๋ค.
# ์๋ฒ๋ฅผ ์๋์ผ๋ก ์คํํ๊ธฐ { #run-a-server-manually }
-## `fastapi run` ๋ช
๋ น ์ฌ์ฉํ๊ธฐ { #use-the-fastapi-run-command }
+## `fastapi run` ๋ช
๋ น์ด ์ฌ์ฉํ๊ธฐ { #use-the-fastapi-run-command }
์์ฝํ๋ฉด, `fastapi run`์ ์ฌ์ฉํด FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ์๋น์คํ์ธ์:
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ์ด๊ฒ์ผ๋ก ๋์ํฉ๋๋ค. ๐
-รฌ\98\88รซยฅยผ รซ\93ยครฌ\96ยด รฌ\9dยด รซยช\85รซย ยนรฌ\9d\80 รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88รซ\82\98 รฌ\84\9cรซยฒ\84 รซ\93ยฑรฌ\97\90รฌ\84\9c **FastAPI** รฌ\95ยฑ์ ์์ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+รฌ\98\88รซยฅยผ รซ\93ยครฌ\96ยด รฌ\9dยด รซยช\85รซย ยนรฌ\96ยดรซ\8a\94 รฌยปยจรญ\85\8cรฌ\9dยดรซ\84\88รซ\82\98 รฌ\84\9cรซยฒ\84 รซ\93ยฑรฌ\97\90รฌ\84\9c **FastAPI** รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์์ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
## ASGI ์๋ฒ { #asgi-servers }
FastAPI๋ <abbr title="Asynchronous Server Gateway Interface - ๋น๋๊ธฐ ์๋ฒ ๊ฒ์ดํธ์จ์ด ์ธํฐํ์ด์ค">ASGI</abbr>๋ผ๊ณ ๋ถ๋ฆฌ๋, Python ์น ํ๋ ์์ํฌ์ ์๋ฒ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ํ์ค์ ์ฌ์ฉํฉ๋๋ค. FastAPI๋ ASGI ์น ํ๋ ์์ํฌ์
๋๋ค.
-์๊ฒฉ ์๋ฒ ๋จธ์ ์์ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
(๋๋ ๋ค๋ฅธ ASGI ์ ํ๋ฆฌ์ผ์ด์
)์ ์คํํ๊ธฐ ์ํด ํ์ํ ํต์ฌ ์์๋ **Uvicorn** ๊ฐ์ ASGI ์๋ฒ ํ๋ก๊ทธ๋จ์
๋๋ค. `fastapi` ๋ช
๋ น์๋ ๊ธฐ๋ณธ์ผ๋ก ์ด๊ฒ์ด ํฌํจ๋์ด ์์ต๋๋ค.
+รฌ\9b\90รชยฒยฉ รฌ\84\9cรซยฒ\84 รซยจยธรฌ\8bย รฌ\97\90รฌ\84\9c **FastAPI** รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98(รซ\98\90รซ\8a\94 รซ\8bยครซยฅยธ ASGI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98)รฌ\9d\84 รฌ\8bยครญ\96\89รญ\95\98รชยธยฐ รฌ\9c\84รญ\95ยด รญ\95\84รฌ\9a\94รญ\95\9c รญ\95ยตรฌ\8bยฌ รฌ\9a\94รฌ\86\8cรซ\8a\94 **Uvicorn** รชยฐ\99รฌ\9d\80 ASGI รฌ\84\9cรซยฒ\84 รญ\94\84รซยก\9cรชยทยธรซ\9eยจรฌ\9e\85รซ\8b\88รซ\8bยค. `fastapi` รซยช\85รซย ยนรฌ\96ยดรฌ\97\90รซ\8a\94 รชยธยฐรซยณยธรฌ\9cยผรซยก\9c รฌ\9dยดรชยฒ\83รฌ\9dยด รญ\8fยฌรญ\95ยจรซ\90\98รฌ\96ยด รฌ\9e\88รฌ\8aยตรซ\8b\88รซ\8bยค.
๋ค์์ ํฌํจํด ์ฌ๋ฌ ๋์์ด ์์ต๋๋ค:
## ์๋ฒ ํ๋ก๊ทธ๋จ ์ค์นํ๊ธฐ { #install-the-server-program }
-FastAPIรซยฅยผ รฌ\84ยครฌยน\98รญ\95\98รซยฉยด รญ\94\84รซยก\9cรซ\8d\95รฌ\85\98 รฌ\84\9cรซยฒ\84รฌ\9dยธ Uvicornรฌ\9dยด รญ\95ยจรชยป\98 รฌ\84ยครฌยน\98รซ\90\98รซยฉยฐ, `fastapi run` รซยช\85รซย ยนรฌ\9cยผ๋ก ์์ํ ์ ์์ต๋๋ค.
+FastAPIรซยฅยผ รฌ\84ยครฌยน\98รญ\95\98รซยฉยด รญ\94\84รซยก\9cรซ\8d\95รฌ\85\98 รฌ\84\9cรซยฒ\84รฌ\9dยธ Uvicornรฌ\9dยด รญ\95ยจรชยป\98 รฌ\84ยครฌยน\98รซ\90\98รซยฉยฐ, `fastapi run` รซยช\85รซย ยนรฌ\96ยด๋ก ์์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ASGI ์๋ฒ๋ฅผ ์๋์ผ๋ก ์ค์นํ ์๋ ์์ต๋๋ค.
/// note | ์ฐธ๊ณ
-`uvicorn main:app` รซยช\85รซย ยนรฌ\9d\80 ๋ค์์ ๊ฐ๋ฆฌํต๋๋ค:
+`uvicorn main:app` รซยช\85รซย ยนรฌ\96ยดรซ\8a\94 ๋ค์์ ๊ฐ๋ฆฌํต๋๋ค:
* `main`: ํ์ผ `main.py`(Python "module").
* `app`: `main.py` ์์์ `app = FastAPI()` ๋ผ์ธ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด.
///
-รชยฐ\81 ASGI รฌ\84\9cรซยฒ\84 รญ\94\84รซยก\9cรชยทยธรซ\9eยจรฌ\9d\98 รซ\8c\80รฌ\95\88รซ\8f\84 รซยน\84รฌ\8aยทรญ\95\9c รซยช\85รซย ยนรฌ\9d\84 ๊ฐ๊ณ ์์ผ๋ฉฐ, ์์ธํ ๋ด์ฉ์ ๊ฐ์์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
+รชยฐ\81 ASGI รฌ\84\9cรซยฒ\84 รญ\94\84รซยก\9cรชยทยธรซ\9eยจรฌ\9d\98 รซ\8c\80รฌ\95\88รซ\8f\84 รซยน\84รฌ\8aยทรญ\95\9c รซยช\85รซย ยนรฌ\96ยดรซยฅยผ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์์ธํ ๋ด์ฉ์ ๊ฐ์์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
/// warning | ๊ฒฝ๊ณ
# ์๋ํฐ ์ง์ { #editor-support }
+
๊ณต์ [FastAPI ํ์ฅ](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)์ FastAPI ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐํํด ์ค๋๋ค. *๊ฒฝ๋ก ์ฒ๋ฆฌ* ํ์ ๋ฐ ์ด๋, FastAPI Cloud ๋ฐฐํฌ, ์ค์๊ฐ ๋ก๊ทธ ์คํธ๋ฆฌ๋ฐ์ ์ ๊ณตํฉ๋๋ค.
ํ์ฅ์ ๋ํ ์์ธํ ๋ด์ฉ์ [GitHub ์ ์ฅ์](https://github.com/fastapi/fastapi-vscode)์ README๋ฅผ ์ฐธ๊ณ ํ์ธ์.
# ํ๊ฒฝ ๋ณ์ { #environment-variables }
+
/// tip | ํ
๋ง์ฝ "ํ๊ฒฝ ๋ณ์"๊ฐ ๋ฌด์์ด๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์๊ณ ๊ณ์๋ค๋ฉด, ์ด ์ฑํฐ๋ฅผ ์คํตํ์
๋ ์ข์ต๋๋ค.
my_second_user: User = User(**second_user_data)
```
-/// note
+/// note | ์ฐธ๊ณ
`**second_user_data`๋ ๋ค์์ ์๋ฏธํฉ๋๋ค:
* HTTPX ๊ธฐ๋ฐ ํ
์คํธ ํด๋ผ์ด์ธํธ.
* **CORS**, GZip, ์ ์ ํ์ผ, ์คํธ๋ฆฌ๋ฐ ์๋ต.
* **์ธ์
๊ณผ ์ฟ ํค** ์ง์.
-* 100% test coverage.
-* 100% type annotated codebase.
+* 100% ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง.
+* 100% ํ์
์ด๋
ธํ
์ด์
์ฝ๋ ๋ฒ ์ด์ค.
## Pydantic ๊ธฐ๋ฅ { #pydantic-features }
* ๊น๊ฒ **์ค์ฒฉ๋ JSON** ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ชจ๋ ๊ฒ์ฆํ๊ณ ์ฃผ์์ ๋ฌ ์ ์์ต๋๋ค.
* **ํ์ฅ ๊ฐ๋ฅ**:
* Pydantic์ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ํ์
์ ์ ์ํ ์ ์๊ฒ ํ๊ฑฐ๋, validator decorator๊ฐ ๋ถ์ ๋ชจ๋ธ ๋ฉ์๋๋ก ๊ฒ์ฆ์ ํ์ฅํ ์ ์์ต๋๋ค.
-* 100% test coverage.
+* 100% ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง.
# ๋์ { #help }
+
FastAPI๋ฅผ ๋๊ฑฐ๋ FastAPI์ ๋ํ ๋์์ ๋ฐ๊ณ ์ถ์ผ์ ๊ฐ์?
์์ฃผ ๊ฐ๋จํ๊ฒ ๋๊ณ ๋์์ ๋ฐ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ถ๊ฐ์ ์ธ [Swagger UI ๋งค๊ฐ๋ณ์](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
-รชยตยฌรฌ\84ยฑรฌ\9d\84 รญ\95\98รซย ยครซยฉยด, `FastAPI()` รฌ\95ยฑ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋๋ `get_swagger_ui_html()` ํจ์์ `swagger_ui_parameters` ์ธ์๋ฅผ ์ ๋ฌํ์ญ์์ค.
+รชยตยฌรฌ\84ยฑรฌ\9d\84 รญ\95\98รซย ยครซยฉยด, `FastAPI()` รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋๋ `get_swagger_ui_html()` ํจ์์ `swagger_ui_parameters` ์ธ์๋ฅผ ์ ๋ฌํ์ญ์์ค.
`swagger_ui_parameters`๋ Swagger UI์ ์ง์ ์ ๋ฌ๋ ๊ตฌ์ฑ์ ํฌํจํ๋ ๋์
๋๋ฆฌ๋ฅผ ๋ฐ์ต๋๋ค.
# ์ปค์คํ
Request ๋ฐ APIRoute ํด๋์ค { #custom-request-and-apiroute-class }
+
์ผ๋ถ ๊ฒฝ์ฐ์๋ `Request`์ `APIRoute` ํด๋์ค์์ ์ฌ์ฉ๋๋ ๋ก์ง์ ์ค๋ฒ๋ผ์ด๋ํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
ํนํ, ์ด๋ middleware์ ์๋ ๋ก์ง์ ์ข์ ๋์์ด ๋ ์ ์์ต๋๋ค.
**FastAPI**๋ **ASGI** ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก, ASGI์๋ ํธํ๋๋ ์ด๋ค **GraphQL** ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค์ฐ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
-๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ผ๋ฐ FastAPI **๊ฒฝ๋ก ์ฒ๋ฆฌ**์ GraphQL์ ํจ๊ป ์กฐํฉํ ์ ์์ต๋๋ค.
+๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ผ๋ฐ FastAPI *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ GraphQL์ ํจ๊ป ์กฐํฉํ ์ ์์ต๋๋ค.
/// tip | ํ
FastAPI 0.126.0 ๋ฒ์ ์์๋ Pydantic v1 ์ง์์ ์ค๋จํ์ง๋ง, `pydantic.v1`์ ์ ์ ๋์ ๊ณ์ ์ง์ํ์ต๋๋ค.
+FastAPI 0.128.0 ๋ฒ์ ์์๋ `pydantic.v1` ์ง์๋ ์ค๋จํ์ผ๋ฏ๋ก, FastAPI์ ์ต์ ๋ฒ์ ์ Pydantic v2๋ฅผ ํ์๋ก ํฉ๋๋ค.
+
/// warning | ๊ฒฝ๊ณ
Pydantic ํ์ ์ต์ Python ๋ฒ์ ์์ Pydantic v1 ์ง์์ ์ค๋จํ์ผ๋ฉฐ, ์์ ๋ฒ์ ์ **Python 3.14**์
๋๋ค.
### v2 ์์ Pydantic v1์ ๋ํ FastAPI ์ง์ { #fastapi-support-for-pydantic-v1-in-v2 }
+/// warning | ๊ฒฝ๊ณ
+
+`pydantic.v1` ๋ชจ๋ธ์ ๋ํ ์ด FastAPI ์ง์์ **FastAPI 0.119.0**์์ ์ถ๊ฐ๋์๊ณ **FastAPI 0.128.0**์์ ์ ๊ฑฐ๋์์ต๋๋ค. ์ด๋ Pydantic v2๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ ์ํ ์์ ๋์ ๊ธฐ๋ฅ์ด์์ต๋๋ค.
+
+ํ์ฌ ๋ฒ์ ์ FastAPI์์๋ ์ฑ์์ `pydantic.v1` ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
+
+์ด ์น์
์ ๋๋จธ์ง ๋ถ๋ถ์ ํด๋น ์ค๋๋ ๋ฒ์ ์์๋ง ์ฌ์ฉํ ์ ์๋ ์์ ์ง์์ ์ค๋ช
ํฉ๋๋ค.
+
+///
+
FastAPI 0.119.0๋ถํฐ๋ v2๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ ์ฝ๊ฒ ํ๊ธฐ ์ํด, Pydantic v2 ๋ด๋ถ์ Pydantic v1์ ๋ํด์๋ ๋ถ๋ถ์ ์ธ ์ง์์ด ์์ต๋๋ค.
๋ฐ๋ผ์ Pydantic์ ์ต์ v2๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ , import๋ฅผ `pydantic.v1` ์๋ธ๋ชจ๋์ ์ฌ์ฉํ๋๋ก ๋ฐ๊พธ๋ฉด, ๋ง์ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋์ํฉ๋๋ค.
### ๋จ๊ณ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ { #migrate-in-steps }
+/// warning | ๊ฒฝ๊ณ
+
+์๋์ ์ค๋ช
๋ ๊ฐ์ ์ฑ์์ Pydantic v1๊ณผ v2 ๋ชจ๋ธ์ ๋ชจ๋ ์ฌ์ฉํ๋ ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
์ **FastAPI 0.119.0๋ถํฐ 0.127.x๊น์ง**์์๋ง ๋์ํฉ๋๋ค. ์ด๋ **FastAPI 0.128.0**์์ ์ ๊ฑฐ๋์์ผ๋ฉฐ, ์ต์ ๋ฒ์ ์ **Pydantic v2** ๋ชจ๋ธ์ ํ์๋ก ํฉ๋๋ค.
+
+///
+
/// tip | ํ
๋จผ์ `bump-pydantic`๋ก ์๋ํด ๋ณด์ธ์. ํ
์คํธ๊ฐ ํต๊ณผํ๊ณ ์ ๋์ํ๋ค๋ฉด, ํ ๋ฒ์ ๋ช
๋ น์ผ๋ก ๋์
๋๋ค. โจ
-# ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ํด OpenAPI ์คํคะผะฐ๋ฅผ ๋ถ๋ฆฌํ ์ง ์ฌ๋ถ { #separate-openapi-schemas-for-input-and-output-or-not }
+# ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ํด OpenAPI ์คํค๋ง๋ฅผ ๋ถ๋ฆฌํ ์ง ์ฌ๋ถ { #separate-openapi-schemas-for-input-and-output-or-not }
**Pydantic v2**๊ฐ ๋ฆด๋ฆฌ์ค๋ ์ดํ, ์์ฑ๋๋ OpenAPI๋ ์ด์ ๋ณด๋ค ์กฐ๊ธ ๋ ์ ํํ๊ณ **์ฌ๋ฐ๋ฅด๊ฒ** ๋ง๋ค์ด์ง๋๋ค. ๐
<div class="only-github" markdown="1">
-"_[...] ์ ๋ ์์ฆ **FastAPI**๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค. [...] ์ฌ์ค ์ฐ๋ฆฌ ํ์ **๋ง์ดํฌ๋ก์ํํธ ML ์๋น์ค** ์ ๋ถ๋ฅผ ๋ฐ๊ฟ ๊ณํ์
๋๋ค. ๊ทธ์ค ์ผ๋ถ๋ ํต์ฌ **Windows**์ ๋ช๋ช์ **Office** ์ ํ๋ค์ด ํตํฉ๋๊ณ ์์ต๋๋ค._"
+"_[...] ์ ๋ ์์ฆ **FastAPI**๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค. [...] ์ฌ์ค ์ฐ๋ฆฌ ํ์ **๋ง์ดํฌ๋ก์ํํธ ML ์๋น์ค** ์ ๋ถ์ ์ฌ์ฉํ ๊ณํ์
๋๋ค. ๊ทธ์ค ์ผ๋ถ๋ ํต์ฌ **Windows** ์ ํ๊ณผ ์ผ๋ถ **Office** ์ ํ์ ํตํฉ๋๊ณ ์์ต๋๋ค._"
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(ref)</small></a></div>
---
-"_**Netflix**๋ ์ฐ๋ฆฌ์ ์คํ ์์ค ๋ฐฐํฌํ์ธ **์๊ธฐ ๊ด๋ฆฌ** ์ค์ผ์คํธ๋ ์ด์
ํ๋ ์์ํฌ๋ฅผ ๋ฐํํ ์ ์์ด ๊ธฐ์ฉ๋๋ค: ๋ฐ๋ก **Dispatch**์
๋๋ค! [**FastAPI**๋ก ๋น๋]_"
+"_**Netflix**๋ ์ฐ๋ฆฌ์ **์๊ธฐ ๊ด๋ฆฌ** ์ค์ผ์คํธ๋ ์ด์
ํ๋ ์์ํฌ์ธ **Dispatch**์ ์คํ ์์ค ๊ณต๊ฐ๋ฅผ ๋ฐํํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค! [**FastAPI**๋ก ๋น๋]_"
<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>Netflix</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072"><small>(ref)</small></a></div>
</div>
-**Note**: ๋ชจ๋ ํฐ๋ฏธ๋์์ ๋์ํ๋๋ก `"fastapi[standard]"`๋ฅผ ๋ฐ์ดํ๋ก ๊ฐ์ธ ๋ฃ์๋์ง ํ์ธํ์ธ์.
+**์ฐธ๊ณ **: ๋ชจ๋ ํฐ๋ฏธ๋์์ ๋์ํ๋๋ก `"fastapi[standard]"`๋ฅผ ๋ฐ์ดํ๋ก ๊ฐ์ธ ๋ฃ์๋์ง ํ์ธํ์ธ์.
## ์์ { #example }
return {"item_id": item_id, "q": q}
```
-**Note**:
+**์ฐธ๊ณ **:
-์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด, ["๊ธํ์ธ์?"](https://fastapi.tiangolo.com/ko/async/#in-a-hurry) ์น์
์ ํ์ธํด ๋ณด์ญ์์ค.
+์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด, ๋ฌธ์์ [`async`์ `await`](https://fastapi.tiangolo.com/ko/async/#in-a-hurry)์ ๊ดํ _"๊ธํ์ธ์?"_ ์น์
์ ํ์ธํด ๋ณด์ญ์์ค.
</details>
# Full Stack FastAPI ํ
ํ๋ฆฟ { #full-stack-fastapi-template }
+
ํ
ํ๋ฆฟ์ ์ผ๋ฐ์ ์ผ๋ก ํน์ ์ค์ ๊ณผ ํจ๊ป ์ ๊ณต๋์ง๋ง, ์ ์ฐํ๊ณ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํ๊ฒ ๋์์ธ ๋์์ต๋๋ค. ์ด ํน์ฑ๋ค์ ์ฌ๋ฌ๋ถ์ด ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์์ , ์ ์ฉ์ ํ ์ ์๊ฒ ํด์ฃผ๊ณ , ํ
ํ๋ฆฟ์ด ์๋ฒฝํ ์์์ ์ด ๋๊ฒ ํด์ค๋๋ค. ๐
๋ง์ ์ด๊ธฐ ์ค์ , ๋ณด์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ์ผ๋ถ API ์๋ํฌ์ธํธ๊ฐ ์ด๋ฏธ ์ค๋น๋์ด ์์ผ๋ฏ๋ก, ์ฌ๋ฌ๋ถ์ ์ด ํ
ํ๋ฆฟ์ ์์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ **FastAPI**์ ํจ๊ป ์ฌ์ฉํ ๋๋ ์ฃผ์ ์์น์
๋๋ค.
-### Simple ํ์
{ #simple-types }
+### ๊ฐ๋จํ ํ์
{ #simple-types }
`str`๋ฟ ์๋๋ผ ๋ชจ๋ ํ์ด์ฌ ํ์ค ํ์
์ ์ ์ธํ ์ ์์ต๋๋ค.
/// note | ์ฐธ๊ณ
-Pydantic์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด [๋ฌธ์๋ฅผ ํ์ธํ์ธ์](https://docs.pydantic.dev/).
+๋ ์์๋ณด๋ ค๋ฉด [Pydantic ๋ฌธ์๋ฅผ ํ์ธํ์ธ์](https://docs.pydantic.dev/).
///
```
.
โโโ app
-โย ย โโโ __init__.py
-โย ย โโโ main.py
-โย ย โโโ dependencies.py
-โย ย โโโ routers
-โย ย โ โโโ __init__.py
-โย ย โ โโโ items.py
-โย ย โ โโโ users.py
-โย ย โโโ internal
-โย ย โโโ __init__.py
-โย ย โโโ admin.py
+โ โโโ __init__.py
+โ โโโ main.py
+โ โโโ dependencies.py
+โ โโโ routers
+โ โ โโโ __init__.py
+โ โ โโโ items.py
+โ โ โโโ users.py
+โ โโโ internal
+โ โโโ __init__.py
+โ โโโ admin.py
```
/// tip | ํ
์ฌ์ฉ์๋ง ์ฒ๋ฆฌํ๋ ์ ์ฉ ํ์ผ์ด `/app/routers/users.py`์ submodule์ด๋ผ๊ณ ํด๋ด
์๋ค.
-์ฝ๋๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์์ ๊ด๋ จ๋ *path operations*๋ฅผ ๋๋จธ์ง ์ฝ๋์ ๋ถ๋ฆฌํด ๋๊ณ ์ถ์ ๊ฒ์
๋๋ค.
+์ฝ๋๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์์ ๊ด๋ จ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๋๋จธ์ง ์ฝ๋์ ๋ถ๋ฆฌํด ๋๊ณ ์ถ์ ๊ฒ์
๋๋ค.
ํ์ง๋ง ์ด๊ฒ์ ์ฌ์ ํ ๊ฐ์ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
/์น API์ ์ผ๋ถ์
๋๋ค(๊ฐ์ "Python Package"์ ์ผ๋ถ์
๋๋ค).
-`APIRouter`๋ฅผ ์ฌ์ฉํด ํด๋น ๋ชจ๋์ *path operations*๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
+`APIRouter`๋ฅผ ์ฌ์ฉํด ํด๋น ๋ชจ๋์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
### `APIRouter` importํ๊ธฐ { #import-apirouter }
{* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[1,3] title["app/routers/users.py"] *}
-### `APIRouter`๋ก *path operations* ๋ง๋ค๊ธฐ { #path-operations-with-apirouter }
+### `APIRouter`๋ก *๊ฒฝ๋ก ์ฒ๋ฆฌ* ๋ง๋ค๊ธฐ { #path-operations-with-apirouter }
-๊ทธ ๋ค์ ์ด๋ฅผ ์ฌ์ฉํด *path operations*๋ฅผ ์ ์ธํฉ๋๋ค.
+๊ทธ ๋ค์ ์ด๋ฅผ ์ฌ์ฉํด *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ์ ์ธํฉ๋๋ค.
`FastAPI` ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํฉ๋๋ค:
///
-รฌ\9dยดรฌย \9c รฌ\9dยด `APIRouter`รซยฅยผ รซยฉ\94รฌ\9dยธ `FastAPI` รฌ\95ยฑ์ ํฌํจ(include)ํ ๊ฒ์ด์ง๋ง, ๋จผ์ dependencies์ ๋ค๋ฅธ `APIRouter` ํ๋๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
+รฌ\9dยดรฌย \9c รฌ\9dยด `APIRouter`รซยฅยผ รซยฉ\94รฌ\9dยธ `FastAPI` รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ํฌํจ(include)ํ ๊ฒ์ด์ง๋ง, ๋จผ์ dependencies์ ๋ค๋ฅธ `APIRouter` ํ๋๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
## Dependencies { #dependencies }
์ ํ๋ฆฌ์ผ์ด์
์ "items"๋ฅผ ์ฒ๋ฆฌํ๋ ์ ์ฉ endpoint๋ค๋ `app/routers/items.py` ๋ชจ๋์ ์๋ค๊ณ ํด๋ด
์๋ค.
-์ฌ๊ธฐ์๋ ๋ค์์ ๋ํ *path operations*๊ฐ ์์ต๋๋ค:
+์ฌ๊ธฐ์๋ ๋ค์์ ๋ํ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ ์์ต๋๋ค:
* `/items/`
* `/items/{item_id}`
ํ์ง๋ง ์ฐ๋ฆฌ๋ ์กฐ๊ธ ๋ ๋๋ํ๊ฒ, ์ฝ๋๋ฅผ ์ฝ๊ฐ ๋จ์ํํ๊ณ ์ถ์ต๋๋ค.
-์ด ๋ชจ๋์ ๋ชจ๋ *path operations*์๋ ๋ค์์ด ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค:
+์ด ๋ชจ๋์ ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์๋ ๋ค์์ด ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค:
* ๊ฒฝ๋ก `prefix`: `/items`.
* `tags`: (ํ๊ทธ ํ๋: `items`).
* ์ถ๊ฐ `responses`.
* `dependencies`: ๋ชจ๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ `X-Token` dependency๊ฐ ํ์ํฉ๋๋ค.
-๋ฐ๋ผ์ ๊ฐ *path operation*๋ง๋ค ๋งค๋ฒ ๋ชจ๋ ์ถ๊ฐํ๋ ๋์ , `APIRouter`์ ํ ๋ฒ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
+๋ฐ๋ผ์ ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ง๋ค ๋งค๋ฒ ๋ชจ๋ ์ถ๊ฐํ๋ ๋์ , `APIRouter`์ ํ ๋ฒ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[5:10,16,21] title["app/routers/items.py"] *}
-๊ฐ *path operation*์ ๊ฒฝ๋ก๋ ๋ค์์ฒ๋ผ `/`๋ก ์์ํด์ผ ํ๋ฏ๋ก:
+๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ๊ฒฝ๋ก๋ ๋ค์์ฒ๋ผ `/`๋ก ์์ํด์ผ ํ๋ฏ๋ก:
```Python hl_lines="1"
@router.get("/{item_id}")
๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ prefix๋ `/items`์
๋๋ค.
-๋ํ ์ด router์ ํฌํจ๋ ๋ชจ๋ *path operations*์ ์ ์ฉ๋ `tags` ๋ชฉ๋ก๊ณผ ์ถ๊ฐ `responses`๋ ๋ฃ์ ์ ์์ต๋๋ค.
+๋ํ ์ด router์ ํฌํจ๋ ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์ ์ฉ๋ `tags` ๋ชฉ๋ก๊ณผ ์ถ๊ฐ `responses`๋ ๋ฃ์ ์ ์์ต๋๋ค.
-๊ทธ๋ฆฌ๊ณ router์ ๋ชจ๋ *path operations*์ ์ถ๊ฐ๋ `dependencies` ๋ชฉ๋ก๋ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ํด๋น ๊ฒฝ๋ก๋ค๋ก ๋ค์ด์ค๋ ๊ฐ ์์ฒญ๋ง๋ค ์คํ/ํด๊ฒฐ๋ฉ๋๋ค.
+๊ทธ๋ฆฌ๊ณ router์ ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์ถ๊ฐ๋ `dependencies` ๋ชฉ๋ก๋ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ํด๋น ๊ฒฝ๋ก๋ค๋ก ๋ค์ด์ค๋ ๊ฐ ์์ฒญ๋ง๋ค ์คํ/ํด๊ฒฐ๋ฉ๋๋ค.
/// tip | ํ
-[*path operation decorator์ dependencies*](dependencies/dependencies-in-path-operation-decorators.md)์ ๋ง์ฐฌ๊ฐ์ง๋ก, *path operation function*์ ์ด๋ค ๊ฐ๋ ์ ๋ฌ๋์ง ์์ต๋๋ค.
+[*๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*์ dependencies](dependencies/dependencies-in-path-operation-decorators.md)์ ๋ง์ฐฌ๊ฐ์ง๋ก, *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์ ์ด๋ค ๊ฐ๋ ์ ๋ฌ๋์ง ์์ต๋๋ค.
///
* ๋จ์ผ ๋ฌธ์์ด `"items"`๋ฅผ ํฌํจํ๋ ํ๊ทธ ๋ชฉ๋ก์ผ๋ก ํ์๋ฉ๋๋ค.
* ์ด "tags"๋ ์๋ ๋ํํ ๋ฌธ์ ์์คํ
(OpenAPI ์ฌ์ฉ)์ ํนํ ์ ์ฉํฉ๋๋ค.
* ๋ชจ๋ ๋ฏธ๋ฆฌ ์ ์๋ `responses`๋ฅผ ํฌํจํฉ๋๋ค.
-* ์ด ๋ชจ๋ *path operations*๋ ์คํ๋๊ธฐ ์ ์ `dependencies` ๋ชฉ๋ก์ด ํ๊ฐ/์คํ๋ฉ๋๋ค.
- * ํน์ *path operation*์ dependencies๋ฅผ ์ถ๊ฐ๋ก ์ ์ธํ๋ฉด **๊ทธ๊ฒ๋ค๋ ์คํ๋ฉ๋๋ค**.
- * router dependencies๊ฐ ๋จผ์ ์คํ๋๊ณ , ๊ทธ ๋ค์์ [decorator์ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ํ๋ผ๋ฏธํฐ dependencies๊ฐ ์คํ๋ฉ๋๋ค.
+* ์ด ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ ์คํ๋๊ธฐ ์ ์ `dependencies` ๋ชฉ๋ก์ด ํ๊ฐ/์คํ๋ฉ๋๋ค.
+ * ํน์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ dependencies๋ฅผ ์ถ๊ฐ๋ก ์ ์ธํ๋ฉด **๊ทธ๊ฒ๋ค๋ ์คํ๋ฉ๋๋ค**.
+ * router dependencies๊ฐ ๋จผ์ ์คํ๋๊ณ , ๊ทธ ๋ค์์ [๋ฐ์ฝ๋ ์ดํฐ์ `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ํ๋ผ๋ฏธํฐ dependencies๊ฐ ์คํ๋ฉ๋๋ค.
* [`scopes`๊ฐ ์๋ `Security` dependencies](../advanced/security/oauth2-scopes.md)๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
/// tip | ํ
-`APIRouter`์ `dependencies`๋ฅผ ๋๋ ๊ฒ์ ์๋ฅผ ๋ค์ด ์ ์ฒด *path operations* ๊ทธ๋ฃน์ ์ธ์ฆ์ ์๊ตฌํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ ๊ฒฝ๋ก ์ฒ๋ฆฌ์ ๊ฐ๋ณ์ ์ผ๋ก dependencies๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๋ฉ๋๋ค.
+`APIRouter`์ `dependencies`๋ฅผ ๋๋ ๊ฒ์ ์๋ฅผ ๋ค์ด ์ ์ฒด *๊ฒฝ๋ก ์ฒ๋ฆฌ* ๊ทธ๋ฃน์ ์ธ์ฆ์ ์๊ตฌํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ ๊ฒฝ๋ก ์ฒ๋ฆฌ์ ๊ฐ๋ณ์ ์ผ๋ก dependencies๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๋ฉ๋๋ค.
///
ํ์ง๋ง ๊ทธ ํ์ผ์ ์กด์ฌํ์ง ์์ต๋๋ค. dependencies๋ `app/dependencies.py` ํ์ผ์ ์์ต๋๋ค.
-รฌ\9aยฐรซยฆยฌ รฌ\95ยฑ/ํ์ผ ๊ตฌ์กฐ๋ฅผ ๋ค์ ๋ ์ฌ๋ ค ๋ณด์ธ์:
+รฌ\9aยฐรซยฆยฌ รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98/ํ์ผ ๊ตฌ์กฐ๋ฅผ ๋ค์ ๋ ์ฌ๋ ค ๋ณด์ธ์:
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
์ด๋ `app/` ์์ชฝ์ ์ด๋ค package(์์ ์ `__init__.py` ํ์ผ ๋ฑ์ ๊ฐ์ง)์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ฉ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๋ฐ ๊ฒ์ด ์์ต๋๋ค. ๊ทธ๋์ ์ด ์์์์๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ๐จ
-รฌ\9dยดรฌย \9c รฌ\96ยดรซ\96ยปรชยฒ\8c รซ\8f\99รฌ\9e\91รญ\95\98รซ\8a\94รฌยง\80 รฌ\95\8cรฌ\95\98รฌ\9cยผรซ\8b\88, รฌ\95ยฑ์ด ์ผ๋ง๋ ๋ณต์กํ๋ ์๋ import๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๐ค
+รฌ\9dยดรฌย \9c รฌ\96ยดรซ\96ยปรชยฒ\8c รซ\8f\99รฌ\9e\91รญ\95\98รซ\8a\94รฌยง\80 รฌ\95\8cรฌ\95\98รฌ\9cยผรซ\8b\88, รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ์ผ๋ง๋ ๋ณต์กํ๋ ์๋ import๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๐ค
### ์ปค์คํ
`tags`, `responses`, `dependencies` ์ถ๊ฐํ๊ธฐ { #add-some-custom-tags-responses-and-dependencies }
-`APIRouter`์ ์ด๋ฏธ prefix `/items`์ `tags=["items"]`๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ *path operation*์ ์ด๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
+`APIRouter`์ ์ด๋ฏธ prefix `/items`์ `tags=["items"]`๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ์ด๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
-ํ์ง๋ง ํน์ *path operation*์๋ง ์ ์ฉ๋ _์ถ๊ฐ_ `tags`๋ฅผ ๋ํ ์๋ ์๊ณ , ๊ทธ *path operation* ์ ์ฉ์ ์ถ๊ฐ `responses`๋ ๋ฃ์ ์ ์์ต๋๋ค:
+ํ์ง๋ง ํน์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์๋ง ์ ์ฉ๋ _์ถ๊ฐ_ `tags`๋ฅผ ๋ํ ์๋ ์๊ณ , ๊ทธ *๊ฒฝ๋ก ์ฒ๋ฆฌ* ์ ์ฉ์ ์ถ๊ฐ `responses`๋ ๋ฃ์ ์ ์์ต๋๋ค:
{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[30:31] title["app/routers/items.py"] *}
์ด์ ์กฐ์ง์์ `app/internal/admin.py` ํ์ผ์ ๋ฐ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
-์ฌ๊ธฐ์๋ ์กฐ์ง์์ ์ฌ๋ฌ ํ๋ก์ ํธ ๊ฐ์ ๊ณต์ ํ๋ ๊ด๋ฆฌ์์ฉ *path operations*๊ฐ ์๋ `APIRouter`๊ฐ ๋ค์ด ์์ต๋๋ค.
+์ฌ๊ธฐ์๋ ์กฐ์ง์์ ์ฌ๋ฌ ํ๋ก์ ํธ ๊ฐ์ ๊ณต์ ํ๋ ๊ด๋ฆฌ์์ฉ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ ์๋ `APIRouter`๊ฐ ๋ค์ด ์์ต๋๋ค.
์ด ์์์์๋ ๋งค์ฐ ๋จ์ํ๊ฒ ๋ง๋ค๊ฒ ์ต๋๋ค. ํ์ง๋ง ์กฐ์ง ๋ด ๋ค๋ฅธ ํ๋ก์ ํธ์ ๊ณต์ ๋๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์์ ํ ์ ์์ด `prefix`, `dependencies`, `tags` ๋ฑ์ `APIRouter`์ ์ง์ ์ถ๊ฐํ ์ ์๋ค๊ณ ํด๋ด
์๋ค:
{* ../../docs_src/bigger_applications/app_an_py310/internal/admin.py hl[3] title["app/internal/admin.py"] *}
-ํ์ง๋ง `APIRouter`๋ฅผ ํฌํจํ ๋ ์ปค์คํ
`prefix`๋ฅผ ์ง์ ํด ๋ชจ๋ *path operations*๊ฐ `/admin`์ผ๋ก ์์ํ๊ฒ ํ๊ณ , ์ด ํ๋ก์ ํธ์์ ์ด๋ฏธ ๊ฐ์ง `dependencies`๋ก ๋ณดํธํ๊ณ , `tags`์ `responses`๋ ํฌํจํ๊ณ ์ถ์ต๋๋ค.
+ํ์ง๋ง `APIRouter`๋ฅผ ํฌํจํ ๋ ์ปค์คํ
`prefix`๋ฅผ ์ง์ ํด ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๊ฐ `/admin`์ผ๋ก ์์ํ๊ฒ ํ๊ณ , ์ด ํ๋ก์ ํธ์์ ์ด๋ฏธ ๊ฐ์ง `dependencies`๋ก ๋ณดํธํ๊ณ , `tags`์ `responses`๋ ํฌํจํ๊ณ ์ถ์ต๋๋ค.
์๋ `APIRouter`๋ฅผ ์์ ํ์ง ์๊ณ ๋ `app.include_router()`์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํด์ ์ด๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค:
์ด๋ ๊ฒ ํ๋ฉด ์๋ `APIRouter`๋ ์์ ๋์ง ์์ผ๋ฏ๋ก, ์กฐ์ง ๋ด ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ๋์ผํ `app/internal/admin.py` ํ์ผ์ ๊ณ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
-รชยฒยฐรชยณยผรฌย \81รฌ\9cยผรซยก\9c รฌ\9aยฐรซยฆยฌ รฌ\95ยฑรฌ\97\90รฌ\84\9c `admin` รซยชยจรซ\93\88รฌ\9d\98 รชยฐ\81 *path operations*๋ ๋ค์์ ๊ฐ๊ฒ ๋ฉ๋๋ค:
+รชยฒยฐรชยณยผรฌย \81รฌ\9cยผรซยก\9c รฌ\9aยฐรซยฆยฌ รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\97\90รฌ\84\9c `admin` รซยชยจรซ\93\88รฌ\9d\98 รชยฐ\81 *รชยฒยฝรซยก\9c รฌยฒ\98รซยฆยฌ*๋ ๋ค์์ ๊ฐ๊ฒ ๋ฉ๋๋ค:
* prefix `/admin`.
* tag `admin`.
* dependency `get_token_header`.
* ์๋ต `418`. ๐ต
-รญ\95\98รฌยง\80รซยง\8c รฌ\9dยดรซ\8a\94 รฌ\9aยฐรซยฆยฌ รฌ\95ยฑ์์ ๊ทธ `APIRouter`์๋ง ์ํฅ์ ์ฃผ๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฝ๋์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
+รญ\95\98รฌยง\80รซยง\8c รฌ\9dยดรซ\8a\94 รฌ\9aยฐรซยฆยฌ รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์์ ๊ทธ `APIRouter`์๋ง ์ํฅ์ ์ฃผ๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฝ๋์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ํ๋ก์ ํธ๋ค์ ๊ฐ์ `APIRouter`๋ฅผ ๋ค๋ฅธ ์ธ์ฆ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
-### *path operation* ํฌํจํ๊ธฐ { #include-a-path-operation }
+### *๊ฒฝ๋ก ์ฒ๋ฆฌ* ํฌํจํ๊ธฐ { #include-a-path-operation }
-*path operations*๋ฅผ `FastAPI` ์ฑ์ ์ง์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
+*๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ `FastAPI` ์ ํ๋ฆฌ์ผ์ด์
์ ์ง์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด... ๊ทธ๋ฅ ํด๋ด
๋๋ค ๐คท:
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[21:23] title["app/main.py"] *}
-๊ทธ๋ฆฌ๊ณ `app.include_router()`๋ก ์ถ๊ฐํ ๋ค๋ฅธ ๋ชจ๋ *path operations*์ ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํฉ๋๋ค.
+๊ทธ๋ฆฌ๊ณ `app.include_router()`๋ก ์ถ๊ฐํ ๋ค๋ฅธ ๋ชจ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํฉ๋๋ค.
/// note | ๋งค์ฐ ๊ธฐ์ ์ ์ธ ์ธ๋ถ์ฌํญ
`APIRouter`๋ "mount"๋๋ ๊ฒ์ด ์๋๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌ๋์ด ์์ง ์์ต๋๋ค.
-์ด๋ OpenAPI ์คํค๋ง์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๊ทธ๋ค์ *path operations*๋ฅผ ํฌํจ์ํค๊ธฐ ์ํจ์
๋๋ค.
+์ด๋ OpenAPI ์คํค๋ง์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๊ทธ๋ค์ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ฅผ ํฌํจ์ํค๊ธฐ ์ํจ์
๋๋ค.
-FastAPI๋ ์๋์ router์ *path operations*๋ฅผ ํ์ฑ ์ํ๋ก ์ ์งํ๊ณ , ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ OpenAPI๋ฅผ ์์ฑํ ๋ router์ prefix, dependencies, tags, responses ๋ฐ ๊ธฐํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
+FastAPI๋ ์๋์ router์ ๊ฒฝ๋ก ์ฒ๋ฆฌ๋ฅผ ํ์ฑ ์ํ๋ก ์ ์งํ๊ณ , ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ OpenAPI๋ฅผ ์์ฑํ ๋ router์ prefix, dependencies, tags, responses ๋ฐ ๊ธฐํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
///
from app.main import app
```
-รฌ\9dยดรซย \87รชยฒ\8c รญ\95\98รซยฉยด `fastapi` รซยช\85รซย ยนรฌ\96ยดรชยฐ\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ยฑ์ด ์ด๋์ ์๋์ง ์ ์ ์์ต๋๋ค.
+รฌ\9dยดรซย \87รชยฒ\8c รญ\95\98รซยฉยด `fastapi` รซยช\85รซย ยนรฌ\96ยดรชยฐ\80 รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ์ด๋์ ์๋์ง ์ ์ ์์ต๋๋ค.
/// Note | ์ฐธ๊ณ
## ์๋ API ๋ฌธ์ ํ์ธํ๊ธฐ { #check-the-automatic-api-docs }
-รฌ\9dยดรฌย \9c รฌ\95ยฑ์ ์คํํ์ธ์:
+รฌ\9dยดรฌย \9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์คํํ์ธ์:
<div class="termy">
router.include_router(other_router)
```
-`router`รซยฅยผ `FastAPI` รฌ\95ยฑรฌ\97\90 รญ\8fยฌรญ\95ยจรญ\95\98รชยธยฐ รฌย \84รฌ\9dยดรซ\93ย รญ\9b\84รซ\93ย , รฌ\96ยดรซ\8a\90 รฌ\8b\9cรฌย \90รฌ\97\90 รญ\95ยดรซ\8f\84 รซ\90ยฉรซ\8b\88รซ\8bยค. FastAPIรซ\8a\94 รซ\9dยผรฌ\9aยฐรญ\8c\85รชยณยผ OpenAPIรฌ\97\90 `other_router`รฌ\9d\98 *path operations*๋ ํฌํจํฉ๋๋ค.
+`router`รซยฅยผ `FastAPI` รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\97\90 รญ\8fยฌรญ\95ยจรญ\95\98รชยธยฐ รฌย \84รฌ\9dยดรซ\93ย รญ\9b\84รซ\93ย , รฌ\96ยดรซ\8a\90 รฌ\8b\9cรฌย \90รฌ\97\90 รญ\95ยดรซ\8f\84 รซ\90ยฉรซ\8b\88รซ\8bยค. FastAPIรซ\8a\94 รซ\9dยผรฌ\9aยฐรญ\8c\85รชยณยผ OpenAPIรฌ\97\90 `other_router`รฌ\9d\98 *รชยฒยฝรซยก\9c รฌยฒ\98รซยฆยฌ*๋ ํฌํจํฉ๋๋ค.
-๋์ค์ router๋ค์ ์ถ๊ฐ๋ *path operations*๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ์ด์ ์ ์ํํ ํฌํจ์ ํตํด์๋ ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
+๋์ค์ router๋ค์ ์ถ๊ฐ๋ *๊ฒฝ๋ก ์ฒ๋ฆฌ*๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ์ด์ ์ ์ํํ ํฌํจ์ ํตํด์๋ ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
/// warning | ๊ธฐ์ ์ธ๋ถ์ฌํญ
router๋ฅผ ํฌํจํ ๋ค์ `router.routes`๋ฅผ ์ง์ ๋ณํํ๋ ๊ฒ์ ํผํ์ธ์. FastAPI๋ router ํฌํจ์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก, ์๋ router์ ๊ทธ routes๋ ๋ผ์ฐํ
๊ณผ OpenAPI ์์ฑ์ ์ผ๋ถ๋ก ๋จ์ ์์ต๋๋ค.
-๊ฒฝ๋ก์ router๋ฅผ ์ถ๊ฐํ ๋๋ path operation ๋ฐ์ฝ๋ ์ดํฐ์ `.include_router()` ๊ฐ์ ๋ฌธ์ํ๋ API๋ฅผ ์ฌ์ฉํ์ธ์.
+๊ฒฝ๋ก์ router๋ฅผ ์ถ๊ฐํ ๋๋ ๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ์ `.include_router()` ๊ฐ์ ๋ฌธ์ํ๋ API๋ฅผ ์ฌ์ฉํ์ธ์.
-`router.routes`๋ ์ต์ข
*path operations*์ ํํํ๋ ๋ชฉ๋ก์ด ์๋๋ผ, route ์ ์์ ํฌํจ๋ router๋ฅผ ๋ด๋ ํ์ ์์ค์ ํธ๋ฆฌ๋ก ์ทจ๊ธํ๊ณ , ์ฌ๊ธฐ์ ์์กดํ์ง ๋ง์ธ์.
+`router.routes`๋ ์ต์ข
*๊ฒฝ๋ก ์ฒ๋ฆฌ*์ ํํํ๋ ๋ชฉ๋ก์ด ์๋๋ผ, route ์ ์์ ํฌํจ๋ router๋ฅผ ๋ด๋ ํ์ ์์ค์ ํธ๋ฆฌ๋ก ์ทจ๊ธํ๊ณ , ์ฌ๊ธฐ์ ์์กดํ์ง ๋ง์ธ์.
///
๋ํ ํค๋ ์ด๋ค ํ์
์ด๊ณ ๊ฐ์ ๋ค๋ฅธ ํ์
์ธ `dict`๋ก ๋ณธ๋ฌธ์ ์ ์ธํ ์ ์์ต๋๋ค.
-รฌ\9dยดรซย \87รชยฒ\8c รญ\95\98รซยฉยด (Pydantic รซยชยจรซ\8dยธรฌ\9d\84 รฌ\82ยฌรฌ\9aยฉรญ\95\98รซ\8a\94 รชยฒยฝรฌ\9aยฐรฌยฒ\98รซ\9fยผ) ์ ํจํ ํ๋/์ดํธ๋ฆฌ๋ทฐํธ ์ด๋ฆ์ด ๋ฌด์์ธ์ง ๋ฏธ๋ฆฌ ์ ํ์๊ฐ ์์ต๋๋ค.
+รฌ\9dยดรซย \87รชยฒ\8c รญ\95\98รซยฉยด (Pydantic รซยชยจรซ\8dยธรฌ\9d\84 รฌ\82ยฌรฌ\9aยฉรญ\95\98รซ\8a\94 รชยฒยฝรฌ\9aยฐรฌ\99\80 รซ\8bยฌรซยฆยฌ) ์ ํจํ ํ๋/์ดํธ๋ฆฌ๋ทฐํธ ์ด๋ฆ์ด ๋ฌด์์ธ์ง ๋ฏธ๋ฆฌ ์ ํ์๊ฐ ์์ต๋๋ค.
์์ง ๋ชจ๋ฅด๋ ํค๋ฅผ ๋ฐ์ผ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
/// note | ์ฐธ๊ณ
-๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด, (์ข ๋ ๋ณดํธ์ ์ธ) `POST`, `PUT`, `DELETE` ํน์ `PATCH` ์ค์ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
+๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด, `POST` (๊ฐ์ฅ ์ผ๋ฐ์ ), `PUT`, `DELETE` ํน์ `PATCH` ์ค์ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
`GET` ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ด์ ๋ณด๋ด๋ ๊ฒ์ ๋ช
์ธ์์ ์ ์๋์ง ์์ ํ๋์
๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ด ๋ฐฉ์์ ์์ฃผ ๋ณต์กํ/๊ทนํ์ ์ฌ์ฉ ์ํฉ์์๋ง FastAPI์ ์ํด ์ง์๋ฉ๋๋ค.
## ํธ์ง๊ธฐ ์ง์ { #editor-support }
-ํธ์ง๊ธฐ์์, ํจ์ ๋ด์์ ํ์
ํํธ์ ์์ฑ์ ์ด๋์๋ (๋ง์ฝ Pydantic model ๋์ ์ `dict`์ ๋ฐ์ ๊ฒฝ์ฐ ๋ํ๋์ง ์์ ์ ์์ต๋๋ค) ๋ฐ์ ์ ์์ต๋๋ค:
+ํธ์ง๊ธฐ์์, ํจ์ ๋ด์์ ํ์
ํํธ์ ์์ฑ์ ์ด๋์๋ (๋ง์ฝ Pydantic ๋ชจ๋ธ ๋์ ์ `dict`์ ๋ฐ์ ๊ฒฝ์ฐ ๋ํ๋์ง ์์ ์ ์์ต๋๋ค) ๋ฐ์ ์ ์์ต๋๋ค:
<img src="/img/tutorial/body/image03.png">
**๋ณธ๋ฌธ**, **๊ฒฝ๋ก** ๊ทธ๋ฆฌ๊ณ **์ฟผ๋ฆฌ** ๋งค๊ฐ๋ณ์ ๋ชจ๋ ๋์์ ์ ์ธํ ์๋ ์์ต๋๋ค.
-**FastAPI**๋ ๊ฐ๊ฐ์ ์ธ์งํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅธ ์์น์ ๊ฐ์ ธ์ฌ ๊ฒ์
๋๋ค.
+**FastAPI**๋ ๊ฐ๊ฐ์ ์ธ์งํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅธ ์์น์์ ๊ฐ์ ธ์ฌ ๊ฒ์
๋๋ค.
{* ../../docs_src/body/tutorial004_py310.py hl[16] *}
ํจ์ ๋งค๊ฐ๋ณ์๋ ๋ค์์ ๋ฐ๋ผ์ ์ธ์งํ๊ฒ ๋ฉ๋๋ค:
* ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ **๊ฒฝ๋ก**์๋ ์ ์ธ๋์ด ์๋ค๋ฉด, ์ด๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ๋ ๊ฒ์
๋๋ค.
-* ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ (`int`, `float`, `str`, `bool` ๋ฑ๊ณผ ๊ฐ์) **์ ์ผํ ํ์
**์ผ๋ก ๋์ด์์ผ๋ฉด, **์ฟผ๋ฆฌ** ๋งค๊ฐ๋ณ์๋ก ํด์๋ ๊ฒ์
๋๋ค.
+* ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ (`int`, `float`, `str`, `bool` ๋ฑ๊ณผ ๊ฐ์) **๋จ์ผ ํ์
**์ผ๋ก ๋์ด์์ผ๋ฉด, **์ฟผ๋ฆฌ** ๋งค๊ฐ๋ณ์๋ก ํด์๋ ๊ฒ์
๋๋ค.
* ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ **Pydantic ๋ชจ๋ธ** ํ์
์ผ๋ก ์ ์ธ๋์ด ์์ผ๋ฉด, ์์ฒญ **๋ณธ๋ฌธ**์ผ๋ก ํด์๋ ๊ฒ์
๋๋ค.
/// note | ์ฐธ๊ณ
## Pydantic์์ด { #without-pydantic }
-๋ง์ฝ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด, **Body** ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body) ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
+๋ง์ฝ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด, **Body** ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. [Body - ์ฌ๋ฌ ๋งค๊ฐ๋ณ์: ๋ณธ๋ฌธ์ ๋จ์ผ ๊ฐ](body-multiple-params.md#singular-values-in-body) ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
```Python
from myapp import app
-# Some more code
+# ์ถ๊ฐ ์ฝ๋
```
์ด ๊ฒฝ์ฐ `myapp.py` ๋ด๋ถ์ ์๋ ๋ณ์ `__name__`์๋ ๊ฐ์ด `"__main__"`์ด ๋ค์ด๊ฐ์ง ์์ต๋๋ค.
---
-Pycharm์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํํ ์ ์์ต๋๋ค
+PyCharm์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํํ ์ ์์ต๋๋ค
* "Run" ๋ฉ๋ด๋ฅผ ์ฝ๋๋ค.
* "Debug..." ์ต์
์ ์ ํํฉ๋๋ค.
์ด๋ฅผ ๊ตฌํํ๋ ค๋ฉด `return` ๋์ `yield`๋ฅผ ์ฌ์ฉํ๊ณ , ์ถ๊ฐ๋ก ์คํํ ๋จ๊ณ (์ฝ๋)๋ฅผ ๊ทธ ๋ค์ ์์ฑํ์ธ์.
-/// tip
+/// tip | ํ
๊ฐ ์์กด์ฑ๋ง๋ค `yield`๋ ํ ๋ฒ๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
{* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *}
-/// tip
+/// tip | ํ
`async` ํจ์์ ์ผ๋ฐ ํจ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, ์์กด์ฑ ๋ด์์ `except SomeException`์ ์ฌ์ฉํ์ฌ ํน์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
-รซยง\88รฌยฐยฌรชยฐ\80รฌยง\80รซยก\9c, `finally`รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95\98รฌ\97ยฌ รฌ\98\88รฌ\99ยธ รซยฐ\9cรฌ\83\9d รฌ\97ยฌรซยถ\80รฌ\99\80 รชยด\80รชยณ\84 รฌ\97\86รฌ\9dยด รฌยข\85รซยฃ\8c รซ\8bยจรชยณ\84รชยน\8c ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค.
+รซยง\88รฌยฐยฌรชยฐ\80รฌยง\80รซยก\9c, `finally`รซยฅยผ รฌ\82ยฌรฌ\9aยฉรญ\95\98รฌ\97ยฌ รฌ\98\88รฌ\99ยธ รซยฐ\9cรฌ\83\9d รฌ\97ยฌรซยถ\80รฌ\99\80 รชยด\80รชยณ\84 รฌ\97\86รฌ\9dยด รฌยข\85รซยฃ\8c รซ\8bยจรชยณ\84รชยฐ\80 ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค.
{* ../../docs_src/dependencies/tutorial007_py310.py hl[3,5] *}
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
-ํ์ด์ฌ์ [Context Managers](https://docs.python.org/3/library/contextlib.html) ๋๋ถ์ ์ด ๊ธฐ๋ฅ์ด ์๋ํฉ๋๋ค.
+ํ์ด์ฌ์ [์ปจํ
์คํธ ๊ด๋ฆฌ์](https://docs.python.org/3/library/contextlib.html) ๋๋ถ์ ์ด ๊ธฐ๋ฅ์ด ์๋ํฉ๋๋ค.
**FastAPI**๋ ์ด๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
์๋ฅผ ๋ค์ด, `HTTPException` ๊ฐ์ ๋ค๋ฅธ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
-/// tip
+/// tip | ํ
์ด๋ ๋ค์ ๊ณ ๊ธ ๊ธฐ์ ์ด๋ฉฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค์ ๋ก๋ ํ์ํ์ง ์์ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, *๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์* ๋ฑ ๋๋จธ์ง ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ด๋ถ์์ ์์ธ (`HTTPException` ํฌํจ)๋ฅผ ๋ฐ์์ํฌ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
end
```
-/// note
+/// note | ์ฐธ๊ณ
ํด๋ผ์ด์ธํธ์๋ **ํ๋์ ์๋ต**๋ง ์ ์ก๋ฉ๋๋ค. ์ด๋ ์ค๋ฅ ์๋ต ์ค ํ๋์ผ ์๋ ์๊ณ , *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์ ์์ฑ๋ ์๋ต์ผ ์๋ ์์ต๋๋ค.
///
-/// tip
+/// tip | ํ
*๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์*์ ์ฝ๋์์ ์ด๋ค ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉด `HTTPException`์ ํฌํจํด `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํด๋น ์์ธ(๋๋ ์ ์์ธ)๋ฅผ `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์์ ๋ค์ ๋ฐ์์์ผ, ์ ๋๋ก ์ฒ๋ฆฌ๋๋๋ก ํด์ผ ํฉ๋๋ค.
`yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์ ์๊ฐ์ด ์ง๋๋ฉด์ ์๋ก ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๊ณ ์ผ๋ถ ๋ฌธ์ ๋ฅผ ์์ ํ๊ธฐ ์ํด ๋ฐ์ ํด ์์ต๋๋ค.
FastAPI์ ์ฌ๋ฌ ๋ฒ์ ์์ ๋ฌด์์ด ๋ฐ๋์๋์ง ๋ณด๊ณ ์ถ๋ค๋ฉด, ๊ณ ๊ธ ๊ฐ์ด๋์ [๊ณ ๊ธ ์์กด์ฑ - `yield`, `HTTPException`, `except` ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ์ฌ์ฉํ๋ ์์กด์ฑ](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)์์ ๋ ์์ธํ ์ฝ์ ์ ์์ต๋๋ค.
+
## ์ปจํ
์คํธ ๊ด๋ฆฌ์ { #context-managers }
### "์ปจํ
์คํธ ๊ด๋ฆฌ์"๋ { #what-are-context-managers }
### `yield`๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ์์ ์ปจํ
์คํธ ๊ด๋ฆฌ์ ์ฌ์ฉํ๊ธฐ { #using-context-managers-in-dependencies-with-yield }
-/// warning
+/// warning | ๊ฒฝ๊ณ
์ด๊ฒ์ ์ด๋ ์ ๋ "๊ณ ๊ธ" ๊ฐ๋
์
๋๋ค.
{* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *}
-/// tip
+/// tip | ํ
์ปจํ
์คํธ ๊ด๋ฆฌ์๋ฅผ ์์ฑํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
# ์ถ๊ฐ ๋ฐ์ดํฐ ์๋ฃํ { #extra-data-types }
+
์ง๊ธ๊น์ง ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ์๋ฃํ์ ์ฌ์ฉํ์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
* `int`
* **์ถ๋ ฅ ๋ชจ๋ธ**์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฐ์ง๋ฉด ์ ๋ฉ๋๋ค.
* **๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ**์ ์๋ง๋ ํด์ ์ฒ๋ฆฌ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฐ์ง ํ์๊ฐ ์์ ๊ฒ์
๋๋ค.
-/// danger
+/// danger | ์ํ
์ ๋ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ๋ฌธ์ผ๋ก ์ ์ฅํ์ง ๋ง์ธ์. ํญ์ ์ดํ์ ๊ฒ์ฆ ๊ฐ๋ฅํ "์์ ํ ํด์(secure hash)"๋ก ์ ์ฅํ์ธ์.
)
```
-/// warning
+/// warning | ๊ฒฝ๊ณ
์ถ๊ฐ์ ์ผ๋ก ์ ๊ณต๋ ํจ์ `fake_password_hasher`์ `fake_save_user`๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ฐํ๊ธฐ ์ํ ์์ ์ผ ๋ฟ์ด๋ฉฐ, ์ค์ ๋ณด์์ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ด๋ฅผ ์ํด ํ์ค Python ํ์
ํํธ์ธ [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union)์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
-/// note
+/// note | ์ฐธ๊ณ
[`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions)์ ์ ์ํ ๋๋ ๋ ๊ตฌ์ฒด์ ์ธ ํ์
์ ๋จผ์ ํฌํจํ๊ณ , ๋ ๊ตฌ์ฒด์ ์ธ ํ์
์ ๊ทธ ๋ค์ ๋์ดํด์ผ ํฉ๋๋ค. ์๋ ์์ ์์๋ `Union[PlaneItem, CarItem]`์์ ๋ ๊ตฌ์ฒด์ ์ธ `PlaneItem`์ด `CarItem`๋ณด๋ค ์์ ์์นํฉ๋๋ค.
์ฌ๋ฌ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ , ๊ฐ ๊ฒฝ์ฐ์ ๋ง๊ฒ ์์ ๋กญ๊ฒ ์์ํ์ธ์.
-์ํฐํฐ๊ฐ ์๋ก ๋ค๋ฅธ "์ํ"๋ฅผ ๊ฐ์ ธ์ผ ํ๋ ๊ฒฝ์ฐ, ์ํฐํฐ๋น ๋จ์ผ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ "์ํฐํฐ"๊ฐ `password`, `password_hash`, ๊ทธ๋ฆฌ๊ณ ๋น๋ฐ๋ฒํธ๊ฐ ์๋ ์ํ๋ฅผ ํฌํจํ ์ ์๋ ๊ฒฝ์ฐ์ฒ๋ผ ๋ง์
๋๋ค.
+์ํฐํฐ๊ฐ ์๋ก ๋ค๋ฅธ "์ํ"๋ฅผ ๊ฐ์ ธ์ผ ํ๋ ๊ฒฝ์ฐ, ์ํฐํฐ๋น ๋จ์ผ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, **์ฌ์ฉ์** "์ํฐํฐ"๊ฐ `password`, `password_hash`, ๊ทธ๋ฆฌ๊ณ ๋น๋ฐ๋ฒํธ๊ฐ ์๋ ์ํ๋ฅผ ํฌํจํ ์ ์๋ ๊ฒฝ์ฐ์ฒ๋ผ ๋ง์
๋๋ค.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
-รญ\95ยดรซ\8bยน รฌยค\84รฌ\9d\80 รซยก\9cรฌยปยฌ รซยจยธรฌ\8bย รฌ\97\90รฌ\84\9c รฌ\95ยฑ์ด ์๋น์ค๋๋ URL์ ๋ณด์ฌ์ค๋๋ค.
+รญ\95ยดรซ\8bยน รฌยค\84รฌ\9d\80 รซยก\9cรฌยปยฌ รซยจยธรฌ\8bย รฌ\97\90รฌ\84\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ์๋น์ค๋๋ URL์ ๋ณด์ฌ์ค๋๋ค.
### ํ์ธํ๊ธฐ { #check-it }
API์ ํต์ ํ๋ ํด๋ผ์ด์ธํธ(ํ๋ก ํธ์๋, ๋ชจ๋ฐ์ผ, IoT ์ ํ๋ฆฌ์ผ์ด์
๋ฑ)๋ฅผ ์ํด ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๋ฐ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-### `pyproject.toml`รฌ\97\90 รฌ\95ยฑ `entrypoint` ๊ตฌ์ฑํ๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
+### `pyproject.toml`รฌ\97\90 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 `entrypoint` ๊ตฌ์ฑํ๊ธฐ { #configure-the-app-entrypoint-in-pyproject-toml }
-รซ\8bยครฌ\9d\8cรชยณยผ รชยฐ\99รฌ\9dยด `pyproject.toml` รญ\8c\8cรฌ\9dยผรฌ\97\90รฌ\84\9c รฌ\95ยฑ์ด ์์นํ ๊ณณ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค:
+รซ\8bยครฌ\9d\8cรชยณยผ รชยฐ\99รฌ\9dยด `pyproject.toml` รญ\8c\8cรฌ\9dยผรฌ\97\90รฌ\84\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ์์นํ ๊ณณ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค:
```toml
[tool.fastapi]
entrypoint = "main:app"
```
-รญ\95ยดรซ\8bยน `entrypoint`รซ\8a\94 `fastapi` รซยช\85รซย ยนรฌ\96ยดรฌ\97\90 รซ\8bยครฌ\9d\8cรชยณยผ รชยฐ\99รฌ\9dยด รฌ\95ยฑ์ ์ํฌํธํ๋ผ๊ณ ์๋ ค์ค๋๋ค:
+รญ\95ยดรซ\8bยน `entrypoint`รซ\8a\94 `fastapi` รซยช\85รซย ยนรฌ\96ยดรฌ\97\90 รซ\8bยครฌ\9d\8cรชยณยผ รชยฐ\99รฌ\9dยด รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์ํฌํธํ๋ผ๊ณ ์๋ ค์ค๋๋ค:
```python
from main import app
### `fastapi dev`๋ฅผ ๊ฒฝ๋ก ๋๋ `--entrypoint` CLI ์ต์
๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
-`fastapi dev` ๋ช
๋ น์ด์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ๋ฌํ ์๋ ์์ผ๋ฉฐ, ๊ทธ๋ฌ๋ฉด ์ฌ์ฉํ FastAPI app ๊ฐ์ฒด๋ฅผ ์ถ์ ํฉ๋๋ค:
+`fastapi dev` ๋ช
๋ น์ด์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ๋ฌํ ์๋ ์์ผ๋ฉฐ, ๊ทธ๋ฌ๋ฉด ์ฌ์ฉํ FastAPI ์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ฒด๋ฅผ ์ถ์ ํฉ๋๋ค:
```console
$ fastapi dev main.py
๋ํ ๋ค๋ฅธ ๋๊ตฌ๋ค, ์๋ฅผ ๋ค์ด [VS Code ํ์ฅ](../editor-support.md)์ด๋ [FastAPI Cloud](https://fastapicloud.com)๊ฐ ์ด๋ฅผ ์ฐพ์ง ๋ชปํ ์ ์์ผ๋ฏ๋ก, `pyproject.toml`์ `entrypoint`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
-### รฌ\95ยฑ ๋ฐฐํฌํ๊ธฐ(์ ํ ์ฌํญ) { #deploy-your-app-optional }
+### รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 ๋ฐฐํฌํ๊ธฐ(์ ํ ์ฌํญ) { #deploy-your-app-optional }
-รฌ\84ย รญ\83\9dรฌย \81รฌ\9cยผรซยก\9c FastAPI รฌ\95ยฑรฌ\9d\84 [FastAPI Cloud](https://fastapicloud.com)รฌ\97\90 รซ\8bยจ รญ\95\9c รซยฒ\88รฌ\9d\98 รซยช\85รซย ยนรฌ\9cยผ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค. ๐
+รฌ\84ย รญ\83\9dรฌย \81รฌ\9cยผรซยก\9c FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9d\84 [FastAPI Cloud](https://fastapicloud.com)รฌ\97\90 รซ\8bยจ รญ\95\9c รซยฒ\88รฌ\9d\98 รซยช\85รซย ยนรฌ\96ยด๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค. ๐
<div class="termy">
CLI๊ฐ ์ฌ๋ฌ๋ถ์ FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ํด๋ผ์ฐ๋์ ๋ฐฐํฌํฉ๋๋ค. ๋ก๊ทธ์ธ๋์ด ์์ง ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ ค ์ธ์ฆ ๊ณผ์ ์ ์๋ฃํฉ๋๋ค.
-รฌ\9dยดรชยฒ\8c รฌย \84รซยถ\80รฌ\9e\85รซ\8b\88รซ\8bยค! รฌ\9dยดรฌย \9c รญ\95ยดรซ\8bยน URLรฌ\97\90รฌ\84\9c รฌ\95ยฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค. โจ
+รฌ\9dยดรชยฒ\8c รฌย \84รซยถ\80รฌ\9e\85รซ\8b\88รซ\8bยค! รฌ\9dยดรฌย \9c รญ\95ยดรซ\8bยน URLรฌ\97\90รฌ\84\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ์ ๊ทผํ ์ ์์ต๋๋ค. โจ
## ๋จ๊ณ๋ณ ์์ฝ { #recap-step-by-step }
```
/items/foo
```
+
/// note | ์ฐธ๊ณ
"๊ฒฝ๋ก"๋ ์ผ๋ฐ์ ์ผ๋ก "์๋ํฌ์ธํธ" ๋๋ "๋ผ์ฐํธ"๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค.
### 6 ๋จ๊ณ: ๋ฐฐํฌํ๊ธฐ { #step-6-deploy-it }
-รญ\95\9c รซยฒ\88รฌ\9d\98 รซยช\85รซย ยนรฌ\9cยผรซยก\9c **[FastAPI Cloud](https://fastapicloud.com)**รฌ\97\90 รฌ\95ยฑ์ ๋ฐฐํฌํฉ๋๋ค: `fastapi deploy`. ๐
+รญ\95\9c รซยฒ\88รฌ\9d\98 รซยช\85รซย ยนรฌ\96ยดรซยก\9c **[FastAPI Cloud](https://fastapicloud.com)**รฌ\97\90 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ๋ฐฐํฌํฉ๋๋ค: `fastapi deploy`. ๐
#### FastAPI Cloud ์๊ฐ { #about-fastapi-cloud }
์ต์ํ์ ๋
ธ๋ ฅ์ผ๋ก API๋ฅผ **๋น๋**, **๋ฐฐํฌ**, **์ ๊ทผ**ํ๋ ๊ณผ์ ์ ๊ฐ์ํํฉ๋๋ค.
-FastAPIรซยก\9c รฌ\95ยฑ์ ๋น๋ํ ๋์ ๋์ผํ **๊ฐ๋ฐ์ ๊ฒฝํ**์ ํด๋ผ์ฐ๋์ **๋ฐฐํฌ**ํ ๋๋ ์ ๊ณตํฉ๋๋ค. ๐
+FastAPIรซยก\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ๋น๋ํ ๋์ ๋์ผํ **๊ฐ๋ฐ์ ๊ฒฝํ**์ ํด๋ผ์ฐ๋์ **๋ฐฐํฌ**ํ ๋๋ ์ ๊ณตํฉ๋๋ค. ๐
FastAPI Cloud๋ *FastAPI์ ์น๊ตฌ๋ค* ์คํ ์์ค ํ๋ก์ ํธ์ ์ฃผ์ ์คํฐ์์ด์ ์๊ธ ์ ๊ณต์์
๋๋ค. โจ
#### ๋ค๋ฅธ ํด๋ผ์ฐ๋ ์ ๊ณต์
์ฒด์ ๋ฐฐํฌํ๊ธฐ { #deploy-to-other-cloud-providers }
-FastAPIรซ\8a\94 รฌ\98ยครญ\94\88 รฌ\86\8cรฌ\8aยครฌ\9dยดรซยฉยฐ รญ\91\9cรฌยค\80รฌ\9d\84 รชยธยฐรซยฐ\98รฌ\9cยผรซยก\9c รญ\95ยฉรซ\8b\88รซ\8bยค. รฌ\84ย รญ\83\9dรญ\95\9c รฌ\96ยดรซ\96ยค รญ\81ยดรซ\9dยผรฌ\9aยฐรซ\93\9c รฌย \9cรชยณยตรฌ\97\85รฌยฒยดรฌ\97\90รซ\8f\84 FastAPI รฌ\95ยฑ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
+FastAPIรซ\8a\94 รฌ\98ยครญ\94\88 รฌ\86\8cรฌ\8aยครฌ\9dยดรซยฉยฐ รญ\91\9cรฌยค\80รฌ\9d\84 รชยธยฐรซยฐ\98รฌ\9cยผรซยก\9c รญ\95ยฉรซ\8b\88รซ\8bยค. รฌ\84ย รญ\83\9dรญ\95\9c รฌ\96ยดรซ\96ยค รญ\81ยดรซ\9dยผรฌ\9aยฐรซ\93\9c รฌย \9cรชยณยตรฌ\97\85รฌยฒยดรฌ\97\90รซ\8f\84 FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
-รญ\81ยดรซ\9dยผรฌ\9aยฐรซ\93\9c รฌย \9cรชยณยตรฌ\97\85รฌยฒยดรฌ\9d\98 รชยฐ\80รฌ\9dยดรซ\93\9cรซยฅยผ รซ\94ยฐรซ\9dยผ FastAPI รฌ\95ยฑ์ ๋ฐฐํฌํ์ธ์. ๐ค
+รญ\81ยดรซ\9dยผรฌ\9aยฐรซ\93\9c รฌย \9cรชยณยตรฌ\97\85รฌยฒยดรฌ\9d\98 รชยฐ\80รฌ\9dยดรซ\93\9cรซยฅยผ รซ\94ยฐรซ\9dยผ FastAPI รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ ๋ฐฐํฌํ์ธ์. ๐ค
## ์์ฝ { #recap }
* `app` ์ธ์คํด์ค ์์ฑ.
* (`@app.get("/")`์ฒ๋ผ) **๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ** ์์ฑ.
* (์์ ์๋ `def root(): ...`์ฒ๋ผ) **๊ฒฝ๋ก ์ฒ๋ฆฌ ํจ์** ์์ฑ.
-* `fastapi dev` รซยช\85รซย ยนรฌ\9cยผ๋ก ๊ฐ๋ฐ ์๋ฒ ์คํ.
-* รฌ\84ย รญ\83\9dรฌย \81รฌ\9cยผรซยก\9c `fastapi deploy`รซยก\9c รฌ\95ยฑ ๋ฐฐํฌ.
+* `fastapi dev` รซยช\85รซย ยนรฌ\96ยด๋ก ๊ฐ๋ฐ ์๋ฒ ์คํ.
+* รฌ\84ย รญ\83\9dรฌย \81รฌ\9cยผรซยก\9c `fastapi deploy`รซยก\9c รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98 ๋ฐฐํฌ.
# ์ค๋ฅ ์ฒ๋ฆฌ { #handling-errors }
+
API๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ์ค๋ฅ๋ฅผ ์๋ ค์ผ ํ๋ ์ํฉ์ ๋ง์ด ์์ต๋๋ค.
์ด ํด๋ผ์ด์ธํธ๋ ํ๋ก ํธ์๋๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ์ผ ์๋ ์๊ณ , ๋ค๋ฅธ ์ฌ๋์ด ์์ฑํ ์ฝ๋์ผ ์๋ ์๊ณ , IoT ์ฅ์น์ผ ์๋ ์์ต๋๋ค.
# ์์ต์ - ์ฌ์ฉ์ ์๋ด์ { #tutorial-user-guide }
+
์ด ์์ต์๋ **FastAPI**์ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ๋จ๊ณ๋ณ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ฐ ์น์
์ ์ด์ ์น์
์ ๋ฐํ์ผ๋ก ์ ์ง์ ์ผ๋ก ๊ตฌ์ฑ๋์ง๋ง, ์ฃผ์ ๋ฅผ ๋ถ๋ฆฌํ ๊ตฌ์กฐ๋ก ๋์ด ์์ด ํน์ API ์๊ตฌ์ฌํญ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ํ๋ ์น์
์ผ๋ก ๋ฐ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
| `title` | `str` | API์ ์ ๋ชฉ์
๋๋ค. |
| `summary` | `str` | API์ ๋ํ ์งง์ ์์ฝ์
๋๋ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ.</small> |
| `description` | `str` | API์ ๋ํ ์งง์ ์ค๋ช
์
๋๋ค. ๋งํฌ๋ค์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
-| `version` | `string` | API์ ๋ฒ์ ์
๋๋ค. OpenAPI์ ๋ฒ์ ์ด ์๋, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ์ ์ ๋ํ๋
๋๋ค. ์: `2.5.0`. |
+| `version` | `str` | API์ ๋ฒ์ ์
๋๋ค. OpenAPI์ ๋ฒ์ ์ด ์๋, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ์ ์ ๋ํ๋
๋๋ค. ์: `2.5.0`. |
| `terms_of_service` | `str` | API ์ด์ฉ ์ฝ๊ด์ URL์
๋๋ค. ์ ๊ณตํ๋ ๊ฒฝ์ฐ URL ํ์์ด์ด์ผ ํฉ๋๋ค. |
| `contact` | `dict` | ๋
ธ์ถ๋ API์ ๋ํ ์ฐ๋ฝ์ฒ ์ ๋ณด์
๋๋ค. ์ฌ๋ฌ ํ๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. <details><summary><code>contact</code> ํ๋</summary><table><thead><tr><th>๋งค๊ฐ๋ณ์</th><th>ํ์
</th><th>์ค๋ช
</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>์ฐ๋ฝ์ฒ ์ธ๋ฌผ/์กฐ์ง์ ์๋ณ๋ช
์
๋๋ค.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>์ฐ๋ฝ์ฒ ์ ๋ณด๊ฐ ๋ด๊ธด URL์
๋๋ค. URL ํ์์ด์ด์ผ ํฉ๋๋ค.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>์ฐ๋ฝ์ฒ ์ธ๋ฌผ/์กฐ์ง์ ์ด๋ฉ์ผ ์ฃผ์์
๋๋ค. ์ด๋ฉ์ผ ์ฃผ์ ํ์์ด์ด์ผ ํฉ๋๋ค.</td></tr></tbody></table></details> |
| `license_info` | `dict` | ๋
ธ์ถ๋ API์ ๋ผ์ด์ ์ค ์ ๋ณด์
๋๋ค. ์ฌ๋ฌ ํ๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. <details><summary><code>license_info</code> ํ๋</summary><table><thead><tr><th>๋งค๊ฐ๋ณ์</th><th>ํ์
</th><th>์ค๋ช
</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>ํ์</strong> (<code>license_info</code>๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ). API์ ์ฌ์ฉ๋ ๋ผ์ด์ ์ค ์ด๋ฆ์
๋๋ค.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>API์ ๋ํ [SPDX](https://spdx.org/licenses/) ๋ผ์ด์ ์ค ํํ์
๋๋ค. <code>identifier</code> ํ๋๋ <code>url</code> ํ๋์ ์ํธ ๋ฐฐํ์ ์
๋๋ค. <small>OpenAPI 3.1.0, FastAPI 0.99.0๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>API์ ์ฌ์ฉ๋ ๋ผ์ด์ ์ค์ URL์
๋๋ค. URL ํ์์ด์ด์ผ ํฉ๋๋ค.</td></tr></tbody></table></details> |
///
-์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ์๋ํ(๋ก ์์ฑ๋) API ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์
๋๋ค:
+์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ์๋ API ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์
๋๋ค:
<img src="/img/tutorial/metadata/image01.png">
# ๊ฒฝ๋ก ์ฒ๋ฆฌ ์ค์ { #path-operation-configuration }
+
*๊ฒฝ๋ก ์ฒ๋ฆฌ ๋ฐ์ฝ๋ ์ดํฐ*๋ฅผ ์ค์ ํ๊ธฐ ์ํด ์ ๋ฌํ ์ ์๋ ๋ช ๊ฐ์ง ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
/// warning | ๊ฒฝ๊ณ
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | ์ ๋ณด
+/// note | ์ฐธ๊ณ
FastAPI๋ 0.95.0 ๋ฒ์ ์์ `Annotated` ์ง์์ ์ถ๊ฐํ๊ณ (๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๊ถ์ฅํ๊ธฐ ์์ํ์ต๋๋ค).
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | ์ ๋ณด
+/// note | ์ฐธ๊ณ
์ด๋ Pydantic 2 ์ด์ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๐
# ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ { #query-parameters }
+
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ์ผ๋ถ๊ฐ ์๋ ๋ค๋ฅธ ํจ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด "์ฟผ๋ฆฌ" ๋งค๊ฐ๋ณ์๋ก ์๋ ํด์ํฉ๋๋ค.
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
๊ทธ๋ค์ "ํผ ๋ฐ์ดํฐ"๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ก๋ ๋์ผํ "ํผ ํ๋"์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
-์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด , `bytes` ์ `List` ๋๋ `UploadFile` ๋ฅผ ์ ์ธํ๊ธฐ ๋ฐ๋๋๋ค:
+์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด `bytes` ๋๋ `UploadFile`์ `list`๋ฅผ ์ ์ธํ๊ธฐ ๋ฐ๋๋๋ค:
{* ../../docs_src/request_files/tutorial002_an_py310.py hl[10,15] *}
-์ ์ธํ๋๋ก, `bytes` ์ `list` ๋๋ `UploadFile` ๋ค์ ์ ์ก๋ฐ์ ๊ฒ์
๋๋ค.
+์ ์ธํ ๋๋ก, `bytes` ๋๋ `UploadFile`์ `list`๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
/// note | ๊ธฐ์ ์ธ๋ถ์ฌํญ
# ํผ ๋ฐ์ดํฐ { #form-data }
+
JSON ๋์ ํผ ํ๋๋ฅผ ๋ฐ์์ผ ํ๋ ๊ฒฝ์ฐ `Form`์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
/// note | ์ฐธ๊ณ
# ์๋ต ์ํ ์ฝ๋ { #response-status-code }
+
์๋ต ๋ชจ๋ธ์ ์ง์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก, ์ด๋ค *๊ฒฝ๋ก ์ฒ๋ฆฌ*์์๋ `status_code` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต์ ์ฌ์ฉํ HTTP ์ํ ์ฝ๋๋ฅผ ์ ์ธํ ์๋ ์์ต๋๋ค:
* `@app.get()`
# ์์ฒญ ์์ ๋ฐ์ดํฐ ์ ์ธ { #declare-request-example-data }
-รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ยฑ์ด ๋ฐ์ ์ ์๋ ๋ฐ์ดํฐ ์์ ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
+รฌ\97ยฌรซ\9fยฌรซยถ\84รฌ\9d\98 รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ๋ฐ์ ์ ์๋ ๋ฐ์ดํฐ ์์ ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ ์ด๋ฅผ ์ํ ๋ช ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค.
# ๋ณด์ - ์ฒซ ๋จ๊ณ { #security-first-steps }
+
์ด๋ค ๋๋ฉ์ธ์ **backend** API๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋๋ฉ์ธ์ **frontend**๊ฐ ์๊ฑฐ๋, ๊ฐ์ ๋๋ฉ์ธ์ ๋ค๋ฅธ ๊ฒฝ๋ก์ ์๊ฑฐ๋(๋๋ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์๋ ์์ต๋๋ค).
Pydantic์ ์ฌ์ฉํด ๋ณธ๋ฌธ์ ์ ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก, ๋ค๋ฅธ ๊ณณ์์๋ ์ด๋์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## `get_current_user` ์์กด์ฑ ์์ฑํ๊ธฐ { #create-a-get-current-user-dependency }
# ํจ์ค์๋(ํด์ฑ ํฌํจ)๋ฅผ ์ฌ์ฉํ๋ OAuth2, JWT ํ ํฐ์ ์ฌ์ฉํ๋ Bearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
+
๋ชจ๋ ๋ณด์ ํ๋ฆ์ ๊ตฌ์ฑํ์ผ๋ฏ๋ก, ์ด์ <abbr title="JSON Web Tokens - JSON ์น ํ ํฐ">JWT</abbr> ํ ํฐ๊ณผ ์์ ํ ํจ์ค์๋ ํด์ฑ์ ์ฌ์ฉํด ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ ๋ก ์์ ํ๊ฒ ๋ง๋ค๊ฒ ์ต๋๋ค.
์ด ์ฝ๋๋ ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํจ์ค์๋ ํด์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฑ์ ์์
์ ํ์ฉํ ์ ์์ต๋๋ค.
**FastAPI** ๋ณด์ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ `username` ๋ฐ `password`๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์
๋๋ค.
-OAuth2๋ (์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๊ณ ์๋) "ํจ์ค์๋ ํ๋ก์ฐ"์ ์ฌ์ฉํ ๋ ํด๋ผ์ด์ธํธ/์ ์ ๊ฐ `username` ๋ฐ `password` ํ๋๋ฅผ ํผ ๋ฐ์ดํฐ๋ก ๋ณด๋ด์ผ ํจ์ ์ง์ ํฉ๋๋ค.
+OAuth2๋ (์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๊ณ ์๋) "ํจ์ค์๋ ํ๋ก์ฐ"๋ฅผ ์ฌ์ฉํ ๋ ํด๋ผ์ด์ธํธ/์ ์ ๊ฐ `username` ๋ฐ `password` ํ๋๋ฅผ ํผ ๋ฐ์ดํฐ๋ก ๋ณด๋ด์ผ ํจ์ ์ง์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ์์๋ ํ๋์ ์ด๋ฆ์ ๊ทธ๋ ๊ฒ ์ง์ ํด์ผ ํ๋ค๊ณ ๋์ ์์ต๋๋ค. ๋ฐ๋ผ์ `user-name` ๋๋ `email`์ ์๋ํ์ง ์์ต๋๋ค.
### ํจ์ค์๋ ํ์ธํ๊ธฐ { #check-the-password }
-์ด ์์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์ ๋ฐ์ดํฐ ํ์์ ํ์ธํ์ง๋ง ์ํธ๋ฅผ ํ์ธํ์ง ์์์ต๋๋ค.
+์ด ์์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ ์์ง๋ง, ์์ง ํจ์ค์๋๋ ํ์ธํ์ง ์์์ต๋๋ค.
๋จผ์ ๋ฐ์ดํฐ๋ฅผ Pydantic `UserInDB` ๋ชจ๋ธ์ ๋ฃ๊ฒ ์ต๋๋ค.
/// note | ์ฐธ๊ณ
-`**user_dict`์ ๋ํ ์์ธํ ์ค๋ช
์ [**์ถ๊ฐ ๋ชจ๋ธ** ๋ฌธ์](../extra-models.md#about-user-in-dict)๋ฅผ ๋ค์ ํ์ธํด๋ณด์ธ์.
+`**user_dict`์ ๋ํ ์์ธํ ์ค๋ช
์ [**์ถ๊ฐ ๋ชจ๋ธ** ๋ฌธ์](../extra-models.md#about-user-in-model-dump)๋ฅผ ๋ค์ ํ์ธํด๋ณด์ธ์.
///
# SQL (๊ด๊ณํ) ๋ฐ์ดํฐ๋ฒ ์ด์ค { #sql-relational-databases }
+
**FastAPI**์์ SQL(๊ด๊ณํ) ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์ ํ์๊ฐ ์๋๋๋ค. ํ์ง๋ง ์ฌ๋ฌ๋ถ์ด ์ํ๋ **์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ** ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ [SQLModel](https://sqlmodel.tiangolo.com/)์ ์ฌ์ฉํ๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
`StaticFiles`๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ ํฐ๋ฆฌ์์ ์ ์ ํ์ผ์ ์๋์ผ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค.
+/// tip | ํ
+
+ํ๋ก ํธ์๋๋ฅผ ํธ์คํ
ํด์ผ ํ๋ค๋ฉด ๋์ `app.frontend()`๋ฅผ ์ฌ์ฉํ์ธ์. ์์ธํ ๋ด์ฉ์ [ํ๋ก ํธ์๋](frontend.md)์์ ํ์ธํ์ธ์.
+
+`app.frontend()`๋ ๋ด๋ถ์ ์ผ๋ก `StaticFiles`๋ฅผ ์ฌ์ฉํ๋ฉฐ, ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ
์ฒ๋ฆฌ์ ๊ฐ์ ํ๋ก ํธ์๋๋ฅผ ์ํ ์ฌ๋ฌ ์ถ๊ฐ ์ด์ ์ด ์์ต๋๋ค.
+
+///
+
## `StaticFiles` ์ฌ์ฉ { #use-staticfiles }
* `StaticFiles`๋ฅผ ์ํฌํธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
๋ ์ฌ๋ฌ ํ์ผ์ด๋ ๋ชจ๋ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
-### **FastAPI** app ํ์ผ { #fastapi-app-file }
+### **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
ํ์ผ { #fastapi-app-file }
[๋ ํฐ ์ ํ๋ฆฌ์ผ์ด์
](bigger-applications.md)์ ๋ฌ์ฌ๋ ํ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํด๋ด
์๋ค.
โย ย โโโ main.py
```
-`main.py` ํ์ผ ์์ **FastAPI** app รฌ\9d\84 รซยง\8cรซ\93ยครฌ\97\88รฌ\8aยตรซ\8b\88รซ\8bยค:
+`main.py` ํ์ผ ์์ **FastAPI** รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98รฌ\9dยด รฌ\9e\88รฌ\8aยตรซ\8b\88รซ\8bยค:
{* ../../docs_src/app_testing/app_a_py310/main.py *}
์ด์ ์์ ์์๋ฅผ ํ์ฅํ๊ณ ๋ ๋ง์ ์ธ๋ถ ์ฌํญ์ ์ถ๊ฐํ์ฌ ๋ค์ํ ๋ถ๋ถ์ ์ด๋ป๊ฒ ํ
์คํธํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
-### ํ์ฅ๋ **FastAPI** app ํ์ผ { #extended-fastapi-app-file }
+### ํ์ฅ๋ **FastAPI** ์ ํ๋ฆฌ์ผ์ด์
ํ์ผ { #extended-fastapi-app-file }
์ด์ ๊ณผ ๊ฐ์ ํ์ผ ๊ตฌ์กฐ๋ฅผ ๊ณ์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
โย ย โโโ test_main.py
```
-รฌ\9dยดรฌย \9c **FastAPI** รฌ\95ยฑ์ด ์๋ `main.py` ํ์ผ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ **๊ฒฝ๋ก ์ฒ๋ฆฌ**๊ฐ ์ถ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ด
์๋ค.
+รฌ\9dยดรฌย \9c **FastAPI** รฌ\95ย รญ\94\8cรซยฆยฌรฌยผ\80รฌ\9dยดรฌ\85\98์ด ์๋ `main.py` ํ์ผ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ **๊ฒฝ๋ก ์ฒ๋ฆฌ**๊ฐ ์ถ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ด
์๋ค.
์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์๋ `GET` ์์
์ด ์์ต๋๋ค.
# ๊ฐ์ ํ๊ฒฝ { #virtual-environments }
+
Python ํ๋ก์ ํธ๋ฅผ ์์
ํ ๋๋ **๊ฐ์ ํ๊ฒฝ**(๋๋ ์ด์ ์ ์ฌํ ๋ฉ์ปค๋์ฆ)์ ์ฌ์ฉํด ๊ฐ ํ๋ก์ ํธ๋ง๋ค ์ค์นํ๋ ํจํค์ง๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
/// note | ์ฐธ๊ณ