๐Ÿš€ FastAPI ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐฐํฌ ๊ฐ€์ด๋“œ (Windows ํ™˜๊ฒฝ ๊ธฐ์ค€)

๐Ÿ•’ ์•ฝ 1๋ถ„ ์ฝ๋Š” ๋ฐ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค

์ด์ „ ๊ธ€ ๋ณด๊ธฐ(FastAPI ์•ฑ ํ…Œ์ŠคํŠธ-PyTest)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋งŒํผ์ด๋‚˜ ์ค‘์š”ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฐฐํฌ๋‹ค. FastAPI๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋†’์€ ์„ฑ๋Šฅ ๋•๋ถ„์— ํ˜„๋Œ€์ ์ธ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•˜์ง€๋งŒ, ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ, ์ฆ‰ ์ž์ฒด ์„œ๋ฒ„ ํ˜น์€ Windows PC์—์„œ ์ง์ ‘ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ์„œ๋น„์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค. Uvicorn, Gunicorn, ๊ทธ๋ฆฌ๊ณ  Docker๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ „์—์„œ ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌ ๊ณผ์ •์„ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž.


๐Ÿ”ง Uvicorn์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ํ•˜๊ธฐ

FastAPI๋Š” ์ž์ฒด์ ์œผ๋กœ ASGI(Asynchronous Server Gateway Interface)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด๋•Œ, ASGI ์„œ๋ฒ„ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Uvicorn์ด๋‹ค.

Uvicorn์€ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ Python ASGI ์„œ๋ฒ„๋กœ, FastAPI์˜ ๊ธฐ๋ณธ ๋Ÿฐ์ฒ˜๋‹ค.

Uvicorn ์„ค์น˜

๋จผ์ € ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ Uvicorn์„ ์„ค์น˜ํ•˜์ž.

pip install uvicorn

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, main.py๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

uvicorn main:app --reload
  • main: FastAPI ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํŒŒ์ผ๋ช… (ํ™•์žฅ์ž ์ œ์™ธ)
  • app: FastAPI ๊ฐ์ฒด ์ด๋ฆ„
  • --reload: ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ž๋™์œผ๋กœ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ (๊ฐœ๋ฐœ์šฉ)

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ์šด์˜์—์„œ๋Š” --reload ์—†์ด ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ๋” ๋‚˜์•„๊ฐ€ Gunicorn๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.


๐Ÿ”ฅ Gunicorn๊ณผ ํ•จ๊ป˜ Uvicorn ์‚ฌ์šฉํ•˜๊ธฐ

Linux ํ™˜๊ฒฝ์—์„œ๋Š” Gunicorn + Uvicorn Worker ์กฐํ•ฉ์ด ๋ฐฐํฌ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ์žก๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Windows ํ™˜๊ฒฝ์—์„œ๋Š” Gunicorn์ด ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์˜จํ”„๋ ˆ๋ฏธ์Šค Windows ํ™˜๊ฒฝ์—์„œ๋Š” Uvicorn ๋‹จ๋… ์‹คํ–‰, ๋˜๋Š” Docker๋ฅผ ์ด์šฉํ•œ Linux ํ™˜๊ฒฝ ๊ฐ€์ƒํ™”๋ฅผ ํ†ตํ•ด Gunicorn์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์šด์˜ ํ™˜๊ฒฝ์—์„œ Uvicorn์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

uvicorn main:app --host 0.0.0.0 --port 8000
  • --host 0.0.0.0: ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
  • --port: ์›ํ•˜๋Š” ํฌํŠธ ์„ค์ •

์ด ๋ช…๋ น์€ ์‹คํ–‰ ์ฝ˜์†”์—์„œ ์ง์ ‘ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ .bat ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ์ž๋™ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿณ Docker๋กœ ๋ฐฐํฌํ•˜๊ธฐ

Windows ํ™˜๊ฒฝ์—์„œ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ๊ณ ์˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” Docker๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Docker๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ๋กœ, ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋“  ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

Docker ์„ค์น˜ (Windows)

  1. Docker Desktop ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ Docker Desktop์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.
  2. ์„ค์น˜ ํ›„, ์žฌ๋ถ€ํŒ…ํ•˜๊ณ  Docker๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. PowerShell์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ •์ƒ ๋™์ž‘ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
docker --version

Dockerfile ์ž‘์„ฑ

๋‹ค์Œ์€ FastAPI + Uvicorn์„ Docker๋กœ ํŒจํ‚ค์ง•ํ•˜๊ธฐ ์œ„ํ•œ Dockerfile ์˜ˆ์ œ์ด๋‹ค.

# ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€
FROM python:3.11

# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
WORKDIR /app

# ํ•„์š”ํ•œ ํŒŒ์ผ ๋ณต์‚ฌ
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# ์•ฑ ๋ณต์‚ฌ
COPY . .

# ํฌํŠธ ์˜คํ”ˆ
EXPOSE 8000

# ์‹คํ–‰ ๋ช…๋ น
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

requirements.txt ์ž‘์„ฑ

FastAPI์™€ Uvicorn์ด ํฌํ•จ๋œ ์˜์กด์„ฑ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์ž.

fastapi
uvicorn

Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ

๋‹ค์Œ ๋ช…๋ น์–ด๋กœ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.

docker build -t fastapi-app .

Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run -d -p 8000:8000 --name fastapi-container fastapi-app
  • -d: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰
  • -p: ํ˜ธ์ŠคํŠธ ํฌํŠธ:์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ๋งคํ•‘
  • --name: ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„

์ด์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8000์œผ๋กœ ์ ‘์†ํ•˜๋ฉด FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿงฑ Windows ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•˜๊ธฐ

์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ณ„์† ์‚ด์•„ ์žˆ๋„๋ก ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด NSSM(Non-Sucking Service Manager)์ด๋ผ๋Š” ํˆด์„ ์‚ฌ์šฉํ•ด๋ณด์ž.

NSSM ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ

  1. NSSM์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์••์ถ•์„ ํ‘ผ๋‹ค.
  2. ๊ด€๋ฆฌ์ž ๊ถŒํ•œ CMD ๋˜๋Š” PowerShell์„ ์—ด๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ๋‹ค.
nssm install fastapi-service
  1. ์‹คํ–‰ ํŒŒ์ผ ์œ„์น˜์—๋Š” Python ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ, ์ธ์ž์—๋Š” Uvicorn ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค.

์˜ˆ:

  • Path: C:\Users\username\venv\Scripts\python.exe
  • Arguments: -m uvicorn main:app --host 0.0.0.0 --port 8000

์ด์ œ ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์‹œ FastAPI๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์œˆ๋„์šฐ ์„œ๋น„์Šค๊ฐ€ ์™„์„ฑ๋œ๋‹ค.


๐Ÿ“‹ ๋ณด์•ˆ ๋ฐ ์„ฑ๋Šฅ ํŒ

  • ๋ฐฉํ™”๋ฒฝ ์˜ˆ์™ธ ๋“ฑ๋ก: Windows ๋ฐฉํ™”๋ฒฝ์—์„œ 8000๋ฒˆ ํฌํŠธ๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ์™ธ๋ถ€์—์„œ ์ ‘์† ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •: ์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” Nginx๋‚˜ Apache๋ฅผ ์•ž๋‹จ์— ๋‘๊ณ  ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์ด๋Š” HTTPS ์ ์šฉ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์บ์‹ฑ ๋“ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  • ๋ชจ๋‹ˆํ„ฐ๋ง: ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ๋Š” prometheus, grafana, logrotate ๋“ฑ์„ ํ™œ์šฉํ•ด ๋กœ๊ทธ ๋ฐ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ตฌ์„ฑํ•˜๋ฉด ์ข‹๋‹ค.

โœ… ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

FastAPI๋Š” ๊ฐ€๋ณ๊ณ  ๊ฐ•๋ ฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ธ ๋งŒํผ, ๋ฐฐํฌ ๋˜ํ•œ ๋‹จ์ˆœํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ Windows ํ™˜๊ฒฝ์—์„œ๋„ Docker๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์˜ ๋ฐฐํฌ ๊ตฌ์กฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ด์‹์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๋ฐฐํฌ์— ์ค‘์ ์„ ๋‘์—ˆ์ง€๋งŒ, ์ดํ›„์—๋Š” AWS, Vercel ๋“ฑ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ๋ฐฐํฌ ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•  ์˜ˆ์ •์ด๋‹ค. ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธํ•˜๊ณ , ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ํด๋ผ์šฐ๋“œ ์ด์ „๋„ ๊ณ ๋ คํ•ด๋ณด์ž.

FastAPI ๊ณต์‹ ๋ฌธ์„œ : https://fastapi.tiangolo.com/ko/

fastapi-logo,fastapi-๊ฐœ๋ฐœ-ํ™˜๊ฒฝ-์„ค์ •, fastapi-์•ฑ-๋งŒ๋“ค๊ธฐ, fastapi-๋ผ์šฐํŒ…, fastapi-request-response, fastapi-์˜ˆ์™ธ-์ฒ˜๋ฆฌ, fastapi-mysql-์—ฐ๋™, fastapi-๋ฐฐํฌ