๐ŸŽธ ๋กœ์ปฌ ๋ผ์ด๋ธŒ ๊ณต์—ฐ ํ‹ฐ์ผ“ ํŒ๋งค ํŽ˜์ด์ง€ - ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ๋ ˆ์‹œํ”ผ
์ž…๋ฌธ PHP + JavaScript Laravel + React AI: Claude

๐ŸŽธ ๋กœ์ปฌ ๋ผ์ด๋ธŒ ๊ณต์—ฐ ํ‹ฐ์ผ“ ํŒ๋งค ํŽ˜์ด์ง€

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ช… live-show-ticket-sales
์กฐํšŒ์ˆ˜ 46 0๊ฑด ์ œ์ถœ

๋ฌธ์ œ ์„ค๋ช…

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์†Œ๊ทœ๋ชจ ๋ผ์ด๋ธŒ ๊ณต์—ฐ์žฅ, ์ธ๋”” ๋ฐด๋“œ, ํด๋Ÿฝ ๊ณต์—ฐ์„ ์œ„ํ•œ ํ‹ฐ์ผ“ ํŒ๋งค ๋žœ๋”ฉํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Laravel 13.x API ๋ฐฑ์—”๋“œ์™€ React 19 ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๋ฉฐ, ์‹ค์ œ ๊ณต์—ฐ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๊ฐ์ด ํ‹ฐ์ผ“์„ ๊ตฌ๋งค ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ํ’€์Šคํƒ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๊ธฐ๋Šฅ

  • ๊ณต์—ฐ ์ •๋ณด ํ‘œ์‹œ: ๊ณต์—ฐ๋ช…, ์•„ํ‹ฐ์ŠคํŠธ, ์ผ์‹œ, ์žฅ์†Œ, ํ‹ฐ์ผ“ ๊ฐ€๊ฒฉ ๋“ฑ ์ƒ์„ธ ์ •๋ณด
  • ํ‹ฐ์ผ“ ๊ตฌ๋งค ์‹ ์ฒญ ํผ: ์ด๋ฆ„, ์ด๋ฉ”์ผ, ์—ฐ๋ฝ์ฒ˜, ํ‹ฐ์ผ“ ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ
  • ์‹ค์‹œ๊ฐ„ ์ž”์—ฌ์„ ํ™•์ธ: ํŒ๋งค๋œ ํ‹ฐ์ผ“ ์ˆ˜์™€ ๋‚จ์€ ์ขŒ์„ ์ˆ˜ ํ‘œ์‹œ
  • ๋ฐ˜์‘ํ˜• ๋””์ž์ธ: ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ด๋Š” UI
  • ์‹œ๊ฐ์  ๊ณต์—ฐ ํฌ์Šคํ„ฐ: ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ (์„ ํƒ์‚ฌํ•ญ)

๋ณด๋„ˆ์Šค ๊ธฐ๋Šฅ

  • ๊ตฌ๋งค ์™„๋ฃŒ ์‹œ ํ™•์ธ ์ด๋ฉ”์ผ ์ž๋™ ๋ฐœ์†ก
  • ๊ณต์—ฐ๋ณ„ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง (๋ฝ, ์žฌ์ฆˆ, ํž™ํ•ฉ ๋“ฑ)
  • ์ข‹์•„์š”/์ฐœํ•˜๊ธฐ ๊ธฐ๋Šฅ์œผ๋กœ ๊ด€์‹ฌ ๊ณต์—ฐ ์ €์žฅ
  • ๊ณต์—ฐ D-day ์นด์šดํŠธ๋‹ค์šด ํƒ€์ด๋จธ
  • ํ‹ฐ์ผ“ ๊ตฌ๋งค ํ›„ QR ์ฝ”๋“œ ์ƒ์„ฑ (์ž…์žฅ๊ถŒ)

๊ธฐ์ˆ  ์Šคํƒ

  • ๋ฐฑ์—”๋“œ: Laravel 13.x (RESTful API)
  • ํ”„๋ก ํŠธ์—”๋“œ: React 19 (Vite)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: SQLite (๊ฐ„๋‹จํ•œ ๋กœ์ปฌ DB)
  • ์Šคํƒ€์ผ๋ง: Tailwind CSS

ํ•™์Šต ๋ชฉํ‘œ

  • Laravel API ์—”๋“œํฌ์ธํŠธ ์„ค๊ณ„ ๋ฐ CRUD ๊ตฌํ˜„
  • React์—์„œ fetch/axios๋กœ API ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์—ฐ๋™
  • useState๋ฅผ ํ™œ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ
  • ํผ ์ž…๋ ฅ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฒ˜๋ฆฌ
  • ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋ฆฌ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

์ œ์•ฝ ์กฐ๊ฑด

  • โ€ข Laravel 13.x ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ (๊ตฌ๋ฒ„์ „ ๊ธˆ์ง€)
  • โ€ข React 19 ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ
  • โ€ข SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ (์„ค์ • ๊ฐ„์†Œํ™”)
  • โ€ข ๋ณต์žกํ•œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธˆ์ง€ (useState๋งŒ ์‚ฌ์šฉ)
  • โ€ข WebSocket ์‚ฌ์šฉ ๊ธˆ์ง€ (HTTP ๊ธฐ๋ฐ˜ ํ†ต์‹ ๋งŒ)
  • โ€ข Tailwind CSS๋กœ ์Šคํƒ€์ผ๋ง
  • โ€ข CORS ์„ค์ • ํ•„์ˆ˜ (Laravel API โ†” React ํ”„๋ก ํŠธ์—”๋“œ ํ†ต์‹ )
  • โ€ข API ์‘๋‹ต์€ JSON ํ˜•์‹
  • โ€ข ํ”„๋ก ํŠธ์—”๋“œ๋Š” Vite๋กœ ๋ณ„๋„ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

ํ”„๋กฌํ”„ํŠธ ๋ ˆ์‹œํ”ผ

์•„๋ž˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ AI์—๊ฒŒ ๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

1
Step 1
mkdir live-show-ticket-sales && cd live-show-ticket-sales

์ด ํด๋”์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

## Laravel 13.x API ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

1. `backend` ํด๋”์— Laravel 13.x ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
2. `.env` ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ SQLite๋กœ ์„ค์ •ํ•˜์„ธ์š”.
3. `database/database.sqlite` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”.
4. CORS ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์—ฌ React ํ”„๋ก ํŠธ์—”๋“œ(http://localhost:5173)์—์„œ API ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์„ธ์š”.
5. `php artisan serve --port=8000`๋กœ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•˜์„ธ์š”.

## ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ
- `backend` ํด๋”์— Laravel 13.x ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์™„๋ฃŒ
- SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • ์™„๋ฃŒ
- CORS ๋ฏธ๋“ค์›จ์–ด ์„ค์ •์œผ๋กœ React ์•ฑ๊ณผ ํ†ต์‹  ๊ฐ€๋Šฅ
- `php artisan serve` ์‹คํ–‰ ์‹œ http://localhost:8000 ์ ‘์† ๊ฐ€๋Šฅ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: Laravel ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • ๋ฐ CORS ์„ค์ •์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋ฉด API ์—”๋“œํฌ์ธํŠธ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

2
Step 2
## Laravel ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ๋ชจ๋ธ ์ƒ์„ฑ

1. `shows` ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋งŒ๋“œ์„ธ์š”. ์ปฌ๋Ÿผ:
   - id (primary key)
   - title (๊ณต์—ฐ๋ช…, string)
   - artist (์•„ํ‹ฐ์ŠคํŠธ๋ช…, string)
   - venue (๊ณต์—ฐ ์žฅ์†Œ, string)
   - show_date (๊ณต์—ฐ ์ผ์‹œ, datetime)
   - ticket_price (ํ‹ฐ์ผ“ ๊ฐ€๊ฒฉ, decimal)
   - total_seats (์ด ์ขŒ์„ ์ˆ˜, integer)
   - sold_seats (ํŒ๋งค๋œ ์ขŒ์„ ์ˆ˜, integer, ๊ธฐ๋ณธ๊ฐ’ 0)
   - poster_url (ํฌ์Šคํ„ฐ ์ด๋ฏธ์ง€ URL, string, nullable)
   - created_at, updated_at (ํƒ€์ž„์Šคํƒฌํ”„)

2. `ticket_orders` ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋งŒ๋“œ์„ธ์š”. ์ปฌ๋Ÿผ:
   - id (primary key)
   - show_id (์™ธ๋ž˜ํ‚ค, shows ํ…Œ์ด๋ธ” ์ฐธ์กฐ)
   - customer_name (๊ตฌ๋งค์ž ์ด๋ฆ„, string)
   - customer_email (๊ตฌ๋งค์ž ์ด๋ฉ”์ผ, string)
   - customer_phone (๊ตฌ๋งค์ž ์—ฐ๋ฝ์ฒ˜, string)
   - quantity (ํ‹ฐ์ผ“ ์ˆ˜๋Ÿ‰, integer)
   - created_at, updated_at (ํƒ€์ž„์Šคํƒฌํ”„)

3. `Show` ๋ชจ๋ธ๊ณผ `TicketOrder` ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜์„ธ์š”.
4. ๋ชจ๋ธ ๊ฐ„ ๊ด€๊ณ„ ์„ค์ •:
   - Show ๋ชจ๋ธ: `hasMany` ๊ด€๊ณ„๋กœ TicketOrder์™€ ์—ฐ๊ฒฐ
   - TicketOrder ๋ชจ๋ธ: `belongsTo` ๊ด€๊ณ„๋กœ Show์™€ ์—ฐ๊ฒฐ

5. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜์„ธ์š”: `php artisan migrate`

## ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ
- shows, ticket_orders ํ…Œ์ด๋ธ”์ด SQLite DB์— ์ƒ์„ฑ๋จ
- Show, TicketOrder Eloquent ๋ชจ๋ธ ์ƒ์„ฑ ์™„๋ฃŒ
- ๋ชจ๋ธ ๊ฐ„ ๊ด€๊ณ„ ์„ค์ • ์™„๋ฃŒ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ Eloquent ๋ชจ๋ธ์ด ์ƒ์„ฑ๋˜๋ฉฐ, ๊ณต์—ฐ ์ •๋ณด์™€ ํ‹ฐ์ผ“ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

3
Step 3
## Laravel API ๋ผ์šฐํŠธ ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„

1. `routes/api.php`์— ๋‹ค์Œ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ •์˜ํ•˜์„ธ์š”:
   - GET `/api/shows` : ๋ชจ๋“  ๊ณต์—ฐ ๋ชฉ๋ก ์กฐํšŒ
   - GET `/api/shows/{id}` : ํŠน์ • ๊ณต์—ฐ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ
   - POST `/api/shows` : ์ƒˆ ๊ณต์—ฐ ๋“ฑ๋ก (๊ด€๋ฆฌ์ž์šฉ, ์„ ํƒ์‚ฌํ•ญ)
   - POST `/api/ticket-orders` : ํ‹ฐ์ผ“ ๊ตฌ๋งค ์‹ ์ฒญ

2. `ShowController`๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”:
   - `index()`: ๋ชจ๋“  ๊ณต์—ฐ ๋ชฉ๋ก์„ JSON์œผ๋กœ ๋ฐ˜ํ™˜ (์ž”์—ฌ์„ ๊ณ„์‚ฐ ํฌํ•จ)
   - `show($id)`: ํŠน์ • ๊ณต์—ฐ ์ƒ์„ธ ์ •๋ณด ๋ฐ˜ํ™˜
   - `store()`: ์ƒˆ ๊ณต์—ฐ ๋“ฑ๋ก (title, artist, venue, show_date, ticket_price, total_seats ์ž…๋ ฅ)

3. `TicketOrderController`๋ฅผ ์ƒ์„ฑํ•˜๊ณ  `store()` ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”:
   - ํ‹ฐ์ผ“ ๊ตฌ๋งค ์‹ ์ฒญ ์ฒ˜๋ฆฌ
   - show_id, customer_name, customer_email, customer_phone, quantity ์ž…๋ ฅ
   - ์ž”์—ฌ์„ ํ™•์ธ: `show->sold_seats + quantity <= show->total_seats` ๊ฒ€์ฆ
   - ๊ตฌ๋งค ๊ฐ€๋Šฅํ•˜๋ฉด TicketOrder ์ƒ์„ฑ ๋ฐ Show์˜ sold_seats ์ฆ๊ฐ€
   - ์„ฑ๊ณต ์‹œ JSON ์‘๋‹ต ๋ฐ˜ํ™˜

4. Postman ๋˜๋Š” curl๋กœ API ํ…Œ์ŠคํŠธ:
   - POST `/api/shows`๋กœ ์ƒ˜ํ”Œ ๊ณต์—ฐ ๋ฐ์ดํ„ฐ 1~2๊ฐœ ๋“ฑ๋ก
   - GET `/api/shows`๋กœ ๊ณต์—ฐ ๋ชฉ๋ก ์กฐํšŒ ํ™•์ธ
   - POST `/api/ticket-orders`๋กœ ํ‹ฐ์ผ“ ๊ตฌ๋งค ํ…Œ์ŠคํŠธ

## ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ
- RESTful API ์—”๋“œํฌ์ธํŠธ ๊ตฌํ˜„ ์™„๋ฃŒ
- ๊ณต์—ฐ ๋“ฑ๋ก, ์กฐํšŒ, ํ‹ฐ์ผ“ ๊ตฌ๋งค ๋กœ์ง ๋™์ž‘
- JSON ์‘๋‹ต ํ˜•์‹ ํ™•์ธ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: Laravel API๊ฐ€ ์™„์„ฑ๋˜์–ด ๊ณต์—ฐ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‹ฐ์ผ“ ๊ตฌ๋งค ์‹ ์ฒญ ์‹œ ์ž”์—ฌ์„์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

4
Step 4
## React 19 ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

1. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ(`live-show-ticket-sales`)์—์„œ `frontend` ํด๋”์— React 19 + Vite ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
   ```bash
   npm create vite@latest frontend -- --template react
   cd frontend
   npm install
   ```

2. Tailwind CSS๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์„ค์ •ํ•˜์„ธ์š”:
   ```bash
   npm install -D tailwindcss postcss autoprefixer
   npx tailwindcss init -p
   ```
   - `tailwind.config.js`์—์„œ content ๊ฒฝ๋กœ ์„ค์ •: `["./index.html", "./src/**/*.{js,jsx}"]`
   - `src/index.css`์— Tailwind ์ง€์‹œ์–ด ์ถ”๊ฐ€:
     ```css
     @tailwind base;
     @tailwind components;
     @tailwind utilities;
     ```

3. `npm run dev`๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š” (http://localhost:5173).

4. `src/App.jsx`๋ฅผ ๊ฐ„๋‹จํ•œ ํ—ค๋”์™€ "๊ณต์—ฐ ํ‹ฐ์ผ“ ํŒ๋งค" ํƒ€์ดํ‹€๋กœ ์ˆ˜์ •ํ•˜์—ฌ Tailwind CSS๊ฐ€ ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

## ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ
- React 19 + Vite ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์™„๋ฃŒ
- Tailwind CSS ์„ค์ • ์™„๋ฃŒ
- http://localhost:5173 ์ ‘์† ์‹œ ๊ธฐ๋ณธ ํ™”๋ฉด ํ‘œ์‹œ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: React ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Tailwind CSS๊ฐ€ ์ ์šฉ๋˜์–ด ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

5
Step 5
## React ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ - ๊ณต์—ฐ ๋ชฉ๋ก ํ‘œ์‹œ

1. `src/components/ShowList.jsx` ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
2. `useState`์™€ `useEffect`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Laravel API(`http://localhost:8000/api/shows`)์—์„œ ๊ณต์—ฐ ๋ชฉ๋ก์„ fetchํ•˜์„ธ์š”.
3. ๊ณต์—ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ:
   - ๊ณต์—ฐ๋ช…, ์•„ํ‹ฐ์ŠคํŠธ, ์žฅ์†Œ, ์ผ์‹œ, ํ‹ฐ์ผ“ ๊ฐ€๊ฒฉ
   - ์ž”์—ฌ์„ ํ‘œ์‹œ: `total_seats - sold_seats` ๊ณ„์‚ฐ
   - Tailwind CSS๋กœ ๋ฐ˜์‘ํ˜• ๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์•„์›ƒ (๋ชจ๋ฐ”์ผ: 1์—ด, ํƒœ๋ธ”๋ฆฟ: 2์—ด, ๋ฐ์Šคํฌํ†ฑ: 3์—ด)
4. ๊ฐ ์นด๋“œ์— "ํ‹ฐ์ผ“ ๊ตฌ๋งค" ๋ฒ„ํŠผ ์ถ”๊ฐ€ (ํด๋ฆญ ์‹œ ํ•ด๋‹น ๊ณต์—ฐ ID๋ฅผ ์ƒํƒœ๋กœ ์ €์žฅํ•˜์—ฌ ๊ตฌ๋งค ํผ ํ‘œ์‹œ ์ค€๋น„)
5. `src/App.jsx`์—์„œ `<ShowList />` ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜์„ธ์š”.

## ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ
- ๊ณต์—ฐ ๋ชฉ๋ก์ด ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ๋จ
- ์ž”์—ฌ์„ ์ •๋ณด๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œ๋จ
- ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ์ ์šฉ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: React ์•ฑ์—์„œ Laravel API๋กœ๋ถ€ํ„ฐ ๊ณต์—ฐ ๋ชฉ๋ก์„ ๋ถˆ๋Ÿฌ์™€ ํ™”๋ฉด์— ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ณต์—ฐ์˜ ์ž”์—ฌ์„ ์ •๋ณด๊ฐ€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

6
Step 6
## React ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ - ํ‹ฐ์ผ“ ๊ตฌ๋งค ํผ

1. `src/components/TicketOrderForm.jsx` ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
2. Props๋กœ ์„ ํƒ๋œ ๊ณต์—ฐ ์ •๋ณด(`selectedShow`)๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.
3. ํผ ํ•„๋“œ:
   - ์ด๋ฆ„ (customer_name)
   - ์ด๋ฉ”์ผ (customer_email)
   - ์—ฐ๋ฝ์ฒ˜ (customer_phone)
   - ํ‹ฐ์ผ“ ์ˆ˜๋Ÿ‰ (quantity, number input)
4. `useState`๋กœ ํผ ์ž…๋ ฅ๊ฐ’์„ ๊ด€๋ฆฌํ•˜์„ธ์š”.
5. ์ œ์ถœ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ:
   - Laravel API(`http://localhost:8000/api/ticket-orders`)๋กœ POST ์š”์ฒญ
   - ์š”์ฒญ body: `{ show_id, customer_name, customer_email, customer_phone, quantity }`
   - ์„ฑ๊ณต ์‹œ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ ๋ฐ ํผ ์ดˆ๊ธฐํ™”
   - ์‹คํŒจ ์‹œ (์ž”์—ฌ์„ ๋ถ€์กฑ ๋“ฑ) ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
6. `ShowList` ์ปดํฌ๋„ŒํŠธ์—์„œ "ํ‹ฐ์ผ“ ๊ตฌ๋งค" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ `TicketOrderForm`์„ ๋ชจ๋‹ฌ ๋˜๋Š” ์„น์…˜์œผ๋กœ ํ‘œ์‹œํ•˜์„ธ์š”.
7. ๊ตฌ๋งค ์™„๋ฃŒ ํ›„ ๊ณต์—ฐ ๋ชฉ๋ก์„ ๋‹ค์‹œ fetchํ•˜์—ฌ ์ž”์—ฌ์„ ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

## ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ
- ํ‹ฐ์ผ“ ๊ตฌ๋งค ํผ์ด ๋™์ž‘ํ•˜์—ฌ Laravel API๋กœ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ ์ „์†ก
- ๊ตฌ๋งค ์„ฑ๊ณต ์‹œ ์ž”์—ฌ์„์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์†Œ
- ํผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต์—ฐ์„ ์„ ํƒํ•˜๊ณ  ํ‹ฐ์ผ“ ๊ตฌ๋งค ํผ์„ ์ž‘์„ฑํ•˜์—ฌ ์ œ์ถœํ•˜๋ฉด, Laravel API๋กœ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๊ณ  ์ž”์—ฌ์„์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ๋งค ์™„๋ฃŒ ํ›„ ๊ณต์—ฐ ๋ชฉ๋ก์ด ์ƒˆ๋กœ๊ณ ์นจ๋˜์–ด ๋ณ€๊ฒฝ๋œ ์ž”์—ฌ์„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์ถœ๋œ ์ž‘ํ’ˆ (0)

๋กœ๊ทธ์ธ ํ›„ ์ œ์ถœ

์•„์ง ์ œ์ถœ๋œ ์ž‘ํ’ˆ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋„์ „์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”!

๋Œ“๊ธ€ (0)

๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ๋ณด์„ธ์š”!