๐ธ ์ธ๋ ๋ฐด๋ ๊ณต์ ๊ตฟ์ฆ์ต - ํ์ ํ ๋จธ์น ํ๋งค ํ์ด์ง
indie-band-merch-shop
๋ฌธ์ ์ค๋ช
๐ธ ์ธ๋ ๋ฐด๋ ๊ณต์ ๊ตฟ์ฆ์ต
์ธ๋ ๋ฐด๋๋ ๋ฎค์ง์ ์ด ์์ ์ ๊ณต์ ๊ตฟ์ฆ(ํฐ์ ์ธ , ํ๋, ํฌ์คํฐ, ์คํฐ์ปค ๋ฑ)๋ฅผ ํ๋งคํ ์ ์๋ ๊ฐ๋จํ ์ผํ๋ชฐ ํ์ด์ง๋ฅผ ๋ง๋ญ๋๋ค. Laravel 13.x + Blade ํ ํ๋ฆฟ + Tailwind CSS๋ก ๊ตฌํํ๋ฉฐ, ๊ด๋ฆฌ์ ๊ธฐ๋ฅ ์์ด ํฌ๋ค์ด ์ง์ ์ํ์ ๋๋ฌ๋ณด๊ณ ๊ตฌ๋งค ์ ์ฒญ์ ํ ์ ์๋ ๊ณ ๊ฐ ์ค์ฌ ํ์ด์ง์ ์ง์คํฉ๋๋ค.
ํ์ ๊ธฐ๋ฅ
- ๐๏ธ ๊ตฟ์ฆ ์นดํ๋ก๊ทธ ํ์ด์ง: ์ํ ๋ชฉ๋ก์ ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ผ๋ก ํ์ (์ด๋ฏธ์ง, ์ด๋ฆ, ๊ฐ๊ฒฉ, ์ฌ๊ณ ์ํ)
- ๐ ์ํ ์์ธ ํ์ด์ง: ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ, ์ค๋ช , ์ฌ์ด์ฆ/์์ ์ ํ, ์๋ ์ ํ
- ๐ ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ: ์ ํํ ์ํ์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ณ , ์๋ ์กฐ์ ๋ฐ ์ญ์ ๊ฐ๋ฅ (์ธ์ ๊ธฐ๋ฐ, DB ๋ถํ์)
- ๐ ์ฃผ๋ฌธ์ ์์ฑ ํผ: ์ด๋ฆ, ์ฐ๋ฝ์ฒ, ๋ฐฐ์ก์ง ์ ๋ ฅ ํ ์ฃผ๋ฌธ ์๋ฃ (DB์ ์ ์ฅ)
- โ ์ฃผ๋ฌธ ์๋ฃ ํ์ด์ง: ์ฃผ๋ฌธ ๋ฒํธ ํ์ ๋ฐ ๊ฐ์ฌ ๋ฉ์์ง
- ๐ท๏ธ ์ฌ๊ณ ํ์: "ํ์ ", "ํ์ ์๋", "๊ณง ์ถ์" ๋ฑ ๋ฐฐ์ง๋ก ์ํ ํ์
- ๐ฑ ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ ๋ชจ๋ ์ง์
์ ํ ์ถ๊ฐ ๊ธฐ๋ฅ (๋ณด๋์ค)
- ๐จ ๋คํฌ ๋ชจ๋ ํ ๋ง ํ ๊ธ: Tailwind CSS์ dark ๋ชจ๋ ํ์ฉ
- ๐ฅ ์ธ๊ธฐ ์ํ ์น์ : ๋ฉ์ธ ํ์ด์ง์ ๋ฒ ์คํธ์ ๋ฌ ๋๋ ์ ์ํ ๊ฐ์กฐ
- ๐ฌ ์ํ ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ: ๊ตฌ๋งค์๊ฐ ๊ฐ๋จํ ๋ณ์ ๊ณผ ํ๊ธฐ๋ฅผ ๋จ๊ธธ ์ ์๋ ์น์ (์ ํ ์ฌํญ)
- ๐ ์ฟ ํฐ ์ฝ๋ ์ ๋ ฅ: ํ ์ธ ์ฝ๋ ์ ๋ ฅ ์ ๊ฐ๊ฒฉ ์๋ ๊ณ์ฐ (ํ๋์ฝ๋ฉ๋ ์ฟ ํฐ 1~2๊ฐ)
๊ธฐ์ ์คํ
- ๋ฐฑ์๋: Laravel 13.x + Blade ํ ํ๋ฆฟ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: SQLite (๊ฐ๋จํ ์ํ/์ฃผ๋ฌธ ํ ์ด๋ธ)
- ํ๋ก ํธ์๋: Tailwind CSS (CDN ๋๋ Vite ๋น๋)
- ์ธ์ ๊ด๋ฆฌ: Laravel ๊ธฐ๋ณธ ์ธ์ (์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ ์ ์ฅ)
ํ์ต ๋ชฉํ
- Laravel ๋ผ์ฐํ ๋ฐ ์ปจํธ๋กค๋ฌ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํด
- Blade ํ ํ๋ฆฟ ์์ง ํ์ฉ (๋ ์ด์์, ์ปดํฌ๋ํธ, ๋ฐ๋ณต๋ฌธ)
- SQLite ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ Eloquent ORM ๊ธฐ์ด
- ์ธ์ ์ ํ์ฉํ ์ฅ๋ฐ๊ตฌ๋ ๊ตฌํ (๋ก๊ทธ์ธ ์์ด๋ ์๋)
- Tailwind CSS๋ก ๋ฐ์ํ UI ๋์์ธ
์ ์ฝ ์กฐ๊ฑด
- โข Laravel 13.x ์ฌ์ฉ ํ์ (๊ตฌ๋ฒ์ ๊ธ์ง)
- โข Blade ํ ํ๋ฆฟ ์์ง๋ง ์ฌ์ฉ (React/Vue ๋ฑ SPA ํ๋ ์์ํฌ ๊ธ์ง)
- โข ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ SQLite ์ฌ์ฉ (๊ฐ๋จํ ์ค์ )
- โข Tailwind CSS๋ก ์คํ์ผ๋ง (Vite ๋๋ CDN)
- โข ์ฅ๋ฐ๊ตฌ๋๋ ์ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ (๋ก๊ทธ์ธ ๋ถํ์)
- โข ์ํ ๋ฐ์ดํฐ๋ ์๋(Seeder)๋ก ๋ฏธ๋ฆฌ ์์ฑ
- โข ์ค์ ๊ฒฐ์ ์ฐ๋ ์์ (์ฃผ๋ฌธ์ ์์ฑ๊น์ง๋ง)
- โข ๊ด๋ฆฌ์ ํ์ด์ง ์์ (๊ณ ๊ฐ์ฉ ์ผํ ํ์ด์ง๋ง)
ํ๋กฌํํธ ๋ ์ํผ
์๋ ํ๋กฌํํธ๋ฅผ ์์๋๋ก AI์๊ฒ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ๋ณต์ฌ ๋ฒํผ์ ๋๋ฌ ๋ฐ๋ก ์ฌ์ฉํ์ธ์.
mkdir indie-band-merch-shop && cd indie-band-merch-shop ์ด ํด๋์์ Laravel 13.x ํ๋ก์ ํธ๋ฅผ ์์ํฉ๋๋ค. **์๊ตฌ์ฌํญ:** 1. Laravel 13.x ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ธ์ (composer create-project laravel/laravel . ๋ช ๋ น ์ฌ์ฉ) 2. `.env` ํ์ผ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ SQLite๋ก ์ค์ ํ์ธ์: - DB_CONNECTION=sqlite - DB_DATABASE ๊ฒฝ๋ก๋ฅผ `database/database.sqlite`๋ก ์ง์ 3. `database/database.sqlite` ํ์ผ์ ์์ฑํ์ธ์ (touch ๋ช ๋ น ๋๋ ๋น ํ์ผ ์์ฑ) 4. Tailwind CSS๋ฅผ ์ค์นํ๊ณ Vite ์ค์ ์ ์๋ฃํ์ธ์: - `npm install -D tailwindcss postcss autoprefixer` - `npx tailwindcss init -p` - tailwind.config.js์์ content ๊ฒฝ๋ก ์ค์ : `['./resources/**/*.blade.php', './resources/**/*.js']` - resources/css/app.css์ Tailwind ๋๋ ํฐ๋ธ ์ถ๊ฐ (`@tailwind base; @tailwind components; @tailwind utilities;`) 5. `php artisan serve` ๋ฐ `npm run dev`๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ์ ๋ "Welcome to Laravel" ํ์ด์ง๊ฐ Tailwind ์คํ์ผ๋ก ํ์๋๋์ง ํ์ธํ์ธ์. ๋ชจ๋ ์ค์ ์ด ์๋ฃ๋๋ฉด ๋ค์ ๋จ๊ณ๋ก ์งํํ ์ค๋น๊ฐ ๋ ์ํ์ฌ์ผ ํฉ๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: Laravel 13.x ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ , SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ด ์์ฑ๋๋ฉฐ, Tailwind CSS๊ฐ ์ค์น๋์ด ๊ฐ๋ฐ ์๋ฒ๊ฐ ์ ์ ์๋ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ localhost:8000 ์ ์ ์ Laravel ๊ธฐ๋ณธ ํ์ด์ง๊ฐ ํ์๋ฉ๋๋ค.
**์๊ตฌ์ฌํญ:** 1. `Product` ๋ชจ๋ธ๊ณผ ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ฑํ์ธ์ (`php artisan make:model Product -m`) 2. ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์์ `products` ํ ์ด๋ธ์ ๋ค์ ์ปฌ๋ผ์ ์ถ๊ฐํ์ธ์: - name (string): ์ํ๋ช - description (text): ์ํ ์ค๋ช - price (decimal, 8,2): ๊ฐ๊ฒฉ - image_url (string): ์ํ ์ด๋ฏธ์ง URL (์ธ๋ถ ๋งํฌ ๋๋ ๋๋ฏธ ์ด๋ฏธ์ง) - stock (integer, default 0): ์ฌ๊ณ ์๋ - category (string, nullable): ์นดํ ๊ณ ๋ฆฌ (์: ํฐ์ ์ธ , ํ๋, ํฌ์คํฐ) - is_featured (boolean, default false): ์ธ๊ธฐ ์ํ ์ฌ๋ถ - timestamps 3. `Order` ๋ชจ๋ธ๊ณผ ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ฑํ์ธ์ (`php artisan make:model Order -m`) 4. ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์์ `orders` ํ ์ด๋ธ์ ๋ค์ ์ปฌ๋ผ์ ์ถ๊ฐํ์ธ์: - order_number (string, unique): ์ฃผ๋ฌธ ๋ฒํธ (์: ORD-20240101-XXXX) - customer_name (string): ๊ณ ๊ฐ ์ด๋ฆ - customer_email (string): ๊ณ ๊ฐ ์ด๋ฉ์ผ - customer_phone (string): ๊ณ ๊ฐ ์ ํ๋ฒํธ - shipping_address (text): ๋ฐฐ์ก์ง ์ฃผ์ - total_price (decimal, 8,2): ์ด ์ฃผ๋ฌธ ๊ธ์ก - items (json): ์ฃผ๋ฌธ ์ํ ์ ๋ณด (์ํ๋ช , ์๋, ๊ฐ๊ฒฉ ๋ฑ์ JSON์ผ๋ก ์ ์ฅ) - timestamps 5. ๋ง์ด๊ทธ๋ ์ด์ ์ ์คํํ์ธ์ (`php artisan migrate`) 6. `DatabaseSeeder.php`์์ ๋๋ฏธ ์ํ ๋ฐ์ดํฐ๋ฅผ 5~10๊ฐ ์์ฑํ์ธ์: - ๋ค์ํ ์นดํ ๊ณ ๋ฆฌ (ํฐ์ ์ธ , ํ๋, ํฌ์คํฐ, ์คํฐ์ปค ๋ฑ) - ์ผ๋ถ ์ํ์ ์ฌ๊ณ 0์ผ๋ก ์ค์ (ํ์ ์ํ) - ์ผ๋ถ ์ํ์ is_featured๋ฅผ true๋ก ์ค์ (์ธ๊ธฐ ์ํ) - ์ด๋ฏธ์ง URL์ Unsplash ๋๋ Placeholder ์ด๋ฏธ์ง ์ฌ์ฉ (์: https://via.placeholder.com/400x400) 7. ์๋๋ฅผ ์คํํ์ธ์ (`php artisan db:seed`) ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ด ์์ฑ๋๊ณ ๋๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋์๋์ง ํ์ธํ์ธ์ (`php artisan tinker`๋ก Product::all() ์คํ).
๊ธฐ๋ ๊ฒฐ๊ณผ: products์ orders ํ ์ด๋ธ์ด ์์ฑ๋๊ณ , ๋๋ฏธ ์ํ ๋ฐ์ดํฐ๊ฐ 5~10๊ฐ ์ฝ์ ๋ฉ๋๋ค. tinker์์ Product::all()์ ์คํํ๋ฉด ์๋๋ก ์์ฑํ ์ํ ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค.
**์๊ตฌ์ฌํญ:**
1. `web.php` ๋ผ์ฐํธ ํ์ผ์ ๋ค์ ๋ผ์ฐํธ๋ฅผ ์ถ๊ฐํ์ธ์:
- GET `/` : ๋ฉ์ธ ํ์ด์ง (์ํ ๋ชฉ๋ก)
- GET `/products/{id}` : ์ํ ์์ธ ํ์ด์ง
- POST `/cart/add` : ์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐ
- GET `/cart` : ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง
- POST `/cart/update` : ์ฅ๋ฐ๊ตฌ๋ ์๋ ์
๋ฐ์ดํธ
- POST `/cart/remove` : ์ฅ๋ฐ๊ตฌ๋์์ ์ํ ์ญ์
- GET `/checkout` : ์ฃผ๋ฌธ์ ์์ฑ ํ์ด์ง
- POST `/order` : ์ฃผ๋ฌธ ์๋ฃ ์ฒ๋ฆฌ
- GET `/order/{orderNumber}/complete` : ์ฃผ๋ฌธ ์๋ฃ ํ์ด์ง
2. `ProductController`๋ฅผ ์์ฑํ๊ณ (`php artisan make:controller ProductController`) ๋ค์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ธ์:
- `index()`: ๋ชจ๋ ์ํ์ ๊ฐ์ ธ์ ๋ฉ์ธ ํ์ด์ง ๋ทฐ๋ก ์ ๋ฌ
- `show($id)`: ํน์ ์ํ ์์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์์ธ ํ์ด์ง ๋ทฐ๋ก ์ ๋ฌ
3. `CartController`๋ฅผ ์์ฑํ๊ณ (`php artisan make:controller CartController`) ๋ค์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ธ์:
- `add(Request $request)`: ์ธ์
์ ์ํ ์ถ๊ฐ (์ํ ID, ์ด๋ฆ, ๊ฐ๊ฒฉ, ์๋์ ๋ฐฐ์ด๋ก ์ ์ฅ)
- `index()`: ์ธ์
์์ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ทฐ๋ก ์ ๋ฌ
- `update(Request $request)`: ํน์ ์ํ์ ์๋ ์
๋ฐ์ดํธ
- `remove(Request $request)`: ํน์ ์ํ์ ์ฅ๋ฐ๊ตฌ๋์์ ์ญ์
4. `OrderController`๋ฅผ ์์ฑํ๊ณ (`php artisan make:controller OrderController`) ๋ค์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ธ์:
- `checkout()`: ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ณ ์ฃผ๋ฌธ์ ์์ฑ ํ์ด์ง๋ก ์ด๋
- `store(Request $request)`: ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๊ณ DB์ ์ ์ฅ, ์ฃผ๋ฌธ ๋ฒํธ ์์ฑ (์: ORD-20240101-XXXX), ์ธ์
์ฅ๋ฐ๊ตฌ๋ ์ด๊ธฐํ
- `complete($orderNumber)`: ์ฃผ๋ฌธ ์๋ฃ ํ์ด์ง ํ์
์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ ์์ง ๋ทฐ๋ฅผ ์ฐ๊ฒฐํ์ง ์์๋ ๋ฉ๋๋ค. ๋ค์ ๋จ๊ณ์์ Blade ๋ทฐ๋ฅผ ์์ฑํ ์์ ์
๋๋ค.
๊ธฐ๋ ๊ฒฐ๊ณผ: ๋ผ์ฐํธ์ ์ปจํธ๋กค๋ฌ๊ฐ ์์ฑ๋๊ณ , ๊ฐ ๋ฉ์๋์ ๊ธฐ๋ณธ ๋ก์ง์ด ๊ตฌํ๋ฉ๋๋ค. ์ธ์ ๊ธฐ๋ฐ ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ/์์ /์ญ์ ๊ธฐ๋ฅ์ด ์๋ํ๋ฉฐ, ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฅํ๋ ๋ก์ง์ด ์์ฑ๋ฉ๋๋ค.
**์๊ตฌ์ฌํญ:**
1. `resources/views/layouts/app.blade.php` ํ์ผ์ ์์ฑํ๊ณ ๊ณตํต ๋ ์ด์์์ ์์ฑํ์ธ์:
- HTML ๊ธฐ๋ณธ ๊ตฌ์กฐ (head, body)
- Tailwind CSS ๋งํฌ (`@vite(['resources/css/app.css', 'resources/js/app.js'])`)
- ๋ค๋น๊ฒ์ด์
๋ฐ: ๋ก๊ณ (๋ฐด๋๋ช
), ํ ๋งํฌ, ์ฅ๋ฐ๊ตฌ๋ ๋งํฌ (์ฅ๋ฐ๊ตฌ๋ ์์ดํ
๊ฐ์ ๋ฐฐ์ง ํ์)
- `@yield('content')` ์น์
์ผ๋ก ๋ณธ๋ฌธ ์์ญ ์ง์
- ํธํฐ: ์ ์๊ถ ์ ๋ณด ๋ฐ ์์
๋ฏธ๋์ด ๋งํฌ (๋๋ฏธ)
2. `resources/views/products/index.blade.php` ํ์ผ์ ์์ฑํ๊ณ ๋ฉ์ธ ํ์ด์ง๋ฅผ ์์ฑํ์ธ์:
- ํ์ด๋ก ์น์
: ๋ฐด๋ ์ด๋ฆ, ์ฌ๋ก๊ฑด (์: "Official Merch Shop"), ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ๋๋ ๊ทธ๋ผ๋์ธํธ
- ์ธ๊ธฐ ์ํ ์น์
: `is_featured`๊ฐ true์ธ ์ํ๋ง ํ์ (๊ฐ๋ก ์คํฌ๋กค ๋๋ ๊ทธ๋ฆฌ๋)
- ์ ์ฒด ์ํ ๋ชฉ๋ก: ๊ทธ๋ฆฌ๋ ๋ ์ด์์ (3~4์ด), ๊ฐ ์ํ ์นด๋์ ์ด๋ฏธ์ง, ์ด๋ฆ, ๊ฐ๊ฒฉ, ์ฌ๊ณ ์ํ ๋ฐฐ์ง ํ์
- ์ฌ๊ณ ๊ฐ 0์ด๋ฉด "ํ์ " ๋ฐฐ์ง, ์ฌ๊ณ ๊ฐ 10 ์ดํ๋ฉด "ํ์ ์๋" ๋ฐฐ์ง ํ์
- ๊ฐ ์ํ ์นด๋ ํด๋ฆญ ์ ์์ธ ํ์ด์ง๋ก ์ด๋
3. Tailwind CSS๋ก ์คํ์ผ๋ง:
- ์นด๋ ํธ๋ฒ ํจ๊ณผ (shadow, scale ๋ฑ)
- ๋ฐ์ํ ๊ทธ๋ฆฌ๋ (๋ชจ๋ฐ์ผ: 1์ด, ํ๋ธ๋ฆฟ: 2์ด, ๋ฐ์คํฌํฑ: 3~4์ด)
- ๋ฐฐ์ง ์์ (ํ์ : ๋นจ๊ฐ, ํ์ ์๋: ๋
ธ๋, ์ ์: ์ด๋ก)
๋ฉ์ธ ํ์ด์ง์ ์ ์ํ์ ๋ ์ํ ๋ชฉ๋ก์ด ๊ทธ๋ฆฌ๋๋ก ํ์๋๊ณ , ์ฌ๊ณ ์ํ๊ฐ ๋ฐฐ์ง๋ก ํ์๋๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ๋ฉ์ธ ํ์ด์ง๊ฐ Tailwind CSS๋ก ์คํ์ผ๋ง๋์ด ์ํ ๋ชฉ๋ก์ด ๊ทธ๋ฆฌ๋ ํํ๋ก ํ์๋ฉ๋๋ค. ์ธ๊ธฐ ์ํ ์น์ ๊ณผ ์ฌ๊ณ ์ํ ๋ฐฐ์ง๊ฐ ์ ์ ์๋ํ๋ฉฐ, ๋ฐ์ํ ๋์์ธ์ด ์ ์ฉ๋ฉ๋๋ค.
**์๊ตฌ์ฌํญ:**
1. `resources/views/products/show.blade.php` ํ์ผ์ ์์ฑํ๊ณ ์ํ ์์ธ ํ์ด์ง๋ฅผ ์์ฑํ์ธ์:
- ์ผ์ชฝ: ์ํ ์ด๋ฏธ์ง (ํฐ ์ฌ์ด์ฆ)
- ์ค๋ฅธ์ชฝ: ์ํ ์ ๋ณด (์ด๋ฆ, ๊ฐ๊ฒฉ, ์ค๋ช
, ์นดํ
๊ณ ๋ฆฌ)
- ์ฌ์ด์ฆ/์์ ์ ํ (๋๋กญ๋ค์ด ๋๋ ๋ฒํผ ๊ทธ๋ฃน, ๋๋ฏธ ์ต์
์ผ๋ก "S, M, L, XL" ๋๋ "Black, White, Gray")
- ์๋ ์ ํ (+ / - ๋ฒํผ์ผ๋ก ์กฐ์ , ๊ธฐ๋ณธ๊ฐ 1)
- "์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ" ๋ฒํผ (์ฌ๊ณ ๊ฐ 0์ด๋ฉด ๋นํ์ฑํ)
- ์ฌ๊ณ ์ํ ํ์ ("์ฌ๊ณ : X๊ฐ ๋จ์" ๋๋ "ํ์ ")
2. "์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ" ๋ฒํผ ํด๋ฆญ ์:
- POST `/cart/add` ๋ผ์ฐํธ๋ก ํผ ์ ์ถ
- ์ํ ID, ์ด๋ฆ, ๊ฐ๊ฒฉ, ์๋, ์ ํํ ์ต์
(์ฌ์ด์ฆ/์์)์ ์ ๋ฌ
- ์ฑ๊ณต ์ ์๋ฆผ ๋ฉ์์ง ํ์ ("์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ๋์์ต๋๋ค!") ๋ฐ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
3. Tailwind CSS๋ก ์คํ์ผ๋ง:
- 2์ด ๋ ์ด์์ (๋ชจ๋ฐ์ผ์์๋ 1์ด๋ก ๋ณ๊ฒฝ)
- ๋ฒํผ ํธ๋ฒ ํจ๊ณผ ๋ฐ ๋นํ์ฑํ ์คํ์ผ
- ์๋ ์กฐ์ ๋ฒํผ (+/-) ์คํ์ผ๋ง
์ํ ์์ธ ํ์ด์ง์์ ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ์ถ๊ฐํ ์ ์๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ์ํ ์์ธ ํ์ด์ง๊ฐ ์์ฑ๋๊ณ , ์ฌ์ด์ฆ/์์ ์ ํ ๋ฐ ์๋ ์กฐ์ UI๊ฐ ์๋ํฉ๋๋ค. ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ฒํผ ํด๋ฆญ ์ ์ธ์ ์ ์ํ์ด ์ถ๊ฐ๋๋ฉฐ, ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ๋ฉ๋๋ค.
**์๊ตฌ์ฌํญ:**
1. `resources/views/cart/index.blade.php` ํ์ผ์ ์์ฑํ๊ณ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ฅผ ์์ฑํ์ธ์:
- ์ฅ๋ฐ๊ตฌ๋๊ฐ ๋น์ด์์ผ๋ฉด "์ฅ๋ฐ๊ตฌ๋๊ฐ ๋น์ด์์ต๋๋ค" ๋ฉ์์ง ํ์ ๋ฐ ์ผํ ๊ณ์ํ๊ธฐ ๋ฒํผ
- ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ด ์์ผ๋ฉด ํ
์ด๋ธ ๋๋ ์นด๋ ํํ๋ก ํ์:
- ๊ฐ ์ํ: ์ด๋ฏธ์ง, ์ด๋ฆ, ์ ํํ ์ต์
(์ฌ์ด์ฆ/์์), ๊ฐ๊ฒฉ, ์๋ ์กฐ์ ๋ฒํผ (+/-), ์ญ์ ๋ฒํผ
- ์๋ ๋ณ๊ฒฝ ์ POST `/cart/update` ๋ผ์ฐํธ๋ก ํผ ์ ์ถํ์ฌ ์ธ์
์
๋ฐ์ดํธ
- ์ญ์ ๋ฒํผ ํด๋ฆญ ์ POST `/cart/remove` ๋ผ์ฐํธ๋ก ํผ ์ ์ถํ์ฌ ์ธ์
์์ ์ ๊ฑฐ
- ํ๋จ์ ์ด ์ฃผ๋ฌธ ๊ธ์ก ํ์ (๋ชจ๋ ์ํ์ ๊ฐ๊ฒฉ ร ์๋ ํฉ๊ณ)
- "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ (ํด๋ฆญ ์ `/checkout` ํ์ด์ง๋ก ์ด๋)
2. Tailwind CSS๋ก ์คํ์ผ๋ง:
- ํ
์ด๋ธ ๋๋ ์นด๋ ๋ ์ด์์ (๋ชจ๋ฐ์ผ ์นํ์ ์ผ๋ก)
- ์ญ์ ๋ฒํผ (๋นจ๊ฐ์, ํธ๋ฒ ํจ๊ณผ)
- ์ด ๊ธ์ก ๊ฐ์กฐ (ํฐ ํฐํธ, ๊ตต์ ๊ธ์จ)
์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์์ ์๋ ์กฐ์ ๋ฐ ์ญ์ ๊ธฐ๋ฅ์ด ์ ์ ์๋ํ๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๊ฐ ์์ฑ๋๊ณ , ์ํ ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค. ์๋ ์กฐ์ ๋ฐ ์ญ์ ๋ฒํผ์ด ์๋ํ๋ฉฐ, ์ด ์ฃผ๋ฌธ ๊ธ์ก์ด ์๋์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
**์๊ตฌ์ฌํญ:**
1. `resources/views/orders/checkout.blade.php` ํ์ผ์ ์์ฑํ๊ณ ์ฃผ๋ฌธ์ ์์ฑ ํ์ด์ง๋ฅผ ์์ฑํ์ธ์:
- ์ฃผ๋ฌธ ์ํ ์์ฝ: ์ฅ๋ฐ๊ตฌ๋ ๋ด์ฉ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ํ์ (์ํ๋ช
, ์๋, ๊ฐ๊ฒฉ)
- ์ด ์ฃผ๋ฌธ ๊ธ์ก ํ์
- ๊ณ ๊ฐ ์ ๋ณด ์
๋ ฅ ํผ:
- ์ด๋ฆ (required)
- ์ด๋ฉ์ผ (required, email ํ์)
- ์ ํ๋ฒํธ (required)
- ๋ฐฐ์ก์ง ์ฃผ์ (required, textarea)
- "์ฃผ๋ฌธ ์๋ฃ" ๋ฒํผ (ํด๋ฆญ ์ POST `/order` ๋ผ์ฐํธ๋ก ํผ ์ ์ถ)
2. `OrderController@store` ๋ฉ์๋์์:
- ์
๋ ฅ ๋ฐ์ดํฐ ๊ฒ์ฆ (Validation)
- ์ฃผ๋ฌธ ๋ฒํธ ์์ฑ (์: ORD-{๋ ์ง}-{๋๋ค์ซ์})
- ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ๋ณํํ์ฌ `items` ์ปฌ๋ผ์ ์ ์ฅ
- ์ด ๊ธ์ก ๊ณ์ฐ ๋ฐ ์ ์ฅ
- ์ธ์
์ฅ๋ฐ๊ตฌ๋ ์ด๊ธฐํ (`session()->forget('cart')`)
- ์ฃผ๋ฌธ ์๋ฃ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ (`/order/{orderNumber}/complete`)
3. `resources/views/orders/complete.blade.php` ํ์ผ์ ์์ฑํ๊ณ ์ฃผ๋ฌธ ์๋ฃ ํ์ด์ง๋ฅผ ์์ฑํ์ธ์:
- "์ฃผ๋ฌธ์ด ์๋ฃ๋์์ต๋๋ค!" ๋ฉ์์ง
- ์ฃผ๋ฌธ ๋ฒํธ ํ์ (ํฐ ํฐํธ๋ก ๊ฐ์กฐ)
- ์ฃผ๋ฌธ ๋ด์ญ ์์ฝ (์ํ๋ช
, ์๋, ์ด ๊ธ์ก)
- "์ผํ ๊ณ์ํ๊ธฐ" ๋ฒํผ (๋ฉ์ธ ํ์ด์ง๋ก ์ด๋)
4. Tailwind CSS๋ก ์คํ์ผ๋ง:
- ํผ ํ๋ ์คํ์ผ๋ง (input, textarea)
- ์ฃผ๋ฌธ ์๋ฃ ํ์ด์ง์ ์ฑ๊ณต ๋ฉ์์ง ์์ด์ฝ ์ถ๊ฐ (์ฒดํฌ๋งํฌ ๋ฑ)
์ฃผ๋ฌธ์ ์์ฑ๋ถํฐ ์ฃผ๋ฌธ ์๋ฃ๊น์ง ์ ์ฒด ํ๋ก์ฐ๊ฐ ์ ์ ์๋ํ๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ์ฃผ๋ฌธ์ ์์ฑ ํ์ด์ง๊ฐ ์์ฑ๋๊ณ , ํผ ์ ์ถ ์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๊ฐ DB์ ์ ์ฅ๋ฉ๋๋ค. ์ฃผ๋ฌธ ์๋ฃ ํ์ด์ง์์ ์ฃผ๋ฌธ ๋ฒํธ์ ์ฃผ๋ฌธ ๋ด์ญ์ด ํ์๋๋ฉฐ, ์ฅ๋ฐ๊ตฌ๋๊ฐ ์ด๊ธฐํ๋ฉ๋๋ค.
์ ์ถ๋ ์ํ (0)
๋ก๊ทธ์ธ ํ ์ ์ถ์์ง ์ ์ถ๋ ์ํ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋์ ์๊ฐ ๋์ด๋ณด์ธ์!