๐ŸŽฏ g5se ์˜ค๋Š˜์˜ ์˜์–ด ๋ฌธ์žฅ ๋งŒ๋“ค๊ธฐ - ๋‹จ์–ด ์นด๋“œ ์กฐํ•ฉ ๊ฒŒ์ž„ - ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ๋ ˆ์‹œํ”ผ
์ž…๋ฌธ PHP g5se AI: Claude

๐ŸŽฏ g5se ์˜ค๋Š˜์˜ ์˜์–ด ๋ฌธ์žฅ ๋งŒ๋“ค๊ธฐ - ๋‹จ์–ด ์นด๋“œ ์กฐํ•ฉ ๊ฒŒ์ž„

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ช… g5se-sentence-builder-game
์กฐํšŒ์ˆ˜ 145 0๊ฑด ์ œ์ถœ

๋ฌธ์ œ ์„ค๋ช…

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

๋žœ๋ค์œผ๋กœ ์ฃผ์–ด์ง„ ์˜์–ด ๋‹จ์–ด ์นด๋“œ๋“ค์„ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์กฐํ•ฉํ•˜์—ฌ ๋ฌธ๋ฒ•์— ๋งž๋Š” ๋ฌธ์žฅ์„ ๋งŒ๋“œ๋Š” ํ•™์Šต ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ฃผ์–ด์ง„ ๋‹จ์–ด๋“ค์„ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๋ฐฐ์—ดํ•˜๊ณ , ์ œ์ถœ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ •๋‹ต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SQLite DB์— ๋ฌธ์žฅ ํ…œํ”Œ๋ฆฟ๊ณผ ์ •๋‹ต์„ ์ €์žฅํ•˜๊ณ , ๋งค ์ ‘์†๋งˆ๋‹ค ๋žœ๋ค์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ถœ์ œํ•ฉ๋‹ˆ๋‹ค.

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

  • ๋žœ๋ค ๋ฌธ์ œ ์ถœ์ œ: ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ DB์—์„œ ๋žœ๋œ์œผ๋กœ 1๊ฐœ ๋ฌธ์žฅ ํ…œํ”Œ๋ฆฟ ์„ ํƒ
  • ๋‹จ์–ด ์นด๋“œ ์„ž๊ธฐ: ์ •๋‹ต ๋ฌธ์žฅ์„ ๋‹จ์–ด ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ ์นด๋“œ ๋ฐฐ์น˜
  • ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ: ๋‹จ์–ด ์นด๋“œ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ์ •๋‹ต ์˜์—ญ์— ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์น˜
  • ์ •๋‹ต ํ™•์ธ: ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฐ์—ดํ•œ ๋ฌธ์žฅ๊ณผ ์ •๋‹ต์„ ๋น„๊ตํ•˜์—ฌ ์„ฑ๊ณต/์‹คํŒจ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
  • ๋‹ค์‹œ ๋„์ „: ํ˜„์žฌ ๋ฌธ์ œ๋ฅผ ๋ฆฌ์…‹ํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ’€๊ธฐ
  • ๋‹ค์Œ ๋ฌธ์ œ: ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ๋žœ๋ค์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  • ๋‹คํฌ๋ชจ๋“œ ๋Œ€์‘: modern shell์˜ ๋””์ž์ธ ํ† ํฐ ์‚ฌ์šฉ์œผ๋กœ ์ž๋™ ๋‹คํฌ๋ชจ๋“œ ์ง€์›

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

  • ํžŒํŠธ ๊ธฐ๋Šฅ: ์ฒซ ๋‹จ์–ด ์œ„์น˜๋ฅผ ์‚ด์ง ๋ณด์—ฌ์ฃผ๋Š” ํžŒํŠธ ๋ฒ„ํŠผ
  • ๋‚œ์ด๋„๋ณ„ ํ•„ํ„ฐ: ์‰ฌ์šด/์ค‘๊ฐ„/์–ด๋ ค์šด ๋ฌธ์žฅ ํ…œํ”Œ๋ฆฟ ์„ ํƒ
  • ํ†ต๊ณ„ ํ‘œ์‹œ: ์„ธ์…˜ ๋™์•ˆ ๋งž์ถ˜ ๋ฌธ์ œ ์ˆ˜ / ์‹œ๋„ ํšŸ์ˆ˜ ํ‘œ์‹œ
  • ์• ๋‹ˆ๋ฉ”์ด์…˜: ์นด๋“œ ๋“œ๋กญ ์‹œ ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜ ํšจ๊ณผ
  • ์Œ์„ฑ ํ”ผ๋“œ๋ฐฑ: ์ •๋‹ต/์˜ค๋‹ต ์‹œ ํšจ๊ณผ์Œ ์žฌ์ƒ (Web Audio API)

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

  • ๋ฐฑ์—”๋“œ: PHP 8.2+ (g5se ์ปจ๋ฒค์…˜)
  • DB: SQLite (๋ชจ๋“ˆ ์ „์šฉ ํŒŒ์ผ)
  • ํ”„๋ก ํŠธ: HTML5 Drag & Drop API, Vanilla JS
  • ์Šคํƒ€์ผ: modern shell ๋””์ž์ธ ํ† ํฐ + ์ปค์Šคํ…€ CSS

๐Ÿ“‚ ์ฃผ์š” ํŒŒ์ผ ๊ตฌ์กฐ

app/modules/sentence-builder/
  โ”œโ”€โ”€ index.php          # ๋ฉ”์ธ ๊ฒŒ์ž„ ํŽ˜์ด์ง€
  โ””โ”€โ”€ (DB๋Š” data/modules/sentence-builder.sqlite ์ž๋™ ์ƒ์„ฑ)

์ œ์•ฝ ์กฐ๊ฑด

  • โ€ข g5se ์„ค์น˜๋ณธ ์œ„์—์„œ ์ž‘์—… (https://github.com/gnuboard/g5se main ๋ธŒ๋žœ์น˜)
  • โ€ข ํด๋” ๊ธฐ๋ฐ˜ ์ž๋™ ๋ผ์šฐํŒ… ์‚ฌ์šฉ โ€” app/modules/sentence-builder/index.php ์ƒ์„ฑํ•˜๋ฉด /sentence-builder๋กœ ์ž๋™ ์ ‘๊ทผ
  • โ€ข modern shell ํ•„์ˆ˜ ์ ์šฉ (_head.inc.php + m-shell + _nav.inc.php + m-container + _footer.inc.php + tail.sub.php)
  • โ€ข ๋””์ž์ธ ํ† ํฐ ์‚ฌ์šฉ (--m-surface, --m-text, --m-shadow ๋“ฑ) โ€” ๋‹คํฌ๋ชจ๋“œ ์ž๋™ ๋Œ€์‘
  • โ€ข ๋ชจ๋“ˆ ์ „์šฉ SQLite DB: G5_DATA_PATH.'/modules/sentence-builder.sqlite' ๊ฒฝ๋กœ์— ์ƒ์„ฑ
  • โ€ข DB ์Šคํ‚ค๋งˆ๋Š” ์ฒซ ์ ‘์† ์‹œ CREATE TABLE IF NOT EXISTS๋กœ ์ž๋™ ์ƒ์„ฑ (๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ถˆํ•„์š”)
  • โ€ข prepared statement ์‚ฌ์šฉ์œผ๋กœ SQL ์ธ์ ์…˜ ๋ฐฉ์ง€
  • โ€ข ์‚ฌ์šฉ์ž ์ž…๋ ฅ์€ htmlspecialchars()๋กœ XSS ๋ฐฉ์ง€
  • โ€ข HTML5 Drag & Drop API ์‚ฌ์šฉ (์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธˆ์ง€)
  • โ€ข ์™ธ๋ถ€ ๋นŒ๋“œ ๋„๊ตฌ(npm/vite) ์‚ฌ์šฉ ๊ธˆ์ง€, CDN ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๊ฐ€๊ธ‰์  ๋ฐฐ์ œํ•˜๊ณ  ์ˆœ์ˆ˜ JS๋กœ ๊ตฌํ˜„

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

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

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

์ด์ œ `app/modules/sentence-builder/index.php` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์„ธ์š”:

1. **modern shell ๊ณจ๊ฒฉ ์ ์šฉ**:
   - `_common.php` ์ธํด๋ฃจ๋“œ (์ƒ๋Œ€๊ฒฝ๋กœ `./_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: 32px 20px 48px;">`๋กœ ๋ณธ๋ฌธ ์˜์—ญ
   - `<?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>`
   - `<?php include_once('./tail.sub.php'); ?>`

2. **SQLite DB ์ดˆ๊ธฐํ™”**:
   - `G5_DATA_PATH.'/modules'` ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด `@mkdir(G5_DATA_PATH.'/modules', 0707, true);`๋กœ ์ƒ์„ฑ
   - `new PDO('sqlite:'.G5_DATA_PATH.'/modules/sentence-builder.sqlite')`๋กœ ์—ฐ๊ฒฐ
   - ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ (์ฒซ ์ ‘์† ์‹œ ์ž๋™ ์ƒ์„ฑ):
     ```sql
     CREATE TABLE IF NOT EXISTS sentences (
       id INTEGER PRIMARY KEY AUTOINCREMENT,
       answer TEXT NOT NULL,
       difficulty TEXT DEFAULT 'easy',
       created_at DATETIME DEFAULT CURRENT_TIMESTAMP
     )
     ```
   - ์ดˆ๊ธฐ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ 3๊ฐœ INSERT (์ด๋ฏธ ์žˆ์œผ๋ฉด ์Šคํ‚ต):
     - "The cat is sleeping" (easy)
     - "She likes reading books" (easy)
     - "We are learning English" (easy)

3. **ํŽ˜์ด์ง€ ํƒ€์ดํ‹€ & ์„ค๋ช…**:
   - ํ—ค๋”: "๐ŸŽฏ ์˜ค๋Š˜์˜ ์˜์–ด ๋ฌธ์žฅ ๋งŒ๋“ค๊ธฐ"
   - ๋ถ€์ œ: "๋‹จ์–ด ์นด๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๋ฐฐ์—ดํ•˜์—ฌ ๋ฌธ์žฅ์„ ์™„์„ฑํ•˜์„ธ์š”!"

4. **๊ฒŒ์ž„ ์˜์—ญ HTML ๊ตฌ์กฐ**:
   - ๋ฌธ์ œ ๋ฒˆํ˜ธ ํ‘œ์‹œ ์˜์—ญ (`#problem-info`)
   - ๋‹จ์–ด ์นด๋“œ ํ’€ ์˜์—ญ (`#word-pool`) โ€” ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•œ ์นด๋“œ๋“ค์ด ๋“ค์–ด๊ฐˆ ๊ณณ
   - ์ •๋‹ต ์กฐ๋ฆฝ ์˜์—ญ (`#answer-zone`) โ€” ๋“œ๋กญ์กด์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์นด๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณณ
   - ๋ฒ„ํŠผ ๊ทธ๋ฃน:
     - "์ •๋‹ต ํ™•์ธ" ๋ฒ„ํŠผ (`#check-btn`)
     - "๋‹ค์‹œ ๋„์ „" ๋ฒ„ํŠผ (`#reset-btn`)
     - "๋‹ค์Œ ๋ฌธ์ œ" ๋ฒ„ํŠผ (`#next-btn`)
   - ํ”ผ๋“œ๋ฐฑ ๋ฉ”์‹œ์ง€ ์˜์—ญ (`#feedback`) โ€” ์ •๋‹ต/์˜ค๋‹ต ๊ฒฐ๊ณผ ํ‘œ์‹œ

5. **์Šคํƒ€์ผ๋ง (์ธ๋ผ์ธ `<style>` ๋ธ”๋ก)**:
   - ๋””์ž์ธ ํ† ํฐ ์‚ฌ์šฉ:
     - ๋ฐฐ๊ฒฝ: `background: var(--m-surface);`
     - ํ…์ŠคํŠธ: `color: var(--m-text);`
     - ๊ทธ๋ฆผ์ž: `box-shadow: var(--m-shadow);`
     - ๋ผ์šด๋“œ: `border-radius: var(--m-radius-lg);`
   - ๋‹จ์–ด ์นด๋“œ ์Šคํƒ€์ผ:
     - ์ธ๋ผ์ธ ๋ธ”๋ก, ํŒจ๋”ฉ, ์ปค์„œ ํฌ์ธํ„ฐ
     - ๋“œ๋ž˜๊ทธ ์‹œ ๋ฐ˜ํˆฌ๋ช… ํšจ๊ณผ
   - ์ •๋‹ต ์กฐ๋ฆฝ ์˜์—ญ:
     - ์ตœ์†Œ ๋†’์ด 80px, ์ ์„  ํ…Œ๋‘๋ฆฌ
     - ์นด๋“œ๊ฐ€ ์—†์„ ๋•Œ "์—ฌ๊ธฐ์— ๋‹จ์–ด๋ฅผ ๋“œ๋ž˜๊ทธํ•˜์„ธ์š”" placeholder ํ‘œ์‹œ
   - ๋ฒ„ํŠผ:
     - primary ์ƒ‰์ƒ ๋ฐฐ๊ฒฝ, ํฐ์ƒ‰ ํ…์ŠคํŠธ
     - hover ์‹œ ์•ฝ๊ฐ„ ์–ด๋‘์›Œ์ง€๋Š” ํšจ๊ณผ

**์ถœ๋ ฅ**: modern shell์ด ์ ์šฉ๋œ ํŽ˜์ด์ง€๊ฐ€ `/sentence-builder` URL๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , DB ํ…Œ์ด๋ธ”์ด ์ž๋™ ์ƒ์„ฑ๋˜๋ฉฐ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ 3๊ฐœ๊ฐ€ ์‚ฝ์ž…๋œ ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง JS ๋กœ์ง์€ ์—†์œผ๋ฏ€๋กœ ์นด๋“œ๋Š” ์ •์ ์œผ๋กœ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ํŽ˜์ด์ง€๊ฐ€ /sentence-builder๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ, modern shell์˜ nav/footer๊ฐ€ ํฌํ•จ๋˜๊ณ , DB ํ…Œ์ด๋ธ”์ด ์ž๋™ ์ƒ์„ฑ๋˜์–ด ์ดˆ๊ธฐ ์ƒ˜ํ”Œ ๋ฌธ์žฅ 3๊ฐœ๊ฐ€ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์—๋Š” ๊ฒŒ์ž„ ์˜์—ญ HTML ๊ตฌ์กฐ์™€ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์–ด ์žˆ์œผ๋‚˜ ์•„์ง ์ธํ„ฐ๋ž™์…˜์€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2
Step 2
์ด์ œ **๋žœ๋ค ๋ฌธ์ œ ์ถœ์ œ ๋กœ์ง**๊ณผ **๋‹จ์–ด ์นด๋“œ ์ƒ์„ฑ JS**๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”:

1. **PHP ๋กœ์ง (ํŽ˜์ด์ง€ ์ƒ๋‹จ)**:
   - DB์—์„œ `SELECT * FROM sentences ORDER BY RANDOM() LIMIT 1`๋กœ ๋žœ๋ค ๋ฌธ์žฅ 1๊ฐœ ๊ฐ€์ ธ์˜ค๊ธฐ
   - ์ •๋‹ต ๋ฌธ์žฅ์„ ๊ณต๋ฐฑ ๊ธฐ์ค€์œผ๋กœ `explode(' ', $answer)`ํ•˜์—ฌ ๋‹จ์–ด ๋ฐฐ์—ด ์ƒ์„ฑ
   - ๋‹จ์–ด ๋ฐฐ์—ด์„ `shuffle()`๋กœ ์„ž๊ธฐ (๋ฌด์ž‘์œ„ ์ˆœ์„œ)
   - ์„ž์ธ ๋‹จ์–ด ๋ฐฐ์—ด์„ JSON์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ JS ๋ณ€์ˆ˜์— ์ „๋‹ฌ:
     ```php
     <script>
     const shuffledWords = <?= json_encode($shuffled_words) ?>;
     const correctAnswer = <?= json_encode($answer) ?>;
     const problemId = <?= $problem['id'] ?>;
     </script>
     ```

2. **JS ๋กœ์ง (์ธ๋ผ์ธ `<script>` ๋ธ”๋ก)**:
   - ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ `shuffledWords` ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ๋‹จ์–ด๋ฅผ `<div class="word-card" draggable="true">` ์š”์†Œ๋กœ ์ƒ์„ฑ
   - ์ƒ์„ฑ๋œ ์นด๋“œ๋ฅผ `#word-pool`์— append
   - ๊ฐ ์นด๋“œ์— `data-word` ์†์„ฑ์œผ๋กœ ๋‹จ์–ด ์ €์žฅ
   - ๋ฌธ์ œ ์ •๋ณด ํ‘œ์‹œ: `#problem-info`์— "๋ฌธ์ œ #${problemId}" ์ถœ๋ ฅ

3. **๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ**:
   - `dragstart`: ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ ์‹œ ์นด๋“œ ๋ฐ์ดํ„ฐ๋ฅผ `dataTransfer`์— ์ €์žฅ
   - `dragover`: ๋“œ๋กญ์กด ์œ„์—์„œ `preventDefault()`๋กœ ๋“œ๋กญ ํ—ˆ์šฉ
   - `drop`: ๋“œ๋กญ ์‹œ ์นด๋“œ๋ฅผ `#answer-zone`์œผ๋กœ ์ด๋™
   - ์นด๋“œ๋ฅผ `#answer-zone`์—์„œ ๋‹ค์‹œ `#word-pool`๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ๋„ ๊ฐ€๋Šฅํ•˜๋„๋ก ์–‘๋ฐฉํ–ฅ ๋“œ๋ž˜๊ทธ ์ง€์›

4. **์นด๋“œ ๋ฐฐ์น˜ ์‹œ๊ฐ ํ”ผ๋“œ๋ฐฑ**:
   - ๋“œ๋ž˜๊ทธ ์ค‘์ธ ์นด๋“œ๋Š” `opacity: 0.5` ์ ์šฉ
   - ๋“œ๋กญ์กด์— ์นด๋“œ๊ฐ€ hover๋  ๋•Œ ๋ฐฐ๊ฒฝ์ƒ‰ ์‚ด์ง ๋ณ€๊ฒฝ

**์ถœ๋ ฅ**: ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ๋žœ๋ค ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋˜๊ณ , ๋‹จ์–ด ์นด๋“œ๋“ค์ด ์„ž์ธ ์ˆœ์„œ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์นด๋“œ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ์ •๋‹ต ์˜์—ญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ˆœ์„œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ ๊ฒฐ๊ณผ: ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ DB์—์„œ ๋žœ๋ค ๋ฌธ์žฅ์ด ์„ ํƒ๋˜๊ณ , ๋‹จ์–ด ์นด๋“œ๊ฐ€ ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์นด๋“œ๋ฅผ ์ •๋‹ต ์˜์—ญ๊ณผ ๋‹จ์–ด ํ’€ ์‚ฌ์ด์—์„œ ์ž์œ ๋กญ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3
Step 3
์ด์ œ **์ •๋‹ต ํ™•์ธ ๋กœ์ง**๊ณผ **ํ”ผ๋“œ๋ฐฑ ์‹œ์Šคํ…œ**์„ ๊ตฌํ˜„ํ•˜์„ธ์š”:

1. **์ •๋‹ต ํ™•์ธ ๋ฒ„ํŠผ (`#check-btn`) ํด๋ฆญ ์ด๋ฒคํŠธ**:
   - `#answer-zone` ์•ˆ์˜ ๋ชจ๋“  `.word-card` ์š”์†Œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์–ด์„œ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ธฐ
   - ๋ฐฐ์—ด์„ ๊ณต๋ฐฑ์œผ๋กœ joinํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ๋ฌธ์žฅ ์ƒ์„ฑ
   - `correctAnswer`์™€ ๋น„๊ต:
     - ์ผ์น˜ํ•˜๋ฉด: `#feedback`์— "โœ… ์ •๋‹ต์ž…๋‹ˆ๋‹ค!" ์ดˆ๋ก์ƒ‰ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
     - ๋ถˆ์ผ์น˜ํ•˜๋ฉด: `#feedback`์— "โŒ ๋‹ค์‹œ ์‹œ๋„ํ•ด๋ณด์„ธ์š”. ์ •๋‹ต: {correctAnswer}" ๋นจ๊ฐ„์ƒ‰ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ

2. **๋‹ค์‹œ ๋„์ „ ๋ฒ„ํŠผ (`#reset-btn`) ํด๋ฆญ ์ด๋ฒคํŠธ**:
   - `#answer-zone`์˜ ๋ชจ๋“  ์นด๋“œ๋ฅผ ๋‹ค์‹œ `#word-pool`๋กœ ์ด๋™
   - `#feedback` ๋ฉ”์‹œ์ง€ ์ดˆ๊ธฐํ™”
   - ์นด๋“œ ์ˆœ์„œ๋ฅผ ๋‹ค์‹œ ์„ž์–ด์„œ ์žฌ๋ฐฐ์น˜ (์„ ํƒ ์‚ฌํ•ญ)

3. **๋‹ค์Œ ๋ฌธ์ œ ๋ฒ„ํŠผ (`#next-btn`) ํด๋ฆญ ์ด๋ฒคํŠธ**:
   - ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋žœ๋ค ๋ฌธ์ œ ๋กœ๋“œ
   - ๋˜๋Š” AJAX๋กœ ์ƒˆ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋™์ ์œผ๋กœ ๊ต์ฒด (๊ณ ๊ธ‰ ์˜ต์…˜)

4. **ํ”ผ๋“œ๋ฐฑ ๋ฉ”์‹œ์ง€ ์Šคํƒ€์ผ**:
   - ์ •๋‹ต ์‹œ: ์ดˆ๋ก์ƒ‰ ๋ฐฐ๊ฒฝ, ๊ตต์€ ๊ธ€์”จ, ์ฒดํฌ ์•„์ด์ฝ˜
   - ์˜ค๋‹ต ์‹œ: ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ๊ฒฝ, ์ •๋‹ต ํžŒํŠธ ํ‘œ์‹œ
   - ์• ๋‹ˆ๋ฉ”์ด์…˜: fade-in ํšจ๊ณผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ธฐ

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

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

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

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

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

๋Œ“๊ธ€ (0)

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