๐ ํ๊ตญ์ด | English | ๆฅๆฌ่ช
์์๋ฆฌ๋ ๊ทธ๋ง. ์์์ ์์ํ์ธ์.
๋งค์ฃผ ์์ด๋ค์๊ฒ ํ ์ผ์ ์ํค๋๋ผ ๋ช ์๊ฐ์ฉ ์์๋ฆฌํ๊ณ ๊ณ์ ๊ฐ์? ๋งค์ผ ๋ฐ๋ณต๋๋ ์ง์์ผ์ด ์ ์ํฐ๊ฐ ๋๊ณ ์์ง ์๋์? DOOOZ๋ ์ง๋ฃจํ ์ผ์์ ์๋ ๊ฐ ์ด์ด์ง๋ ๋ชจํ์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค. ๋ถ๋ชจ๊ฐ ํ ์ผ์ ์ ํ๋ฉด, ์์ด๊ฐ ์๋ฃํ๊ณ , ํฌ์ธํธ๊ฐ ์์ด๊ณ , ์บ๋ฆญํฐ๊ฐ ์ฑ์ฅํ๊ณ , ์ฐ์ ๊ธฐ๋ก์ด ์จ ๊ฐ์กฑ์ ํ๋๋ก ๋ฌถ์ด์ค๋๋ค.
์์ด์ ์ฑ์ฅ์ 5๋ ์ด์ ์ง์ผ๋ณด๊ณ ์ถ์ ๊ฐ์กฑ์ ์ํด ๋ง๋ค์์ต๋๋ค.
์ DOOOZ์ธ๊ฐ ๐คฉ (๐ ์์ธ ์ฌ์ฉ ๊ฐ์ด๋)
๋ถ๋ชจ๊ฐ ํ ์ผ์ ๋ฑ๋กํ๋ฉด ์์ด๊ฐ ์ค์ค๋ก ์ฒดํฌํ๊ณ , ์ฒดํฌํ๋ ์๊ฐ ํฌ์ธํธ๊ฐ ๋ฐ๋ก ์์ ๋๋ค. ๋ถ๋ชจ ์น์ธ์ ๊ธฐ๋ค๋ฆด ํ์ ์์ด ์์ด๊ฐ ์ฃผ๋์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ์ ๋๋ค. ์์ธ ํฌ์ธํธ๋ ๋ถ๋ชจ๊ฐ ๋ฑ๋กํ ๋ณด์(์ฉ๋, ํน๋ณ ํ๋ ๋ฑ)์ผ๋ก ๊ตํํ ์ ์๊ณ , 30๋จ๊ณ ๋ ๋ฒจ๊ณผ 58์ข ๋ฐฐ์ง, 5๋จ๊ณ๋ก ์งํํ๋ ์บ๋ฆญํฐ๊ฐ ์์ด์๊ฒ ์ง์์ ์ธ ๋๊ธฐ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ์์จ ์ฒดํฌ, ์ฆ์ ๋ฐ์ | ์์ด๊ฐ ํ ์ผ์ ์ฒดํฌํ๋ฉด ํฌ์ธํธ๊ฐ ๋ฐ๋ก ์ ๋ฆฝ! ๋ถ๋ชจ ์น์ธ ๋ถํ์ |
| ์กฐ๋ฅด๊ธฐ | ์์ด๊ฐ ์ถ๊ฐ๋ก ํ ์ผ์ ๋ถ๋ชจ์๊ฒ ์ธ์ ์์ฒญ โ ๋ถ๋ชจ๊ฐ ํฌ์ธํธ๋ฅผ ์ ํด์ ์ง๊ธ |
| ๋ด์ฃผ๊ธฐ | ์ฌํ์ด๋ ์ํ ๋ , ๋ถ๋ชจ๊ฐ ๋ฏธ์๋ฃ ํ ์ผ์ ํจ๋ํฐ๋ฅผ ๋ฉด์ |
| ๋ณด์ ๊ตํ | ํฌ์ธํธ๋ก ๋ณด์(์ฉ๋ ๋ฑ) ๊ตํ ์ ์ฒญ โ ๋ถ๋ชจ ์น์ธ ์ ์ฐจ๊ฐ |
| ์ค๋ ๊ฐ๋ ๊ฒ์ํ | 30๋ ๋ฒจ + 58๋ฐฐ์ง + 12์บ๋ฆญํฐ(5๋จ๊ณ ์งํ) โ ์๋ ๊ฐ ๋๊ธฐ ๋ถ์ฌ |
| ์๋ ์ด์ | ์๋ฒฝ 1์ ํ ์ผ ์๋ ์์ฑ + ๋ฏธ์๋ฃ ํจ๋ํฐ, ์ ๋ 9์ ๋ฆฌ๋ง์ธ๋ |
| ์ฑ ์ค์น & ํธ์ | ํ ํ๋ฉด์ ์ถ๊ฐํ๋ฉด ๋ณ๋ ์ฑ์ผ๋ก ์ฌ์ฉ + ํธ์ ์๋ฆผ |
| ๊ฐ์กฑ ๋ฐ์ดํฐ ๋ณดํธ | ๊ฐ์กฑ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฒจ์์ ์์ ๊ฒฉ๋ฆฌ |
| ๋ค๊ตญ์ด | ํ๊ตญ์ด / English / ๆฅๆฌ่ช + ๊ธ๋ก๋ฒ ํ์์กด |
๐ก ์ฑ ์ค์น ํ (iOS): ๋ก๊ทธ์ธ ํ ๋ฉ์ธ ํ๋ฉด์์ ํ ํ๋ฉด์ ์ถ๊ฐํด์ฃผ์ธ์. ๋ก๊ทธ์ธ ์ ์ ์ค์นํ๋ฉด ํ๋ฉด ๋ ์ด์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
| ๊ฐ์กฑ ์์ธ | ํ ์ผ ํํฉ(1) |
| ํ ์ผ ํํฉ(2) | ๋ณด์ ๊ด๋ฆฌ |
- Next.js 15 (App Router, RSC) + React 19 + TypeScript 5
- Tailwind + shadcn ์คํ์ผ ์ปดํฌ๋ํธ
- Supabase (Postgres, Auth, RLS)
- Zod ์คํค๋ง ์ ํจ์ฑ ๊ฒ์ฌ
- Web Push API (VAPID)
- Vercel ๋ฐฐํฌ
DOOOZ๋ ์ด๋ฏธ์ง/ํ์ผ ์ ๋ก๋ ์์ด ํ ์คํธ ๋ฐ์ดํฐ๋ง ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์๋ฒ ๋น์ฉ์ด ๋งค์ฐ ์์ต๋๋ค. ์ง์ ๊ตฌ์ถ ์์ด ๋ฐ๋ก ์ฌ์ฉํด๋ณด๊ณ ์ถ์ ๋ถ์ ์ ์ฃผ์์์ ํ์๊ฐ์ ํ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค.
ํ์ฌ๋ ๋ฌด๋ฃ tier๋ก ์ด์ ์ค์ด๋ฉฐ, ๊ฐ์ ๋ ๊ฐ์กฑ์ด 100๊ณณ์ ๋์ผ๋ฉด Supabase๋ฅผ ์ ๋ฃ tier๋ก, 5,000๊ฐ์กฑ์ ๋์ผ๋ฉด Vercel๋ ์ ๋ฃ tier๋ก ์ ๊ทธ๋ ์ด๋ํ ์์ ์ ๋๋ค. (์ต๋ ์ฝ 15,000๊ฐ์กฑ, 50,000๋ช ๊น์ง ์์ฉ ๊ฐ๋ฅ ์์)
๋ค๋ง, DOOOZ๋ ์ ์ ๊ฐ ์ง์ ์์ ๋ง์ ์๋น์ค๋ฅผ ๊ตฌ์ถํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ์๋ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ด ๋ฌธ์๋ฅผ ๋ฐ๋ผ ํ๋ ค๋ฉด ์ฝ๊ฐ์ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ์ด ํ์ํฉ๋๋ค.
- ํฐ๋ฏธ๋ ์ด๊ธฐ โ Mac์ ํฐ๋ฏธ๋, Windows๋ PowerShell์ ์ฌ์ฉํ์ธ์. ์ฌ๋ ๋ฒ์ ๋ชจ๋ฅด์๋ฉด ๊ตฌ๊ธ์์ ๊ฒ์ํ๊ฑฐ๋ AI์๊ฒ ๋ฌผ์ด๋ณด์ธ์.
- git์ด ์ ๋๋ค๋ฉด โ ๊ตฌ๊ธ์์ "Git ์ค์น ๋ฐฉ๋ฒ" ์ ๊ฒ์ํ๊ฑฐ๋ AI์๊ฒ ๋ฌผ์ด๋ณด์ธ์.
- npm/npx๊ฐ ์ ๋๋ค๋ฉด โ ๊ตฌ๊ธ์์ "Node.js ์ค์น ๋ฐฉ๋ฒ" ์ ๊ฒ์ํ๊ฑฐ๋ AI์๊ฒ ๋ฌผ์ด๋ณด์ธ์.
# 1. ๋ค์ด๋ก๋ ๋ฐ๊ณ ์ถ์ ํด๋๋ก ์ด๋ (์: ๋ฐํํ๋ฉด)
cd ~/Desktop
# 2. ํด๋ก & ์ค์น
git clone https://github.com/taekim34/doooz.git
cd doooz && npm install
# 3. ํ๊ฒฝ ๋ณ์ (.env.example์ ๋ณต์ฌํด์ .env.local ์์ฑ)
cp .env.example .env.local # ์๋ ํ์ ๊ฐ์ ์ฑ์์ฃผ์ธ์
# 4. ๊ฐ๋ฐ ์๋ฒ
npm run dev # http://localhost:3000๋ณต์ฌ๋ .env.local์ ํ์๊ฐ์ ๋น์์ ธ ์์ต๋๋ค. ํ
์คํธ๋ฅผ ์์ ํ ์ ์๋ ํ๋ก๊ทธ๋จ์ผ๋ก ์ด๊ณ , ๋ค์ ์น์
์ ๊ฐ์ด๋์ ๋ฐ๋ผ ๊ฐ์ ์ฑ์์ฃผ์ธ์.
1. Supabase ์ฐ๊ฒฐ ์ ๋ณด โ supabase.com์์ ํ๋ก์ ํธ ์์ฑ ํ, ์ข์ธก ๋ฉ๋ด Project Settings โ API Keys ์์ ๋ณต์ฌํฉ๋๋ค.
| ๋ณ์ | ์ด๋์ ์ฐพ๋์ |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
ํ๋ก์ ํธ ํ โ ํ๋ก์ ํธ ์ด๋ฆ ์๋ ํ์๋ URL (https://xxx.supabase.co) |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY |
Publishable key (๊ณต๊ฐ ํค) |
SUPABASE_SERVICE_SECRET_KEY |
Secret key ( |
Supabase์ ๋ก์ปฌ ์ฃผ์ ๋ฑ๋ก โ Supabase Dashboard โ Auth โ URL Configuration์์:
- Site URL:
http://localhost:3000- Redirect URLs:
http://localhost:3000ํ์ ์ ์ฒด ๊ฒฝ๋ก ์ถ๊ฐ (์ ๋ ฅ๊ฐ:http://localhost:3000/**)์ด ์ค์ ์ด ์์ผ๋ฉด ๋ก์ปฌ์์ ๋ก๊ทธ์ธ์ด ๋์ํ์ง ์์ต๋๋ค.
2. ์ฌ์ดํธ ์ฃผ์ โ ๋ก์ปฌ์์๋ ์๋ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ธ์.
| ๋ณ์ | ๊ฐ |
|---|---|
NEXT_PUBLIC_SITE_URL |
http://localhost:3000 |
3. ํธ์ ์๋ฆผ ํค โ ํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด 2๊ฐ์ ํค๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ๊ทธ๋๋ก ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ์ผ์ธ์.
npx web-push generate-vapid-keys| ๋ณ์ | ๊ฐ |
|---|---|
NEXT_PUBLIC_VAPID_PUBLIC_KEY |
์ถ๋ ฅ๋ Public Key |
VAPID_PRIVATE_KEY |
์ถ๋ ฅ๋ Private Key |
4. ํฌ๋ก ๋น๋ฐ๋ฒํธ โ ์๋ฌด ๋น๋ฐ๋ฒํธ๋ ์ง์ ๋ง๋ค์ด ๋ฃ์ผ์ธ์. ๋์ค์ ์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค. (์: my-secret-123)
| ๋ณ์ | ๊ฐ |
|---|---|
CRON_SECRET |
์์ ๋กญ๊ฒ ์ ํ ๋น๋ฐ ๋ฌธ์์ด |
์ฌ๊ธฐ๊น์ง ์ค์ ํ๋ฉด
npm run dev๋ก ๋ก์ปฌ์์ ์คํํ ์ ์์ต๋๋ค. ์ธํฐ๋ท์ ๋ฐฐํฌํ๋ ค๋ฉด ์๋ "Vercel ๋ฐฐํฌ" ์น์ ์ ๋ฐ๋ผ ํ์ธ์.
| ๋ณ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
NEXT_PUBLIC_APP_NAME |
DOOOZ |
์ฑ ํ์ ์ด๋ฆ |
NEXT_PUBLIC_APP_DESCRIPTION |
Family tasks, points... |
์ฑ ์ค๋ช |
NEXT_PUBLIC_THEME_COLOR |
#7c3aed |
์ฑ ํ ๋ง ์์ |
NEXT_PUBLIC_DEFAULT_LOCALE |
en |
๊ธฐ๋ณธ ์ธ์ด |
NEXT_PUBLIC_LOCALE_COOKIE |
doooz_locale |
์ธ์ด ์ค์ ์ฟ ํค ์ด๋ฆ |
NEXT_PUBLIC_SYNTHETIC_EMAIL_DOMAIN |
dooooz.invalid |
์์ด ๊ณ์ ์ฉ ๊ฐ์ง ์ด๋ฉ์ผ ๋๋ฉ์ธ (์ค์ ์ด๋ฉ์ผ ์ ์ก ์์). ์ฌ์ดํธ ๋๋ฉ์ธ๊ณผ ์ผ์น์ํฌ ํ์๋ ์์ง๋ง ์ผ๊ด์ฑ์ ์ํด ๊ถ์ฅ. |
VAPID_CONTACT_EMAIL |
mailto:noreply@dooooz.invalid |
ํธ์ ์๋น์ค ์ฐ๋ฝ์ฒ URI. ์์ ๋์ผ โ ๋๋ฉ์ธ ์ผ์น ๊ถ์ฅ์ด๋ ํ์ ์๋. |
NEXT_PUBLIC_FAMILY_STORAGE_KEY |
doooz_family_name |
๊ฐ์กฑ ์ด๋ฆ์ฉ localStorage ํค |
์ด ๋จ๊ณ๋ ์ฒ์ ํ ๋ฒ๋ง ์ค์ ํ๋ฉด ๋ค์ ํ ํ์๊ฐ ์์ต๋๋ค.
-
vercel.com์ ๋ฌด๋ฃ ๊ฐ์ ํ, ๋์๋ณด๋์์ Add New โ Project๋ก ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ ์ํ๋ ํ๋ก์ ํธ ์ด๋ฆ์ ์ง์ ํ๋ฉด
https://๋ดํ๋ก์ ํธ.vercel.app์ฃผ์๊ฐ ๋ฉ๋๋ค. -
Vercel CLI๋ฅผ ์ค์นํฉ๋๋ค:
npm i -g vercel
-
ํฐ๋ฏธ๋์์ doooz ์์ค๊ฐ ์๋ ํด๋๋ก ์ด๋ํฉ๋๋ค:
cd ~/Desktop/doooz(๋ค์ด๋ก๋ ๊ฒฝ๋ก์ ๋ง๊ฒ ์์ ) -
vercel link๋ฅผ ์คํํฉ๋๋ค. ๋ก๊ทธ์ธ ํ "Link to existing project?"์ Y๋ฅผ ์ ํํ๊ณ , ์์์ ๋ง๋ ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค. -
์์์ ๋ก์ปฌ์ ์ค์ ํ ํ๊ฒฝ ๋ณ์๋ฅผ Vercel์๋ ๋ฑ๋กํฉ๋๋ค. ์๋ ๋ช ๋ น์ ํ๋์ฉ ์คํํ์ธ์. ๋ช ๋ น์ ์น๋ฉด ๊ฐ์ ์ ๋ ฅํ๋ผ๋ ํ๋กฌํํธ๊ฐ ๋์ต๋๋ค. ๊ฐ์ ๋ถ์ฌ๋ฃ๊ณ Enter๋ฅผ ๋๋ฅด๋ฉด ๋ฉ๋๋ค.
vercel env add NEXT_PUBLIC_SITE_URL production # โ ๏ธ Vercel ๋ฐฐํฌ ์ฃผ์ ์ ๋ ฅ (์: https://๋ดํ๋ก์ ํธ.vercel.app) vercel env add NEXT_PUBLIC_SUPABASE_URL production vercel env add NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY production vercel env add SUPABASE_SERVICE_SECRET_KEY production vercel env add NEXT_PUBLIC_VAPID_PUBLIC_KEY production vercel env add VAPID_PRIVATE_KEY production vercel env add CRON_SECRET productionNEXT_PUBLIC_SITE_URL๋ง Vercel ๋ฐฐํฌ ์ฃผ์๋ก ๋ณ๊ฒฝํ๊ณ , ๋๋จธ์ง๋ ๋ก์ปฌ(.env.local)๊ณผ ๋์ผํ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. -
Supabase์ ๋ฐฐํฌ ์ฃผ์ ๋ฑ๋ก โ Supabase Dashboard โ Auth โ URL Configuration:
- Site URL: Vercel ๋ฐฐํฌ ์ฃผ์๋ก ๋ณ๊ฒฝ (์:
https://๋ดํ๋ก์ ํธ.vercel.app) - Redirect URLs: Vercel ๋ฐฐํฌ ์ฃผ์ ํ์ ์ ์ฒด ๊ฒฝ๋ก ์ถ๊ฐ (์
๋ ฅ๊ฐ:
https://๋ดํ๋ก์ ํธ.vercel.app/**) โ ๋ก์ปฌ ๋จ๊ณ์์ ๋ฑ๋กํlocalhost:3000์ ๊ทธ๋๋ก ์ ์ง
- Site URL: Vercel ๋ฐฐํฌ ์ฃผ์๋ก ๋ณ๊ฒฝ (์:
ํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ ์ ๋ ฅํ๊ณ ์ ์ ๊ธฐ๋ค๋ฆฌ๋ฉด DOOOZ ์์ค๊ฐ Vercel ์๋ฒ๋ก ๋ฐฐํฌ๋ฉ๋๋ค.
vercel --prod๋ฐฐํฌ๊ฐ ์๋ฃ๋๋ฉด ๋์ ์ฐ๋ฆฌ ๊ฐ์กฑ๋ค์ด ์ปดํจํฐ์์๋, ๋ชจ๋ฐ์ผ์์๋ https://๋ดํ๋ก์ ํธ.vercel.app ์ผ๋ก ์ง์ ์ ์ํ ์ ์์ต๋๋ค!
์ดํ ์์ค๋ฅผ ์์ ํ ๋๋ง๋ค ๋ค์ vercel --prod๋ก ๋ฐฐํฌํ๋ฉด ์ธํฐ๋ท์ ๋ฐฐํฌ๋ ์๋น์ค๊ฐ ์
๋ฐ์ดํธ๋ฉ๋๋ค.
์ด ๋ฌธ์๋ ๋ก์ปฌ ์ปดํจํฐ์ ์ธํฐ๋ท ๋ฐฐํฌ ๋ฒ์ ์ด ๊ฐ์ ํ๊ฒฝ์ ๋ฐ๋ผ๋ณด๊ณ ์์ต๋๋ค. ์ง์ ์์ค๋ฅผ ์์ , ๊ฐ๋ฐํ์ค ๋ถ๋ค์ ๋ณ๋์ dev ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
๋น์ทํ ์ฑ์ ์ง์ ๋ง๋ค์ด ๋ณด๊ณ ์ถ์ผ์ ๊ฐ์? AI ์ด์์คํดํธ(Claude, ChatGPT, Gemini ๋ฑ)์ ํ๋กฌํํธ๋ฅผ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋น์ทํ ์ฑ์ ์ฒ์๋ถํฐ ๋ง๋ค ์ ์๋ ๊ฐ์ด๋๋ฅผ ์ค๋นํ์ต๋๋ค.
AI ์ฝ๋ฉ ๋๊ตฌ(Claude Code ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Supabase MCP๋ฅผ ์ฐ๊ฒฐํ๋ฉด AI๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ด ํธ๋ฆฌํฉ๋๋ค. ํนํ "Supabase best practices๋ฅผ ์ฐธ๊ณ ํด์ ๋ง๋ค์ด์ค"๋ผ๊ณ ์ง์ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๋ชฐ๋ผ๋ Supabase ๊ธฐ๋ฐ ํ๊ฒฝ์ ์์ ์ ์ผ๋ก ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Vercel CLI๋ ์ "์ธํฐ๋ท ๋ฐฐํฌ ์ค์ ํ๊ธฐ" ๋จ๊ณ์์ ์ด๋ฏธ ์ค์น๋์ด ์์ต๋๋ค.
์ ์ฒด ํ๋กฌํํธ๋ฅผ AI ์ฑํ ์ ๋ณต์ฌํ๋ฉด ํ ๋ฒ์ ๋์ํ๋ ์ฑ์ด ์์ฑ๋ฉ๋๋ค.
์๋ด์ ๋ฐ๋ผ ํ๋กฌํํธ๋ฅผ ํ๋์ฉ ์ ๋ ฅํ๋ฉฐ ๋จ๊ณ์ ์ผ๋ก ์ฑ์ ๋ง๋ค์ด ๊ฐ๋๋ค.
์์ด์ ํจ๊ป ํ๋กฌํํธ๋ฅผ ๋ฐ๋ผ ํ๋ฉด์ "๋ด๊ฐ ๋ง๋ ์ฑ"์ ๊ฒฝํํด ๋ณด์ธ์.
| ๋ช ๋ น์ด | ์ฉ๋ |
|---|---|
npm run dev
8146
td>
| ๋ด ์ปดํจํฐ์์ ๊ฐ๋ฐ ์๋ฒ ์คํ (http://localhost:3000) |
npm run build |
๋ฐฐํฌ ์ ๋น๋ ์๋ฌ ํ์ธ |
npm run typecheck |
ํ์ ์ค๋ฅ ๊ฒ์ฌ |
npm run lint |
์ฝ๋ ์คํ์ผ ๊ฒ์ฌ |
vercel --prod |
์ธํฐ๋ท์ ๋ฐฐํฌ |
src/
โโ app/
โ โโ (auth)/ ๋ก๊ทธ์ธ, ํ์๊ฐ์
, ์จ๋ณด๋ฉ
โ โโ (app)/ ๋ณดํธ๋ ๋ผ์ฐํธ โ ํ, ํ ์ผ, ํฌ์ธํธ, ๋ณด์, ์บ๋ฆญํฐ, ๊ฐ์กฑ, ์ค์
โ โโ api/ ๋ผ์ฐํธ ํธ๋ค๋ฌ + ํฌ๋ก (์ ๋
์๋ฆผ, ์์ ๋กค์ค๋ฒ)
โโ features/
โ โโ auth/ requireUser, getCurrentAuth
โ โโ tasks/ ์๋ฒ ์ก์
(์์ , ๋ด์ฃผ๊ธฐ)
โ โโ children/ ์์ ๊ณ์ฐ
โ โโ characters/ ์ด๋ชจ์ง ๋งต
โโ lib/
โ โโ supabase/ client, server, admin ํด๋ผ์ด์ธํธ + ํ์
Database
โ โโ datetime/ ๊ฐ์กฑ ์๊ฐ๋ ์ ํธ๋ฆฌํฐ + ์ฃผ์
๊ฐ๋ฅํ clock
โ โโ i18n/ ko.json, ja.json, en.json + ๋ฒ์ญ ํฌํผ
โ โโ push/ ์น ํธ์ ์๋ฆผ ์ ์ก
โ โโ level.ts L1-L30 ์๊ณ๊ฐ ๊ณ์ฐ
โ โโ streak.ts ์ฐ์ ์ผ์ ๊ณ์ฐ
โ โโ invariants.ts I1-I10 ์์ฅ ๊ฒ์ฆ ํฌํผ
โโ schemas/ Zod ์คํค๋ง (๊ฐ์กฑ, ์ฌ์ฉ์, ํ ์ผ, ํฌ์ธํธ, ๋ณด์, ๋ฑ์ง)
โโ components/ui/ shadcn ์คํ์ผ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ
supabase/
โโ migrations/ ์คํค๋ง, RLS, ํธ๋ฆฌ๊ฑฐ, ์ธ๋ฑ์ค
โโ seed.sql ์บ๋ฆญํฐ 12๊ฐ + ๋ฑ์ง 58๊ฐ
tests/
โโ unit/ ์์ค ํ์ผ๊ณผ ํจ๊ป ์์น
โโ integration/ RLS ๋งคํธ๋ฆญ์ค
โโ e2e/ Playwright ์๋๋ฆฌ์ค
DOOOZ๋ ์ด๋ฏธ์ง/ํ์ผ ์
๋ก๋ ์์ด ํ
์คํธ ๋ฐ์ดํฐ๋ง ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ๋งค์ฐ ์ ์ต๋๋ค. 1๊ฐ์กฑ = ๋ถ๋ชจ 1๋ช
+ ์์ด 23๋ช
, ํ๋ฃจ ํ ์ผ ์ฒดํฌ 1015๊ฑด ๊ธฐ์ค:
| ๊ตฌ๊ฐ | ์ ๋น์ฉ | ์ต๋ ๊ฐ์กฑ ์ (์์) | ๊ตฌ์ฑ |
|---|---|---|---|
| ๋ฌด๋ฃ | $0 |
~200๊ฐ์กฑ | Supabase Free + Vercel Free |
| ์ค๊ท๋ชจ | ~$27 |
~5,000๊ฐ์กฑ | Supabase Pro ($25) + DB ($2) + Vercel Free |
| ๋๊ท๋ชจ | ~$50 |
~15,000๊ฐ์กฑ | Supabase Pro ($25) + DB ($5) + Vercel Pro ($20) |
- 1๊ฐ์กฑ ์ ์ฉ์ด๋ฉด ๋ฌด๋ฃ ํ๋์ 1~2%๋ง ์ฌ์ฉํฉ๋๋ค.
- ~200๊ฐ์กฑ ์ด๊ณผ โ DB ์ฉ๋๊ณผ Supabase ๋์์ ์ ์ ํ์ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. Supabase Pro๋ก ์ ๊ทธ๋ ์ด๋ํ๊ณ ์ถ๊ฐ DB๋ฅผ ๊ตฌ๋งคํ์ธ์.
- ~5,000๊ฐ์กฑ ์ด๊ณผ โ Vercel์์ ๋งค์ผ ์๋ฒฝ 1์์ ์คํ๋๋ ํ ์ผ ์ ๋ฆฌ ์์ (ํฌ๋ก )์ ๋ณ๋ชฉ์ด ์๊ธธ ์ ์์ต๋๋ค. Vercel Pro๋ก ์ ๊ทธ๋ ์ด๋ํ์ธ์. Vercel Pro๋ ํฌ๋ก ์์ ์ ํ์ด ์์ด ๋ ๋ง์ ์๊ฐ๋๋ ๊ธ๋ก๋ฒ ๋์๊น์ง ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
- Supabase Dashboard โ Settings โ Billing: ๋์ญํญ, DB ์ฉ๋ ํ์ธ
- Vercel Dashboard โ Usage: ๋์ญํญ, ํจ์ ์คํ ์๊ฐ ํ์ธ
DOOOZ๋ ๋๊ตฌ๋ ์ฐธ์ฌํ ์ ์๋ ์คํ์์ค ํ๋ก์ ํธ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ค์ ๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค!
- ๐จ ๋์์ด๋ โ UI/UX ๊ฐ์ ์ ๋์์ ์ฃผ์ค ๋์์ด๋๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค.
- ๐ ๋ค๊ตญ์ด & ๊ธ๋ก๋ฒ ํ๊ฒฝ โ ์๋ก์ด ์ธ์ด ์ถ๊ฐ, ๋ค์ํ ๊ตญ๊ฐ ํ๊ฒฝ์ ๋ง๋ ๊ฐ์ ์ ํ์ํฉ๋๋ค.
- ๐จโ๐ฉโ๐งโ๐ฆ ํ ์คํธ ๊ฐ์กฑ โ ์ฑ์ ๋งค์ผ ์ฌ์ฉํ๋ฉฐ ์ ๊ทน์ ์ผ๋ก ํ ์คํธํด์ฃผ์ค ๊ฐ์กฑ์ ํ์ํฉ๋๋ค. ์ด๋ฏธ ๊ตฌ์ถ๋ ์๋น์ค๋ฅผ ์ ๊ณตํด๋๋ฆด ์ ์์ต๋๋ค.
Issue๋ Pull Request๋ก ์์ ๋กญ๊ฒ ์ฐธ์ฌํด์ฃผ์ธ์!