๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ #1 - ํ”„๋กœ์ ํŠธ ์„ธํŒ… (Expo + FastAPI + PostgreSQL)

๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ #1

๊ธฐํš ยท ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ยท Expo + FastAPI + PostgreSQL ์„ธํŒ…

1 ์™œ ๋ชจ๋ฐ”์ผ ๋ฒ„์ „์„ ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ๋‚˜

์›น๋ฒ„์ „ Neon Runner๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๋‚˜์„œ ์นœ๊ตฌ๊ฐ€ ํ•ธ๋“œํฐ์œผ๋กœ ์—ด์–ด๋ดค๋”๋‹ˆ ํ™”๋ฉด์ด ์ž˜๋ฆฌ๊ณ  ํ‚ค๋ณด๋“œ๊ฐ€ ์—†์–ด์„œ ์กฐ์ž‘์ด ์•ˆ ๋๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋ฐ”์ผ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ์˜€๋‹ค.

๊ทธ๋ƒฅ ์›น๋ฒ„์ „์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋ฐ”์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋‚ซ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ์–ด์ฐจํ”ผ ์ƒˆ๋กœ ๋งŒ๋“ค ๊ฑฐ๋ฉด ๊ธฐ๋Šฅ๋„ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  DB๋„ ์ œ๋Œ€๋กœ ์“ฐ๊ณ  ์‹ถ์—ˆ๋‹ค.

๐Ÿ’ก
์›น๋ฒ„์ „์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€
๋ชจ๋ฐ”์ผ ๋ฒ„์ „์€ ์™„์ „ํžˆ ๋ณ„๋„ ํ”„๋กœ์ ํŠธ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ์›น๋ฒ„์ „(neon-runner)์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ๋ชจ๋ฐ”์ผ ๋ฒ„์ „์€ neon-runner-mobile๋กœ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

2 ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ 

๐Ÿ“ฑ
React Native (Expo)
ํ”„๋ก ํŠธ์—”๋“œ
์›น๋ฒ„์ „์—์„œ ๋ฐฐ์šด React ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค. iOS + Android ๋™์‹œ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ. Expo ๋•๋ถ„์— ๋ณต์žกํ•œ ํ™˜๊ฒฝ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ
Python FastAPI
๋ฐฑ์—”๋“œ
์›น๋ฒ„์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€. ์ด๋ฏธ ์ต์ˆ™ํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๋‹ค. ์ด๋ฒˆ์—” JWT ์ธ์ฆ๊นŒ์ง€ ์ถ”๊ฐ€ํ•ด์„œ ์ œ๋Œ€๋กœ ๋œ ๋ฐฑ์—”๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.
๐Ÿ—„๏ธ
PostgreSQL + SQLAlchemy
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
์›น๋ฒ„์ „์˜ JSON ํŒŒ์ผ ๋Œ€์‹  ์ œ๋Œ€๋กœ ๋œ DB๋ฅผ ์“ด๋‹ค. SQLAlchemy๋กœ Python ์ฝ”๋“œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‹ค์ œ SQL๋„ ๊ฒฝํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ”
JWT ํ† ํฐ
์ธ์ฆ
ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ. ๋กœ๊ทธ์ธํ•˜๋ฉด JWT ํ† ํฐ์„ ๋ฐ›์•„์„œ ์ดํ›„ ์š”์ฒญ์— ํฌํ•จ์‹œํ‚จ๋‹ค. ๋‚ด ๊ธฐ๋ก, ๋‚ด ์•„์ดํ…œ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
โ˜๏ธ
Supabase
DB ํ˜ธ์ŠคํŒ…
PostgreSQL์„ ๋ฌด๋ฃŒ๋กœ ํด๋ผ์šฐ๋“œ์—์„œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค. ์ง์ ‘ ์„œ๋ฒ„ ์„ค์น˜ ์—†์ด DB URL๋งŒ ๋ฐ›์•„์„œ ์—ฐ๊ฒฐํ•˜๋ฉด ๋์ด๋‹ค.

3 ์›น๋ฒ„์ „๊ณผ ๋‹ฌ๋ผ์ง„ ์ 

ํ•ญ๋ชฉ ์›น๋ฒ„์ „ ๋ชจ๋ฐ”์ผ๋ฒ„์ „
ํ”„๋ ˆ์ž„์›Œํฌ React + Vite React Native + Expo
๋ Œ๋”๋ง Canvas API React Native ์ปดํฌ๋„ŒํŠธ
์กฐ์ž‘ ํ‚ค๋ณด๋“œ (SPACE, โ†“) ํ„ฐ์น˜ (์™ผ์ชฝ ํƒญ, ์˜ค๋ฅธ์ชฝ ํƒญ)
๋ฐ์ดํ„ฐ ์ €์žฅ JSON ํŒŒ์ผ PostgreSQL DB
์ธ์ฆ ๋‹‰๋„ค์ž„๋งŒ ์ž…๋ ฅ ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ (JWT)
์•„์ดํ…œ ์—†์Œ ์‰ด๋“œ / ์Šฌ๋กœ์šฐ / ๋ฌด์  / ์ ์ˆ˜2๋ฐฐ
์Šคํ…Œ์ด์ง€ ์—†์Œ 4๊ฐœ ํ…Œ๋งˆ (30์ดˆ๋งˆ๋‹ค ๋ณ€๊ฒฝ)
์ฝค๋ณด ์—†์Œ ์—ฐ์† ํšŒํ”ผ ์‹œ ์ ์ˆ˜ ๋ฐฐ์œจ ์ฆ๊ฐ€

4 ๊ฒŒ์ž„ ๊ธฐํš โ€” ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ๋“ค

ํ”ํ•œ ์ ํ”„๊ฒŒ์ž„์ด๋ž‘ ์ฐจ๋ณ„ํ™”ํ•˜๋ ค๊ณ  ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

๐ŸŒ ์Šคํ…Œ์ด์ง€ ์‹œ์Šคํ…œ

30์ดˆ๋งˆ๋‹ค ๋ฐฐ๊ฒฝ ํ…Œ๋งˆ๊ฐ€ ๋ฐ”๋€๋‹ค. ์‚ฌ์ด๋ฒ„๋„์‹œ โ†’ ์šฐ์ฃผ โ†’ ์šฉ์•”์ง€๋Œ€ โ†’ ์‹ฌํ•ด ์ˆœ์„œ๋กœ. ์žฅ์• ๋ฌผ ์ƒ‰์ด๋‚˜ ๋ถ„์œ„๊ธฐ๋„ ์Šคํ…Œ์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ์ ธ์„œ ์งˆ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

โšก ์•„์ดํ…œ ์‹œ์Šคํ…œ

๊ฒŒ์ž„ ์ค‘์— ์•„์ดํ…œ์ด ๋งต์— ๋“ฑ์žฅํ•˜๊ณ , ๋จน์œผ๋ฉด ์ธ๋ฒคํ† ๋ฆฌ์— ๋ณด๊ด€๋œ๋‹ค. ์›ํ•  ๋•Œ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

์•„์ดํ…œ ํšจ๊ณผ ์ง€์†์‹œ๊ฐ„
๐Ÿ›ก๏ธ ์‰ด๋“œ ํ•œ ๋ฒˆ ๋งž์•„๋„ ์•ˆ ์ฃฝ์Œ 1ํšŒ
๐ŸŒ ์Šฌ๋กœ์šฐ ๊ฒŒ์ž„ ์†๋„ ๋А๋ ค์ง 3์ดˆ
๐ŸŒ€ ๋ฌด์  ๋ชจ๋“  ์žฅ์• ๋ฌผ ํ†ต๊ณผ 2์ดˆ
๐Ÿ’Ž ์ ์ˆ˜ 2๋ฐฐ ํš๋“ ์ ์ˆ˜ 2๋ฐฐ 5์ดˆ

๐ŸŽฏ ์ฝค๋ณด ์‹œ์Šคํ…œ

์žฅ์• ๋ฌผ์„ ์—ฐ์†์œผ๋กœ ํ”ผํ• ์ˆ˜๋ก ์ฝค๋ณด๊ฐ€ ์Œ“์ด๊ณ  ์ ์ˆ˜ ๋ฐฐ์œจ์ด ์˜ฌ๋ผ๊ฐ„๋‹ค. ๋งž์œผ๋ฉด ์ฝค๋ณด ์ดˆ๊ธฐํ™”.

๐Ÿ† ์•„์ดํ…œ ์ธ๋ฒคํ† ๋ฆฌ

100์  ์ด์ƒ ํš๋“ํ•˜๋ฉด ๊ฒŒ์ž„์˜ค๋ฒ„ ํ›„ ๋žœ๋ค ์•„์ดํ…œ 1๊ฐœ ์ง€๊ธ‰. ์ตœ๋Œ€ 3๊ฐœ ๋ณด๊ด€ ๊ฐ€๋Šฅ. ๋‹ค์Œ ๊ฒŒ์ž„์—์„œ ์›ํ•  ๋•Œ ์‚ฌ์šฉ.

5 ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ & Expo ์„ธํŒ…

D:\Lee_project\neon-runner-mobile\
โ”œโ”€โ”€ frontend\    โ† React Native (Expo)
โ”‚   โ”œโ”€โ”€ App.js     โ† ๊ฒŒ์ž„ ๋ฉ”์ธ
โ”‚   โ”œโ”€โ”€ app.json
โ”‚   โ””โ”€โ”€ package.json
โ””โ”€โ”€ backend\    โ† Python FastAPI
    โ”œโ”€โ”€ venv\
    โ”œโ”€โ”€ main.py    โ† API ์„œ๋ฒ„
    โ”œโ”€โ”€ .env       โ† DB ์ฃผ์†Œ, ๋น„๋ฐ€ํ‚ค
    โ””โ”€โ”€ .gitignore

Expo ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ช…๋ น์–ด:

PowerShell
# Expo ์„ค์น˜
npm install -g expo-cli

# ๋นˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
npx create-expo-app frontend --template blank

# ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
cd frontend
npx expo start
๐Ÿ’ก
Expo๊ฐ€ ๋ญ”๊ฐ€?
React Native ์•ฑ์„ ๋งŒ๋“ค ๋•Œ Xcode, Android Studio ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ๋„๊ตฌ ์„ค์น˜ ์—†์ด ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‹ค. ํฐ์— Expo Go ์•ฑ ์„ค์น˜ํ•˜๊ณ  QR์ฝ”๋“œ ์Šค์บ”ํ•˜๋ฉด ์‹ค๊ธฐ๊ธฐ์—์„œ ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ํฐ์— ๋ฐ˜์˜๋œ๋‹ค.
โœ…
React Native์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ๋ฒ•
HTML ํƒœ๊ทธ ๋Œ€์‹  React Native ์ „์šฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ด๋‹ค.
<div> โ†’ <View>
<p> โ†’ <Text>
CSS โ†’ StyleSheet.create()
ํด๋ฆญ โ†’ onPress
JavaScript/React ๋ฌธ๋ฒ•์€ ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค.

6 FastAPI + PostgreSQL ๋ฐฑ์—”๋“œ ์„ธํŒ…

์›น๋ฒ„์ „๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ด๋ฒˆ์—” PostgreSQL DB๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๊ฐ€ ๋” ๋งŽ๋‹ค.

PowerShell
# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
cd D:\Lee_project\neon-runner-mobile\backend
python -m venv venv
venv\Scripts\activate

# ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜
pip install fastapi uvicorn sqlalchemy psycopg2-binary python-jose passlib python-multipart python-dotenv

์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๋“ค ์—ญํ• :

ํŒจํ‚ค์ง€ ์—ญํ• 
fastapi API ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ
uvicorn ์„œ๋ฒ„ ์‹คํ–‰
sqlalchemy Python์œผ๋กœ DB ์ฟผ๋ฆฌ ์ž‘์„ฑ (ORM)
psycopg2-binary PostgreSQL ๋“œ๋ผ์ด๋ฒ„
python-jose JWT ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ
passlib ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” (bcrypt)
python-multipart ๋กœ๊ทธ์ธ ํผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
python-dotenv .env ํŒŒ์ผ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฝ๊ธฐ
๐Ÿ’ก
ORM์ด ๋ญ”๊ฐ€?
Object Relational Mapping. SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๋Œ€์‹  Python ์ฝ”๋“œ๋กœ DB๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‹ค. SELECT * FROM users ๋Œ€์‹  db.query(User).all() ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๋‹ค. SQLAlchemy๊ฐ€ ๋Œ€ํ‘œ์ ์ธ Python ORM์ด๋‹ค.
๐Ÿ’ก
JWT๊ฐ€ ๋ญ”๊ฐ€?
JSON Web Token. ๋กœ๊ทธ์ธํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค. ์ดํ›„ ์š”์ฒญํ•  ๋•Œ ์ด ํ† ํฐ์„ ๊ฐ™์ด ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ ๋ˆ„๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์„ธ์…˜์ฒ˜๋Ÿผ ์„œ๋ฒ„์— ์ €์žฅํ•  ํ•„์š” ์—†์ด ํ† ํฐ ์ž์ฒด์— ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ์–ด์„œ ๊ฐ€๋ณ๋‹ค.

7 Supabase DB ์—ฐ๊ฒฐ

PostgreSQL ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๊ฑด ๋ณต์žกํ•˜๋‹ค. Supabase๋ฅผ ์“ฐ๋ฉด ๋ฌด๋ฃŒ๋กœ ํด๋ผ์šฐ๋“œ PostgreSQL DB๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

supabase.com์—์„œ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ณ  โ†’ Connect โ†’ Direct ํƒญ์—์„œ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์„ ๋ฐ›์•˜๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ์— ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์žˆ์œผ๋ฉด URL ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ•˜๋‹ค. @๋Š” %40, !๋Š” %21๋กœ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.

backend/.env
DATABASE_URL=postgresql://postgres.ํ”„๋กœ์ ํŠธID:๋น„๋ฐ€๋ฒˆํ˜ธ@aws-1-ap-northeast-1.pooler.supabase.com:5432/postgres
SECRET_KEY=neon-runner-secret-key-2026
backend/.gitignore
venv/
.env
__pycache__/
*.pyc
๐Ÿšจ
.env ํŒŒ์ผ์€ ์ ˆ๋Œ€ GitHub์— ์˜ฌ๋ฆฌ๋ฉด ์•ˆ ๋œ๋‹ค
DB ์ฃผ์†Œ์™€ ๋น„๋ฐ€ํ‚ค๊ฐ€ ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. .gitignore์— ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์‹ค์ˆ˜๋กœ ์˜ฌ๋ ธ๋‹ค๋ฉด ๋ฐ”๋กœ Supabase์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

8 API ๊ตฌ์กฐ ์™„์„ฑ

์›น๋ฒ„์ „์€ API๊ฐ€ 2๊ฐœ(์ ์ˆ˜ ์ €์žฅ, ๋ฆฌ๋”๋ณด๋“œ)๋ฟ์ด์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—” ํ›จ์”ฌ ๋งŽ์•„์กŒ๋‹ค.

๋ฉ”์„œ๋“œ ๊ฒฝ๋กœ ์—ญํ•  ์ธ์ฆ
POST /register ํšŒ์›๊ฐ€์ž… ๋ถˆํ•„์š”
POST /login ๋กœ๊ทธ์ธ โ†’ JWT ๋ฐœ๊ธ‰ ๋ถˆํ•„์š”
GET /me ๋‚ด ์ •๋ณด ์กฐํšŒ ํ•„์š” ๐Ÿ”’
POST /score ์ ์ˆ˜ ์ €์žฅ + ์•„์ดํ…œ ์ง€๊ธ‰ ํ•„์š” ๐Ÿ”’
GET /leaderboard ์ƒ์œ„ 20๊ฐœ ์ ์ˆ˜ ์กฐํšŒ ๋ถˆํ•„์š”
GET /items ๋‚ด ์•„์ดํ…œ ์กฐํšŒ ํ•„์š” ๐Ÿ”’
POST /items/use ์•„์ดํ…œ ์‚ฌ์šฉ ํ•„์š” ๐Ÿ”’

DB ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๊ณ„ํ–ˆ๋‹ค.

SQLAlchemy ๋ชจ๋ธ (Python)
# users ํ…Œ์ด๋ธ”
class User(Base):
    id       = Column(Integer, primary_key=True)
    username = Column(String, unique=True)
    hashed_password = Column(String)   # bcrypt ์•”ํ˜ธํ™”
    skin     = Column(String, default="default")
    total_score = Column(Integer, default=0)

# scores ํ…Œ์ด๋ธ”
class Score(Base):
    id       = Column(Integer, primary_key=True)
    user_id  = Column(Integer, ForeignKey("users.id"))
    username = Column(String)
    score    = Column(Integer)
    time     = Column(Float)
    stage    = Column(Integer)

# items ํ…Œ์ด๋ธ”
class Item(Base):
    id        = Column(Integer, primary_key=True)
    user_id   = Column(Integer, ForeignKey("users.id"))
    item_type = Column(String)   # shield / slow / invincible / double_score
    quantity  = Column(Integer, default=1)
โœ…
Base.metadata.create_all()์ด ํ•˜๋Š” ์ผ
Python ํด๋ž˜์Šค๋กœ ์ •์˜ํ•œ ํ…Œ์ด๋ธ”์„ ์‹ค์ œ DB์— ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์„œ๋ฒ„๊ฐ€ ์ฒ˜์Œ ์ผœ์งˆ ๋•Œ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๊ณ , ํ…Œ์ด๋ธ”์ด ์ด๋ฏธ ์žˆ์œผ๋ฉด ๊ฑด๋„ˆ๋›ด๋‹ค. SQL๋กœ ์ง์ ‘ CREATE TABLE์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ์™„๋ฃŒ ํ”„๋กœ์ ํŠธ ๊ธฐํš ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ •
  • ์™„๋ฃŒ Expo React Native ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  • ์™„๋ฃŒ Python FastAPI + PostgreSQL ํŒจํ‚ค์ง€ ์„ค์น˜
  • ์™„๋ฃŒ Supabase DB ์ƒ์„ฑ ๋ฐ ์—ฐ๊ฒฐ
  • ์™„๋ฃŒ .env + .gitignore ์„ค์ •
  • ์™„๋ฃŒ API 7๊ฐœ + DB ํ…Œ์ด๋ธ” 3๊ฐœ ์™„์„ฑ
  • ์™„๋ฃŒ FastAPI /docs ์—์„œ API ๋™์ž‘ ํ™•์ธ
  • ๋‹ค์ŒํŽธ ๊ฒŒ์ž„ ํ™”๋ฉด UI ๋งŒ๋“ค๊ธฐ (React Native)
  • ๋‹ค์ŒํŽธ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ํ™”๋ฉด

์›น๋ฒ„์ „ ๋งŒ๋“ค ๋•Œ๋ณด๋‹ค ์„ค์ •ํ•  ๊ฒŒ ํ›จ์”ฌ ๋งŽ์•˜๋‹ค.

๊ทผ๋ฐ DB๋ž‘ JWT ์ธ์ฆ๊นŒ์ง€ ๋ถ™์ด๊ณ  ๋‚˜๋‹ˆ๊นŒ ์ง„์งœ ์„œ๋น„์Šค์ฒ˜๋Ÿผ ๋А๊ปด์ง„๋‹ค.

โ–ถ ๋‹ค์ŒํŽธ: React Native๋กœ ๊ฒŒ์ž„ ํ™”๋ฉด ๋งŒ๋“ค๊ธฐ