๐ŸŽฏ g5se ์˜จ๋ผ์ธ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ํ† ๋„ˆ๋จผํŠธ - ์‹ค์‹œ๊ฐ„ ๋Œ€์ง„ํ‘œ & ์šฐ์Šน์ž ๊ธฐ๋ก - ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ๋ ˆ์‹œํ”ผ
์ž…๋ฌธ PHP g5se AI: Claude

๐ŸŽฏ g5se ์˜จ๋ผ์ธ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ํ† ๋„ˆ๋จผํŠธ - ์‹ค์‹œ๊ฐ„ ๋Œ€์ง„ํ‘œ & ์šฐ์Šน์ž ๊ธฐ๋ก

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ช… g5se-rps-tournament
์กฐํšŒ์ˆ˜ 52 0๊ฑด ์ œ์ถœ

๋ฌธ์ œ ์„ค๋ช…

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

์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์ฆ๊ธฐ๋Š” ๊ฐ€์œ„๋ฐ”์œ„๋ณด ํ† ๋„ˆ๋จผํŠธ ํ”Œ๋žซํผ! ์ฐธ๊ฐ€์ž๋ฅผ ๋“ฑ๋กํ•˜๊ณ , ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํ† ๋„ˆ๋จผํŠธ ๋Œ€์ง„ํ‘œ์—์„œ ํ•œ ๊ฒฝ๊ธฐ์”ฉ ๊ฒฐ๊ณผ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ ๋ผ์šด๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์šฐ์Šน์ž๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด ๋ช…์˜ˆ์˜ ์ „๋‹น์— ๊ธฐ๋ก๋˜์–ด ์—ญ๋Œ€ ์ฑ”ํ”ผ์–ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

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

  • ํ† ๋„ˆ๋จผํŠธ ์ƒ์„ฑ ํผ (ํ† ๋„ˆ๋จผํŠธ๋ช…, ์ฐธ๊ฐ€์ž ์ด๋ฆ„ ์ž…๋ ฅ)
  • ์ฐธ๊ฐ€์ž ์ˆ˜์— ๋”ฐ๋ฅธ ์ž๋™ ๋Œ€์ง„ํ‘œ ์ƒ์„ฑ (4/8/16๋ช… ์ง€์›)
  • ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ ์ž…๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค (๊ฐ€์œ„/๋ฐ”์œ„/๋ณด ์„ ํƒ)
  • ๋ผ์šด๋“œ๋ณ„ ์ง„ํ–‰ ์ƒํ™ฉ ์‹œ๊ฐํ™” (16๊ฐ• โ†’ 8๊ฐ• โ†’ 4๊ฐ• โ†’ ๊ฒฐ์Šน)
  • ์šฐ์Šน์ž ๊ฒฐ์ • ์‹œ ๋ช…์˜ˆ์˜ ์ „๋‹น ์ž๋™ ๋“ฑ๋ก
  • ์ง„ํ–‰ ์ค‘์ธ ํ† ๋„ˆ๋จผํŠธ ๋ชฉ๋ก & ์™„๋ฃŒ๋œ ํ† ๋„ˆ๋จผํŠธ ์•„์นด์ด๋ธŒ

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

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

๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

  • g5se ํด๋” ๊ธฐ๋ฐ˜ ์ž๋™ ๋ผ์šฐํŒ… ์ดํ•ด
  • modern shell๋กœ ์ผ๊ด€๋œ UI ๊ตฌ์„ฑ
  • SQLite ๊ธฐ๋ฐ˜ ๋…๋ฆฝ DB ์„ค๊ณ„ (ํ† ๋„ˆ๋จผํŠธ, ๊ฒฝ๊ธฐ, ์ฐธ๊ฐ€์ž ํ…Œ์ด๋ธ”)
  • ํ† ๋„ˆ๋จผํŠธ ๋ธŒ๋ž˜ํ‚ท ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ (๋‹จ์ผ ํƒˆ๋ฝ์ œ)
  • CSS ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•œ ๋‹คํฌ๋ชจ๋“œ ์ž๋™ ๋Œ€์‘

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

  • PHP (๊ทธ๋ˆ„๋ณด๋“œ5 SE)
  • SQLite (๋ชจ๋“ˆ ์ „์šฉ DB)
  • HTML/CSS/JavaScript (๋ฐ”๋‹๋ผ)
  • modern shell (g5se ํ…Œ๋งˆ ์‹œ์Šคํ…œ)

๐Ÿ“‹ ์ œ์•ฝ ์กฐ๊ฑด

  • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/CDN ์‚ฌ์šฉ ๊ธˆ์ง€ (์ˆœ์ˆ˜ ๋ฐ”๋‹๋ผ JS)
  • g5se ๋ฉ”์ธ DB์— ํ…Œ์ด๋ธ” ์ถ”๊ฐ€ ๊ธˆ์ง€ (๋…๋ฆฝ SQLite ์‚ฌ์šฉ)
  • ์ฐธ๊ฐ€์ž ์ˆ˜๋Š” 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ (4/8/16๋ช…)๋งŒ ์ง€์›
  • ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋Š” ๊ฐ€์œ„/๋ฐ”์œ„/๋ณด ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒ ๊ฐ€๋Šฅ

์ œ์•ฝ ์กฐ๊ฑด

  • โ€ข g5se ์„ค์น˜๋ณธ ์œ„์— ํŒŒ์ผ ์ถ”๊ฐ€ (์ƒˆ ํด๋” ์ƒ์„ฑ ๊ธˆ์ง€)
  • โ€ข app/modules/rps-tournament/index.php๋กœ ํŽ˜์ด์ง€ ์ƒ์„ฑ
  • โ€ข modern shell ํ•„์ˆ˜ ์‚ฌ์šฉ (_head.inc.php + m-shell + _nav.inc.php + m-container + _footer.inc.php)
  • โ€ข ๋…๋ฆฝ SQLite DB ์‚ฌ์šฉ: G5_DATA_PATH.'/modules/rps_tournament.sqlite'
  • โ€ข ๋””์ž์ธ ํ† ํฐ ์‚ฌ์šฉ: var(--m-surface), var(--m-text), var(--m-shadow) ๋“ฑ
  • โ€ข ์™ธ๋ถ€ CDN/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธˆ์ง€ (์ˆœ์ˆ˜ ๋ฐ”๋‹๋ผ JS)
  • โ€ข ์ฐธ๊ฐ€์ž ์ˆ˜๋Š” 4/8/16๋ช…์œผ๋กœ ์ œํ•œ (2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ)
  • โ€ข htmlspecialchars()๋กœ XSS ๋ฐฉ์ง€
  • โ€ข prepared statement๋กœ SQL ์ธ์ ์…˜ ๋ฐฉ์ง€

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

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

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

**1๋‹จ๊ณ„: ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ๊ณจ๊ฒฉ ์ƒ์„ฑ**

`app/modules/rps-tournament/index.php` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜์„ธ์š”:

```php
<?php
include_once('./_common.php');

// SQLite DB ์ดˆ๊ธฐํ™”
@mkdir(G5_DATA_PATH.'/modules', 0707, true);
$db_path = G5_DATA_PATH.'/modules/rps_tournament.sqlite';
$db = new PDO('sqlite:'.$db_path);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// ํ…Œ์ด๋ธ” ์ƒ์„ฑ (์ฒซ ์ ‘๊ทผ ์‹œ)
$db->exec("
    CREATE TABLE IF NOT EXISTS tournaments (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        player_count INTEGER NOT NULL,
        status TEXT DEFAULT 'ongoing',
        winner_name TEXT,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )
");

$db->exec("
    CREATE TABLE IF NOT EXISTS matches (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        tournament_id INTEGER NOT NULL,
        round INTEGER NOT NULL,
        match_number INTEGER NOT NULL,
        player1_name TEXT,
        player2_name TEXT,
        player1_choice TEXT,
        player2_choice TEXT,
        winner_name TEXT,
        FOREIGN KEY(tournament_id) REFERENCES tournaments(id)
    )
");

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: 32px 20px 48px;">
        <style>
            .tournament-header {
                text-align: center;
                margin-bottom: 40px;
            }
            .tournament-header h1 {
                font-size: 2rem;
                font-weight: 700;
                color: var(--m-text);
                margin-bottom: 8px;
            }
            .tournament-header p {
                font-size: 1rem;
                color: var(--m-text-muted);
            }
            .tab-buttons {
                display: flex;
                gap: 12px;
                justify-content: center;
                margin-bottom: 32px;
            }
            .tab-btn {
                padding: 12px 24px;
                background: var(--m-surface);
                border: 2px solid #e0e0e0;
                border-radius: var(--m-radius-lg);
                font-weight: 600;
                cursor: pointer;
                transition: all 0.2s;
            }
            .tab-btn.active {
                background: #4CAF50;
                color: white;
                border-color: #4CAF50;
            }
            .content-section {
                display: none;
            }
            .content-section.active {
                display: block;
            }
            .create-form {
                max-width: 500px;
                margin: 0 auto;
                padding: 32px;
                background: var(--m-surface);
                border-radius: var(--m-radius-lg);
                box-shadow: var(--m-shadow);
            }
            .form-group {
                margin-bottom: 20px;
            }
            .form-group label {
                display: block;
                font-weight: 600;
                margin-bottom: 8px;
                color: var(--m-text);
            }
            .form-group input, .form-group select, .form-group textarea {
                width: 100%;
                padding: 12px;
                border: 2px solid #e0e0e0;
                border-radius: 8px;
                font-size: 1rem;
                background: var(--m-surface);
                color: var(--m-text);
            }
            .form-group textarea {
                min-height: 120px;
                resize: vertical;
            }
            .submit-btn {
                width: 100%;
                padding: 14px;
                background: #4CAF50;
                color: white;
                border: none;
                border-radius: 8px;
                font-size: 1.1rem;
                font-weight: 700;
                cursor: pointer;
                transition: background 0.2s;
            }
            .submit-btn:hover {
                background: #45a049;
            }
        </style>

        <div class="tournament-header">
            <h1>๐ŸŽฏ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ํ† ๋„ˆ๋จผํŠธ</h1>
            <p>์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์ฆ๊ธฐ๋Š” ์‹ค์‹œ๊ฐ„ ๋Œ€์ง„ํ‘œ & ์šฐ์Šน์ž ๊ธฐ๋ก</p>
        </div>

        <div class="tab-buttons">
            <button class="tab-btn active" onclick="showTab('create')">์ƒˆ ํ† ๋„ˆ๋จผํŠธ</button>
            <button class="tab-btn" onclick="showTab('ongoing')">์ง„ํ–‰ ์ค‘</button>
            <button class="tab-btn" onclick="showTab('archive')">๋ช…์˜ˆ์˜ ์ „๋‹น</button>
        </div>

        <div id="create-section" class="content-section active">
            <form method="POST" class="create-form">
                <input type="hidden" name="action" value="create_tournament">
                <div class="form-group">
                    <label>ํ† ๋„ˆ๋จผํŠธ ์ด๋ฆ„</label>
                    <input type="text" name="tournament_name" placeholder="์˜ˆ: 2024 ๋ด„ ์ฑ”ํ”ผ์–ธ์‹ญ" required>
                </div>
                <div class="form-group">
                    <label>์ฐธ๊ฐ€์ž ์ˆ˜</label>
                    <select name="player_count" required>
                        <option value="4">4๋ช… (2๋ผ์šด๋“œ)</option>
                        <option value="8">8๋ช… (3๋ผ์šด๋“œ)</option>
                        <option value="16">16๋ช… (4๋ผ์šด๋“œ)</option>
                    </select>
                </div>
                <div class="form-group">
                    <label>์ฐธ๊ฐ€์ž ์ด๋ฆ„ (ํ•œ ์ค„์— ํ•œ ๋ช…์”ฉ)</label>
                    <textarea name="player_names" placeholder="ํ™๊ธธ๋™\n๊น€์ฒ ์ˆ˜\n์ด์˜ํฌ\n๋ฐ•๋ฏผ์ˆ˜" required></textarea>
                </div>
                <button type="submit" class="submit-btn">๐Ÿš€ ํ† ๋„ˆ๋จผํŠธ ์‹œ์ž‘</button>
            </form>
        </div>

        <div id="ongoing-section" class="content-section">
            <p style="text-align:center; color: var(--m-text-muted);">์ง„ํ–‰ ์ค‘์ธ ํ† ๋„ˆ๋จผํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</p>
        </div>

        <div id="archive-section" class="content-section">
            <p style="text-align:center; color: var(--m-text-muted);">์™„๋ฃŒ๋œ ํ† ๋„ˆ๋จผํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</p>
        </div>

        <script>
            function showTab(tab) {
                document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active'));
                document.querySelectorAll('.content-section').forEach(sec => sec.classList.remove('active'));
                
                event.target.classList.add('active');
                document.getElementById(tab + '-section').classList.add('active');
            }
        </script>
    </main>
    <?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
</div>
<?php include_once('./tail.sub.php'); ?>
```

์ด ํŒŒ์ผ์€ ์ž๋™์œผ๋กœ `/rps-tournament` URL์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๋ธŒ๋ผ์šฐ์ €์—์„œ `/rps-tournament`์— ์ ‘์†ํ•˜๋ฉด modern shell ์Šคํƒ€์ผ์˜ ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ , 3๊ฐœ ํƒญ(์ƒˆ ํ† ๋„ˆ๋จผํŠธ/์ง„ํ–‰ ์ค‘/๋ช…์˜ˆ์˜ ์ „๋‹น)๊ณผ ํ† ๋„ˆ๋จผํŠธ ์ƒ์„ฑ ํผ์ด ๋ณด์ž…๋‹ˆ๋‹ค. SQLite DB์— tournaments, matches ํ…Œ์ด๋ธ”์ด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

2
Step 2
**2๋‹จ๊ณ„: ํ† ๋„ˆ๋จผํŠธ ์ƒ์„ฑ & ๋Œ€์ง„ํ‘œ ์ž๋™ ์ƒ์„ฑ ๋กœ์ง ๊ตฌํ˜„**

`app/modules/rps-tournament/index.php` ํŒŒ์ผ์˜ `include_once('./_common.php');` ๋ฐ”๋กœ ์•„๋ž˜์— ๋‹ค์Œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

```php
// ํ† ๋„ˆ๋จผํŠธ ์ƒ์„ฑ ์ฒ˜๋ฆฌ
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'create_tournament') {
    $tournament_name = trim($_POST['tournament_name']);
    $player_count = (int)$_POST['player_count'];
    $player_names = array_filter(array_map('trim', explode("\n", $_POST['player_names'])));
    
    if (count($player_names) !== $player_count) {
        echo "<script>alert('์ฐธ๊ฐ€์ž ์ˆ˜๊ฐ€ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. {$player_count}๋ช…์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.'); history.back();</script>";
        exit;
    }
    
    // ํ† ๋„ˆ๋จผํŠธ ์ƒ์„ฑ
    $stmt = $db->prepare("INSERT INTO tournaments (name, player_count, status) VALUES (?, ?, 'ongoing')");
    $stmt->execute([$tournament_name, $player_count]);
    $tournament_id = $db->lastInsertId();
    
    // 1๋ผ์šด๋“œ ๋Œ€์ง„ ์ƒ์„ฑ (์ˆœ์„œ๋Œ€๋กœ ๋งค์นญ)
    shuffle($player_names); // ๋ฌด์ž‘์œ„ ๋ฐฐ์น˜
    $match_number = 1;
    for ($i = 0; $i < count($player_names); $i += 2) {
        $stmt = $db->prepare("
            INSERT INTO matches (tournament_id, round, match_number, player1_name, player2_name)
            VALUES (?, 1, ?, ?, ?)
        ");
        $stmt->execute([$tournament_id, $match_number, $player_names[$i], $player_names[$i+1]]);
        $match_number++;
    }
    
    echo "<script>alert('ํ† ๋„ˆ๋จผํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!'); location.href='/rps-tournament';</script>";
    exit;
}
```

๊ทธ๋ฆฌ๊ณ  "์ง„ํ–‰ ์ค‘" ํƒญ ์„น์…˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

```php
<div id="ongoing-section" class="content-section">
    <style>
        .tournament-list {
            display: grid;
            gap: 20px;
            max-width: 800px;
            margin: 0 auto;
        }
        .tournament-card {
            padding: 24px;
            background: var(--m-surface);
            border-radius: var(--m-radius-lg);
            box-shadow: var(--m-shadow);
        }
        .tournament-card h3 {
            font-size: 1.3rem;
            font-weight: 700;
            color: var(--m-text);
            margin-bottom: 12px;
        }
        .tournament-meta {
            display: flex;
            gap: 16px;
            font-size: 0.9rem;
            color: var(--m-text-muted);
            margin-bottom: 16px;
        }
        .view-bracket-btn {
            display: inline-block;
            padding: 10px 20px;
            background: #2196F3;
            color: white;
            border-radius: 8px;
            text-decoration: none;
            font-weight: 600;
            transition: background 0.2s;
        }
        .view-bracket-btn:hover {
            background: #1976D2;
        }
    </style>
    
    <?php
    $stmt = $db->query("SELECT * FROM tournaments WHERE status = 'ongoing' ORDER BY created_at DESC");
    $ongoing = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (empty($ongoing)) {
        echo '<p style="text-align:center; color: var(--m-text-muted);">์ง„ํ–‰ ์ค‘์ธ ํ† ๋„ˆ๋จผํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</p>';
    } else {
        echo '<div class="tournament-list">';
        foreach ($ongoing as $t) {
            $created = date('Y-m-d H:i', strtotime($t['created_at']));
            echo "
                <div class='tournament-card'>
                    <h3>๐Ÿ† ".htmlspecialchars($t['name'])."</h3>
                    <div class='tournament-meta'>
                        <span>๐Ÿ‘ฅ {$t['player_count']}๋ช…</span>
                        <span>๐Ÿ“… {$created}</span>
                    </div>
                    <a href='/rps-tournament?view={$t['id']}' class='view-bracket-btn'>๋Œ€์ง„ํ‘œ ๋ณด๊ธฐ</a>
                </div>
            ";
        }
        echo '</div>';
    }
    ?>
</div>
```

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ํ† ๋„ˆ๋จผํŠธ ์ƒ์„ฑ ํผ์„ ์ œ์ถœํ•˜๋ฉด DB์— ํ† ๋„ˆ๋จผํŠธ์™€ 1๋ผ์šด๋“œ ๊ฒฝ๊ธฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , "์ง„ํ–‰ ์ค‘" ํƒญ์—์„œ ์ƒ์„ฑ๋œ ํ† ๋„ˆ๋จผํŠธ ๋ชฉ๋ก์„ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์นด๋“œ์—์„œ "๋Œ€์ง„ํ‘œ ๋ณด๊ธฐ" ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

3
Step 3
**3๋‹จ๊ณ„: ํ† ๋„ˆ๋จผํŠธ ๋Œ€์ง„ํ‘œ ์‹œ๊ฐํ™” & ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ ์ž…๋ ฅ UI**

`app/modules/rps-tournament/index.php` ํŒŒ์ผ์˜ `// SQLite DB ์ดˆ๊ธฐํ™”` ์„น์…˜ ๋ฐ”๋กœ ์•„๋ž˜์— ๋‹ค์Œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

```php
// ํŠน์ • ํ† ๋„ˆ๋จผํŠธ ์กฐํšŒ
if (isset($_GET['view'])) {
    $tournament_id = (int)$_GET['view'];
    $stmt = $db->prepare("SELECT * FROM tournaments WHERE id = ?");
    $stmt->execute([$tournament_id]);
    $tournament = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$tournament) {
        echo "<script>alert('์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ† ๋„ˆ๋จผํŠธ์ž…๋‹ˆ๋‹ค.'); location.href='/rps-tournament';</script>";
        exit;
    }
    
    // ๋ผ์šด๋“œ๋ณ„ ๊ฒฝ๊ธฐ ์กฐํšŒ
    $stmt = $db->prepare("SELECT * FROM matches WHERE tournament_id = ? ORDER BY round, match_number");
    $stmt->execute([$tournament_id]);
    $all_matches = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    $rounds = [];
    foreach ($all_matches as $m) {
        $rounds[$m['round']][] = $m;
    }
    
    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: 32px 20px 48px;">
            <style>
                .bracket-header {
                    text-align: center;
                    margin-bottom: 32px;
                }
                .bracket-header h1 {
                    font-size: 1.8rem;
                    font-weight: 700;
                    color: var(--m-text);
                    margin-bottom: 8px;
                }
                .bracket-header .status-badge {
                    display: inline-block;
                    padding: 6px 16px;
                    background: #4CAF50;
                    color: white;
                    border-radius: 20px;
                    font-size: 0.9rem;
                    font-weight: 600;
                }
                .rounds-container {
                    display: flex;
                    gap: 32px;
                    overflow-x: auto;
                    padding: 20px;
                    justify-content: center;
                }
                .round-column {
                    min-width: 280px;
                }
                .round-title {
                    text-align: center;
                    font-size: 1.1rem;
                    font-weight: 700;
                    color: var(--m-text);
                    margin-bottom: 20px;
                }
                .match-card {
                    padding: 16px;
                    background: var(--m-surface);
                    border: 2px solid #e0e0e0;
                    border-radius: var(--m-radius-lg);
                    margin-bottom: 16px;
                }
                .match-card.completed {
                    border-color: #4CAF50;
                }
                .player-row {
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    padding: 10px;
                    margin-bottom: 8px;
                    background: rgba(0,0,0,0.02);
                    border-radius: 6px;
                }
                .player-row.winner {
                    background: #4CAF50;
                    color: white;
                    font-weight: 700;
                }
                .player-name {
                    font-weight: 600;
                }
                .rps-buttons {
                    display: flex;
                    gap: 8px;
                    margin-top: 12px;
                }
                .rps-btn {
                    flex: 1;
                    padding: 8px;
                    background: #2196F3;
                    color: white;
                    border: none;
                    border-radius: 6px;
                    cursor: pointer;
                    font-size: 1.2rem;
                    transition: background 0.2s;
                }
                .rps-btn:hover {
                    background: #1976D2;
                }
            </style>

            <div class="bracket-header">
                <h1>๐Ÿ† <?php echo htmlspecialchars($tournament['name']); ?></h1>
                <span class="status-badge"><?php echo $tournament['status'] === 'ongoing' ? '์ง„ํ–‰ ์ค‘' : '์™„๋ฃŒ'; ?></span>
            </div>

            <div class="rounds-container">
                <?php
                $round_names = [1 => '1๋ผ์šด๋“œ', 2 => '์ค€๊ฒฐ์Šน', 3 => '์ค€์ค€๊ฒฐ์Šน', 4 => '16๊ฐ•'];
                foreach ($rounds as $round_num => $matches) {
                    echo "<div class='round-column'>";
                    echo "<div class='round-title'>{$round_names[$round_num]}</div>";
                    
                    foreach ($matches as $match) {
                        $is_completed = !empty($match['winner_name']);
                        echo "<div class='match-card ".($is_completed ? 'completed' : '').">";
                        
                        // Player 1
                        $p1_winner = ($match['winner_name'] === $match['player1_name']);
                        echo "<div class='player-row ".($p1_winner ? 'winner' : '').">";
                        echo "<span class='player-name'>".htmlspecialchars($match['player1_name']).".";
                        if ($match['player1_choice']) echo " (".htmlspecialchars($match['player1_choice']).")";
                        echo "</span>";
                        if ($p1_winner) echo "<span>๐Ÿ†</span>";
                        echo "</div>";
                        
                        // Player 2
                        $p2_winner = ($match['winner_name'] === $match['player2_name']);
                        echo "<div class='player-row ".($p2_winner ? 'winner' : '').">";
                        echo "<span class='player-name'>".htmlspecialchars($match['player2_name']).".";
                        if ($match['player2_choice']) echo " (".htmlspecialchars($match['player2_choice']).")";
                        echo "</span>";
                        if ($p2_winner) echo "<span>๐Ÿ†</span>";
                        echo "</div>";
                        
                        // ๊ฒฐ๊ณผ ์ž…๋ ฅ ๋ฒ„ํŠผ (๋ฏธ์™„๋ฃŒ ๊ฒฝ๊ธฐ๋งŒ)
                        if (!$is_completed) {
                            echo "
                                <form method='POST' style='margin-top: 12px;'>
                                    <input type='hidden' name='action' value='set_result'>
                                    <input type='hidden' name='match_id' value='{$match['id']}'>
                                    <input type='hidden' name='tournament_id' value='{$tournament_id}'>
                                    <div style='margin-bottom: 8px; font-size: 0.9rem; color: var(--m-text-muted);'>Player 1 ์„ ํƒ:</div>
                                    <div class='rps-buttons'>
                                        <button type='submit' name='p1_choice' value='๊ฐ€์œ„' class='rps-btn'>โœŒ๏ธ</button>
                                        <button type='submit' name='p1_choice' value='๋ฐ”์œ„' class='rps-btn'>โœŠ</button>
                                        <button type='submit' name='p1_choice' value='๋ณด' class='rps-btn'>๐Ÿ–</button>
                                    </div>
                                    <div style='margin: 12px 0 8px; font-size: 0.9rem; color: var(--m-text-muted);'>Player 2 ์„ ํƒ:</div>
                                    <div class='rps-buttons'>
                                        <button type='submit' name='p2_choice' value='๊ฐ€์œ„' class='rps-btn'>โœŒ๏ธ</button>
                                        <button type='submit' name='p2_choice' value='๋ฐ”์œ„' class='rps-btn'>โœŠ</button>
                                        <button type='submit' name='p2_choice' value='๋ณด' class='rps-btn'>๐Ÿ–</button>
                                    </div>
                                </form>
                            ";
                        }
                        
                        echo "</div>";
                    }
                    
                    echo "</div>";
                }
                ?>
            </div>

            <div style="text-align: center; margin-top: 32px;">
                <a href="/rps-tournament" style="display: inline-block; padding: 12px 24px; background: var(--m-surface); border: 2px solid #e0e0e0; border-radius: 8px; text-decoration: none; color: var(--m-text); font-weight: 600;">โ† ๋ชฉ๋ก์œผ๋กœ</a>
            </div>
        </main>
        <?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
    </div>
    <?php
    include_once('./tail.sub.php');
    exit;
}
```

์ด์ œ "๋Œ€์ง„ํ‘œ ๋ณด๊ธฐ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ผ์šด๋“œ๋ณ„ ๊ฒฝ๊ธฐ ๋ชฉ๋ก๊ณผ ๊ฒฐ๊ณผ ์ž…๋ ฅ ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: "๋Œ€์ง„ํ‘œ ๋ณด๊ธฐ"๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ† ๋„ˆ๋จผํŠธ ์ „์šฉ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ , ๋ผ์šด๋“œ๋ณ„๋กœ ๊ฒฝ๊ธฐ๊ฐ€ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฒฝ๊ธฐ์—์„œ Player 1๊ณผ Player 2์˜ ๊ฐ€์œ„/๋ฐ”์œ„/๋ณด ์„ ํƒ ๋ฒ„ํŠผ์ด ๋ณด์ด๋ฉฐ, ์™„๋ฃŒ๋œ ๊ฒฝ๊ธฐ๋Š” ์ดˆ๋ก์ƒ‰ ํ…Œ๋‘๋ฆฌ์™€ ์šฐ์Šน์ž ํ‘œ์‹œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

4
Step 4
**4๋‹จ๊ณ„: ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ & ๋‹ค์Œ ๋ผ์šด๋“œ ์ž๋™ ์ƒ์„ฑ ๋กœ์ง**

`app/modules/rps-tournament/index.php` ํŒŒ์ผ์˜ ํ† ๋„ˆ๋จผํŠธ ์ƒ์„ฑ ๋กœ์ง ๋ฐ”๋กœ ์•„๋ž˜์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

```php
// ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ ์ž…๋ ฅ ์ฒ˜๋ฆฌ
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'set_result') {
    $match_id = (int)$_POST['match_id'];
    $tournament_id = (int)$_POST['tournament_id'];
    $p1_choice = $_POST['p1_choice'] ?? null;
    $p2_choice = $_POST['p2_choice'] ?? null;
    
    if (!$p1_choice || !$p2_choice) {
        echo "<script>alert('์–‘์ชฝ ์„ ํƒ์„ ๋ชจ๋‘ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.'); history.back();</script>";
        exit;
    }
    
    // ๊ฒฝ๊ธฐ ์ •๋ณด ์กฐํšŒ
    $stmt = $db->prepare("SELECT * FROM matches WHERE id = ?");
    $stmt->execute([$match_id]);
    $match = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // ์Šน์ž ๊ฒฐ์ • ๋กœ์ง
    $winner = null;
    if ($p1_choice === $p2_choice) {
        echo "<script>alert('๋ฌด์Šน๋ถ€์ž…๋‹ˆ๋‹ค! ๋‹ค์‹œ ์„ ํƒํ•ด์ฃผ์„ธ์š”.'); history.back();</script>";
        exit;
    } elseif (
        ($p1_choice === '๊ฐ€์œ„' && $p2_choice === '๋ณด') ||
        ($p1_choice === '๋ฐ”์œ„' && $p2_choice === '๊ฐ€์œ„') ||
        ($p1_choice === '๋ณด' && $p2_choice === '๋ฐ”์œ„')
    ) {
        $winner = $match['player1_name'];
    } else {
        $winner = $match['player2_name'];
    }
    
    // ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ ์—…๋ฐ์ดํŠธ
    $stmt = $db->prepare("
        UPDATE matches SET player1_choice = ?, player2_choice = ?, winner_name = ?
        WHERE id = ?
    ");
    $stmt->execute([$p1_choice, $p2_choice, $winner, $match_id]);
    
    // ํ˜„์žฌ ๋ผ์šด๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
    $stmt = $db->prepare("
        SELECT COUNT(*) as total, SUM(CASE WHEN winner_name IS NOT NULL THEN 1 ELSE 0 END) as completed
        FROM matches WHERE tournament_id = ? AND round = ?
    ");
    $stmt->execute([$tournament_id, $match['round']]);
    $round_status = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // ๋ผ์šด๋“œ ์™„๋ฃŒ ์‹œ ๋‹ค์Œ ๋ผ์šด๋“œ ์ƒ์„ฑ
    if ($round_status['total'] == $round_status['completed']) {
        // ํ˜„์žฌ ๋ผ์šด๋“œ ์Šน์ž ๋ชฉ๋ก
        $stmt = $db->prepare("SELECT winner_name FROM matches WHERE tournament_id = ? AND round = ? ORDER BY match_number");
        $stmt->execute([$tournament_id, $match['round']]);
        $winners = $stmt->fetchAll(PDO::FETCH_COLUMN);
        
        if (count($winners) === 1) {
            // ์ตœ์ข… ์šฐ์Šน์ž ๊ฒฐ์ •
            $stmt = $db->prepare("UPDATE tournaments SET status = 'completed', winner_name = ? WHERE id = ?");
            $stmt->execute([$winners[0], $tournament_id]);
            
            echo "<script>alert('๐ŸŽ‰ ์šฐ์Šน์ž: {$winners[0]}'); location.href='/rps-tournament?view={$tournament_id}';</script>";
            exit;
        } else {
            // ๋‹ค์Œ ๋ผ์šด๋“œ ์ƒ์„ฑ
            $next_round = $match['round'] + 1;
            $match_number = 1;
            for ($i = 0; $i < count($winners); $i += 2) {
                $stmt = $db->prepare("
                    INSERT INTO matches (tournament_id, round, match_number, player1_name, player2_name)
                    VALUES (?, ?, ?, ?, ?)
                ");
                $stmt->execute([$tournament_id, $next_round, $match_number, $winners[$i], $winners[$i+1]]);
                $match_number++;
            }
        }
    }
    
    echo "<script>location.href='/rps-tournament?view={$tournament_id}';</script>";
    exit;
}
```

์ด์ œ ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์Šน์ž๊ฐ€ ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋˜๊ณ , ๋ผ์šด๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๋ผ์šด๋“œ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ๊ฒฝ๊ธฐ์—์„œ ๊ฐ€์œ„/๋ฐ”์œ„/๋ณด๋ฅผ ์„ ํƒํ•˜๋ฉด ์Šน์ž๊ฐ€ ๊ฒฐ์ •๋˜๊ณ  ๊ฒฝ๊ธฐ ์นด๋“œ๊ฐ€ ์ดˆ๋ก์ƒ‰ ํ…Œ๋‘๋ฆฌ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋ผ์šด๋“œ์˜ ๋ชจ๋“  ๊ฒฝ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์Œ ๋ผ์šด๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ์ตœ์ข… ์šฐ์Šน์ž๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด alert๋กœ ์ถ•ํ•˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

5
Step 5
**5๋‹จ๊ณ„: ๋ช…์˜ˆ์˜ ์ „๋‹น ๊ตฌํ˜„ & ๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• ๋””์ž์ธ**

`app/modules/rps-tournament/index.php` ํŒŒ์ผ์˜ "๋ช…์˜ˆ์˜ ์ „๋‹น" ํƒญ ์„น์…˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

```php
<div id="archive-section" class="content-section">
    <style>
        .hall-of-fame {
            max-width: 900px;
            margin: 0 auto;
        }
        .champion-card {
            display: flex;
            align-items: center;
            gap: 24px;
            padding: 24px;
            background: var(--m-surface);
            border-radius: var(--m-radius-lg);
            box-shadow: var(--m-shadow);
            margin-bottom: 20px;
            border-left: 6px solid #FFD700;
        }
        .champion-trophy {
            font-size: 3rem;
        }
        .champion-info h3 {
            font-size: 1.4rem;
            font-weight: 700;
            color: var(--m-text);
            margin-bottom: 8px;
        }
        .champion-meta {
            display: flex;
            gap: 16px;
            font-size: 0.9rem;
            color: var(--m-text-muted);
        }
        @media (max-width: 768px) {
            .rounds-container {
                flex-direction: column;
            }
            .round-column {
                width: 100%;
            }
            .champion-card {
                flex-direction: column;
                text-align: center;
            }
        }
    </style>
    
    <?php
    $stmt = $db->query("SELECT * FROM tournaments WHERE status = 'completed' ORDER BY created_at DESC");
    $completed = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (empty($completed)) {
        echo '<p style="text-align:center; color: var(--m-text-muted);">์™„๋ฃŒ๋œ ํ† ๋„ˆ๋จผํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</p>';
    } else {
        echo '<div class="hall-of-fame">';
        foreach ($completed as $t) {
            $created = date('Y-m-d', strtotime($t['created_at']));
            echo "
                <div class='champion-card'>
                    <div class='champion-trophy'>๐Ÿ†</div>
                    <div class='champion-info'>
                        <h3>".htmlspecialchars($t['winner_name'])."</h3>
                        <div class='champion-meta'>
                            <span>๐ŸŽฏ ".htmlspecialchars($t['name'])."</span>
                            <span>๐Ÿ‘ฅ {$t['player_count']}๋ช… ์ฐธ๊ฐ€</span>
                            <span>๐Ÿ“… {$created}</span>
                        </div>
                    </div>
                </div>
            ";
        }
        echo '</div>';
    }
    ?>
</div>
```

๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง€ ์ตœ์ƒ๋‹จ์˜ `<style>` ๋ธ”๋ก์— ๋‹ค์Œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

```css
@media (max-width: 768px) {
    .tab-buttons {
        flex-direction: column;
    }
    .tab-btn {
        width: 100%;
    }
    .create-form {
        padding: 20px;
    }
    .rps-buttons {
        flex-direction: column;
    }
    .rps-btn {
        width: 100%;
    }
}
```

๋งˆ์ง€๋ง‰์œผ๋กœ ๋Œ€์ง„ํ‘œ ํŽ˜์ด์ง€ ์ƒ๋‹จ์— ํ† ๋„ˆ๋จผํŠธ ์ •๋ณด ์š”์•ฝ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š” (`.bracket-header` ์•„๋ž˜):

```php
<div style="max-width: 600px; margin: 0 auto 32px; padding: 20px; background: var(--m-surface); border-radius: var(--m-radius-lg); box-shadow: var(--m-shadow);">
    <div style="display: flex; justify-content: space-around; text-align: center;">
        <div>
            <div style="font-size: 2rem; font-weight: 700; color: #4CAF50;"><?php echo $tournament['player_count']; ?></div>
            <div style="font-size: 0.9rem; color: var(--m-text-muted);">์ฐธ๊ฐ€์ž</div>
        </div>
        <div>
            <div style="font-size: 2rem; font-weight: 700; color: #2196F3;"><?php echo max(array_keys($rounds)); ?></div>
            <div style="font-size: 0.9rem; color: var(--m-text-muted);">์ด ๋ผ์šด๋“œ</div>
        </div>
        <div>
            <div style="font-size: 2rem; font-weight: 700; color: #FF9800;"><?php echo count($all_matches); ?></div>
            <div style="font-size: 0.9rem; color: var(--m-text-muted);">์ด ๊ฒฝ๊ธฐ</div>
        </div>
    </div>
</div>
```

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ์™„๋ฃŒ๋œ ํ† ๋„ˆ๋จผํŠธ์˜ ์šฐ์Šน์ž๊ฐ€ "๋ช…์˜ˆ์˜ ์ „๋‹น" ํƒญ์— ๊ธˆ์ƒ‰ ํŠธ๋กœํ”ผ์™€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ์—์„œ ์ ‘์†ํ•˜๋ฉด ํƒญ ๋ฒ„ํŠผ์ด ์„ธ๋กœ๋กœ ๋ฐฐ์น˜๋˜๊ณ , ๋Œ€์ง„ํ‘œ๊ฐ€ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์„ธ๋กœ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํ† ๋„ˆ๋จผํŠธ ์ƒ๋‹จ์— ์ฐธ๊ฐ€์ž ์ˆ˜, ์ด ๋ผ์šด๋“œ, ์ด ๊ฒฝ๊ธฐ ์ˆ˜๊ฐ€ ์š”์•ฝ ์นด๋“œ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

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

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

๋Œ“๊ธ€ (0)

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