<aside>

</aside>

๋„ค, ์•ˆ๋…•ํ•˜์„ธ์š”! ์‹ค์ „ ํ”„๋กœ์ ํŠธ ๋‘ ๋ฒˆ์งธ ์‹œ๊ฐ„, FastAPI 17๊ฐ•์ž…๋‹ˆ๋‹ค! ๐ŸŽ‰

์ง€๋‚œ 16๊ฐ•์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ToDo ๋ฆฌ์ŠคํŠธ API์˜ ๋ชฉํ‘œ์™€ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •ํ•˜๊ณ , ํ•„์š”ํ•œ API ์—”๋“œํฌ์ธํŠธ์™€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ(Task)์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ๋“ค์–ด๊ฐˆ ์‹œ๊ฐ„์ธ๋ฐ, ๊ทธ ์ „์—! ์ž ์‹œ ๋ฉˆ์ถฐ์„œ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์žก๊ณ  ๊ฐ€๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์€ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด main.py ํŒŒ์ผ ํ•˜๋‚˜์— ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด๋„ ๊ดœ์ฐฎ์ง€๋งŒ, ๊ธฐ๋Šฅ์ด ์กฐ๊ธˆ๋งŒ ๋ณต์žกํ•ด์ ธ๋„ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ๐Ÿ˜… ํŠนํžˆ ์—ฌ๋Ÿฌ ๋ช…์ด ํ˜‘์—…ํ•˜๊ฑฐ๋‚˜ ์žฅ๊ธฐ์ ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๋”์šฑ ๊ทธ๋ ‡์ฃ !

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” FastAPI์˜ APIRouter ๋ผ๋Š” ์•„์ฃผ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์šฐ๋ฆฌ์˜ ToDo ๋ฆฌ์ŠคํŠธ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ **๊ธฐ๋Šฅ๋ณ„ ๋ชจ๋“ˆ(ํŒŒ์ผ)**๋กœ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ , ๊ด€๋ฆฌํ•˜๊ธฐ ํŽธํ•˜๋ฉฐ, ํ™•์žฅํ•˜๊ธฐ ์ข‹์€ ํ˜•ํƒœ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ž˜ ์ •๋ฆฌ๋œ ์„œ๋ž์žฅ์ฒ˜๋Ÿผ์š”! ๐Ÿ—„๏ธโœจ

์ž, ๊ทธ๋Ÿผ ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊นŒ์š”?


๐Ÿ“š ์ฑ•ํ„ฐ ์†Œ๊ฐœ

์ด๋ฒˆ 17๊ฐ•์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉ๋  ๋ฒ•ํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ณ , FastAPI์˜ APIRouter ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ จ ์žˆ๋Š” API ์—”๋“œํฌ์ธํŠธ๋“ค์„ ๋ณ„๋„์˜ ๋ชจ๋“ˆ(ํŒŒ์ผ)๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ด์ „๊นŒ์ง€ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ main.py ํŒŒ์ผ ํ•˜๋‚˜์— ์ž‘์„ฑํ–ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ด๋Š” ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

APIRouter๋Š” ๋งˆ์น˜ ์ž‘์€ FastAPI ์•ฑ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์—ฌ, ํŠน์ • ๊ธฐ๋Šฅ(์˜ˆ: 'Task ๊ด€๋ฆฌ')๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ๋กœ ์ž‘๋™(Path Operations)๋“ค์„ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌ๋œ ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆ๋“ค์„ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(main.py)์—์„œ app.include_router()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ „์ฒด๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ Pydantic ๋ชจ๋ธ ์ •์˜๋„ ๋ณ„๋„์˜ ๋ชจ๋“ˆ(models/)๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ผ์šฐํ„ฐ๋Š” routers/ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜์‹œํ‚ค๋Š” ๋“ฑ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ผ์šฐํ„ฐ๋ฅผ ํฌํ•จ์‹œํ‚ฌ ๋•Œ prefix ์˜ต์…˜์œผ๋กœ ๊ณตํ†ต URL ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๊ณ , tags ์˜ต์…˜์œผ๋กœ API ๋ฌธ์„œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์˜ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽฏ ์ฑ•ํ„ฐ ๋ชฉํ‘œ

์ด ๊ฐ•์˜๋ฅผ ๋งˆ์น˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

  1. ๋‹จ์ผ ํŒŒ์ผ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์˜ ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ฝ”๋“œ ๋ชจ๋“ˆํ™”์˜ ํ•„์š”์„ฑ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. FastAPI์˜ APIRouter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ จ๋œ API ์—”๋“œํฌ์ธํŠธ๋“ค์„ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ธฐ๋Šฅ(๋ผ์šฐํ„ฐ, ๋ชจ๋ธ ๋“ฑ)์— ๋”ฐ๋ผ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  Python ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฉ”์ธ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ app.include_router()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ ๋ผ์šฐํ„ฐ๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ๋ผ์šฐํ„ฐ ํฌํ•จ ์‹œ prefix ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ URL ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๋ฅผ ์„ค์ •ํ•˜๊ณ , tags ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ API ๋ฌธ์„œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.