๐ŸŽจ g5se ํฌ๋ฆฌ์—์ดํ„ฐ ์ž‘ํ’ˆ ์˜๋ขฐ ๊ฒฌ์  ์ž๋™ ์‚ฐ์ถœ๊ธฐ - ํ”„๋กœ์ ํŠธ ์Šค์ฝ”ํ”„ ๊ธฐ๋ฐ˜ ๊ฒฌ์ ์„œ ์ƒ์„ฑ & ๊ณ ๊ฐ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ - ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ๋ ˆ์‹œํ”ผ
๊ณ ๊ธ‰ PHP g5se AI: Claude

๐ŸŽจ g5se ํฌ๋ฆฌ์—์ดํ„ฐ ์ž‘ํ’ˆ ์˜๋ขฐ ๊ฒฌ์  ์ž๋™ ์‚ฐ์ถœ๊ธฐ - ํ”„๋กœ์ ํŠธ ์Šค์ฝ”ํ”„ ๊ธฐ๋ฐ˜ ๊ฒฌ์ ์„œ ์ƒ์„ฑ & ๊ณ ๊ฐ ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ช… g5se-creator-quote-calculator
์กฐํšŒ์ˆ˜ 50 0๊ฑด ์ œ์ถœ

๋ฌธ์ œ ์„ค๋ช…

๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

ํ”„๋ฆฌ๋žœ์„œ ํฌ๋ฆฌ์—์ดํ„ฐ(์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ดํ„ฐ, ๋””์ž์ด๋„ˆ, ๊ฐœ๋ฐœ์ž ๋“ฑ)๊ฐ€ ๊ณ ๊ฐ์œผ๋กœ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ ์˜๋ขฐ๋ฅผ ๋ฐ›์„ ๋•Œ, ์ž‘์—… ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๊ฒฌ์ ์„ ์‚ฐ์ถœํ•˜๊ณ  ๊ณ ๊ฐ์ด ์˜จ๋ผ์ธ์œผ๋กœ ๊ฒ€ํ† ยท์Šน์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ’€์Šคํƒ ๊ฒฌ์  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. g5se์˜ ํด๋” ์ž๋™ ๋ผ์šฐํŒ…๊ณผ modern shell์„ ํ™œ์šฉํ•˜์—ฌ ํฌ๋ฆฌ์—์ดํ„ฐ์™€ ๊ณ ๊ฐ ์–‘์ธก ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•œ UX๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ํ•„์ˆ˜ ๊ธฐ๋Šฅ

1. ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ (/creator-quote/dashboard)

  • ์˜๋ขฐ ๋ชฉ๋ก (๋Œ€๊ธฐ/์Šน์ธ/๊ฑฐ์ ˆ/์™„๋ฃŒ ์ƒํƒœ๋ณ„ ํ•„ํ„ฐ)
  • ๊ฐ ์˜๋ขฐ์˜ ๊ฒฌ์  ๊ธˆ์•ก, ๊ณ ๊ฐ๋ช…, ์ œ์ถœ์ผ, ์ƒํƒœ ํ‘œ์‹œ
  • ์‹ ๊ทœ ์˜๋ขฐ ์•Œ๋ฆผ ๋ฐฐ์ง€ (๋ฏธํ™•์ธ ๊ฑด์ˆ˜)
  • ์˜๋ขฐ ์ƒ์„ธ ๋ณด๊ธฐ ๋ชจ๋‹ฌ (๊ณ ๊ฐ ์ž…๋ ฅ ๋‚ด์šฉ ์ „์ฒด ํ‘œ์‹œ)

2. ๊ฒฌ์  ์‚ฐ์ถœ ์„ค์ • ํŽ˜์ด์ง€ (/creator-quote/pricing)

  • ์ž‘์—… ์œ ํ˜•๋ณ„ ๊ธฐ๋ณธ ๋‹จ๊ฐ€ ์„ค์ • (์˜ˆ: ์บ๋ฆญํ„ฐ ๋””์ž์ธ, ๋กœ๊ณ , ์›น ํŽ˜์ด์ง€, ์ผ๋Ÿฌ์ŠคํŠธ ๋“ฑ)
  • ์ถ”๊ฐ€ ์˜ต์…˜ ๋‹จ๊ฐ€ (์˜ˆ: ์ˆ˜์ • ํšŸ์ˆ˜, ๊ธ‰ํ–‰๋ฃŒ, ์ƒ์—…์  ์ด์šฉ๊ถŒ, ์†Œ์Šค ํŒŒ์ผ ์ œ๊ณต ๋“ฑ)
  • ๋‚œ์ด๋„๋ณ„ ๋ฐฐ์œจ (๊ฐ„๋‹จ/๋ณดํ†ต/๋ณต์žก 1.0x/1.5x/2.0x)
  • ์„ค์ • ์ €์žฅ ์‹œ SQLite์— JSON ํ˜•ํƒœ๋กœ ์ €์žฅ

3. ๊ณ ๊ฐ ์˜๋ขฐ ์ ‘์ˆ˜ ํผ (/creator-quote/request)

  • ํ”„๋กœ์ ํŠธ ์ œ๋ชฉ, ์ƒ์„ธ ์„ค๋ช… (textarea)
  • ์ž‘์—… ์œ ํ˜• ์„ ํƒ (๋“œ๋กญ๋‹ค์šด)
  • ๋‚œ์ด๋„ ์„ ํƒ (๋ผ๋””์˜ค ๋ฒ„ํŠผ: ๊ฐ„๋‹จ/๋ณดํ†ต/๋ณต์žก)
  • ์ถ”๊ฐ€ ์˜ต์…˜ ์ฒดํฌ๋ฐ•์Šค (์—ฌ๋Ÿฌ ๊ฐœ ์„ ํƒ ๊ฐ€๋Šฅ)
  • ํฌ๋ง ๋‚ฉ๊ธฐ์ผ (date picker)
  • ์ฐธ๊ณ  ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ (์ตœ๋Œ€ 3์žฅ, ํŒŒ์ผ์€ G5_DATA_PATH/modules/creator-quote/uploads/ ํ•˜์œ„์— ์ €์žฅ)
  • ๊ณ ๊ฐ ์ด๋ฉ”์ผ (๊ฒฌ์ ์„œ ๋ฐœ์†ก์šฉ)
  • ์ œ์ถœ ์‹œ ์ž๋™ ๊ฒฌ์  ๊ณ„์‚ฐ ํ›„ DB ์ €์žฅ

4. ์ž๋™ ๊ฒฌ์  ์‚ฐ์ถœ ๋กœ์ง

  • ๊ธฐ๋ณธ ๋‹จ๊ฐ€ ร— ๋‚œ์ด๋„ ๋ฐฐ์œจ + ์ถ”๊ฐ€ ์˜ต์…˜ ํ•ฉ๊ณ„ = ์ตœ์ข… ๊ฒฌ์ 
  • ์˜ˆ: ์บ๋ฆญํ„ฐ ๋””์ž์ธ(50,000์›) ร— ๋ณต์žก(2.0x) + ์ˆ˜์ • 3ํšŒ(10,000์›) + ์ƒ์—…์  ์ด์šฉ๊ถŒ(30,000์›) = 140,000์›
  • ๊ฒฌ์  ๋‚ด์—ญ์„ ํ•ญ๋ชฉ๋ณ„๋กœ ํ‘œ์‹œ (ํˆฌ๋ช…์„ฑ)

5. ๊ณ ๊ฐ ๊ฒฌ์  ํ™•์ธ ํŽ˜์ด์ง€ (/creator-quote/view/[id])

  • ๋™์  segment๋กœ ์˜๋ขฐ ID ์บก์ฒ˜
  • ํ”„๋กœ์ ํŠธ ์ •๋ณด, ๊ฒฌ์  ๋‚ด์—ญ, ์ตœ์ข… ๊ธˆ์•ก ํ‘œ์‹œ
  • ์Šน์ธ/๊ฑฐ์ ˆ ๋ฒ„ํŠผ (ํด๋ฆญ ์‹œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ)
  • ๊ฑฐ์ ˆ ์‹œ ์‚ฌ์œ  ์ž…๋ ฅ (optional textarea)
  • ์Šน์ธ ์‹œ "๊ฒฌ์ ์„œ๊ฐ€ ์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ํ™•์ธ ๋ฉ”์‹œ์ง€

6. ๊ฒฌ์ ์„œ PDF ๋‹ค์šด๋กœ๋“œ (๋ณด๋„ˆ์Šค)

  • PHP์˜ TCPDF ๋˜๋Š” mPDF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ (CDN ์—†์ด ์ˆœ์ˆ˜ PHP)
  • ๊ฒฌ์  ๋‚ด์—ญ์„ ํ…Œ์ด๋ธ” ํ˜•์‹์œผ๋กœ PDF ์ƒ์„ฑ
  • ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋Š” ๊ณ ๊ฐ ํ™•์ธ ํŽ˜์ด์ง€์™€ ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ์— ํ‘œ์‹œ

7. ์ด๋ฉ”์ผ ์•Œ๋ฆผ (์„ ํƒ)

  • ๊ณ ๊ฐ์ด ์˜๋ขฐ ์ œ์ถœ ์‹œ ํฌ๋ฆฌ์—์ดํ„ฐ์—๊ฒŒ ์•Œ๋ฆผ (PHP mail() ํ•จ์ˆ˜)
  • ๊ณ ๊ฐ์ด ๊ฒฌ์  ์Šน์ธ/๊ฑฐ์ ˆ ์‹œ ํฌ๋ฆฌ์—์ดํ„ฐ์—๊ฒŒ ์•Œ๋ฆผ

๐ŸŽจ ๋””์ž์ธ ์š”๊ตฌ์‚ฌํ•ญ

  • modern shell ์‚ฌ์šฉ (nav, footer, ๋‹คํฌ๋ชจ๋“œ ํ† ๊ธ€ ์ž๋™ ํฌํ•จ)
  • ๋””์ž์ธ ํ† ํฐ (--m-surface, --m-text, --m-shadow ๋“ฑ) ํ™œ์šฉ
  • ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ๋Š” ํ…Œ์ด๋ธ” ๋ทฐ (์ƒํƒœ๋ณ„ ์ƒ‰์ƒ ๋ฐฐ์ง€)
  • ๊ณ ๊ฐ ์ ‘์ˆ˜ ํผ์€ ๋‹จ๊ณ„๋ณ„ ์„น์…˜ (ํ”„๋กœ์ ํŠธ ์ •๋ณด โ†’ ์˜ต์…˜ ์„ ํƒ โ†’ ์—ฐ๋ฝ์ฒ˜)
  • ๊ฒฌ์  ํ™•์ธ ํŽ˜์ด์ง€๋Š” ์ธ๋ณด์ด์Šค ์Šคํƒ€์ผ ๋ ˆ์ด์•„์›ƒ (ํ•ญ๋ชฉ๋ณ„ ๊ธˆ์•ก ์šฐ์ธก ์ •๋ ฌ)
  • ๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• (ํ…Œ์ด๋ธ”์€ ์นด๋“œ ํ˜•ํƒœ๋กœ ์ „ํ™˜)

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

  • g5se (PHP 8.x ๊ธฐ๋ฐ˜ CMS)
  • SQLite (๋ชจ๋“ˆ ์ „์šฉ DB: G5_DATA_PATH/modules/creator-quote.sqlite)
  • ์ˆœ์ˆ˜ HTML/CSS/JS (์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์Œ)
  • modern shell (Pretendard ํฐํŠธ, ๋””์ž์ธ ํ† ํฐ, ๋‹คํฌ๋ชจ๋“œ)

๐Ÿš€ ๋ณด๋„ˆ์Šค ๊ธฐ๋Šฅ

  • ๊ฒฌ์  ์œ ํšจ๊ธฐ๊ฐ„ ์„ค์ • (์˜ˆ: 7์ผ ํ›„ ์ž๋™ ๋งŒ๋ฃŒ)
  • ๊ณ ๊ฐ๋ณ„ ์˜๋ขฐ ํžˆ์Šคํ† ๋ฆฌ (์ด๋ฉ”์ผ ๊ธฐ์ค€)
  • ์›”๊ฐ„ ์ˆ˜์ต ํ†ต๊ณ„ ์ฐจํŠธ (์Šน์ธ๋œ ๊ฒฌ์  ํ•ฉ๊ณ„)
  • ๊ฒฌ์  ํ…œํ”Œ๋ฆฟ ์ €์žฅ (์ž์ฃผ ์“ฐ๋Š” ์กฐํ•ฉ ํ”„๋ฆฌ์…‹)
  • ๊ณ ๊ฐ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘ (์Šน์ธ ํ›„ ๋งŒ์กฑ๋„ ๋ณ„์ )

โš ๏ธ ์ œ์•ฝ ์กฐ๊ฑด

  • g5se ๋ณธ์ฒด DB์— ํ…Œ์ด๋ธ” ์ถ”๊ฐ€ ๊ธˆ์ง€ (๋ชจ๋“ˆ ์ „์šฉ SQLite ์‚ฌ์šฉ)
  • ์™ธ๋ถ€ npm/composer ํŒจํ‚ค์ง€ ๊ธˆ์ง€ (์ˆœ์ˆ˜ PHP)
  • WebSocket/์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธˆ์ง€ (HTTP ๊ธฐ๋ฐ˜ ํด๋ง ๋˜๋Š” ์ƒˆ๋กœ๊ณ ์นจ)
  • ํŒŒ์ผ ์—…๋กœ๋“œ๋Š” move_uploaded_file()๋กœ ์ฒ˜๋ฆฌ (๋ณด์•ˆ ๊ฒ€์ฆ ํ•„์ˆ˜)

์ œ์•ฝ ์กฐ๊ฑด

  • โ€ข g5se ์„ค์น˜๋ณธ ์œ„์—์„œ ์ž‘์—… (๋ณ„๋„ ํด๋” ์ƒ์„ฑ ๊ธˆ์ง€)
  • โ€ข ํด๋” ์ž๋™ ๋ผ์šฐํŒ… ์‚ฌ์šฉ (`app/modules/creator-quote/` ํ•˜์œ„)
  • โ€ข modern shell ํ•„์ˆ˜ ์ ์šฉ (`_head.inc.php`, `m-shell`, `_nav.inc.php`, `_footer.inc.php`)
  • โ€ข ๋””์ž์ธ ํ† ํฐ ์‚ฌ์šฉ (`--m-surface`, `--m-text`, `--m-shadow` ๋“ฑ)
  • โ€ข ๋ชจ๋“ˆ ์ „์šฉ SQLite DB (`G5_DATA_PATH/modules/creator-quote.sqlite`)
  • โ€ข prepared statement๋กœ SQL ์ธ์ ์…˜ ๋ฐฉ์ง€
  • โ€ข `htmlspecialchars()`๋กœ XSS ๋ฐฉ์ง€
  • โ€ข ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ ํ™•์žฅ์žยทMIME ๊ฒ€์ฆ (ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ)
  • โ€ข ์™ธ๋ถ€ CDN/npm/composer ์‚ฌ์šฉ ๊ธˆ์ง€
  • โ€ข WebSocket/์‹ค์‹œ๊ฐ„ ๊ธฐ๋Šฅ ๊ธˆ์ง€

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

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

1
Step 1
g5se๊ฐ€ ์„ค์น˜๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ(๋ฃจํŠธ์— `index.php`ยท`app/`์ด ์žˆ๋Š” ๊ณณ)์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. (g5se ์„ค์น˜๋Š” https://github.com/gnuboard/g5se ์ฐธ๊ณ )

์ด์ œ ํฌ๋ฆฌ์—์ดํ„ฐ ๊ฒฌ์  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ๊ณจ๊ฒฉ์„ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ํด๋” ๊ตฌ์กฐ ์ƒ์„ฑ:
```bash
mkdir -p app/modules/creator-quote/dashboard
mkdir -p app/modules/creator-quote/pricing
mkdir -p app/modules/creator-quote/request
mkdir -p app/modules/creator-quote/view
```

2. `app/modules/creator-quote/index.php` ์ƒ์„ฑ (๋ฉ”์ธ ๋žœ๋”ฉ ํŽ˜์ด์ง€):
```php
<?php
include_once('./_common.php');

require_once(G5_THEME_PATH.'/modern/_head.inc.php');
include_once('./head.sub.php');
?>
<div class="m-shell">
    <?php require G5_THEME_PATH.'/modern/_nav.inc.php'; ?>
    <main class="m-container" style="padding: 48px 20px;">
        <div style="max-width: 1200px; margin: 0 auto; text-align: center;">
            <h1 style="font-size: 2.5rem; font-weight: 700; margin-bottom: 16px; color: var(--m-text);">๐Ÿ’ผ ํฌ๋ฆฌ์—์ดํ„ฐ ๊ฒฌ์  ์ž๋™ ์‚ฐ์ถœ ์‹œ์Šคํ…œ</h1>
            <p style="font-size: 1.125rem; color: var(--m-text-muted); margin-bottom: 48px;">ํ”„๋กœ์ ํŠธ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๊ฒฌ์ ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ณ ๊ฐ ์Šน์ธ๊นŒ์ง€ ํ•œ ๋ฒˆ์—</p>
            
            <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px; margin-top: 48px;">
                <a href="/creator-quote/dashboard" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 32px; border-radius: var(--m-radius-lg); text-decoration: none; transition: transform 0.2s;" onmouseover="this.style.transform='translateY(-4px)'" onmouseout="this.style.transform='translateY(0)'">
                    <div style="font-size: 2rem; margin-bottom: 12px;">๐Ÿ“Š</div>
                    <h3 style="font-size: 1.25rem; font-weight: 600; margin-bottom: 8px;">ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ</h3>
                    <p style="opacity: 0.9; font-size: 0.875rem;">์˜๋ขฐ ๊ด€๋ฆฌ & ๊ฒฌ์  ํ˜„ํ™ฉ</p>
                </a>
                
                <a href="/creator-quote/pricing" style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); color: white; padding: 32px; border-radius: var(--m-radius-lg); text-decoration: none; transition: transform 0.2s;" onmouseover="this.style.transform='translateY(-4px)'" onmouseout="this.style.transform='translateY(0)'">
                    <div style="font-size: 2rem; margin-bottom: 12px;">๐Ÿ’ฐ</div>
                    <h3 style="font-size: 1.25rem; font-weight: 600; margin-bottom: 8px;">๊ฐ€๊ฒฉ ์„ค์ •</h3>
                    <p style="opacity: 0.9; font-size: 0.875rem;">์ž‘์—… ์œ ํ˜•๋ณ„ ๋‹จ๊ฐ€ ๊ด€๋ฆฌ</p>
                </a>
                
                <a href="/creator-quote/request" style="background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); color: white; padding: 32px; border-radius: var(--m-radius-lg); text-decoration: none; transition: transform 0.2s;" onmouseover="this.style.transform='translateY(-4px)'" onmouseout="this.style.transform='translateY(0)'">
                    <div style="font-size: 2rem; margin-bottom: 12px;">๐Ÿ“</div>
                    <h3 style="font-size: 1.25rem; font-weight: 600; margin-bottom: 8px;">ํ”„๋กœ์ ํŠธ ์˜๋ขฐํ•˜๊ธฐ</h3>
                    <p style="opacity: 0.9; font-size: 0.875rem;">๊ณ ๊ฐ์šฉ ๊ฒฌ์  ์š”์ฒญ ํผ</p>
                </a>
            </div>
        </div>
    </main>
    <?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
</div>
<?php include_once('./tail.sub.php'); ?>
```

3. SQLite DB ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ (`app/modules/creator-quote/_db.php`):
```php
<?php
if (!defined('_GNUBOARD_')) exit;

function get_creator_quote_db() {
    @mkdir(G5_DATA_PATH.'/modules', 0707, true);
    $db_path = G5_DATA_PATH.'/modules/creator-quote.sqlite';
    $pdo = new PDO('sqlite:'.$db_path);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // ๊ฐ€๊ฒฉ ์„ค์ • ํ…Œ์ด๋ธ”
    $pdo->exec("
        CREATE TABLE IF NOT EXISTS pricing (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            work_type TEXT NOT NULL,
            base_price INTEGER NOT NULL,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )
    ");
    
    // ์ถ”๊ฐ€ ์˜ต์…˜ ํ…Œ์ด๋ธ”
    $pdo->exec("
        CREATE TABLE IF NOT EXISTS options (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            option_name TEXT NOT NULL,
            option_price INTEGER NOT NULL,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )
    ");
    
    // ์˜๋ขฐ ํ…Œ์ด๋ธ”
    $pdo->exec("
        CREATE TABLE IF NOT EXISTS requests (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            project_title TEXT NOT NULL,
            description TEXT,
            work_type TEXT NOT NULL,
            difficulty TEXT NOT NULL,
            deadline DATE,
            customer_email TEXT NOT NULL,
            selected_options TEXT,
            reference_images TEXT,
            total_quote INTEGER NOT NULL,
            status TEXT DEFAULT 'pending',
            rejection_reason TEXT,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )
    ");
    
    return $pdo;
}
?>
```

์ด ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ”์ธ ๋žœ๋”ฉ ํŽ˜์ด์ง€์™€ DB ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๊ฐ€ ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. `/creator-quote`๋กœ ์ ‘์†ํ•˜์—ฌ 3๊ฐœ์˜ ์นด๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๋ฉ”์ธ ๋žœ๋”ฉ ํŽ˜์ด์ง€๊ฐ€ modern shell ๋””์ž์ธ์œผ๋กœ ๋ Œ๋”๋ง๋˜๊ณ , 3๊ฐœ์˜ gradient ์นด๋“œ(๋Œ€์‹œ๋ณด๋“œ/๊ฐ€๊ฒฉ ์„ค์ •/์˜๋ขฐํ•˜๊ธฐ)๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. SQLite DB ํŒŒ์ผ์ด `data/modules/creator-quote.sqlite`์— ์ƒ์„ฑ๋˜๋ฉฐ, 3๊ฐœ ํ…Œ์ด๋ธ”(pricing, options, requests)์ด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

2
Step 2
๊ฐ€๊ฒฉ ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ํฌ๋ฆฌ์—์ดํ„ฐ๊ฐ€ ์ž‘์—… ์œ ํ˜•๋ณ„ ๋‹จ๊ฐ€์™€ ์ถ”๊ฐ€ ์˜ต์…˜์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

`app/modules/creator-quote/pricing/index.php` ์ƒ์„ฑ:
```php
<?php
include_once('./_common.php');
require_once('../_db.php');

$pdo = get_creator_quote_db();
$message = '';

// POST ์ฒ˜๋ฆฌ: ์ž‘์—… ์œ ํ˜• ์ถ”๊ฐ€
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_work_type'])) {
    $work_type = trim($_POST['work_type']);
    $base_price = intval($_POST['base_price']);
    
    if ($work_type && $base_price > 0) {
        $stmt = $pdo->prepare("INSERT INTO pricing (work_type, base_price) VALUES (?, ?)");
        $stmt->execute([$work_type, $base_price]);
        $message = '์ž‘์—… ์œ ํ˜•์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';
    }
}

// POST ์ฒ˜๋ฆฌ: ์ถ”๊ฐ€ ์˜ต์…˜ ์ถ”๊ฐ€
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_option'])) {
    $option_name = trim($_POST['option_name']);
    $option_price = intval($_POST['option_price']);
    
    if ($option_name && $option_price > 0) {
        $stmt = $pdo->prepare("INSERT INTO options (option_name, option_price) VALUES (?, ?)");
        $stmt->execute([$option_name, $option_price]);
        $message = '์ถ”๊ฐ€ ์˜ต์…˜์ด ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';
    }
}

// ์‚ญ์ œ ์ฒ˜๋ฆฌ
if (isset($_GET['delete_pricing'])) {
    $id = intval($_GET['delete_pricing']);
    $pdo->prepare("DELETE FROM pricing WHERE id = ?")->execute([$id]);
    header('Location: /creator-quote/pricing');
    exit;
}

if (isset($_GET['delete_option'])) {
    $id = intval($_GET['delete_option']);
    $pdo->prepare("DELETE FROM options WHERE id = ?")->execute([$id]);
    header('Location: /creator-quote/pricing');
    exit;
}

// ๋ฐ์ดํ„ฐ ์กฐํšŒ
$work_types = $pdo->query("SELECT * FROM pricing ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC);
$options = $pdo->query("SELECT * FROM options ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC);

require_once(G5_THEME_PATH.'/modern/_head.inc.php');
include_once('./head.sub.php');
?>
<style>
.pricing-section {
    background: var(--m-surface);
    padding: 24px;
    border-radius: var(--m-radius-lg);
    box-shadow: var(--m-shadow);
    margin-bottom: 32px;
}
.pricing-table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 16px;
}
.pricing-table th,
.pricing-table td {
    padding: 12px;
    text-align: left;
    border-bottom: 1px solid rgba(0,0,0,0.05);
}
.pricing-table th {
    font-weight: 600;
    color: var(--m-text);
}
.pricing-table td {
    color: var(--m-text-muted);
}
.btn-delete {
    background: #ef4444;
    color: white;
    border: none;
    padding: 6px 12px;
    border-radius: 6px;
    cursor: pointer;
    font-size: 0.875rem;
}
.form-group {
    margin-bottom: 16px;
}
.form-group label {
    display: block;
    font-weight: 500;
    margin-bottom: 8px;
    color: var(--m-text);
}
.form-group input {
    width: 100%;
    padding: 10px;
    border: 1px solid rgba(0,0,0,0.1);
    border-radius: 8px;
    font-size: 1rem;
    background: var(--m-surface);
    color: var(--m-text);
}
.btn-submit {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    border: none;
    padding: 12px 24px;
    border-radius: 8px;
    cursor: pointer;
    font-size: 1rem;
    font-weight: 600;
}
</style>
<div class="m-shell">
    <?php require G5_THEME_PATH.'/modern/_nav.inc.php'; ?>
    <main class="m-container" style="padding: 48px 20px; max-width: 1200px; margin: 0 auto;">
        <h1 style="font-size: 2rem; font-weight: 700; margin-bottom: 32px; color: var(--m-text);">๐Ÿ’ฐ ๊ฐ€๊ฒฉ ์„ค์ • ๊ด€๋ฆฌ</h1>
        
        <?php if ($message): ?>
        <div style="background: #10b981; color: white; padding: 16px; border-radius: 8px; margin-bottom: 24px;">
            <?php echo htmlspecialchars($message); ?>
        </div>
        <?php endif; ?>
        
        <!-- ์ž‘์—… ์œ ํ˜• ์ถ”๊ฐ€ -->
        <div class="pricing-section">
            <h2 style="font-size: 1.5rem; font-weight: 600; margin-bottom: 16px; color: var(--m-text);">์ž‘์—… ์œ ํ˜• ์ถ”๊ฐ€</h2>
            <form method="POST">
                <div style="display: grid; grid-template-columns: 2fr 1fr auto; gap: 12px; align-items: end;">
                    <div class="form-group" style="margin-bottom: 0;">
                        <label>์ž‘์—… ์œ ํ˜•</label>
                        <input type="text" name="work_type" placeholder="์˜ˆ: ์บ๋ฆญํ„ฐ ๋””์ž์ธ" required>
                    </div>
                    <div class="form-group" style="margin-bottom: 0;">
                        <label>๊ธฐ๋ณธ ๋‹จ๊ฐ€ (์›)</label>
                        <input type="number" name="base_price" placeholder="50000" required>
                    </div>
                    <button type="submit" name="add_work_type" class="btn-submit">์ถ”๊ฐ€</button>
                </div>
            </form>
            
            <table class="pricing-table">
                <thead>
                    <tr>
                        <th>์ž‘์—… ์œ ํ˜•</th>
                        <th>๊ธฐ๋ณธ ๋‹จ๊ฐ€</th>
                        <th>๊ด€๋ฆฌ</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($work_types as $wt): ?>
                    <tr>
                        <td><?php echo htmlspecialchars($wt['work_type']); ?></td>
                        <td><?php echo number_format($wt['base_price']); ?>์›</td>
                        <td><a href="?delete_pricing=<?php echo $wt['id']; ?>" class="btn-delete" onclick="return confirm('์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')">์‚ญ์ œ</a></td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        </div>
        
        <!-- ์ถ”๊ฐ€ ์˜ต์…˜ ์ถ”๊ฐ€ -->
        <div class="pricing-section">
            <h2 style="font-size: 1.5rem; font-weight: 600; margin-bottom: 16px; color: var(--m-text);">์ถ”๊ฐ€ ์˜ต์…˜ ๋“ฑ๋ก</h2>
            <form method="POST">
                <div style="display: grid; grid-template-columns: 2fr 1fr auto; gap: 12px; align-items: end;">
                    <div class="form-group" style="margin-bottom: 0;">
                        <label>์˜ต์…˜๋ช…</label>
                        <input type="text" name="option_name" placeholder="์˜ˆ: ์ˆ˜์ • 3ํšŒ" required>
                    </div>
                    <div class="form-group" style="margin-bottom: 0;">
                        <label>์ถ”๊ฐ€ ๊ธˆ์•ก (์›)</label>
                        <input type="number" name="option_price" placeholder="10000" required>
                    </div>
                    <button type="submit" name="add_option" class="btn-submit">์ถ”๊ฐ€</button>
                </div>
            </form>
            
            <table class="pricing-table">
                <thead>
                    <tr>
                        <th>์˜ต์…˜๋ช…</th>
                        <th>์ถ”๊ฐ€ ๊ธˆ์•ก</th>
                        <th>๊ด€๋ฆฌ</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($options as $opt): ?>
                    <tr>
                        <td><?php echo htmlspecialchars($opt['option_name']); ?></td>
                        <td>+<?php echo number_format($opt['option_price']); ?>์›</td>
                        <td><a href="?delete_option=<?php echo $opt['id']; ?>" class="btn-delete" onclick="return confirm('์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')">์‚ญ์ œ</a></td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        </div>
        
        <div style="text-align: center; margin-top: 32px;">
            <a href="/creator-quote" style="color: var(--m-text-muted); text-decoration: none;">โ† ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ</a>
        </div>
    </main>
    <?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
</div>
<?php include_once('./tail.sub.php'); ?>
```

์ด ํŽ˜์ด์ง€์—์„œ ์ž‘์—… ์œ ํ˜•(์˜ˆ: ๋กœ๊ณ  ๋””์ž์ธ, ์ผ๋Ÿฌ์ŠคํŠธ)๊ณผ ์ถ”๊ฐ€ ์˜ต์…˜(์˜ˆ: ๊ธ‰ํ–‰๋ฃŒ, ์ˆ˜์ • ํšŸ์ˆ˜)์„ CRUDํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๊ฐ€๊ฒฉ ์„ค์ • ํŽ˜์ด์ง€(`/creator-quote/pricing`)๊ฐ€ ๋ Œ๋”๋ง๋˜๊ณ , ์ž‘์—… ์œ ํ˜•๊ณผ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ถ”๊ฐ€/์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ํผ๊ณผ ํ…Œ์ด๋ธ”์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” SQLite์— ์ €์žฅ๋˜๋ฉฐ, ์ถ”๊ฐ€ ํ›„ ์ฆ‰์‹œ ๋ชฉ๋ก์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

3
Step 3
๊ณ ๊ฐ์šฉ ํ”„๋กœ์ ํŠธ ์˜๋ขฐ ์ ‘์ˆ˜ ํผ์„ ๋งŒ๋“ค์–ด ์ž๋™ ๊ฒฌ์  ์‚ฐ์ถœ์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

`app/modules/creator-quote/request/index.php` ์ƒ์„ฑ:
```php
<?php
include_once('./_common.php');
require_once('../_db.php');

$pdo = get_creator_quote_db();
$message = '';
$quote_id = null;

// POST ์ฒ˜๋ฆฌ
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $project_title = trim($_POST['project_title']);
    $description = trim($_POST['description']);
    $work_type = trim($_POST['work_type']);
    $difficulty = $_POST['difficulty']; // simple, normal, complex
    $deadline = $_POST['deadline'];
    $customer_email = trim($_POST['customer_email']);
    $selected_options = isset($_POST['options']) ? $_POST['options'] : [];
    
    // ํŒŒ์ผ ์—…๋กœ๋“œ ์ฒ˜๋ฆฌ
    $upload_dir = G5_DATA_PATH.'/modules/creator-quote/uploads/';
    @mkdir($upload_dir, 0707, true);
    $uploaded_files = [];
    
    if (isset($_FILES['reference_images'])) {
        foreach ($_FILES['reference_images']['tmp_name'] as $key => $tmp_name) {
            if ($_FILES['reference_images']['error'][$key] === UPLOAD_ERR_OK) {
                $ext = strtolower(pathinfo($_FILES['reference_images']['name'][$key], PATHINFO_EXTENSION));
                $allowed = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
                if (in_array($ext, $allowed)) {
                    $filename = uniqid().'.'.$ext;
                    move_uploaded_file($tmp_name, $upload_dir.$filename);
                    $uploaded_files[] = $filename;
                }
            }
        }
    }
    
    // ๊ฒฌ์  ๊ณ„์‚ฐ
    $stmt = $pdo->prepare("SELECT base_price FROM pricing WHERE work_type = ?");
    $stmt->execute([$work_type]);
    $base_price = $stmt->fetchColumn();
    
    $difficulty_multiplier = ['simple' => 1.0, 'normal' => 1.5, 'complex' => 2.0];
    $total = $base_price * $difficulty_multiplier[$difficulty];
    
    // ์ถ”๊ฐ€ ์˜ต์…˜ ํ•ฉ์‚ฐ
    $option_total = 0;
    if (!empty($selected_options)) {
        $placeholders = implode(',', array_fill(0, count($selected_options), '?'));
        $stmt = $pdo->prepare("SELECT SUM(option_price) FROM options WHERE id IN ($placeholders)");
        $stmt->execute($selected_options);
        $option_total = $stmt->fetchColumn();
    }
    $total += $option_total;
    
    // DB ์ €์žฅ
    $stmt = $pdo->prepare("
        INSERT INTO requests 
        (project_title, description, work_type, difficulty, deadline, customer_email, selected_options, reference_images, total_quote) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    ");
    $stmt->execute([
        $project_title,
        $description,
        $work_type,
        $difficulty,
        $deadline,
        $customer_email,
        json_encode($selected_options),
        json_encode($uploaded_files),
        $total
    ]);
    $quote_id = $pdo->lastInsertId();
    $message = '๊ฒฌ์  ์š”์ฒญ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค!';
}

// ์ž‘์—… ์œ ํ˜• ๋ชฉ๋ก
$work_types = $pdo->query("SELECT * FROM pricing ORDER BY work_type")->fetchAll(PDO::FETCH_ASSOC);
$options = $pdo->query("SELECT * FROM options ORDER BY option_name")->fetchAll(PDO::FETCH_ASSOC);

require_once(G5_THEME_PATH.'/modern/_head.inc.php');
include_once('./head.sub.php');
?>
<style>
.request-form {
    background: var(--m-surface);
    padding: 32px;
    border-radius: var(--m-radius-lg);
    box-shadow: var(--m-shadow);
    max-width: 800px;
    margin: 0 auto;
}
.form-section {
    margin-bottom: 32px;
}
.form-section h3 {
    font-size: 1.25rem;
    font-weight: 600;
    margin-bottom: 16px;
    color: var(--m-text);
}
.form-group {
    margin-bottom: 20px;
}
.form-group label {
    display: block;
    font-weight: 500;
    margin-bottom: 8px;
    color: var(--m-text);
}
.form-group input,
.form-group select,
.form-group textarea {
    width: 100%;
    padding: 12px;
    border: 1px solid rgba(0,0,0,0.1);
    border-radius: 8px;
    font-size: 1rem;
    background: var(--m-surface);
    color: var(--m-text);
}
.form-group textarea {
    min-height: 120px;
    resize: vertical;
}
.radio-group {
    display: flex;
    gap: 16px;
}
.radio-group label {
    display: flex;
    align-items: center;
    gap: 8px;
    cursor: pointer;
}
.checkbox-group {
    display: grid;
    gap: 12px;
}
.checkbox-group label {
    display: flex;
    align-items: center;
    gap: 8px;
    cursor: pointer;
}
.btn-submit {
    background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
    color: white;
    border: none;
    padding: 16px 32px;
    border-radius: 8px;
    cursor: pointer;
    font-size: 1.125rem;
    font-weight: 600;
    width: 100%;
}
</style>
<div class="m-shell">
    <?php require G5_THEME_PATH.'/modern/_nav.inc.php'; ?>
    <main class="m-container" style="padding: 48px 20px;">
        <h1 style="font-size: 2rem; font-weight: 700; margin-bottom: 32px; text-align: center; color: var(--m-text);">๐Ÿ“ ํ”„๋กœ์ ํŠธ ์˜๋ขฐํ•˜๊ธฐ</h1>
        
        <?php if ($message): ?>
        <div style="background: #10b981; color: white; padding: 20px; border-radius: 8px; margin-bottom: 24px; text-align: center; max-width: 800px; margin-left: auto; margin-right: auto;">
            <?php echo htmlspecialchars($message); ?><br>
            <a href="/creator-quote/view/<?php echo $quote_id; ?>" style="color: white; text-decoration: underline; font-weight: 600; margin-top: 8px; display: inline-block;">๊ฒฌ์ ์„œ ํ™•์ธํ•˜๊ธฐ โ†’</a>
        </div>
        <?php endif; ?>
        
        <form method="POST" enctype="multipart/form-data" class="request-form">
            <!-- ํ”„๋กœ์ ํŠธ ์ •๋ณด -->
            <div class="form-section">
                <h3>ํ”„๋กœ์ ํŠธ ์ •๋ณด</h3>
                <div class="form-group">
                    <label>ํ”„๋กœ์ ํŠธ ์ œ๋ชฉ *</label>
                    <input type="text" name="project_title" placeholder="์˜ˆ: ๋ธŒ๋žœ๋“œ ๋กœ๊ณ  ๋””์ž์ธ" required>
                </div>
                <div class="form-group">
                    <label>์ƒ์„ธ ์„ค๋ช… *</label>
                    <textarea name="description" placeholder="ํ”„๋กœ์ ํŠธ ๋‚ด์šฉ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”" required></textarea>
                </div>
            </div>
            
            <!-- ์ž‘์—… ์œ ํ˜• & ๋‚œ์ด๋„ -->
            <div class="form-section">
                <h3>์ž‘์—… ์œ ํ˜• & ๋‚œ์ด๋„</h3>
                <div class="form-group">
                    <label>์ž‘์—… ์œ ํ˜• *</label>
                    <select name="work_type" required>
                        <option value="">์„ ํƒํ•˜์„ธ์š”</option>
                        <?php foreach ($work_types as $wt): ?>
                        <option value="<?php echo htmlspecialchars($wt['work_type']); ?>">
                            <?php echo htmlspecialchars($wt['work_type']); ?> (๊ธฐ๋ณธ <?php echo number_format($wt['base_price']); ?>์›)
                        </option>
                        <?php endforeach; ?>
                    </select>
                </div>
                <div class="form-group">
                    <label>๋‚œ์ด๋„ *</label>
                    <div class="radio-group">
                        <label><input type="radio" name="difficulty" value="simple" required> ๊ฐ„๋‹จ (ร—1.0)</label>
                        <label><input type="radio" name="difficulty" value="normal" checked> ๋ณดํ†ต (ร—1.5)</label>
                        <label><input type="radio" name="difficulty" value="complex"> ๋ณต์žก (ร—2.0)</label>
                    </div>
                </div>
            </div>
            
            <!-- ์ถ”๊ฐ€ ์˜ต์…˜ -->
            <?php if (!empty($options)): ?>
            <div class="form-section">
                <h3>์ถ”๊ฐ€ ์˜ต์…˜</h3>
                <div class="checkbox-group">
                    <?php foreach ($options as $opt): ?>
                    <label>
                        <input type="checkbox" name="options[]" value="<?php echo $opt['id']; ?>">
                        <?php echo htmlspecialchars($opt['option_name']); ?> (+<?php echo number_format($opt['option_price']); ?>์›)
                    </label>
                    <?php endforeach; ?>
                </div>
            </div>
            <?php endif; ?>
            
            <!-- ๋‚ฉ๊ธฐ์ผ & ์—ฐ๋ฝ์ฒ˜ -->
            <div class="form-section">
                <h3>๋‚ฉ๊ธฐ์ผ & ์—ฐ๋ฝ์ฒ˜</h3>
                <div class="form-group">
                    <label>ํฌ๋ง ๋‚ฉ๊ธฐ์ผ</label>
                    <input type="date" name="deadline">
                </div>
                <div class="form-group">
                    <label>์ด๋ฉ”์ผ *</label>
                    <input type="email" name="customer_email" placeholder="your@email.com" required>
                </div>
            </div>
            
            <!-- ์ฐธ๊ณ  ์ด๋ฏธ์ง€ -->
            <div class="form-section">
                <h3>์ฐธ๊ณ  ์ด๋ฏธ์ง€ (์ตœ๋Œ€ 3์žฅ)</h3>
                <div class="form-group">
                    <input type="file" name="reference_images[]" accept="image/*" multiple>
                </div>
            </div>
            
            <button type="submit" class="btn-submit">๊ฒฌ์  ์š”์ฒญํ•˜๊ธฐ</button>
        </form>
        
        <div style="text-align: center; margin-top: 32px;">
            <a href="/creator-quote" style="color: var(--m-text-muted); text-decoration: none;">โ† ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ</a>
        </div>
    </main>
    <?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
</div>
<?php include_once('./tail.sub.php'); ?>
```

์ด ํผ์€ ๊ณ ๊ฐ์ด ํ”„๋กœ์ ํŠธ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฒฌ์ ์„ ๊ณ„์‚ฐํ•˜์—ฌ DB์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๊ณ ๊ฐ์šฉ ์˜๋ขฐ ํผ(`/creator-quote/request`)์ด ๋ Œ๋”๋ง๋˜๊ณ , ํ”„๋กœ์ ํŠธ ์ œ๋ชฉ/์„ค๋ช…/์ž‘์—… ์œ ํ˜•/๋‚œ์ด๋„/์ถ”๊ฐ€ ์˜ต์…˜/๋‚ฉ๊ธฐ์ผ/์ด๋ฉ”์ผ/์ฐธ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์ถœ ์‹œ ๊ฒฌ์ ์ด ์ž๋™ ๊ณ„์‚ฐ๋˜์–ด DB์— ์ €์žฅ๋˜๋ฉฐ, ๊ฒฌ์ ์„œ ํ™•์ธ ๋งํฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

4
Step 4
๊ณ ๊ฐ์ด ๊ฒฌ์ ์„ ํ™•์ธํ•˜๊ณ  ์Šน์ธ/๊ฑฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์  segment๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

`app/modules/creator-quote/view/[id]/index.php` ์ƒ์„ฑ:
```php
<?php
include_once('./_common.php');
require_once('../../_db.php');

$pdo = get_creator_quote_db();
$request_id = intval($_GET['id']);
$message = '';

// ์Šน์ธ/๊ฑฐ์ ˆ ์ฒ˜๋ฆฌ
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['approve'])) {
        $stmt = $pdo->prepare("UPDATE requests SET status = 'approved', updated_at = CURRENT_TIMESTAMP WHERE id = ?");
        $stmt->execute([$request_id]);
        $message = '๊ฒฌ์ ์ด ์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ํฌ๋ฆฌ์—์ดํ„ฐ๊ฐ€ ๊ณง ์—ฐ๋ฝ๋“œ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.';
    } elseif (isset($_POST['reject'])) {
        $reason = trim($_POST['rejection_reason']);
        $stmt = $pdo->prepare("UPDATE requests SET status = 'rejected', rejection_reason = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?");
        $stmt->execute([$reason, $request_id]);
        $message = '๊ฒฌ์ ์ด ๊ฑฐ์ ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์œ ๊ฐ€ ํฌ๋ฆฌ์—์ดํ„ฐ์—๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';
    }
}

// ์˜๋ขฐ ์ •๋ณด ์กฐํšŒ
$stmt = $pdo->prepare("SELECT * FROM requests WHERE id = ?");
$stmt->execute([$request_id]);
$request = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$request) {
    die('์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฌ์  ์š”์ฒญ์ž…๋‹ˆ๋‹ค.');
}

// ์ž‘์—… ์œ ํ˜• ์ •๋ณด
$stmt = $pdo->prepare("SELECT base_price FROM pricing WHERE work_type = ?");
$stmt->execute([$request['work_type']]);
$base_price = $stmt->fetchColumn();

// ๋‚œ์ด๋„ ๋ฐฐ์œจ
$difficulty_map = ['simple' => '๊ฐ„๋‹จ (ร—1.0)', 'normal' => '๋ณดํ†ต (ร—1.5)', 'complex' => '๋ณต์žก (ร—2.0)'];
$difficulty_multiplier = ['simple' => 1.0, 'normal' => 1.5, 'complex' => 2.0];

// ์ถ”๊ฐ€ ์˜ต์…˜ ์ •๋ณด
$selected_options = json_decode($request['selected_options'], true) ?: [];
$option_details = [];
if (!empty($selected_options)) {
    $placeholders = implode(',', array_fill(0, count($selected_options), '?'));
    $stmt = $pdo->prepare("SELECT * FROM options WHERE id IN ($placeholders)");
    $stmt->execute($selected_options);
    $option_details = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

require_once(G5_THEME_PATH.'/modern/_head.inc.php');
include_once('./head.sub.php');
?>
<style>
.quote-card {
    background: var(--m-surface);
    padding: 32px;
    border-radius: var(--m-radius-lg);
    box-shadow: var(--m-shadow);
    max-width: 900px;
    margin: 0 auto;
}
.quote-header {
    border-bottom: 2px solid rgba(0,0,0,0.1);
    padding-bottom: 16px;
    margin-bottom: 24px;
}
.quote-section {
    margin-bottom: 24px;
}
.quote-section h3 {
    font-size: 1.125rem;
    font-weight: 600;
    margin-bottom: 12px;
    color: var(--m-text);
}
.quote-table {
    width: 100%;
    border-collapse: collapse;
}
.quote-table td {
    padding: 12px 0;
    border-bottom: 1px solid rgba(0,0,0,0.05);
}
.quote-table td:last-child {
    text-align: right;
    font-weight: 600;
}
.total-row {
    font-size: 1.25rem;
    font-weight: 700;
    color: #667eea;
}
.btn-group {
    display: flex;
    gap: 12px;
    margin-top: 32px;
}
.btn {
    flex: 1;
    padding: 16px;
    border: none;
    border-radius: 8px;
    font-size: 1rem;
    font-weight: 600;
    cursor: pointer;
}
.btn-approve {
    background: linear-gradient(135deg, #10b981 0%, #059669 100%);
    color: white;
}
.btn-reject {
    background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
    color: white;
}
.status-badge {
    display: inline-block;
    padding: 6px 12px;
    border-radius: 6px;
    font-size: 0.875rem;
    font-weight: 600;
}
.status-pending { background: #fbbf24; color: #78350f; }
.status-approved { background: #10b981; color: white; }
.status-rejected { background: #ef4444; color: white; }
</style>
<div class="m-shell">
    <?php require G5_THEME_PATH.'/modern/_nav.inc.php'; ?>
    <main class="m-container" style="padding: 48px 20px;">
        <h1 style="font-size: 2rem; font-weight: 700; margin-bottom: 32px; text-align: center; color: var(--m-text);">๐Ÿ“„ ๊ฒฌ์ ์„œ</h1>
        
        <?php if ($message): ?>
        <div style="background: #10b981; color: white; padding: 20px; border-radius: 8px; margin-bottom: 24px; text-align: center; max-width: 900px; margin-left: auto; margin-right: auto;">
            <?php echo htmlspecialchars($message); ?>
        </div>
        <?php endif; ?>
        
        <div class="quote-card">
            <div class="quote-header">
                <div style="display: flex; justify-content: space-between; align-items: center;">
                    <h2 style="font-size: 1.5rem; font-weight: 700; color: var(--m-text);"><?php echo htmlspecialchars($request['project_title']); ?></h2>
                    <span class="status-badge status-<?php echo $request['status']; ?>">
                        <?php echo ['pending' => '๋Œ€๊ธฐ์ค‘', 'approved' => '์Šน์ธ๋จ', 'rejected' => '๊ฑฐ์ ˆ๋จ'][$request['status']]; ?>
                    </span>
                </div>
                <p style="color: var(--m-text-muted); margin-top: 8px;">์ ‘์ˆ˜์ผ: <?php echo date('Y-m-d H:i', strtotime($request['created_at'])); ?></p>
            </div>
            
            <div class="quote-section">
                <h3>ํ”„๋กœ์ ํŠธ ์ƒ์„ธ</h3>
                <p style="color: var(--m-text-muted); line-height: 1.6;"><?php echo nl2br(htmlspecialchars($request['description'])); ?></p>
            </div>
            
            <div class="quote-section">
                <h3>๊ฒฌ์  ๋‚ด์—ญ</h3>
                <table class="quote-table">
                    <tr>
                        <td style="color: var(--m-text);">์ž‘์—… ์œ ํ˜•</td>
                        <td><?php echo htmlspecialchars($request['work_type']); ?></td>
                    </tr>
                    <tr>
                        <td style="color: var(--m-text);">๊ธฐ๋ณธ ๋‹จ๊ฐ€</td>
                        <td><?php echo number_format($base_price); ?>์›</td>
                    </tr>
                    <tr>
                        <td style="color: var(--m-text);">๋‚œ์ด๋„</td>
                        <td><?php echo $difficulty_map[$request['difficulty']]; ?></td>
                    </tr>
                    <tr>
                        <td style="color: var(--m-text);">์ž‘์—…๋น„ (๋‹จ๊ฐ€ ร— ๋‚œ์ด๋„)</td>
                        <td><?php echo number_format($base_price * $difficulty_multiplier[$request['difficulty']]); ?>์›</td>
                    </tr>
                    <?php foreach ($option_details as $opt): ?>
                    <tr>
                        <td style="color: var(--m-text);"><?php echo htmlspecialchars($opt['option_name']); ?></td>
                        <td>+<?php echo number_format($opt['option_price']); ?>์›</td>
                    </tr>
                    <?php endforeach; ?>
                    <tr class="total-row">
                        <td>์ตœ์ข… ๊ฒฌ์ </td>
                        <td><?php echo number_format($request['total_quote']); ?>์›</td>
                    </tr>
                </table>
            </div>
            
            <?php if ($request['deadline']): ?>
            <div class="quote-section">
                <h3>ํฌ๋ง ๋‚ฉ๊ธฐ์ผ</h3>
                <p style="color: var(--m-text-muted);"><?php echo date('Y๋…„ m์›” d์ผ', strtotime($request['deadline'])); ?></p>
            </div>
            <?php endif; ?>
            
            <?php if ($request['status'] === 'pending'): ?>
            <form method="POST">
                <div class="btn-group">
                    <button type="submit" name="approve" class="btn btn-approve">โœ“ ๊ฒฌ์  ์Šน์ธ</button>
                    <button type="button" class="btn btn-reject" onclick="showRejectForm()">โœ— ๊ฒฌ์  ๊ฑฐ์ ˆ</button>
                </div>
                <div id="reject-form" style="display: none; margin-top: 16px;">
                    <textarea name="rejection_reason" placeholder="๊ฑฐ์ ˆ ์‚ฌ์œ ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” (์„ ํƒ)" style="width: 100%; padding: 12px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px; min-height: 80px;"></textarea>
                    <button type="submit" name="reject" class="btn btn-reject" style="width: 100%; margin-top: 12px;">๊ฑฐ์ ˆ ํ™•์ •</button>
                </div>
            </form>
            <?php elseif ($request['status'] === 'rejected' && $request['rejection_reason']): ?>
            <div style="background: #fef2f2; padding: 16px; border-radius: 8px; margin-top: 16px;">
                <h4 style="font-weight: 600; color: #ef4444; margin-bottom: 8px;">๊ฑฐ์ ˆ ์‚ฌ์œ </h4>
                <p style="color: #7f1d1d;"><?php echo nl2br(htmlspecialchars($request['rejection_reason'])); ?></p>
            </div>
            <?php endif; ?>
        </div>
        
        <div style="text-align: center; margin-top: 32px;">
            <a href="/creator-quote" style="color: var(--m-text-muted); text-decoration: none;">โ† ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ</a>
        </div>
    </main>
    <?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
</div>
<script>
function showRejectForm() {
    document.getElementById('reject-form').style.display = 'block';
}
</script>
<?php include_once('./tail.sub.php'); ?>
```

์ด ํŽ˜์ด์ง€๋Š” `/creator-quote/view/{id}` ํ˜•์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉฐ, ๊ฒฌ์  ๋‚ด์—ญ๊ณผ ์Šน์ธ/๊ฑฐ์ ˆ ๋ฒ„ํŠผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๊ณ ๊ฐ ๊ฒฌ์  ํ™•์ธ ํŽ˜์ด์ง€(`/creator-quote/view/1`)๊ฐ€ ๋ Œ๋”๋ง๋˜๊ณ , ํ”„๋กœ์ ํŠธ ์ •๋ณด, ๊ฒฌ์  ๋‚ด์—ญ(์ž‘์—…๋น„, ์ถ”๊ฐ€ ์˜ต์…˜, ์ตœ์ข… ๊ธˆ์•ก), ์Šน์ธ/๊ฑฐ์ ˆ ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์Šน์ธ ์‹œ ์ƒํƒœ๊ฐ€ 'approved'๋กœ, ๊ฑฐ์ ˆ ์‹œ 'rejected'๋กœ ๋ณ€๊ฒฝ๋˜๋ฉฐ ์‚ฌ์œ ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

5
Step 5
ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ ‘์ˆ˜๋œ ์˜๋ขฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

`app/modules/creator-quote/dashboard/index.php` ์ƒ์„ฑ:
```php
<?php
include_once('./_common.php');
require_once('../_db.php');

$pdo = get_creator_quote_db();

// ํ•„ํ„ฐ๋ง
$filter = isset($_GET['filter']) ? $_GET['filter'] : 'all';
$where = $filter === 'all' ? '' : "WHERE status = '".$pdo->quote($filter)."'";

$requests = $pdo->query("SELECT * FROM requests $where ORDER BY created_at DESC")->fetchAll(PDO::FETCH_ASSOC);

// ํ†ต๊ณ„
$stats = $pdo->query("
    SELECT 
        COUNT(*) as total,
        SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
        SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END) as approved,
        SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) as rejected,
        SUM(CASE WHEN status = 'approved' THEN total_quote ELSE 0 END) as total_revenue
    FROM requests
")->fetch(PDO::FETCH_ASSOC);

require_once(G5_THEME_PATH.'/modern/_head.inc.php');
include_once('./head.sub.php');
?>
<style>
.stats-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 16px;
    margin-bottom: 32px;
}
.stat-card {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    padding: 24px;
    border-radius: var(--m-radius-lg);
    text-align: center;
}
.stat-card h3 {
    font-size: 2rem;
    font-weight: 700;
    margin-bottom: 8px;
}
.stat-card p {
    opacity: 0.9;
    font-size: 0.875rem;
}
.filter-tabs {
    display: flex;
    gap: 8px;
    margin-bottom: 24px;
    flex-wrap: wrap;
}
.filter-tabs a {
    padding: 10px 20px;
    border-radius: 8px;
    text-decoration: none;
    font-weight: 500;
    transition: all 0.2s;
}
.filter-tabs a.active {
    background: #667eea;
    color: white;
}
.filter-tabs a:not(.active) {
    background: var(--m-surface);
    color: var(--m-text-muted);
}
.request-table {
    background: var(--m-surface);
    border-radius: var(--m-radius-lg);
    box-shadow: var(--m-shadow);
    overflow: hidden;
}
.request-table table {
    width: 100%;
    border-collapse: collapse;
}
.request-table th,
.request-table td {
    padding: 16px;
    text-align: left;
    border-bottom: 1px solid rgba(0,0,0,0.05);
}
.request-table th {
    background: rgba(0,0,0,0.02);
    font-weight: 600;
    color: var(--m-text);
}
.request-table td {
    color: var(--m-text-muted);
}
.status-badge {
    display: inline-block;
    padding: 4px 12px;
    border-radius: 12px;
    font-size: 0.875rem;
    font-weight: 600;
}
.status-pending { background: #fef3c7; color: #92400e; }
.status-approved { background: #d1fae5; color: #065f46; }
.status-rejected { background: #fee2e2; color: #991b1b; }
.btn-view {
    background: #667eea;
    color: white;
    padding: 6px 16px;
    border-radius: 6px;
    text-decoration: none;
    font-size: 0.875rem;
    font-weight: 500;
}
@media (max-width: 768px) {
    .request-table {
        overflow-x: auto;
    }
}
</style>
<div class="m-shell">
    <?php require G5_THEME_PATH.'/modern/_nav.inc.php'; ?>
    <main class="m-container" style="padding: 48px 20px; max-width: 1400px; margin: 0 auto;">
        <h1 style="font-size: 2rem; font-weight: 700; margin-bottom: 32px; color: var(--m-text);">๐Ÿ“Š ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ</h1>
        
        <!-- ํ†ต๊ณ„ ์นด๋“œ -->
        <div class="stats-grid">
            <div class="stat-card" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);">
                <h3><?php echo $stats['total']; ?></h3>
                <p>์ „์ฒด ์˜๋ขฐ</p>
            </div>
            <div class="stat-card" style="background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);">
                <h3><?php echo $stats['pending']; ?></h3>
                <p>๋Œ€๊ธฐ์ค‘</p>
            </div>
            <div class="stat-card" style="background: linear-gradient(135deg, #10b981 0%, #059669 100%);">
                <h3><?php echo $stats['approved']; ?></h3>
                <p>์Šน์ธ๋จ</p>
            </div>
            <div class="stat-card" style="background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);">
                <h3><?php echo $stats['rejected']; ?></h3>
                <p>๊ฑฐ์ ˆ๋จ</p>
            </div>
            <div class="stat-card" style="background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);">
                <h3><?php echo number_format($stats['total_revenue']); ?>์›</h3>
                <p>์ด ์ˆ˜์ต (์Šน์ธ)</p>
            </div>
        </div>
        
        <!-- ํ•„ํ„ฐ ํƒญ -->
        <div class="filter-tabs">
            <a href="?filter=all" class="<?php echo $filter === 'all' ? 'active' : ''; ?>">์ „์ฒด</a>
            <a href="?filter=pending" class="<?php echo $filter === 'pending' ? 'active' : ''; ?>">๋Œ€๊ธฐ์ค‘</a>
            <a href="?filter=approved" class="<?php echo $filter === 'approved' ? 'active' : ''; ?>">์Šน์ธ๋จ</a>
            <a href="?filter=rejected" class="<?php echo $filter === 'rejected' ? 'active' : ''; ?>">๊ฑฐ์ ˆ๋จ</a>
        </div>
        
        <!-- ์˜๋ขฐ ๋ชฉ๋ก -->
        <div class="request-table">
            <table>
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>ํ”„๋กœ์ ํŠธ๋ช…</th>
                        <th>์ž‘์—… ์œ ํ˜•</th>
                        <th>๊ณ ๊ฐ ์ด๋ฉ”์ผ</th>
                        <th>๊ฒฌ์  ๊ธˆ์•ก</th>
                        <th>์ƒํƒœ</th>
                        <th>์ ‘์ˆ˜์ผ</th>
                        <th>๊ด€๋ฆฌ</th>
                    </tr>
                </thead>
                <tbody>
                    <?php if (empty($requests)): ?>
                    <tr>
                        <td colspan="8" style="text-align: center; padding: 48px; color: var(--m-text-muted);">์˜๋ขฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</td>
                    </tr>
                    <?php else: ?>
                    <?php foreach ($requests as $req): ?>
                    <tr>
                        <td style="font-weight: 600; color: var(--m-text);">#<?php echo $req['id']; ?></td>
                        <td style="color: var(--m-text);"><?php echo htmlspecialchars(mb_substr($req['project_title'], 0, 30)); ?></td>
                        <td><?php echo htmlspecialchars($req['work_type']); ?></td>
                        <td><?php echo htmlspecialchars($req['customer_email']); ?></td>
                        <td style="font-weight: 600; color: #667eea;"><?php echo number_format($req['total_quote']); ?>์›</td>
                        <td>
                            <span class="status-badge status-<?php echo $req['status']; ?>">
                                <?php echo ['pending' => '๋Œ€๊ธฐ', 'approved' => '์Šน์ธ', 'rejected' => '๊ฑฐ์ ˆ'][$req['status']]; ?>
                            </span>
                        </td>
                        <td><?php echo date('Y-m-d', strtotime($req['created_at'])); ?></td>
                        <td>
                            <a href="/creator-quote/view/<?php echo $req['id']; ?>" class="btn-view">์ƒ์„ธ</a>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                    <?php endif; ?>
                </tbody>
            </table>
        </div>
        
        <div style="text-align: center; margin-top: 32px;">
            <a href="/creator-quote" style="color: var(--m-text-muted); text-decoration: none;">โ† ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ</a>
        </div>
    </main>
    <?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
</div>
<?php include_once('./tail.sub.php'); ?>
```

์ด ๋Œ€์‹œ๋ณด๋“œ๋Š” ์˜๋ขฐ ํ†ต๊ณ„(์ „์ฒด/๋Œ€๊ธฐ/์Šน์ธ/๊ฑฐ์ ˆ/์ด ์ˆ˜์ต)์™€ ํ•„ํ„ฐ๋ง๋œ ์˜๋ขฐ ๋ชฉ๋ก์„ ํ…Œ์ด๋ธ”๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ(`/creator-quote/dashboard`)๊ฐ€ ๋ Œ๋”๋ง๋˜๊ณ , ํ†ต๊ณ„ ์นด๋“œ(์ „์ฒด/๋Œ€๊ธฐ/์Šน์ธ/๊ฑฐ์ ˆ/์ด ์ˆ˜์ต)์™€ ์˜๋ขฐ ๋ชฉ๋ก ํ…Œ์ด๋ธ”์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ ํƒญ์œผ๋กœ ์ƒํƒœ๋ณ„ ํ•„ํ„ฐ๋ง์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐ ์˜๋ขฐ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6
Step 6
๊ฒฌ์ ์„œ PDF ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณ ๊ฐ๊ณผ ํฌ๋ฆฌ์—์ดํ„ฐ๊ฐ€ ๊ฒฌ์ ์„œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. PHP์˜ TCPDF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € TCPDF๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค (composer ์‚ฌ์šฉ ๊ธˆ์ง€):
1. https://github.com/tecnickcom/TCPDF/releases ์—์„œ ์ตœ์‹  ๋ฒ„์ „ ๋‹ค์šด๋กœ๋“œ
2. `app/modules/creator-quote/vendor/tcpdf/` ํด๋”์— ์••์ถ• ํ•ด์ œ

๊ทธ ๋‹ค์Œ PDF ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

`app/modules/creator-quote/download-pdf.php` ์ƒ์„ฑ:
```php
<?php
include_once('./_common.php');
require_once('./_db.php');

$request_id = intval($_GET['id']);
$pdo = get_creator_quote_db();

// ์˜๋ขฐ ์ •๋ณด ์กฐํšŒ
$stmt = $pdo->prepare("SELECT * FROM requests WHERE id = ?");
$stmt->execute([$request_id]);
$request = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$request) {
    die('์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฌ์ ์ž…๋‹ˆ๋‹ค.');
}

// ์ž‘์—… ์œ ํ˜• ์ •๋ณด
$stmt = $pdo->prepare("SELECT base_price FROM pricing WHERE work_type = ?");
$stmt->execute([$request['work_type']]);
$base_price = $stmt->fetchColumn();

// ๋‚œ์ด๋„ ๋ฐฐ์œจ
$difficulty_map = ['simple' => '๊ฐ„๋‹จ (ร—1.0)', 'normal' => '๋ณดํ†ต (ร—1.5)', 'complex' => '๋ณต์žก (ร—2.0)'];
$difficulty_multiplier = ['simple' => 1.0, 'normal' => 1.5, 'complex' => 2.0];

// ์ถ”๊ฐ€ ์˜ต์…˜ ์ •๋ณด
$selected_options = json_decode($request['selected_options'], true) ?: [];
$option_details = [];
if (!empty($selected_options)) {
    $placeholders = implode(',', array_fill(0, count($selected_options), '?'));
    $stmt = $pdo->prepare("SELECT * FROM options WHERE id IN ($placeholders)");
    $stmt->execute($selected_options);
    $option_details = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// TCPDF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ
require_once(__DIR__.'/vendor/tcpdf/tcpdf.php');

// PDF ์ƒ์„ฑ
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
$pdf->SetCreator('Creator Quote System');
$pdf->SetAuthor('Creator');
$pdf->SetTitle('๊ฒฌ์ ์„œ - '.$request['project_title']);
$pdf->SetSubject('ํ”„๋กœ์ ํŠธ ๊ฒฌ์ ์„œ');

// ํ—ค๋”/ํ‘ธํ„ฐ ์ œ๊ฑฐ
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);

$pdf->SetMargins(15, 15, 15);
$pdf->SetAutoPageBreak(true, 15);
$pdf->AddPage();

// ํ•œ๊ธ€ ํฐํŠธ ์„ค์ • (๊ธฐ๋ณธ ๋‚ด์žฅ ํฐํŠธ ์‚ฌ์šฉ)
$pdf->SetFont('helvetica', '', 10);

// HTML ์ฝ˜ํ…์ธ 
$html = '
<h1 style="text-align: center; color: #667eea; margin-bottom: 20px;">ํ”„๋กœ์ ํŠธ ๊ฒฌ์ ์„œ</h1>
<hr style="border: 1px solid #667eea;">

<h2 style="margin-top: 20px;">ํ”„๋กœ์ ํŠธ ์ •๋ณด</h2>
<table cellpadding="5" style="width: 100%; border: 1px solid #ddd;">
    <tr style="background-color: #f9f9f9;">
        <td style="width: 30%; font-weight: bold;">ํ”„๋กœ์ ํŠธ๋ช…</td>
        <td>'.htmlspecialchars($request['project_title']).'</td>
    </tr>
    <tr>
        <td style="font-weight: bold;">๊ณ ๊ฐ ์ด๋ฉ”์ผ</td>
        <td>'.htmlspecialchars($request['customer_email']).'</td>
    </tr>
    <tr style="background-color: #f9f9f9;">
        <td style="font-weight: bold;">์ ‘์ˆ˜์ผ</td>
        <td>'.date('Y-m-d H:i', strtotime($request['created_at'])).'</td>
    </tr>
</table>

<h2 style="margin-top: 20px;">์ƒ์„ธ ์„ค๋ช…</h2>
<p style="line-height: 1.6;">'.nl2br(htmlspecialchars($request['description'])).'</p>

<h2 style="margin-top: 20px;">๊ฒฌ์  ๋‚ด์—ญ</h2>
<table cellpadding="5" style="width: 100%; border: 1px solid #ddd;">
    <tr style="background-color: #f9f9f9;">
        <td style="width: 70%; font-weight: bold;">ํ•ญ๋ชฉ</td>
        <td style="text-align: right; font-weight: bold;">๊ธˆ์•ก</td>
    </tr>
    <tr>
        <td>์ž‘์—… ์œ ํ˜•: '.htmlspecialchars($request['work_type']).'</td>
        <td style="text-align: right;">'.number_format($base_price).'์›</td>
    </tr>
    <tr style="background-color: #f9f9f9;">
        <td>๋‚œ์ด๋„: '.$difficulty_map[$request['difficulty']].'</td>
        <td style="text-align: right;">'.number_format($base_price * $difficulty_multiplier[$request['difficulty']]).'์›</td>
    </tr>
';

foreach ($option_details as $opt) {
    $html .= '
    <tr>
        <td>'.htmlspecialchars($opt['option_name']).'</td>
        <td style="text-align: right;">+'.number_format($opt['option_price']).'์›</td>
    </tr>
    ';
}

$html .= '
    <tr style="background-color: #667eea; color: white; font-size: 14px; font-weight: bold;">
        <td>์ตœ์ข… ๊ฒฌ์ </td>
        <td style="text-align: right;">'.number_format($request['total_quote']).'์›</td>
    </tr>
</table>
';

if ($request['deadline']) {
    $html .= '
<h2 style="margin-top: 20px;">ํฌ๋ง ๋‚ฉ๊ธฐ์ผ</h2>
<p>'.date('Y๋…„ m์›” d์ผ', strtotime($request['deadline'])).'</p>
    ';
}

$html .= '
<p style="margin-top: 30px; text-align: center; color: #999; font-size: 9px;">๋ณธ ๊ฒฌ์ ์„œ๋Š” ํฌ๋ฆฌ์—์ดํ„ฐ ๊ฒฌ์  ์ž๋™ ์‚ฐ์ถœ ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</p>
';

$pdf->writeHTML($html, true, false, true, false, '');

// PDF ์ถœ๋ ฅ
$pdf->Output('quote_'.$request_id.'.pdf', 'D');
?>
```

์ด์ œ ๊ฒฌ์  ํ™•์ธ ํŽ˜์ด์ง€์™€ ๋Œ€์‹œ๋ณด๋“œ์— PDF ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

`app/modules/creator-quote/view/[id]/index.php`์˜ `.quote-card` ์•ˆ์— ๋‹ค์Œ ๋ฒ„ํŠผ ์ถ”๊ฐ€ (์ƒํƒœ ๋ฐฐ์ง€ ์˜†):
```html
<a href="/creator-quote/download-pdf?id=<?php echo $request_id; ?>" style="background: #ef4444; color: white; padding: 8px 16px; border-radius: 6px; text-decoration: none; font-size: 0.875rem; font-weight: 600;">๐Ÿ“„ PDF ๋‹ค์šด๋กœ๋“œ</a>
```

`app/modules/creator-quote/dashboard/index.php`์˜ ํ…Œ์ด๋ธ” "๊ด€๋ฆฌ" ์—ด์— ๋‹ค์Œ ๋งํฌ ์ถ”๊ฐ€:
```html
<a href="/creator-quote/download-pdf?id=<?php echo $req['id']; ?>" style="color: #ef4444; text-decoration: none; margin-left: 8px;">๐Ÿ“„ PDF</a>
```

์ด์ œ ๊ฒฌ์ ์„œ๋ฅผ PDF๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: PDF ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด `/creator-quote/download-pdf?id=1` ์ ‘์† ์‹œ ๊ฒฌ์ ์„œ๊ฐ€ PDF ํŒŒ์ผ๋กœ ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๊ฒฌ์  ํ™•์ธ ํŽ˜์ด์ง€์™€ ๋Œ€์‹œ๋ณด๋“œ์—์„œ PDF ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋˜๋ฉฐ, ํด๋ฆญ ์‹œ ๊น”๋”ํ•œ ๋ ˆ์ด์•„์›ƒ์˜ PDF ๊ฒฌ์ ์„œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

7
Step 7
๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋ฉ”์ผ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณ ๊ฐ์ด ์˜๋ขฐ๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ ์Šน์ธ/๊ฑฐ์ ˆํ–ˆ์„ ๋•Œ ํฌ๋ฆฌ์—์ดํ„ฐ์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ํฌ๋ฆฌ์—์ดํ„ฐ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์„ค์ • ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

`app/modules/creator-quote/_config.php` ์ƒ์„ฑ:
```php
<?php
if (!defined('_GNUBOARD_')) exit;

// ํฌ๋ฆฌ์—์ดํ„ฐ ์ด๋ฉ”์ผ (์•Œ๋ฆผ ์ˆ˜์‹ ์šฉ)
define('CREATOR_EMAIL', 'your-email@example.com'); // ์‹ค์ œ ์ด๋ฉ”์ผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”

// ์‚ฌ์ดํŠธ๋ช…
define('SITE_NAME', 'ํฌ๋ฆฌ์—์ดํ„ฐ ๊ฒฌ์  ์‹œ์Šคํ…œ');
?>
```

์ด์ œ `app/modules/creator-quote/request/index.php`์˜ POST ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์— ์ด๋ฉ”์ผ ์ „์†ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (DB ์ €์žฅ ํ›„):
```php
// DB ์ €์žฅ ํ›„ ์ด๋ฉ”์ผ ์•Œ๋ฆผ
require_once('../_config.php');

$subject = '['.SITE_NAME.'] ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ์˜๋ขฐ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค';
$message = '
์•ˆ๋…•ํ•˜์„ธ์š”,\n\n'
.htmlspecialchars($customer_email).'๋‹˜์œผ๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ์˜๋ขฐ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n\n'
.'ํ”„๋กœ์ ํŠธ๋ช…: '.htmlspecialchars($project_title).'\n'
.'์ž‘์—… ์œ ํ˜•: '.htmlspecialchars($work_type).'\n'
.'๊ฒฌ์  ๊ธˆ์•ก: '.number_format($total).'์›\n\n'
.'๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธํ•˜์„ธ์š”: '.G5_URL.'/creator-quote/dashboard\n\n'
.'๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.';

@mail(CREATOR_EMAIL, $subject, $message, 'From: noreply@'.str_replace('www.', '', $_SERVER['HTTP_HOST']));
```

๊ทธ๋ฆฌ๊ณ  `app/modules/creator-quote/view/[id]/index.php`์˜ ์Šน์ธ/๊ฑฐ์ ˆ POST ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์—๋„ ์ด๋ฉ”์ผ ์ „์†ก์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:
```php
require_once('../../_config.php');

if (isset($_POST['approve'])) {
    $stmt = $pdo->prepare("UPDATE requests SET status = 'approved', updated_at = CURRENT_TIMESTAMP WHERE id = ?");
    $stmt->execute([$request_id]);
    $message = '๊ฒฌ์ ์ด ์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ํฌ๋ฆฌ์—์ดํ„ฐ๊ฐ€ ๊ณง ์—ฐ๋ฝ๋“œ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.';
    
    // ์ด๋ฉ”์ผ ์•Œ๋ฆผ
    $subject = '['.SITE_NAME.'] ๊ฒฌ์ ์ด ์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค';
    $email_message = '
์•ˆ๋…•ํ•˜์„ธ์š”,\n\n'
.htmlspecialchars($request['customer_email']).'๋‹˜์ด ํ”„๋กœ์ ํŠธ "'.htmlspecialchars($request['project_title']).'"์˜ ๊ฒฌ์ ์„ ์Šน์ธํ•˜์…จ์Šต๋‹ˆ๋‹ค.\n\n'
.'๊ฒฌ์  ๊ธˆ์•ก: '.number_format($request['total_quote']).'์›\n\n'
.'๊ณ ๊ฐ์—๊ฒŒ ์—ฐ๋ฝํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”.\n\n'
.'๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.';
    
    @mail(CREATOR_EMAIL, $subject, $email_message, 'From: noreply@'.str_replace('www.', '', $_SERVER['HTTP_HOST']));
} elseif (isset($_POST['reject'])) {
    $reason = trim($_POST['rejection_reason']);
    $stmt = $pdo->prepare("UPDATE requests SET status = 'rejected', rejection_reason = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?");
    $stmt->execute([$reason, $request_id]);
    $message = '๊ฒฌ์ ์ด ๊ฑฐ์ ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์œ ๊ฐ€ ํฌ๋ฆฌ์—์ดํ„ฐ์—๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';
    
    // ์ด๋ฉ”์ผ ์•Œ๋ฆผ
    $subject = '['.SITE_NAME.'] ๊ฒฌ์ ์ด ๊ฑฐ์ ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค';
    $email_message = '
์•ˆ๋…•ํ•˜์„ธ์š”,\n\n'
.htmlspecialchars($request['customer_email']).'๋‹˜์ด ํ”„๋กœ์ ํŠธ "'.htmlspecialchars($request['project_title']).'"์˜ ๊ฒฌ์ ์„ ๊ฑฐ์ ˆํ•˜์…จ์Šต๋‹ˆ๋‹ค.\n\n'
.($reason ? '๊ฑฐ์ ˆ ์‚ฌ์œ : '.htmlspecialchars($reason).'\n\n' : '')
.'๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.';
    
    @mail(CREATOR_EMAIL, $subject, $email_message, 'From: noreply@'.str_replace('www.', '', $_SERVER['HTTP_HOST']));
}
```

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฉ”์ธ ๋žœ๋”ฉ ํŽ˜์ด์ง€(`app/modules/creator-quote/index.php`)์— ์‚ฌ์šฉ ์•ˆ๋‚ด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:
```html
<div style="max-width: 800px; margin: 48px auto; padding: 24px; background: var(--m-surface); border-radius: var(--m-radius-lg); box-shadow: var(--m-shadow);">
    <h2 style="font-size: 1.5rem; font-weight: 600; margin-bottom: 16px; color: var(--m-text);">๐Ÿš€ ์‹œ์Šคํ…œ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ</h2>
    <ol style="line-height: 2; color: var(--m-text-muted);">
        <li><strong>ํฌ๋ฆฌ์—์ดํ„ฐ:</strong> "๊ฐ€๊ฒฉ ์„ค์ •" ๋ฉ”๋‰ด์—์„œ ์ž‘์—… ์œ ํ˜•๊ณผ ์ถ”๊ฐ€ ์˜ต์…˜์˜ ๋‹จ๊ฐ€๋ฅผ ๋จผ์ € ๋“ฑ๋กํ•˜์„ธ์š”.</li>
        <li><strong>๊ณ ๊ฐ:</strong> "ํ”„๋กœ์ ํŠธ ์˜๋ขฐํ•˜๊ธฐ" ๋ฉ”๋‰ด์—์„œ ํ”„๋กœ์ ํŠธ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฒฌ์ ์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.</li>
        <li><strong>๊ณ ๊ฐ:</strong> ๊ฒฌ์ ์„œ ํ™•์ธ ํŽ˜์ด์ง€์—์„œ ๊ฒฌ์ ์„ ๊ฒ€ํ† ํ•˜๊ณ  ์Šน์ธ ๋˜๋Š” ๊ฑฐ์ ˆํ•˜์„ธ์š”.</li>
        <li><strong>ํฌ๋ฆฌ์—์ดํ„ฐ:</strong> "ํฌ๋ฆฌ์—์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ"์—์„œ ์ ‘์ˆ˜๋œ ์˜๋ขฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  PDF ๊ฒฌ์ ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”.</li>
        <li><strong>์ž๋™ ์•Œ๋ฆผ:</strong> ์˜๋ขฐ ์ ‘์ˆ˜/์Šน์ธ/๊ฑฐ์ ˆ ์‹œ ํฌ๋ฆฌ์—์ดํ„ฐ์—๊ฒŒ ์ด๋ฉ”์ผ์ด ์ž๋™ ๋ฐœ์†ก๋ฉ๋‹ˆ๋‹ค.</li>
    </ol>
</div>
```

์ด์ œ ์ „์ฒด ์‹œ์Šคํ…œ์ด ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:
1. `/creator-quote/pricing`์—์„œ ์ž‘์—… ์œ ํ˜•๊ณผ ์˜ต์…˜ ์ถ”๊ฐ€
2. `/creator-quote/request`์—์„œ ๊ณ ๊ฐ ์˜๋ขฐ ์ œ์ถœ
3. `/creator-quote/view/1`์—์„œ ๊ฒฌ์  ํ™•์ธ ๋ฐ ์Šน์ธ/๊ฑฐ์ ˆ
4. `/creator-quote/dashboard`์—์„œ ๋Œ€์‹œ๋ณด๋“œ ํ™•์ธ
5. PDF ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์ˆ˜์‹  ํ™•์ธ

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ์ด๋ฉ”์ผ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ๊ณ ๊ฐ์ด ์˜๋ขฐ๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ ๊ฒฌ์ ์„ ์Šน์ธ/๊ฑฐ์ ˆํ•  ๋•Œ ํฌ๋ฆฌ์—์ดํ„ฐ์—๊ฒŒ ์ž๋™์œผ๋กœ ์ด๋ฉ”์ผ์ด ๋ฐœ์†ก๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ ๊ฐ€์ด๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์‹œ์Šคํ…œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์™„์„ฑ๋˜์–ด ์‹ค๋ฌด์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ๊ฒฌ์  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ๋ฉ๋‹ˆ๋‹ค.

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

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

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

๋Œ“๊ธ€ (0)

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