# ๐ VibePlan AI ์ค๊ณ ๋ช ์ธ์ – ๊ทธ๋ผ๋นํฐ ์บ์ (Gravity Cash)
**์๋น์ค ์์ฝ**: ํ๋ฉด์ ์ค๋ ฅ์ ๊ฑฐ์ฌ๋ฌ ๋ ๋ค๋๋ ๋์ ๊ณผ ๋ณด์์ ํฐ์นํ์ฌ ํ๋ํ๋ ํผ์ง์ปฌ ๊ธฐ๋ฐ์ ์ฑํ ํฌ ์๋น์ค์ ๋๋ค. ๊ธฐ๋ฐํ ๋ฌผ๋ฆฌ ํจ๊ณผ๋ฅผ ์ฆ๊ธฐ๋ฉฐ ๊ด๊ณ ๋ฅผ ์์ฒญํ๊ณ , ๊ฐ๋ณ๊ฒ ์ฉ๋์ ๋ฒ ์ ์๋ ๊ทน๊ฐ์ ๋ชฐ์ ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
**ํ๋ซํผ**: ์น ์ ํ๋ฆฌ์ผ์ด์
**ํ๊ฒ ํ๊ฒ**: ์ผ๋ฐ ์ฌ์ฉ์
*๋ณธ ๋ฌธ์๋ VibePlan AI์ ์ํด ์์ฑ๋ ๋งํฌ๋ค์ด ์ค๊ณ์ ์ธํธ์ ๋๋ค.*
—
# ๐ 1์ฅ. Vibe Check (์๋น์ค ๊ธฐํ์)
## 1. ์๋น์ค ์ ์ ๋ฐ ๋ชฉ์
**๊ทธ๋ผ๋นํฐ ์บ์ (Gravity Cash)**๋ ๊ธฐ์กด์ ์ง๋ฃจํ๊ณ ๋จ์ํ ํด๋ฆญํ ์ฑํ ํฌ(AppTech)์์ ๋ฒ์ด๋, ์น ๋ธ๋ผ์ฐ์ ์์์ ๋ฌผ๋ฆฌ ์์ง(Physics Engine) ๊ธฐ๋ฐ์ผ๋ก ์์ ๋กญ๊ฒ ํ๋ฉด์ ๋ ๋ค๋๋ ๋์ ๊ณผ ๋ณด์์ ํฐ์นํ์ฌ ํ๋ํ๋ **ํผ์ง์ปฌ ๊ธฐ๋ฐ ๊ฒ์ด๋ฐ ์ฑํ ํฌ ์๋น์ค**์ ๋๋ค.
– **๋ชฉ์ **: ๊ธฐ๋ฐํ ๋ฌผ๋ฆฌ ํจ๊ณผ๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ์ฆ๊ฐ์ ์ธ ์๊ฐ์ ์ฌ๋ฏธ์ ํ๊ฒฉ๊ฐ(์๋ง)์ ์ ๊ณตํ๊ณ , ์ด๋ฅผ ์์ฐ์ค๋ฌ์ด ๊ด๊ณ ์์ฒญ๊ณผ ๋ฆฌ์๋ ํ๋์ผ๋ก ์ฐ๊ฒฐํ์ฌ ๋ฆฌํ ์ ์ ๊ทน๋ํํฉ๋๋ค.
## 2. ํต์ฌ ํ๊ฒ ์ค๋์ธ์ค
– **์ฃผ ํ๊ฒ**: ๋ชจ๋ฐ์ผ/์น ํ๊ฒฝ์์ ๊ฐ๋ณ๊ฒ ์ค๋ต ๊ฒ์์ ์ฆ๊ธฐ๋ฉฐ ์์ํ๊ฒ ์ฑํ ํฌ๋ฅผ ํ๊ณ ์ ํ๋ MZ์ธ๋ ๋ฐ ์ง์ฅ์ธ.
– **์๋ธ ํ๊ฒ**: ์ง๊ด์ ์ธ ์กฐ์๊ณผ ํ๋ คํ ํผ๋๋ฐฑ์ ์ ํธํ๋ฉฐ ๋ฐฉ์นํ/ํฐ์นํ ๊ฒ์์ ์ข์ํ๋ ์ผ๋ฐ ์ฌ์ฉ์.
## 3. ์๋น์ค ํต์ฌ ๊ฐ์น ๋ฐ ์ฐจ๋ณ์
– **๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ๊ธฐ๋ฐ ์๋ง**: ์ ํํ๋ ๋ฆฌ์คํธ UI ๋์ HTML5 Canvas์ ๋ฌผ๋ฆฌ ์์ง(Matter.js)์ ํ์ฉํ์ฌ ์ค๋ ฅ, ๋ฐ๋ฐ๋ ฅ, ๋ง์ฐฐ๋ ฅ์ด ์ ์ฉ๋ ๊ฐ์ ๋์ ๋ค์ ํฐ์นํ๋ ์ญ๋์ ์ธ UX๋ฅผ ์ ๊ณตํฉ๋๋ค.
– **๋ชฐ์ ํ ๋ฆฌ์๋ ๋ฃจํ**: ํ๋ฉด์ ๋ ๋ค๋๋ ์คํ์ ‘ํฉ๊ธ ๋์ ’์ด๋ ‘๋ณด๋ฌผ์์’๋ฅผ ํฐ์นํ๋ฉด ๋ฆฌ์๋ ๊ด๊ณ ํ ๋ชจ๋ฌ์ด ํ์ฑํ๋๊ณ , ๊ด๊ณ ์์ฒญ ์๋ฃ ์ ์ฆ์ ๋๋์ ์บ์๋ฅผ ์ ๋ฆฝํฉ๋๋ค.
– **ํฌ๋ช ํ ์ ์ฐ**: ์์ธ ์บ์๋ฅผ ๊ธฐํํฐ์ฝ ๊ตํ ๋ฐ ์ฆ์ ์ถ๊ธ ์ ์ฒญ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ง๊ด์ ์ด๊ณ ๋น ๋ฅธ ์ ์ฐ ํ๋ฆ์ ๋ณด์ฅํฉ๋๋ค.
—
# โ๏ธ 2์ฅ. Blueprint (๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ์์คํ ์ค๊ณ)
## 1. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์คํค๋ง ์ ์
### `users` (์ฌ์ฉ์ ํ ์ด๋ธ)
| ์ปฌ๋ผ๋ช | ํ์ | ์ ์ฝ์กฐ๊ฑด | ์ค๋ช |
| :— | :— | :— | :— |
| `id` | UUID | PRIMARY KEY, DEFAULT gen_random_uuid() | ๊ณ ์ ์ฌ์ฉ์ ID |
| `email` | VARCHAR(255) | UNIQUE, NOT NULL | ์ด๋ฉ์ผ ์ฃผ์ |
| `nickname` | VARCHAR(50) | NOT NULL | ์ฌ์ฉ์ ๋๋ค์ |
| `points` | INT | DEFAULT 0, CHECK (points >= 0) | ํ์ฌ ๋ณด์ ์ค์ธ ์บ์ ํฌ์ธํธ |
| `created_at` | TIMESTAMP | DEFAULT NOW() | ํ์ ๊ฐ์ ์ผ |
### `point_transactions` (ํฌ์ธํธ ์ ๋ฆฝ/์ฐจ๊ฐ ์ด๋ ฅ)
| ์ปฌ๋ผ๋ช | ํ์ | ์ ์ฝ์กฐ๊ฑด | ์ค๋ช |
| :— | :— | :— | :— |
| `id` | UUID | PRIMARY KEY, DEFAULT gen_random_uuid() | ํธ๋์ญ์ ๊ณ ์ ID |
| `user_id` | UUID | FOREIGN KEY REFERENCES users(id) ON DELETE CASCADE | ์ ๋ฆฝ/์ฐจ๊ฐ ๋์ ์ ์ ID |
| `amount` | INT | NOT NULL | ๋ณ๋ ํฌ์ธํธ์ก (์์: ์ ๋ฆฝ, ์์: ์ฐจ๊ฐ) |
| `type` | VARCHAR(50) | NOT NULL | ๊ตฌ๋ถ (`TAP` / `AD_REWARD` / `WITHDRAWAL` / `EVENT`) |
| `description` | TEXT | | ์์ธ ์ค๋ช |
| `created_at` | TIMESTAMP | DEFAULT NOW() | ์์ฑ ์๊ฐ |
### `withdrawals` (์ถ๊ธ ์ ์ฒญ ํ ์ด๋ธ)
| ์ปฌ๋ผ๋ช | ํ์ | ์ ์ฝ์กฐ๊ฑด | ์ค๋ช |
| :— | :— | :— | :— |
| `id` | UUID | PRIMARY KEY, DEFAULT gen_random_uuid() | ์ถ๊ธ ์ ์ฒญ ๊ณ ์ ID |
| `user_id` | UUID | FOREIGN KEY REFERENCES users(id) ON DELETE CASCADE | ์ถ๊ธ ์ ์ฒญ ์ ์ ID |
| `amount` | INT | NOT NULL | ์ถ๊ธ ์ ์ฒญ ํฌ์ธํธ์ก |
| `bank_name` | VARCHAR(50) | NOT NULL | ์ํ๋ช |
| `account_number` | VARCHAR(100) | NOT NULL | ๊ณ์ข๋ฒํธ |
| `status` | VARCHAR(20) | DEFAULT ‘PENDING’ | ์ํ (`PENDING`, `APPROVED`, `REJECTED`) |
| `created_at` | TIMESTAMP | DEFAULT NOW() | ์ ์ฒญ์ผ์ |
## 2. ์์คํ ์ํคํ ์ฒ ๋ฐ ๋ฐ์ดํฐ ํ๋ฆ
– **Frontend**: Next.js (App Router), Tailwind CSS, Framer Motion
– **Physics Engine**: Matter.js (React integration via canvas ref)
– **Backend & Database**: Supabase (PostgreSQL, Auth, Realtime)
– **Data Flow**:
ย 1. **๋์ ์์ฑ ๋ฐ ํฐ์น**: ์ฌ์ฉ์๊ฐ Gravity Canvas ์์์ ํ๊ฒจ ๋ค๋๋ ๋์ ์ ํฐ์นํ๋ฉด ํ๋ก ํธ์๋๊ฐ ์ฆ๊ฐ ๋ฐ์ํ์ฌ ์ ์๋ฅผ ์นด์ดํธํฉ๋๋ค.
ย 2. **์บ์ ์ ๋ฆฝ ์ฒ๋ฆฌ**: API Route๋ฅผ ํตํด Supabase DB์ `point_transactions`์ ์์ฅ ๊ธฐ์ ์ ์ํํ๊ณ , `users` ํ ์ด๋ธ์ `points` ๊ฐ์ ์์์ (Atomic) ์ฐ์ฐ์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ ๋ถ์ ํ์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
ย 3. **๊ด๊ณ ์ฐ๋**: ํน์ ์ ์ด์ ํฐ์นํ๊ฑฐ๋ ๊ณจ๋ ๋ฐ์ค ํด๋ฆญ ์ ๋น๋์ค ๊ด๊ณ API๊ฐ ๋ก๋ฉ๋๊ณ , ์๋ฃ ์ฝ๋ฐฑ์ ๋ฐ์ DB ํธ๋์ญ์ ์ ํตํด ๋ฆฌ์๋๊ฐ ์์ ํ๊ฒ ์ ๋ฆฝ๋ฉ๋๋ค.
—
# ๐บ๏ธ 3์ฅ. User Flow (ํ๋ฉด ์ค๊ณ)
## 1. ์ฃผ์ ํ์ด์ง ๋ชฉ๋ก
– **`/` (์จ๋ณด๋ฉ ๋ฐ ๋ก๊ทธ์ธ ํ์ด์ง)**: ๊ทธ๋ผ๋นํฐ ์บ์ ์๊ฐ ๋ฐ ๊ฐํธ ์์ ๋ก๊ทธ์ธ ํ๋ฉด.
– **`/dashboard` (๋ฉ์ธ ๊ทธ๋ผ๋นํฐ ํ๋ฉด)**: ์ค๋ ฅ ์์ง์ด ์ ์ฉ๋ ๋ฉ์ธ ์บ๋ฒ์ค ์์ญ. ์ข์ฐ๋ก ํ๋ค๊ฑฐ๋ ๋ชจ๋ฐ์ผ์ ๊ธฐ์ธ์ด๋ฉด ๋์ ๋ค์ด ์๋์น๋ฉฐ ๋จ์ด์ง. ์๋จ์ ์บ์ ๋ณด๋ ์ค์๊ฐ ํ์.
– **`/store` (์บ์ ์์ ๋ฐ ์ถ๊ธ)**: ์์ ํฌ์ธํธ๋ก ๊ธฐํํฐ์ฝ์ ๊ตฌ๋งคํ๊ฑฐ๋, ํ๊ธ ์ถ๊ธ์ ์ ์ฒญํ๋ ํผ ์ ๊ณต.
– **`/history` (์ ๋ฆฝ ์ด๋ ฅ ๋ฐ ๋ด์ญ)**: ์ถ๊ธ ์งํ ์ํฉ ๋ฐ ํฌ์ธํธ ์ ๋ฆฝ ๋ก๊ทธ๋ฅผ ํ์๋ผ์ธ ํํ๋ก ์ ๊ณต.
## 2. ๊ฐ ํ๋ฉด๋ณ ๊ตฌ์ฑ ์ปดํฌ๋ํธ
– **Dashboard ํ๋ฉด**:
ย – `GravityCanvas`: Matter.js๋ฅผ ํ์ฌํ์ฌ ์ค๋ ฅ ํ์ ๋์ ๊ฐ์ฒด๋ค์ด ์ถฉ๋ํ๊ณ ๋ฆฌ๋ฐ์ด๋ํ๋ ํ์คํฌ๋ฆฐ ์บ๋ฒ์ค ์ปดํฌ๋ํธ.
ย – `CashIndicator`: ํ์ฌ ํ๋ํ ์บ์์ ํฐ์น ํ์๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ ธ์ถํ๋ ์๋จ ๊ณ ์ ํค๋.
ย – `AdTriggerModal`: ๋ฆฌ์๋ ๊ด๊ณ ๋ณด๊ธฐ๋ฅผ ์ ๋ํ๊ณ ๊ด๊ณ ๊ฐ ์ฐ๋๋๋ ๋ฐ์ํ ์ค๋ฒ๋ ์ด.
– **Store ํ๋ฉด**:
ย – `WithdrawalForm`: ์ํ, ๊ณ์ข, ์ถ๊ธ์ก์ ์์ ํ๊ฒ ์ ๋ ฅ๋ฐ๊ณ ์ค์๊ฐ ์์ก ๋์กฐ ๊ฒ์ฆ์ ์ํํ๋ ์ ๋ ฅ ํผ.
## 3. ํต์ฌ ์ฌ์ฉ์ ์ด๋ ๊ฒฝ๋ก
1. **๋ก๊ทธ์ธ**: ์์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ํ ๋์๋ณด๋๋ก ์ง์ .
2. **๋ฌผ๋ฆฌ ํ๋ฐ ํ๋ ์ด**: ํ๋ฉด ๋ด ๊ฐ์์ ์ค๋ ฅ ํ์ ๋ํํ๋ ๋์ ์ ๋์ฌํ๋ฏ ํฐ์น. ๋์ ์ด ํ๊ธธ ๋ ๋ง๋ค ์ฌ์ด๋ ๋ฐ ํํฐํด ์ดํํธ ๋ฐ์. `+1 Cash` ๋์ .
3. **ํฌ๋ฆฌํฐ์ปฌ ๋ฆฌ์๋ ๋ฐ๋**: ๋๋คํ๊ฒ ๋ํ๋๋ ํฉ๊ธ ๋ณด๋ฌผ์์๋ฅผ ์ก์ผ๋ฉด ๋ฆฌ์๋ ๋น๋์ค ๊ด๊ณ ๊ฐ ํ์ ํํ๋ก ์ฌ์.
4. **์บ์ ํ๋ ๋ฐ ์ถ๊ธ**: ์ผ์ ๊ธ์ก ์ด์ ๋๋ฌ ์ ์์ ์ผ๋ก ์ด๋ํ์ฌ ํ๊ธ ์ถ๊ธ์ ์ ์ฒญ.
—
# ๐ค AI ๊ฐ๋ฐ ์ง์์ ํ๋กฌํํธ ๊ฐ์ด๋
## 1๋จ๊ณ: ํ๋ก์ ํธ ๊ธฐ์ด ๋ผ๋ ๊ตฌ์ถ ๋ฐ ๋ ์ด์์ ์ค์
“`text
Next.js (App Router), Tailwind CSS, Lucide React๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ‘๊ทธ๋ผ๋นํฐ ์บ์(Gravity Cash)’ ์น ์ฑ์ ๋ผ๋๋ฅผ ์ค์ ํด์ฃผ์ธ์.
1. `package.json`์ ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋๋ก ๊ฐ์ด๋ ๋๋ ๋ผ๋๋ฅผ ์์ฑํ์ธ์.
ย ย – `matter-js` (๋ฌผ๋ฆฌ ์์ง)
ย ย – `framer-motion` (UI ์ ๋๋ฉ์ด์ )
ย ย – `lucide-react` (์์ด์ฝ)
2. ๊ณตํต ๋ ์ด์์์ ์ ์ํด ์ฃผ์ธ์.
ย ย – ์๋จ ํค๋: ์๋น์ค ๋ก๊ณ ‘Gravity Cash’, ํ์ฌ ๋ณด์ ํฌ์ธํธ ํ์๋ถ, ๋ฉ๋ด ๋งํฌ(ํ, ์์ , ์ ๋ฆฝ์ด๋ ฅ)
ย ย – ๋ชจ๋ฐ์ผ ํผ์คํธ ๋ฐ์ํ ์ปจํ ์ด๋ ๋ ์ด์์ (์ต๋ ๋๋น 480px์ ์ฑ ๋๋์ ํ๋ฉด ๊ตฌ์ฑ ์ถ์ฒ)
3. ๊ธฐ๋ณธ ๋๋ฉ ๋ฐ ๋ก๊ทธ์ธ ํ์ด์ง(`/app/page.tsx`)์ ๋์๋ณด๋ ๊ตฌ์กฐ(`/app/dashboard/page.tsx`)์ ๊ฐ๋จํ ๋ชฉ์ ๋ผ์ฐํ ์ ๊ตฌํํด์ฃผ์ธ์.
“`
## 2๋จ๊ณ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ ์ ์ ๋ฐ ์ฐ๋
“`text
Supabase ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ๋ฐ SQL ์ค์ ์ ์์ฑํด์ฃผ์ธ์.
1. ๋ค์ ํ ์ด๋ธ์ ์์ฑํ๋ PostgreSQL DDL ์ฟผ๋ฆฌ๋ฅผ ์ ๊ณตํ์ธ์:
ย ย – `users` (id: uuid, email: text, nickname: text, points: int, created_at)
ย ย – `point_transactions` (id: uuid, user_id, amount: int, type: text, description: text, created_at)
ย ย – `withdrawals` (id: uuid, user_id, amount, bank_name, account_number, status, created_at)
2. `supabase/client.ts`๋ฅผ ์ ์ํ์ฌ ํ๋ก ํธ์๋์ Supabase ๊ฐ ์ฐ๋ ์ค์ ์ ๋ง๋์ธ์.
3. ํฌ์ธํธ๋ฅผ ์์์ ์ผ๋ก ์ฆ๊ฐ์ํค๊ธฐ ์ํ Postgres ํจ์(RPC) `increment_points`๋ฅผ ์ ์ํ๋ SQL์ ์์ฑํด์ฃผ์ธ์:
ย ย – ์ ๋ ฅ: `target_user_id` (UUID), `amount` (INT)
ย ย – ๋ก์ง: `users` ํ ์ด๋ธ์ `points`๋ฅผ ์ฆ๊ฐ์ํค๊ณ , ๋์์ `point_transactions` ํ ์ด๋ธ์ ์ ๋ฆฝ ๋ก๊ทธ๋ฅผ ์์ฅ์ผ๋ก ํ ๋ฒ์ ์ฝ์ ํ๋ ํธ๋์ญ์ ์ ์.
“`
## 3๋จ๊ณ: ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง ๋ฐ API ๊ตฌํ
“`text
Next.js App Router API Route ๋ฐ API ์ฐ๋ ๋ก์ง์ ์์ฑํด์ฃผ์ธ์.
1. `/api/points/route.ts` API ์๋ํฌ์ธํธ ๊ตฌํ:
ย ย – ์ฌ์ฉ์๊ฐ ์ผ๋ฐ ๋์ ํน์ ํฉ๊ธ ์์๋ฅผ ํฐ์นํด ํ๋ํ ํฌ์ธํธ๋ฅผ ์๋ฒ์ ๋๊ธฐํ ์์ฒญํ๋ API.
ย ย – ์์ฒญ ๋ณธ๋ฌธ(body): `{ amount: number, type: string, description: string }`
ย ย – ๋ณด์ ์ฒ๋ฆฌ: Supabase Auth ์ธ์ ๊ฒ์ฆ์ ํต๊ณผํด์ผ ํ๋ฉฐ, 1์ด ๋ด์ ๋น์ ์์ ์ผ๋ก ๋ค๋์ ์์ฒญ์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ง๋ ๊ธฐ์ด์ ์ธ ์ํฐ ์นํธ(Anti-Cheat) ์๊ฐ ๊ธฐ๋ฐ ์ธ์ ์ฒดํฌ๋ฅผ ๋ฐ์ํด ์ฃผ์ธ์.
2. `/api/withdraw/route.ts` API ์๋ํฌ์ธํธ ๊ตฌํ:
ย ย – ์ถ๊ธ ์ ์ฒญ API.
ย ย – ์ ์ ์ ํ์ฌ ํฌ์ธํธ๋ฅผ ๊ฒ์ฆํ์ฌ ์ถ๊ธ ์์ฒญ์ก(`amount`)์ด ํฌ์ธํธ ์์ก๋ณด๋ค ํฐ์ง ํ์ธํ๊ณ , ํต๊ณผํ๋ฉด `points` ์ฐจ๊ฐ ๋ฐ `withdrawals`์ ํ์ ์ฝ์ ํ๋ ํธ๋์ญ์ API๋ฅผ ์์ฑํ์ธ์.
“`
## 4๋จ๊ณ: UI ์์ฑ ๋ฐ ํ๋ก ํธ์๋ ์ฐ๋
“`text
Matter.js ๋ฌผ๋ฆฌ ์์ง์ ํ์ฉํ ํผ์ง์ปฌ ๊ฒ์ ํ๋ฉด๊ณผ ์ต์ข UI ์ฐ๋์ ์์ฑํด์ฃผ์ธ์.
1. `/app/dashboard/components/GravityCanvas.tsx` ์ปดํฌ๋ํธ๋ฅผ ์ค๊ณํ์ธ์:
ย ย – HTML5 `
ย ย – ๋ชจ๋ฐ์ผ/๋ฐ์คํฌํฑ ํฐ์น/ํด๋ฆญ ๊ฐ์ง: ์ฌ์ฉ์๊ฐ ์บ๋ฒ์ค์ ํน์ ์์น๋ฅผ ํฐ์น/ํด๋ฆญํ๋ฉด Matter.js ์๋ ์์ ๋ฌผ๋ฆฌ ์์ฑ(์, ๋ณต์๋ ฅ, ํ์ฑ)์ ๊ฐ์ง ์ํ ‘๋์ (Coin)’๊ณผ ‘๊ธ ์์(Chest)’๊ฐ ํ๋์์ ๋จ์ด์ง๊ณ ๋ฐ๋ฅ์์ ํ๊ธฐ๊ฒ ์ฒ๋ฆฌํ์ธ์.
ย ย – ์บ๋ฒ์ค ๋ด ์์ฑ๋ ๋์ ์ ํด๋ฆญํ๋ฉด ํฐ์นํ ๊ฐ์ฒด๊ฐ ํ๊ดด(World์์ ์ ๊ฑฐ)๋๋ฉด์ ํญ์ฃฝ ํํฐํด ํจ๊ณผ๊ฐ ํผ์ง๊ณ , ํด๋ผ์ด์ธํธ ์ธก ํฌ์ธํธ ์ํ๊ฐ ์ฌ๋ผ๊ฐ๋๋ก ํ์ธ์.
ย ย – ๋๋ฐ์ด์ค ์์ด๋ก์ค์ฝํ ๋๋ ๋๋๊ทธ๋ฅผ ๊ฐ์งํ์ฌ ์ค๋ ฅ ๋ฐฉํฅ์ ์ค์๊ฐ์ผ๋ก ๋ฐ๊พธ์ด ๋์ ๋ค์ด ๋ฏธ๋๋ฌ์ ธ ํ๊ธฐ๊ฒ ๊ตฌํํ์ธ์ (์์ด๋ก ์๋ ํ๊ฒฝ์ ์ํด ๋๋๊ทธ ์ฌ๋ผ์ด๋๋ ํด๋ฆญ์ผ๋ก ์ค๋ ฅ ๋ฐ์ ๋ณด์).
2. ์์ (`/app/store/page.tsx`) ํ๋ฉด์์ ์ถ๊ธ ํผ์ ์๋ ๊ฐ๋ฅํ๋๋ก 3๋จ๊ณ์ `/api/withdraw`์ ์ฐ๊ฒฐํ๊ณ ์ํ ๋ฉ์์ง๋ฅผ ๊น๋ํ๊ฒ ํํํ๋ ํ ์คํธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ์ธ์.
“`