React + FastAPI๋กœ ์›น ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ #5 - Render + Vercel ๋ฐฐํฌ

React + Python FastAPI๋กœ
์›น ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ #5

Render + Vercel๋กœ ๋ฐฐํฌํ•ด์„œ ๋ˆ„๊ตฌ๋‚˜ ์ ‘์† ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

1 ๋ฐฐํฌ๊ฐ€ ๋ญ”์ง€, ์™œ ํ•„์š”ํ•œ์ง€

์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ๊ฒŒ์ž„์€ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋งŒ ๋Œ์•„๊ฐ„๋‹ค. npm run dev๋กœ ์ผ  ์„œ๋ฒ„๋Š” ๋‚ด PC์—๋งŒ ์žˆ๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ์€ ์ ‘์†ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

๋ฐฐํฌ(Deploy)๋Š” ๋‚ด ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ธํ„ฐ๋„ท ์„œ๋ฒ„์— ์˜ฌ๋ ค์„œ ๋ˆ„๊ตฌ๋‚˜ ์ ‘์† ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ’ก
๋กœ์ปฌ vs ๋ฐฐํฌ ์ฐจ์ด
๋กœ์ปฌ: ๋‚ด PC์—์„œ๋งŒ ์‹คํ–‰. ์ฃผ์†Œ๊ฐ€ localhost:5173
๋ฐฐํฌ: ์ธํ„ฐ๋„ท ์„œ๋ฒ„์—์„œ ์‹คํ–‰. ์ฃผ์†Œ๊ฐ€ https://neon-runner.vercel.app
๋ฐฐํฌํ•˜๋ฉด PC๊ฐ€ ๊บผ์ ธ๋„ ์„œ๋ฒ„๋Š” ๊ณ„์† ๋Œ์•„๊ฐ€๊ณ , ์ „ ์„ธ๊ณ„ ๋ˆ„๊ตฌ๋‚˜ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

2 ์ „์ฒด ๋ฐฐํฌ ๊ตฌ์กฐ

ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์˜ฌ๋ ธ๋‹ค. ๋‘˜ ๋‹ค ๋ฌด๋ฃŒ๋‹ค.

โš›๏ธ
React
Vercel์— ๋ฐฐํฌ
โŸท
๐Ÿ
FastAPI
Render์— ๋ฐฐํฌ
โŸท
๐Ÿ“„
scores.json
Render ์„œ๋ฒ„์— ์ €์žฅ
โš ๏ธ
์™œ ๋”ฐ๋กœ ์˜ฌ๋ฆฌ๋‚˜?
Vercel์€ React ๊ฐ™์€ ์ •์  ํŒŒ์ผ ๋ฐฐํฌ์— ํŠนํ™”๋˜์–ด ์žˆ๊ณ , Render๋Š” Python ์„œ๋ฒ„ ์‹คํ–‰์— ํŠนํ™”๋˜์–ด ์žˆ๋‹ค. ๊ฐ์ž ์ž˜ํ•˜๋Š” ๊ฑธ ๋งก๊ธด ๊ฑฐ๋‹ค. ๋‘˜ ๋‹ค GitHub ์—ฐ๋™์ด ๋˜์–ด์„œ ์ฝ”๋“œ๋ฅผ pushํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋œ๋‹ค.

3 ๋ฐฑ์—”๋“œ ๋ฐฐํฌ โ€” Render

FastAPI ์„œ๋ฒ„๋ฅผ Render์— ์˜ฌ๋ฆฌ๋Š” ๊ณผ์ •์ด๋‹ค. Render๋Š” GitHub ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์ž๋™์œผ๋กœ Python ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์„œ ์„œ๋ฒ„๋ฅผ ๋„์›Œ์ค€๋‹ค.

๋จผ์ € ๋ฐฐํฌ์— ํ•„์š”ํ•œ ํŒŒ์ผ ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

backend/requirements.txt
fastapi
uvicorn
๐Ÿ’ก
requirements.txt๊ฐ€ ๋ญ”๊ฐ€?
์ด ํ”„๋กœ์ ํŠธ์—์„œ ํ•„์š”ํ•œ Python ํŒจํ‚ค์ง€ ๋ชฉ๋ก์ด๋‹ค. Render๊ฐ€ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ๋•Œ ์ด ํŒŒ์ผ์„ ๋ณด๊ณ  ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•œ๋‹ค. ๋กœ์ปฌ์—์„œ pip install ๋กœ ์„ค์น˜ํ•œ ๊ฒƒ๋“ค์„ ์—ฌ๊ธฐ์— ์ ์–ด๋‘๋ฉด ๋œ๋‹ค.

๊ทธ ๋‹ค์Œ Render์—์„œ ์„ค์ •ํ•œ ๊ฐ’๋“ค์ด๋‹ค.

1
render.com โ†’ GitHub ๋กœ๊ทธ์ธ โ†’ New Web Service
GitHub ์ €์žฅ์†Œ neon-runner ์„ ํƒ
2
์„ค์ • ์ž…๋ ฅ
Name: neon-runner-backend
Language: Python 3
Root Directory: backend
Build Command: pip install -r requirements.txt
Start Command: uvicorn main:app --host 0.0.0.0 --port $PORT
Instance Type: Free
3
Create Web Service โ†’ ๋ฐฐํฌ ์™„๋ฃŒ
๋ฐฐํฌ๊ฐ€ ๋๋‚˜๋ฉด ์•„๋ž˜ ์ฃผ์†Œ๊ฐ€ ์ƒ๊ธด๋‹ค:
https://neon-runner-backend-1spw.onrender.com

๋ฐฑ์—”๋“œ ์ฃผ์†Œ๊ฐ€ ์ƒ๊ธฐ๋ฉด App.jsx์—์„œ API ์ฃผ์†Œ๋ฅผ ๋ฐ”๊ฟ”์คฌ๋‹ค.

frontend/src/App.jsx
// ๊ธฐ์กด โ€” ๋‚ด PC ์ฃผ์†Œ
const API = 'http://127.0.0.1:8000'

// ๋ณ€๊ฒฝ โ€” Render ์„œ๋ฒ„ ์ฃผ์†Œ
const API = 'https://neon-runner-backend-1spw.onrender.com'
โš ๏ธ
Render ๋ฌด๋ฃŒ ํ”Œ๋žœ ์ฃผ์˜์‚ฌํ•ญ
๋ฌด๋ฃŒ ํ”Œ๋žœ์€ 15๋ถ„ ๋™์•ˆ ์š”์ฒญ์ด ์—†์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ์ž ๋“ ๋‹ค. ์ž ๋“  ์ƒํƒœ์—์„œ ์ฒ˜์Œ ์š”์ฒญ์ด ์˜ค๋ฉด 50์ดˆ ์ •๋„ ๊ฑธ๋ฆฐ๋‹ค. ์ฒซ ์ ์ˆ˜ ๋“ฑ๋ก์ด ๋А๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋œ๋‹ค.

4 ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฐํฌ โ€” Vercel

React ํ”„๋กœ์ ํŠธ๋ฅผ Vercel์— ์˜ฌ๋ฆฌ๋Š” ๊ฑด ํ›จ์”ฌ ๊ฐ„๋‹จํ–ˆ๋‹ค. GitHub ์ €์žฅ์†Œ ์—ฐ๊ฒฐํ•˜๊ณ  ํด๋”๋งŒ ์ง€์ •ํ•˜๋ฉด ๋์ด๋‹ค.

1
vercel.com โ†’ GitHub๋กœ ๊ฐ€์ž…/๋กœ๊ทธ์ธ
GitHub ๊ณ„์ •์œผ๋กœ ๋ฐ”๋กœ ๊ฐ€์ž… ๊ฐ€๋Šฅํ•˜๋‹ค.
2
Add New โ†’ Project โ†’ neon-runner ์„ ํƒ
GitHub ์ €์žฅ์†Œ ๋ชฉ๋ก์—์„œ neon-runner ์ฐพ์•„์„œ Import
3
Root Directory ์„ค์ •
Root Directory: frontend ์ž…๋ ฅ
Framework Preset: Vite ์ž๋™ ๊ฐ์ง€๋จ
4
Deploy ํด๋ฆญ โ†’ ์™„๋ฃŒ!
1~2๋ถ„ ํ›„ ๋ฐฐํฌ ์™„๋ฃŒ. ์ฃผ์†Œ ์ž๋™ ์ƒ์„ฑ:
https://neon-runner-taupe.vercel.app
โœ…
์•ž์œผ๋กœ ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๋ฉด?
git push๋งŒ ํ•˜๋ฉด Vercel์ด๋ž‘ Render ๋‘˜ ๋‹ค ์ž๋™์œผ๋กœ ์žฌ๋ฐฐํฌ๋œ๋‹ค. ๋”ฐ๋กœ ๋ญ”๊ฐ€ ํ•  ํ•„์š” ์—†๋‹ค.

5 ๊ฒช์—ˆ๋˜ ์˜ค๋ฅ˜๋“ค

๐Ÿ”ด ์˜ค๋ฅ˜ 1 โ€” requirements.txt ํŒŒ์ผ ์—†์Œ

Render๊ฐ€ pip install -r requirements.txt ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ํŒŒ์ผ์ด ์—†์–ด์„œ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค. ์ฒ˜์Œ์— ํŒŒ์ผ์„ ๋ฃจํŠธ ํด๋”์— ๋งŒ๋“ค์—ˆ๋Š”๋ฐ backend ํด๋” ์•ˆ์— ์žˆ์–ด์•ผ ํ–ˆ๋‹ค. ํŒŒ์ผ์„ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ  ๋‹ค์‹œ pushํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

ํ•ด๊ฒฐ โ€” PowerShell
# ์ž˜๋ชป๋œ ์œ„์น˜์˜ ํŒŒ์ผ์„ backend ํด๋”๋กœ ์ด๋™
move requirements.txt backend\requirements.txt
git add .
git commit -m "fix: requirements.txt backend ํด๋”๋กœ ์ด๋™"
git push

๐Ÿ”ด ์˜ค๋ฅ˜ 2 โ€” Build Command ์ž…๋ ฅ์ด ์•ˆ ๋จ

Render UI์—์„œ Root Directory์— backend๋ฅผ ์ž…๋ ฅํ•˜๋ฉด Build Command ์•ž์— backend/ $๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ™๋Š”๋‹ค. ์ฒ˜์Œ์—” ์ด๊ฒŒ ๋ญ”์ง€ ๋ชฐ๋ผ์„œ ๊ณ„์† ์ง€์šฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ Render๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ™์—ฌ์ฃผ๋Š” ์ ‘๋‘์‚ฌ๋ผ ๊ฑด๋“œ๋ฆฌ๋ฉด ์•ˆ ๋๋‹ค. ๊ทธ๋ƒฅ ๋ช…๋ น์–ด๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋๋‹ค.

๐Ÿ”ด ์˜ค๋ฅ˜ 3 โ€” CORS ์˜ค๋ฅ˜ (์ ์ˆ˜ ์ €์žฅ์ด ์•ˆ ๋จ)

๋ฐฐํฌ ํ›„์— ์ ์ˆ˜ ๋“ฑ๋ก์„ ํ–ˆ๋Š”๋ฐ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— CORS ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค. ๋กœ์ปฌ์—์„œ๋Š” localhost:5173๋งŒ ํ—ˆ์šฉํ–ˆ๋Š”๋ฐ Vercel ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ์„œ ๋ง‰ํ˜”๋‹ค. main.py์—์„œ CORS ์„ค์ •์„ allow_origins=["*"]๋กœ ๋ฐ”๊ฟ”์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

backend/main.py โ€” CORS ์ˆ˜์ •
# ๊ธฐ์กด โ€” localhost๋งŒ ํ—ˆ์šฉ
allow_origins=["http://localhost:5173"]

# ๋ณ€๊ฒฝ โ€” ๋ชจ๋“  ์ฃผ์†Œ ํ—ˆ์šฉ
allow_origins=["*"]

6 ์™„์„ฑ๋œ ๋งํฌ ๋ชจ์Œ

๋ฐฐํฌ๊ฐ€ ๋๋‚˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ์‹ค์ œ๋กœ ์ฃผ์†Œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์•„๋ž˜ ๋งํฌ๋“ค๋กœ ์ง์ ‘ ์ ‘์†ํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽฎ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด
https://neon-runner-taupe.vercel.app
๋ˆ„๊ตฌ๋‚˜ ์ด ์ฃผ์†Œ๋กœ ์ ‘์†ํ•ด์„œ ๊ฒŒ์ž„ํ•  ์ˆ˜ ์žˆ์–ด์š”!

  • ์™„๋ฃŒ requirements.txt ์ž‘์„ฑ
  • ์™„๋ฃŒ Render๋กœ FastAPI ๋ฐฑ์—”๋“œ ๋ฐฐํฌ
  • ์™„๋ฃŒ App.jsx API ์ฃผ์†Œ Render๋กœ ๋ณ€๊ฒฝ
  • ์™„๋ฃŒ Vercel๋กœ React ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฐํฌ
  • ์™„๋ฃŒ ๋ˆ„๊ตฌ๋‚˜ ์ ‘์† ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ ์ƒ์„ฑ
๐ŸŽ‰ ์‹œ๋ฆฌ์ฆˆ ์™„์„ฑ!

์ฒ˜์Œ์— ํด๋” ๋งŒ๋“œ๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ฐฐํฌ๊นŒ์ง€ ์ „๋ถ€ ํ–ˆ๋‹ค.

React, Canvas, Python, FastAPI, Git, Render, Vercel ๋‹ค ์จ๋ดค๋‹ค.

์ด ์‹œ๋ฆฌ์ฆˆ์˜ ๋ชจ๋“  ์†Œ์Šค์ฝ”๋“œ๋Š”
github.com/jisun22/neon-runner ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!