๐Ÿ• ํ”ผ์ž ๋งค์žฅ ์˜จ๋ผ์ธ ์ฃผ๋ฌธ ํ”Œ๋žซํผ - ์‹ค์‹œ๊ฐ„ ์ฃผ๋ฌธ ์ ‘์ˆ˜ & ํ† ํ•‘ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• - ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ๋ ˆ์‹œํ”ผ
์ค‘๊ธ‰ PHP Vanilla PHP AI: Claude

๐Ÿ• ํ”ผ์ž ๋งค์žฅ ์˜จ๋ผ์ธ ์ฃผ๋ฌธ ํ”Œ๋žซํผ - ์‹ค์‹œ๊ฐ„ ์ฃผ๋ฌธ ์ ‘์ˆ˜ & ํ† ํ•‘ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ช… pizza-shop-online-ordering
์กฐํšŒ์ˆ˜ 49 0๊ฑด ์ œ์ถœ

๋ฌธ์ œ ์„ค๋ช…

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

์†Œ๊ทœ๋ชจ ํ”ผ์ž ๋งค์žฅ์„ ์œ„ํ•œ ์˜จ๋ผ์ธ ์ฃผ๋ฌธ ์ ‘์ˆ˜ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด ๋ฉ”๋‰ด๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ํ”ผ์ž ํฌ๊ธฐ์™€ ํ† ํ•‘์„ ์„ ํƒํ•˜๋ฉฐ, ์ฃผ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ œ์ถœํ•˜๋ฉด ๋งค์žฅ ์ฃผ์ธ์ด ์ฃผ๋ฌธ ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  1. ๋ฉ”๋‰ด ํŽ˜์ด์ง€: ํ”ผ์ž ์ข…๋ฅ˜(๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€, ํŽ˜ํผ๋กœ๋‹ˆ, ์ฝค๋น„๋„ค์ด์…˜ ๋“ฑ) ๋ชฉ๋ก ํ‘œ์‹œ, ๊ฐ ํ”ผ์ž๋ณ„ ์„ค๋ช…ยท๊ฐ€๊ฒฉยท์‚ฌ์ง„ ํฌํ•จ
  2. ์ฃผ๋ฌธ ํผ: ๊ณ ๊ฐ์ด ํ”ผ์ž ํฌ๊ธฐ(Small/Medium/Large) ์„ ํƒ, ์ถ”๊ฐ€ ํ† ํ•‘(์˜ฌ๋ฆฌ๋ธŒ, ๋ฒ„์„ฏ, ๋ฒ ์ด์ปจ ๋“ฑ) ์„ ํƒ(์ฒดํฌ๋ฐ•์Šค), ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ, ๋ฐฐ๋‹ฌ ์ฃผ์†Œยท์—ฐ๋ฝ์ฒ˜ ์ž…๋ ฅ
  3. ์ฃผ๋ฌธ ์ €์žฅ: ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ SQLite DB์— ์ €์žฅ(orders ํ…Œ์ด๋ธ”: id, customer_name, phone, address, pizza_type, size, toppings(JSON ๋˜๋Š” ์‰ผํ‘œ ๊ตฌ๋ถ„), quantity, total_price, status, created_at)
  4. ์ฃผ๋ฌธ ๋ชฉ๋ก ํŽ˜์ด์ง€(๊ด€๋ฆฌ์ž์šฉ): ์ ‘์ˆ˜๋œ ์ฃผ๋ฌธ์„ ์‹œ๊ฐ„ ์ˆœ์œผ๋กœ ํ‘œ์‹œ, ๊ฐ ์ฃผ๋ฌธ์˜ ์ƒํƒœ(์ ‘์ˆ˜/์ค€๋น„์ค‘/๋ฐฐ๋‹ฌ์ค‘/์™„๋ฃŒ) ํ‘œ์‹œ ๋ฐ ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ
  5. ์ฃผ๋ฌธ ์ƒ์„ธ ํŽ˜์ด์ง€: ๊ฐœ๋ณ„ ์ฃผ๋ฌธ ๋‚ด์—ญ ์ƒ์„ธ ํ™•์ธ(๊ณ ๊ฐ ์ •๋ณด, ์ฃผ๋ฌธ ๋‚ด์šฉ, ์ด ๊ธˆ์•ก, ์ฃผ๋ฌธ ์‹œ๊ฐ)
  6. ๋ฐ˜์‘ํ˜• ๋””์ž์ธ: ๋ชจ๋ฐ”์ผ์—์„œ๋„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋„๋ก Tailwind CSS ๋˜๋Š” ์ˆœ์ˆ˜ CSS๋กœ ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„
  7. ์ž…๋ ฅ ๊ฒ€์ฆ: ๊ณ ๊ฐ ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ฃผ์†Œ ํ•„์ˆ˜ ์ž…๋ ฅ, ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹ ๊ฒ€์ฆ(์ •๊ทœ์‹), XSS ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ์ถœ๋ ฅ ์ด์Šค์ผ€์ดํ”„
  8. CSRF ๋ฐฉ์–ด: ์ฃผ๋ฌธ ํผ์— CSRF ํ† ํฐ ์ถ”๊ฐ€ํ•˜์—ฌ ์œ„์กฐ ์š”์ฒญ ๋ฐฉ์–ด

์„ ํƒ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ(๋ณด๋„ˆ์Šค)

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

๊ธฐ์ˆ  ์Šคํƒ

  • ๋ฐฑ์—”๋“œ: PHP 8.3+ (Vanilla PHP, ํ”„๋ ˆ์ž„์›Œํฌ ์—†์Œ)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: SQLite (PDO ์‚ฌ์šฉ)
  • ํ”„๋ก ํŠธ์—”๋“œ: HTML5, CSS3 (Tailwind CDN ๊ถŒ์žฅ), JavaScript (๋ฐ”๋‹๋ผ ๋˜๋Š” ๊ฐ„๋‹จํ•œ Alpine.js)
  • ์„œ๋ฒ„: PHP ๋‚ด์žฅ ์„œ๋ฒ„ (php -S localhost:8000)

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์˜ˆ์‹œ

pizza-shop-online-ordering/
โ”œโ”€โ”€ index.php              # ๋ฉ”์ธ ํŽ˜์ด์ง€(๋ฉ”๋‰ด ๋ชฉ๋ก)
โ”œโ”€โ”€ order.php              # ์ฃผ๋ฌธ ํผ ํŽ˜์ด์ง€
โ”œโ”€โ”€ process_order.php      # ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋กœ์ง
โ”œโ”€โ”€ admin.php              # ๊ด€๋ฆฌ์ž ์ฃผ๋ฌธ ๋ชฉ๋ก
โ”œโ”€โ”€ update_status.php      # ์ฃผ๋ฌธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ
โ”œโ”€โ”€ order_detail.php       # ์ฃผ๋ฌธ ์ƒ์„ธ ํŽ˜์ด์ง€
โ”œโ”€โ”€ db.php                 # DB ์—ฐ๊ฒฐ ๋ฐ ์ดˆ๊ธฐํ™”
โ”œโ”€โ”€ functions.php          # ๊ณตํ†ต ํ•จ์ˆ˜(escape, CSRF ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ ๋“ฑ)
โ”œโ”€โ”€ styles.css             # ์ปค์Šคํ…€ ์Šคํƒ€์ผ
โ””โ”€โ”€ pizza.db               # SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ

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

  • PHP์—์„œ ํผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ(POST) ๋ฐ ๊ฒ€์ฆ
  • PDO๋ฅผ ํ™œ์šฉํ•œ SQLite CRUD ์ž‘์—…
  • ์„ธ์…˜ ๊ธฐ๋ฐ˜ CSRF ํ† ํฐ ๊ตฌํ˜„
  • ๊ด€๋ฆฌ์ž์™€ ๊ณ ๊ฐ ํ™”๋ฉด ๋ถ„๋ฆฌ ์„ค๊ณ„
  • ์‹ค์šฉ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„(๊ฐ€๊ฒฉ ๊ณ„์‚ฐ, ์ƒํƒœ ๊ด€๋ฆฌ)

์ œ์•ฝ ์กฐ๊ฑด

  • โ€ข PHP 8.3 ์ด์ƒ ์‚ฌ์šฉ (Laravel, Symfony ๋“ฑ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธˆ์ง€)
  • โ€ข SQLite + PDO๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ (MySQL ์‚ฌ์šฉ ๊ธˆ์ง€)
  • โ€ข Composer ํŒจํ‚ค์ง€ ์‚ฌ์šฉ ๊ธˆ์ง€ (์ˆœ์ˆ˜ PHP ์ฝ”๋“œ๋กœ๋งŒ ๊ตฌํ˜„)
  • โ€ข ํ”„๋ก ํŠธ์—”๋“œ๋Š” HTML/CSS/JavaScript๋งŒ ์‚ฌ์šฉ (React, Vue ๋“ฑ ๊ธˆ์ง€)
  • โ€ข ๋นŒ๋“œ ๋„๊ตฌ(Webpack, Vite ๋“ฑ) ์‚ฌ์šฉ ๊ธˆ์ง€
  • โ€ข PHP ๋‚ด์žฅ ์„œ๋ฒ„๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ (`php -S localhost:8000`)
  • โ€ข ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์€ htmlspecialchars()๋กœ ์ด์Šค์ผ€์ดํ”„
  • โ€ข SQL ์ธ์ ์…˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด prepared statement ์‚ฌ์šฉ
  • โ€ข CSRF ํ† ํฐ์„ ์„ธ์…˜์— ์ €์žฅํ•˜๊ณ  ํผ ์ œ์ถœ ์‹œ ๊ฒ€์ฆ
  • โ€ข ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ ํ™•์žฅ์ž ๊ฒ€์ฆ ๋ฐ ์•ˆ์ „ํ•œ ๊ฒฝ๋กœ์— ์ €์žฅ

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

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

1
Step 1
mkdir pizza-shop-online-ordering && cd pizza-shop-online-ordering

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

ํ”ผ์ž ๋งค์žฅ ์˜จ๋ผ์ธ ์ฃผ๋ฌธ ํ”Œ๋žซํผ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**

1. `db.php` ํŒŒ์ผ ์ƒ์„ฑ:
   - PDO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(`pizza.db`) ์—ฐ๊ฒฐ
   - `orders` ํ…Œ์ด๋ธ” ์ž๋™ ์ƒ์„ฑ (์—†์œผ๋ฉด):
     - id (INTEGER PRIMARY KEY AUTOINCREMENT)
     - customer_name (TEXT NOT NULL)
     - phone (TEXT NOT NULL)
     - address (TEXT NOT NULL)
     - pizza_type (TEXT NOT NULL)
     - size (TEXT NOT NULL)
     - toppings (TEXT) -- JSON ํ˜•์‹ ๋˜๋Š” ์‰ผํ‘œ ๊ตฌ๋ถ„ ๋ฌธ์ž์—ด
     - quantity (INTEGER NOT NULL)
     - total_price (INTEGER NOT NULL)
     - status (TEXT DEFAULT 'pending') -- pending/preparing/delivering/completed
     - created_at (TEXT DEFAULT CURRENT_TIMESTAMP)

2. `functions.php` ํŒŒ์ผ ์ƒ์„ฑ:
   - `escape($str)`: htmlspecialchars() ๋ž˜ํผ ํ•จ์ˆ˜
   - `generate_csrf_token()`: ์„ธ์…˜์— CSRF ํ† ํฐ ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜
   - `verify_csrf_token($token)`: ์„ธ์…˜์˜ ํ† ํฐ๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ฆ
   - `calculate_price($pizza_type, $size, $toppings, $quantity)`: ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ๋กœ์ง
     - ํ”ผ์ž ๊ธฐ๋ณธ ๊ฐ€๊ฒฉ: ๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€ 10000์›, ํŽ˜ํผ๋กœ๋‹ˆ 12000์›, ์ฝค๋น„๋„ค์ด์…˜ 14000์›
     - ํฌ๊ธฐ๋ณ„ ๋ฐฐ์œจ: Small 1.0, Medium 1.3, Large 1.6
     - ํ† ํ•‘ ์ถ”๊ฐ€: ๊ฐ ํ† ํ•‘๋‹น 1000์›
     - ์ด ๊ฐ€๊ฒฉ = (๊ธฐ๋ณธ ๊ฐ€๊ฒฉ ร— ํฌ๊ธฐ ๋ฐฐ์œจ + ํ† ํ•‘ ๊ฐœ์ˆ˜ ร— 1000์›) ร— ์ˆ˜๋Ÿ‰

3. `index.php` ํŒŒ์ผ ์ƒ์„ฑ:
   - ๋ฉ”๋‰ด ํŽ˜์ด์ง€: ํ”ผ์ž ์ข…๋ฅ˜ ๋ชฉ๋ก ํ‘œ์‹œ (๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€, ํŽ˜ํผ๋กœ๋‹ˆ, ์ฝค๋น„๋„ค์ด์…˜)
   - ๊ฐ ํ”ผ์ž๋ณ„๋กœ ์ด๋ฆ„, ์„ค๋ช…, ๊ธฐ๋ณธ ๊ฐ€๊ฒฉ ํ‘œ์‹œ
   - "์ฃผ๋ฌธํ•˜๊ธฐ" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ `order.php?pizza=๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€` ํ˜•์‹์œผ๋กœ ์ด๋™
   - Tailwind CSS CDN ์‚ฌ์šฉํ•˜์—ฌ ๊น”๋”ํ•œ ์นด๋“œ ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„

4. PHP ๋‚ด์žฅ ์„œ๋ฒ„๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •

**์ถœ๋ ฅ ์˜ˆ์‹œ:**

- `db.php`์—์„œ DB ์—ฐ๊ฒฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ๋˜๋Š” ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ™•์ธ
- `index.php`๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๋ฉด ํ”ผ์ž ๋ฉ”๋‰ด ์นด๋“œ 3๊ฐœ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ํ‘œ์‹œ
- ๊ฐ ์นด๋“œ์— "์ฃผ๋ฌธํ•˜๊ธฐ" ๋ฒ„ํŠผ ํฌํ•จ

**์ฐธ๊ณ :**

- ์„ธ์…˜ ์‹œ์ž‘์€ ๊ฐ PHP ํŒŒ์ผ ์ƒ๋‹จ์—์„œ `session_start()` ํ˜ธ์ถœ
- ์—๋Ÿฌ ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ ์ค‘์—๋Š” `error_reporting(E_ALL); ini_set('display_errors', 1);` ์ถ”๊ฐ€

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ํ”„๋กœ์ ํŠธ ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , db.php๋กœ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ orders ํ…Œ์ด๋ธ”์ด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. functions.php์— ๊ณตํ†ต ํ•จ์ˆ˜๋“ค์ด ์ •์˜๋˜๊ณ , index.php์—์„œ ํ”ผ์ž ๋ฉ”๋‰ด 3์ข…์ด ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์นด๋“œ์—๋Š” ํ”ผ์ž ์ด๋ฆ„, ์„ค๋ช…, ๊ธฐ๋ณธ ๊ฐ€๊ฒฉ, '์ฃผ๋ฌธํ•˜๊ธฐ' ๋ฒ„ํŠผ์ด ํฌํ•จ๋˜๋ฉฐ, Tailwind CSS๋กœ ์Šคํƒ€์ผ๋ง๋˜์–ด ๊น”๋”ํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

2
Step 2
์ฃผ๋ฌธ ํผ ํŽ˜์ด์ง€(`order.php`)๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**

1. GET ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ `pizza` ๊ฐ’์„ ๋ฐ›์•„ ํ•ด๋‹น ํ”ผ์ž ์ด๋ฆ„์„ ํผ์— ์ž๋™ ์ž…๋ ฅ
2. ์ฃผ๋ฌธ ํผ ๊ตฌ์„ฑ:
   - ํ”ผ์ž ์ข…๋ฅ˜: ์„ ํƒ๋œ ํ”ผ์ž ์ด๋ฆ„ ํ‘œ์‹œ (์ฝ๊ธฐ ์ „์šฉ ๋˜๋Š” hidden input)
   - ํฌ๊ธฐ ์„ ํƒ: ๋ผ๋””์˜ค ๋ฒ„ํŠผ (Small/Medium/Large)
   - ์ถ”๊ฐ€ ํ† ํ•‘: ์ฒดํฌ๋ฐ•์Šค (์˜ฌ๋ฆฌ๋ธŒ, ๋ฒ„์„ฏ, ๋ฒ ์ด์ปจ, ๊ณ ์ถ”, ํŒŒ์ธ์• ํ”Œ, ์น˜์ฆˆ ์ถ”๊ฐ€ ๋“ฑ 5~6๊ฐœ)
   - ์ˆ˜๋Ÿ‰: ์ˆซ์ž ์ž…๋ ฅ (๊ธฐ๋ณธ๊ฐ’ 1, ์ตœ์†Œ 1)
   - ๊ณ ๊ฐ ์ด๋ฆ„: ํ…์ŠคํŠธ ์ž…๋ ฅ (ํ•„์ˆ˜)
   - ์ „ํ™”๋ฒˆํ˜ธ: ํ…์ŠคํŠธ ์ž…๋ ฅ (ํ•„์ˆ˜, placeholder: 010-1234-5678)
   - ๋ฐฐ๋‹ฌ ์ฃผ์†Œ: ํ…์ŠคํŠธ ์ž…๋ ฅ (ํ•„์ˆ˜)
   - CSRF ํ† ํฐ: hidden input์œผ๋กœ ํฌํ•จ
   - "์ฃผ๋ฌธํ•˜๊ธฐ" ๋ฒ„ํŠผ

3. ํผ ์ œ์ถœ ์‹œ `process_order.php`๋กœ POST ์ „์†ก

4. JavaScript๋กœ ์‹ค์‹œ๊ฐ„ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ํ‘œ์‹œ:
   - ํฌ๊ธฐ, ํ† ํ•‘, ์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝ ์‹œ ์˜ˆ์ƒ ์ด ๊ฐ€๊ฒฉ์„ ํ™”๋ฉด์— ํ‘œ์‹œ
   - `calculate_price()` ํ•จ์ˆ˜๋ฅผ JavaScript๋กœ๋„ ๊ตฌํ˜„ (๋˜๋Š” AJAX๋กœ PHP ํ•จ์ˆ˜ ํ˜ธ์ถœ)

5. ๋ฐ˜์‘ํ˜• ๋””์ž์ธ: ๋ชจ๋ฐ”์ผ์—์„œ๋„ ์ž…๋ ฅํ•˜๊ธฐ ํŽธํ•˜๋„๋ก ํผ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”

**์ถœ๋ ฅ ์˜ˆ์‹œ:**

- `order.php?pizza=๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€`๋กœ ์ ‘์†ํ•˜๋ฉด ์ฃผ๋ฌธ ํผ์ด ํ‘œ์‹œ
- ํ”ผ์ž ์ด๋ฆ„์ด "๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€"๋กœ ์ž๋™ ์„ค์ •
- ํฌ๊ธฐ, ํ† ํ•‘, ์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝ ์‹œ ํ•˜๋‹จ์— "์˜ˆ์ƒ ๊ฐ€๊ฒฉ: 15,000์›" ํ˜•ํƒœ๋กœ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ
- ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ ฌ๋˜๊ณ  ๋ชจ๋ฐ”์ผ์—์„œ๋„ ์ž˜ ๋ณด์ž„

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: order.php ํŽ˜์ด์ง€๊ฐ€ ์ƒ์„ฑ๋˜์–ด GET ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ํ”ผ์ž ์ข…๋ฅ˜๋ฅผ ๋ฐ›์•„ ํผ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ฐ์€ ํฌ๊ธฐ(๋ผ๋””์˜ค), ํ† ํ•‘(์ฒดํฌ๋ฐ•์Šค), ์ˆ˜๋Ÿ‰์„ ์„ ํƒํ•˜๊ณ  ์ด๋ฆ„/์ „ํ™”๋ฒˆํ˜ธ/์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript๋กœ ์‹ค์‹œ๊ฐ„ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ์ด ๊ตฌํ˜„๋˜์–ด, ์˜ต์…˜ ๋ณ€๊ฒฝ ์‹œ ์˜ˆ์ƒ ์ด ๊ฐ€๊ฒฉ์ด ํ™”๋ฉด์— ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. CSRF ํ† ํฐ์ด hidden input์œผ๋กœ ํฌํ•จ๋˜๋ฉฐ, ํผ์€ process_order.php๋กœ POST ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

3
Step 3
์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋กœ์ง(`process_order.php`)์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**

1. POST ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ:
   - CSRF ํ† ํฐ ๊ฒ€์ฆ (`verify_csrf_token()` ์‚ฌ์šฉ)
   - ๋ชจ๋“  ํ•„์ˆ˜ ํ•„๋“œ(customer_name, phone, address, pizza_type, size, quantity) ์กด์žฌ ํ™•์ธ
   - ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹ ๊ฒ€์ฆ (์ •๊ทœ์‹: `/^010-\d{4}-\d{4}$/`)
   - ์ˆ˜๋Ÿ‰์ด 1 ์ด์ƒ์ธ์ง€ ํ™•์ธ

2. ํ† ํ•‘ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ:
   - ์ฒดํฌ๋ฐ•์Šค ๋ฐฐ์—ด์„ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅ (`json_encode()`)

3. ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ:
   - `calculate_price()` ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜์—ฌ ์ด ๊ฐ€๊ฒฉ ์‚ฐ์ถœ

4. DB์— ์ฃผ๋ฌธ ์ €์žฅ:
   - PDO prepared statement ์‚ฌ์šฉํ•˜์—ฌ orders ํ…Œ์ด๋ธ”์— INSERT
   - status๋Š” ๊ธฐ๋ณธ๊ฐ’ 'pending'์œผ๋กœ ์„ค์ •

5. ์ €์žฅ ์„ฑ๊ณต ์‹œ:
   - ์„ธ์…˜์— ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ์ €์žฅ (`$_SESSION['success'] = '์ฃผ๋ฌธ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค!'`)
   - `index.php`๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

6. ์‹คํŒจ ์‹œ:
   - ์„ธ์…˜์— ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ €์žฅ
   - `order.php`๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (์ž…๋ ฅ๊ฐ’ ์œ ์ง€๋ฅผ ์œ„ํ•ด GET ํŒŒ๋ผ๋ฏธํ„ฐ ํฌํ•จ)

**์ถœ๋ ฅ ์˜ˆ์‹œ:**

- ์ฃผ๋ฌธ ์„ฑ๊ณต ์‹œ: `index.php`๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๋ฉฐ ์ƒ๋‹จ์— "์ฃผ๋ฌธ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค!" ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
- ๊ฒ€์ฆ ์‹คํŒจ ์‹œ: `order.php`๋กœ ๋Œ์•„๊ฐ€๋ฉฐ "์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค" ๋“ฑ์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
- DB์— ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ ์ €์žฅ๋จ (SQLite ํŒŒ์ผ ํ™•์ธ ๊ฐ€๋Šฅ)

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: process_order.php๊ฐ€ ์ƒ์„ฑ๋˜์–ด POST ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. CSRF ํ† ํฐ ๋ฐ ํ•„์ˆ˜ ํ•„๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹์„ ์ •๊ทœ์‹์œผ๋กœ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ํ† ํ•‘ ๋ฐฐ์—ด์€ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด DB์— ์ €์žฅ๋˜๋ฉฐ, calculate_price() ํ•จ์ˆ˜๋กœ ์ด ๊ฐ€๊ฒฉ์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋ฌธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜๋ฉด ์„ธ์…˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ index.php๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๊ณ , ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ order.php๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

4
Step 4
๊ด€๋ฆฌ์ž ์ฃผ๋ฌธ ๋ชฉ๋ก ํŽ˜์ด์ง€(`admin.php`)๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**

1. DB์—์„œ ๋ชจ๋“  ์ฃผ๋ฌธ ์กฐํšŒ:
   - orders ํ…Œ์ด๋ธ”์—์„œ ์ตœ์‹  ์ฃผ๋ฌธ๋ถ€ํ„ฐ ์ •๋ ฌ (ORDER BY created_at DESC)
   - ์ฃผ๋ฌธ ID, ๊ณ ๊ฐ ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ, ํ”ผ์ž ์ข…๋ฅ˜, ํฌ๊ธฐ, ์ˆ˜๋Ÿ‰, ์ด ๊ฐ€๊ฒฉ, ์ƒํƒœ, ์ฃผ๋ฌธ ์‹œ๊ฐ ํ‘œ์‹œ

2. ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์ฃผ๋ฌธ ๋ชฉ๋ก ํ‘œ์‹œ:
   - ๊ฐ ํ–‰์— ์ฃผ๋ฌธ ์ •๋ณด ํ‘œ์‹œ
   - ์ƒํƒœ๋ณ„๋กœ ๋ฐฐ๊ฒฝ์ƒ‰ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ (pending: ๋…ธ๋ž‘, preparing: ํŒŒ๋ž‘, delivering: ์ดˆ๋ก, completed: ํšŒ์ƒ‰)
   - ๊ฐ ํ–‰์— "์ƒ์„ธ๋ณด๊ธฐ" ๋งํฌ (`order_detail.php?id=์ฃผ๋ฌธID`)
   - ๊ฐ ํ–‰์— ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ 4๊ฐœ (์ ‘์ˆ˜/์ค€๋น„์ค‘/๋ฐฐ๋‹ฌ์ค‘/์™„๋ฃŒ)

3. ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ:
   - ํด๋ฆญ ์‹œ `update_status.php?id=์ฃผ๋ฌธID&status=์ƒˆ์ƒํƒœ`๋กœ ์ด๋™
   - CSRF ํ† ํฐ ํฌํ•จ (GET ํŒŒ๋ผ๋ฏธํ„ฐ ๋˜๋Š” ํผ POST)

4. ์ฃผ๋ฌธ์ด ์—†์„ ๊ฒฝ์šฐ "์•„์ง ์ฃผ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค" ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ

5. ๊ฐ„๋‹จํ•œ ํ†ต๊ณ„ ํ‘œ์‹œ (์„ ํƒ):
   - ์˜ค๋Š˜ ์ฃผ๋ฌธ ๊ฑด์ˆ˜, ์ด ๋งค์ถœ (์ƒํƒœ๊ฐ€ completed์ธ ์ฃผ๋ฌธ ํ•ฉ๊ณ„)

**์ถœ๋ ฅ ์˜ˆ์‹œ:**

- `admin.php` ์ ‘์† ์‹œ ์ฃผ๋ฌธ ๋ชฉ๋ก์ด ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ํ‘œ์‹œ
- ๊ฐ ์ฃผ๋ฌธ์˜ ์ƒํƒœ๊ฐ€ ์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ํ•œ๋ˆˆ์— ํŒŒ์•… ๊ฐ€๋Šฅ
- "์ƒ์„ธ๋ณด๊ธฐ" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์ฃผ๋ฌธ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
- ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ฆ‰์‹œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: admin.php ํŽ˜์ด์ง€๊ฐ€ ์ƒ์„ฑ๋˜์–ด DB์—์„œ ๋ชจ๋“  ์ฃผ๋ฌธ์„ ์ตœ์‹ ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๊ณ  ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ฃผ๋ฌธ์˜ ์ƒํƒœ(pending/preparing/delivering/completed)์— ๋”ฐ๋ผ ํ–‰ ๋ฐฐ๊ฒฝ์ƒ‰์ด ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜์–ด ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๊ฐ ํ–‰์—๋Š” '์ƒ์„ธ๋ณด๊ธฐ' ๋งํฌ์™€ ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ 4๊ฐœ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ update_status.php๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ฌธ์ด ์—†์œผ๋ฉด ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

5
Step 5
์ฃผ๋ฌธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ(`update_status.php`)์™€ ์ฃผ๋ฌธ ์ƒ์„ธ ํŽ˜์ด์ง€(`order_detail.php`)๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.

**1. update_status.php ์š”๊ตฌ์‚ฌํ•ญ:**

- GET ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ `id`(์ฃผ๋ฌธ ID)์™€ `status`(์ƒˆ ์ƒํƒœ) ๋ฐ›๊ธฐ
- CSRF ํ† ํฐ ๊ฒ€์ฆ (GET ๋ฐฉ์‹์ด๋ฏ€๋กœ Referer ์ฒดํฌ ๋˜๋Š” POST๋กœ ๋ณ€๊ฒฝ ๊ถŒ์žฅ)
- status ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ํ™•์ธ (pending, preparing, delivering, completed ์ค‘ ํ•˜๋‚˜)
- PDO prepared statement๋กœ ํ•ด๋‹น ์ฃผ๋ฌธ์˜ status ํ•„๋“œ ์—…๋ฐ์ดํŠธ
- ์—…๋ฐ์ดํŠธ ์„ฑ๊ณต ์‹œ ์„ธ์…˜ ๋ฉ”์‹œ์ง€ ์ €์žฅ ํ›„ `admin.php`๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
- ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

**2. order_detail.php ์š”๊ตฌ์‚ฌํ•ญ:**

- GET ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ `id`(์ฃผ๋ฌธ ID) ๋ฐ›๊ธฐ
- DB์—์„œ ํ•ด๋‹น ์ฃผ๋ฌธ ์ •๋ณด ์กฐํšŒ
- ์ฃผ๋ฌธ ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ:
  - ์ฃผ๋ฌธ ๋ฒˆํ˜ธ, ์ฃผ๋ฌธ ์‹œ๊ฐ
  - ๊ณ ๊ฐ ์ •๋ณด: ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ, ๋ฐฐ๋‹ฌ ์ฃผ์†Œ
  - ์ฃผ๋ฌธ ๋‚ด์šฉ: ํ”ผ์ž ์ข…๋ฅ˜, ํฌ๊ธฐ, ์ˆ˜๋Ÿ‰
  - ์ถ”๊ฐ€ ํ† ํ•‘: JSON ๋””์ฝ”๋”ฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ
  - ์ด ๊ฐ€๊ฒฉ
  - ํ˜„์žฌ ์ƒํƒœ (๋ฐฐ์ง€ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ)
- "๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ" ๋ฒ„ํŠผ (`admin.php`๋กœ ์ด๋™)
- ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์œผ๋กœ ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๋ณด๊ธฐ ์ข‹๊ฒŒ

**์ถœ๋ ฅ ์˜ˆ์‹œ:**

- `update_status.php?id=1&status=preparing` ํ˜ธ์ถœ ์‹œ ์ฃผ๋ฌธ 1๋ฒˆ์˜ ์ƒํƒœ๊ฐ€ 'preparing'์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  admin.php๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
- `order_detail.php?id=1` ์ ‘์† ์‹œ ์ฃผ๋ฌธ 1๋ฒˆ์˜ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ํ‘œ์‹œ
- ํ† ํ•‘ ๋ชฉ๋ก์ด "์˜ฌ๋ฆฌ๋ธŒ, ๋ฒ„์„ฏ, ๋ฒ ์ด์ปจ" ํ˜•ํƒœ๋กœ ํ‘œ์‹œ
- ์ƒํƒœ๊ฐ€ ๋ฐฐ์ง€(badge) ์Šคํƒ€์ผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: update_status.php๊ฐ€ ์ƒ์„ฑ๋˜์–ด GET ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ๋ฌธ ID์™€ ์ƒˆ ์ƒํƒœ๋ฅผ ๋ฐ›์•„ ๊ฒ€์ฆํ•œ ๋’ค DB๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ณ  PDO prepared statement๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. order_detail.php๋Š” ์ฃผ๋ฌธ ID๋กœ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ ๊ณ ๊ฐ ์ •๋ณด, ์ฃผ๋ฌธ ๋‚ด์šฉ, ํ† ํ•‘ ๋ชฉ๋ก(JSON ๋””์ฝ”๋”ฉ), ์ด ๊ฐ€๊ฒฉ, ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ† ํ•‘์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ถœ๋ ฅ๋˜๋ฉฐ, ์ƒํƒœ๋Š” ๋ฐฐ์ง€ ํ˜•ํƒœ๋กœ ๊ฐ•์กฐ๋ฉ๋‹ˆ๋‹ค.

6
Step 6
ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•ด์ฃผ์„ธ์š”.

**์š”๊ตฌ์‚ฌํ•ญ:**

1. `index.php`์— ์„ธ์…˜ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ:
   - ์ฃผ๋ฌธ ์„ฑ๊ณต/์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ๋‹จ์— ํ‘œ์‹œ (์•Œ๋ฆผ ๋ฐ•์Šค ํ˜•ํƒœ)
   - ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ ํ›„ ์„ธ์…˜์—์„œ ์ œ๊ฑฐ (ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ)

2. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ฐ•ํ™”:
   - ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ฃผ๋ฌธ ID ์ ‘๊ทผ ์‹œ 404 ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
   - DB ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž ์นœํ™”์  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

3. ๋ณด์•ˆ ๊ฐ•ํ™”:
   - ๋ชจ๋“  ์ถœ๋ ฅ์— `escape()` ํ•จ์ˆ˜ ์ ์šฉ ํ™•์ธ
   - SQL ์ธ์ ์…˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ prepared statement์ธ์ง€ ํ™•์ธ
   - CSRF ํ† ํฐ์ด ๋ชจ๋“  ํผ์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

4. ์Šคํƒ€์ผ ๊ฐœ์„ :
   - `styles.css` ํŒŒ์ผ ์ƒ์„ฑ (๋˜๋Š” Tailwind ์ปค์Šคํ„ฐ๋งˆ์ด์ง•)
   - ๋ฒ„ํŠผ ํ˜ธ๋ฒ„ ํšจ๊ณผ, ์นด๋“œ ๊ทธ๋ฆผ์ž, ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ ์ถ”๊ฐ€
   - ๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• ์ตœ์ข… ์ ๊ฒ€

5. README.md ์ž‘์„ฑ:
   - ํ”„๋กœ์ ํŠธ ์„ค๋ช…
   - ์‹คํ–‰ ๋ฐฉ๋ฒ• (`php -S localhost:8000`)
   - ์ฃผ์š” ๊ธฐ๋Šฅ ๋ชฉ๋ก
   - ์Šคํฌ๋ฆฐ์ƒท (์„ ํƒ)

6. ํ…Œ์ŠคํŠธ:
   - ์ฃผ๋ฌธ ์ƒ์„ฑ, ๋ชฉ๋ก ์กฐํšŒ, ์ƒํƒœ ๋ณ€๊ฒฝ, ์ƒ์„ธ ๋ณด๊ธฐ ์ „์ฒด ํ”Œ๋กœ์šฐ ํ…Œ์ŠคํŠธ
   - ๋‹ค์–‘ํ•œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๊ฒ€์ฆ ๋กœ์ง ํ…Œ์ŠคํŠธ (๋นˆ ๊ฐ’, ์ž˜๋ชป๋œ ํ˜•์‹ ๋“ฑ)

**์ถœ๋ ฅ ์˜ˆ์‹œ:**

- ์ฃผ๋ฌธ ์„ฑ๊ณต ํ›„ index.php ์ƒ๋‹จ์— ์ดˆ๋ก์ƒ‰ ์•Œ๋ฆผ ๋ฐ•์Šค๋กœ "์ฃผ๋ฌธ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค!" ํ‘œ์‹œ
- ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ฃผ๋ฌธ ID๋กœ ์ ‘๊ทผ ์‹œ "์ฃผ๋ฌธ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
- ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๊น”๋”ํ•˜๊ณ  ์ผ๊ด€๋œ ๋””์ž์ธ์œผ๋กœ ํ†ต์ผ
- README.md์— ํ”„๋กœ์ ํŠธ ์„ค๋ช…๊ณผ ์‹คํ–‰ ๋ฐฉ๋ฒ• ๋ช…์‹œ
- ์ „์ฒด ๊ธฐ๋Šฅ์ด ์ •์ƒ ๋™์ž‘ํ•˜๋ฉฐ ๋ณด์•ˆ ์ทจ์•ฝ์  ์—†์Œ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์„ฑ๋˜์–ด ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. index.php์— ์„ธ์…˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์•Œ๋ฆผ ๋ฐ•์Šค๋กœ ํ‘œ์‹œ๋˜๊ณ , ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•ํ™”๋˜์–ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ฃผ๋ฌธ ์ ‘๊ทผ ์‹œ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ถœ๋ ฅ์ด escape()๋กœ ๋ณดํ˜ธ๋˜๊ณ , SQL ์ฟผ๋ฆฌ๋Š” prepared statement๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ, CSRF ํ† ํฐ์ด ๋ชจ๋“  ํผ์— ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. styles.css๋กœ ๋ฒ„ํŠผ ํ˜ธ๋ฒ„ ํšจ๊ณผ์™€ ์นด๋“œ ๊ทธ๋ฆผ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์–ด UI๊ฐ€ ๊ฐœ์„ ๋˜๊ณ , README.md์— ํ”„๋กœ์ ํŠธ ์„ค๋ช…๊ณผ ์‹คํ–‰ ๋ฐฉ๋ฒ•์ด ๋ฌธ์„œํ™”๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ํ”Œ๋กœ์šฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์•ˆ์ •์„ฑ์ด ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค.

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

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

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

๋Œ“๊ธ€ (0)

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