# ๐ŸŽฎ Test Project: Module C - CyberTyper 2026 ## 1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š” (Project Overview) ๋ณธ ๊ณผ์ œ๋Š” ์˜๋ฌธ ํƒ€์ดํ•‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ณ ์„ฑ๋Šฅ ์•„์ผ€์ด๋“œ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž…๋‹ˆ๋‹ค. ์„ ์ˆ˜๋Š” ์ œ๊ณต๋œ `words_data.json` ํŒŒ์ผ์„ ๋ถ„์„ํ•˜์—ฌ **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL)**๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  , ํƒ„ํ™˜์ด ์‹ค์‹œ๊ฐ„ ์ขŒํ‘œ๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋‹จ์–ด๋ฅผ ํŒŒ๊ดดํ•˜๋Š” ์—ญ๋™์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง„์„ API์™€ ์—ฐ๋™ํ•˜์—ฌ ์™„์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ## 2. ์ฃผ์š” ์šฉ์–ด ์ •์˜ (Technical Definitions) * **VFX (Visual Effects)**: ๊ฒŒ์ž„ ๋‚ด ์‹œ๊ฐ ํŠน์ˆ˜ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ํƒ„ํ™˜ ์ถฉ๋Œ ์‹œ ๊ธ€์ž๊ฐ€ ํŒŒํŽธ์œผ๋กœ ๋ถ€์„œ์ง€๋Š” ํšจ๊ณผ ๋“ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. * **WPM (Words Per Minute)**: ๋ถ„๋‹น ๋‹จ์–ด ์ž…๋ ฅ ์†๋„ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. (๊ณ„์‚ฐ์‹: `ํƒ€์ดํ•‘ํ•œ ์ด ๋‹จ์–ด ์ˆ˜ / ํ”Œ๋ ˆ์ด ์‹œ๊ฐ„(๋ถ„)`) * **HP (Health Point)**: ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ๋ช…๋ ฅ(100%)์ด๋ฉฐ, ๋‹จ์–ด๋ฅผ ๋†“์น  ๋•Œ๋งˆ๋‹ค ์ฐจ๊ฐ๋˜์–ด 0%๊ฐ€ ๋˜๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ## 3. Step 1: ๋ฐฑ์—”๋“œ API ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ (Server-side) ๋ชจ๋“  API ์—”๋“œํฌ์ธํŠธ๋Š” `/module_c/api/` ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ , ๋ฐ์ดํ„ฐ์˜ ์˜์†์„ฑ(Persistence)์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ### **A. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ (ํ•„์ˆ˜ ๊ตฌํ˜„)** * **Word Table**: ์ œ๊ณต๋œ `words_data.json`์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ์–ด ํ…์ŠคํŠธ, ๋‚œ์ด๋„ ๋ ˆ๋ฒจ, ๊ณ ์œ  ์ ์ˆ˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. * **Ranking Table**: ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„, ์ตœ์ข… ์ ์ˆ˜, ์ตœ๋Œ€ ์ฝค๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ### **B. API ๋กœ์ง ์š”๊ตฌ์‚ฌํ•ญ** * **๋‹จ์–ด ๊ณต๊ธ‰ API (`GET /module_c/api/words?level=n`)**: 1. ์š”์ฒญํ•œ ๋‚œ์ด๋„(`level`)์— ํ•ด๋‹นํ•˜๋Š” ๋‹จ์–ด ์ค‘ ๋žœ๋คํ•˜๊ฒŒ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. 2. **์ค‘๋ณต ๋ฐฉ์ง€**: ํ˜„์žฌ ๊ฒŒ์ž„ ํ™”๋ฉด์— ์ด๋ฏธ ๋‚˜ํƒ€๋‚˜ ์žˆ๋Š” ๋‹จ์–ด๋Š” ์ค‘๋ณตํ•ด์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. * **๋žญํ‚น API**: `POST` ์š”์ฒญ์„ ํ†ตํ•ด ๊ธฐ๋ก์„ DB์— ์ €์žฅํ•˜๊ณ , `GET` ์š”์ฒญ ์‹œ ์ƒ์œ„ **Global TOP 5** ๊ธฐ๋ก์„ ์ ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ### **C. ์ œ์ถœ๋ฌผ (Deliverables)** * ์„ ์ˆ˜๋Š” ์ž‘์„ฑํ•œ API ์†Œ์Šค์ฝ”๋“œ์™€ ํ•จ๊ป˜, ์„ค๊ณ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” **`table.sql`** ํŒŒ์ผ์„ ๋ฐ˜๋“œ์‹œ ๋ฃจํŠธ ํด๋”์— ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ## 4. Step 2: ๊ฒŒ์ž„ ์—”์ง„ ๋ฐ ์ ์ˆ˜ ๋กœ์ง (Front-end Development) ### **A. ๋‚œ์ด๋„๋ณ„ ์„ค์ • (์ƒ์„ฑ ์ฃผ๊ธฐ ๋ฐ ๋‚™ํ•˜ ์†๋„)** ๋‹จ์–ด๋Š” ํ™”๋ฉด ์ƒ๋‹จ(y=0)์˜ **๊ฐ€๋กœ์ถ• ๋žœ๋ค ์œ„์น˜**์—์„œ ์ƒ์„ฑ๋˜์–ด ์•„๋ž˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. | ๋‚œ์ด๋„ (Level) | ๋‹จ์–ด ์ƒ์„ฑ ์ฃผ๊ธฐ (Interval) | ๋‚™ํ•˜ ์†๋„ (Speed) | ๋‚œ์ด๋„ ๊ฐ€์ค‘์น˜ ($Multiplier$) | | :--- | :--- | :--- | :--- | | **Level 1** | 2.0์ดˆ๋งˆ๋‹ค 1๊ฐœ ์ƒ์„ฑ | ๋А๋ฆผ (50px/sec) | 1.0 | | **Level 2** | 1.5์ดˆ๋งˆ๋‹ค 1๊ฐœ ์ƒ์„ฑ | ๋ณดํ†ต (80px/sec) | 1.5 | | **Level 3** | 1.0์ดˆ๋งˆ๋‹ค 1๊ฐœ ์ƒ์„ฑ | ๋น ๋ฆ„ (120px/sec) | 2.0 | ### **B. ์ƒ์„ธ ์ ์ˆ˜ ์‚ฐ์ถœ ๊ณต์‹ ($FinalScore$)** $$FinalScore = BasePoints + (CurrentCombo \times LevelMultiplier)$$ * **$BasePoints$ (๊ณ ์œ  ์ ์ˆ˜)**: ๋งž์ถ˜ ๋‹จ์–ด๊ฐ€ DB์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ณ ์œ  ์ ์ˆ˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. * **$CurrentCombo$**: ์—ฐ์† ์„ฑ๊ณต ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. (์„ฑ๊ณต ์‹œ +1, ๋‹จ์–ด๊ฐ€ ๋ฐ”๋‹ฅ์— ๋‹ฟ์œผ๋ฉด ์ฆ‰์‹œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”). * **ํ‘œ์‹œ**: ๊ณ„์‚ฐ๋œ ์ ์ˆ˜๋Š” ๊ฒŒ์ž„ ํ™”๋ฉด **Score** ์˜์—ญ์— ์‹ค์‹œ๊ฐ„ ๋ˆ„์  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ### **C. HP ์‹œ์Šคํ…œ ๋ฐ ํšŒ๋ณต** * **๊ฐ์†Œ**: ๋‹จ์–ด๊ฐ€ ๋ฐ”๋‹ฅ(Bottom Line)์— ๋‹ฟ์œผ๋ฉด HP๊ฐ€ **10%** ์ฐจ๊ฐ๋ฉ๋‹ˆ๋‹ค. * **ํšŒ๋ณต**: **20 ์ฝค๋ณด** ๋‹ฌ์„ฑ ์‹œ๋งˆ๋‹ค ํ˜„์žฌ ์ค„์–ด๋“  HP์˜ **5%**๊ฐ€ ๋ณด๋„ˆ์Šค๋กœ ์ฆ‰์‹œ ํšŒ๋ณต๋ฉ๋‹ˆ๋‹ค. ## 5. Step 3: UI/UX ๋ฐ ์žฅ๋ฉด๋ณ„ ๋ช…์„ธ (Design Implementation) ### **A. 3-Scene SPA(Single Page Application) ๊ตฌ์กฐ** * ๋ณธ ๊ณผ์ œ๋Š” ํŽ˜์ด์ง€ ์ „์ฒด ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์ด ์ „ํ™˜๋˜๋Š” **SPA ๊ตฌ์กฐ**๋กœ ๊ฐœ๋ฐœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. * **Scene 1 (Start)**: ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„ ์ž…๋ ฅ ๋ฐ ๋‚œ์ด๋„ ์„ ํƒ. * **Scene 2 (Play)**: ์‹ค์ œ ๊ฒŒ์ž„ ์ง„ํ–‰ ํ™”๋ฉด. * **Scene 3 (Result)**: ์ตœ์ข… ์ ์ˆ˜ ์š”์•ฝ ๋ฐ Global TOP 5 ๋žญํ‚น ์ถœ๋ ฅ ํ™”๋ฉด. ### **B. ์‹œ์ž‘ ํ™”๋ฉด (Start Scene)** * **์ž…๋ ฅ ์š”์†Œ**: ๊ฒŒ์ž„ ์ œ๋ชฉ(CyberTyper 2026), **ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„ ์ž…๋ ฅ๋ž€(ํ•„์ˆ˜)**, **๋‚œ์ด๋„ ์„ ํƒ(Level 1, 2, 3)** ๋ผ๋””์˜ค ๋ฒ„ํŠผ ๋˜๋Š” ์„ ํƒ์ฐฝ. * **์‹œ์ž‘ ๋ฒ„ํŠผ**: ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ํ™œ์„ฑํ™”๋˜๋ฉฐ, ํด๋ฆญ ์‹œ ๊ฒŒ์ž„ ํ™”๋ฉด์œผ๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค. ### **C. ๊ฒŒ์ž„ ํ™”๋ฉด ํ•„์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ (์ฑ„์  ํ•ญ๋ชฉ)** * **Score**: ์‹ค์‹œ๊ฐ„ ๋ˆ„์  ์ ์ˆ˜ํŒ. * **Combo**: ํ˜„์žฌ ์—ฐ์† ์„ฑ๊ณต ํšŸ์ˆ˜. * **WPM**: ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐ๋˜๋Š” ๋ถ„๋‹น ํƒ€์ˆ˜. * **HP Gauge**: ์‹œ๊ฐ์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ์ƒ๋ช…๋ ฅ ๋ฐ”. * **Input Field**: ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์˜๋ฌธ ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ํ…์ŠคํŠธ ์˜์—ญ. * **Falling Words**: ์ƒ๋‹จ ๋žœ๋ค ์œ„์น˜์—์„œ ๋‚™ํ•˜ํ•˜๋Š” ๋‹จ์–ด๋“ค. ### **D. ํˆฌ์‚ฌ์ฒด(Projectile) ๋ฐ ํ”ผ๋ฒ„ ํšจ๊ณผ** * **ํƒ„ํ™˜ ๋ฐ ์ถฉ๋Œ**: ์—”ํ„ฐ ์ž…๋ ฅ ์‹œ ํ•˜๋‹จ์—์„œ ๋‹จ์–ด์˜ **์‹ค์‹œ๊ฐ„ ์ขŒํ‘œ**๋กœ ํƒ„ํ™˜์ด ๋ฐœ์‚ฌ๋˜๋ฉฐ, ์ถฉ๋Œ ์‹œ ๊ธ€์ž ํŒŒํŽธ VFX๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ๋‹จ์–ด๊ฐ€ ์†Œ๋ฉธํ•ฉ๋‹ˆ๋‹ค. * **Fever Mode ์‹œ๊ฐ ํšจ๊ณผ**: 20 ์ฝค๋ณด ๋‹ฌ์„ฑ ์‹œ ํ™”๋ฉด ์ค‘์•™์— **"FEVER MODE"** ํ…์ŠคํŠธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ž ์‹œ ๋‚˜ํƒ€๋‚ฌ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ ธ์•ผ ํ•˜๋ฉฐ, ๋ฐฐ๊ฒฝ์˜ ๋„ค์˜จ VFX๋Š” ๊ธฐ์กด ๋ฐฐ๊ฒฝ๊ณผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์—ฐํžˆ ๊ตฌ๋ถ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ### **E. ๋žญํ‚น ํ™”๋ฉด (Result Scene)** * ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ถˆ๋Ÿฌ์˜จ **Global TOP 5** ์ˆœ์œ„ํ‘œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์œ„ํ‘œ์—๋Š” 1๋“ฑ๋ถ€ํ„ฐ 5๋“ฑ๊นŒ์ง€์˜ ์ˆœ์œ„์™€ ์ด๋ฆ„, ์ ์ˆ˜, ์ˆœ์œ„๋‹ฌ์„ฑ์ผ์‹œ๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. * **[New Game]** ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ชจ๋“  ์„ค์ •์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ด๋ฆ„ ์ž…๋ ฅ ํ™”๋ฉด์œผ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. --- ## 6. ์ฑ„์  ๊ธฐ์ค€ ์š”์•ฝ (Marking Scheme - 25.00) | ํ•ญ๋ชฉ | ์ƒ์„ธ ๊ธฐ์ค€ | ๋ฐฐ์  | | :--- | :--- | :--- | | **Design (7.0)** | ํƒ„ํ™˜/ํŒŒํŽธ ์—ญ๋™์„ฑ, ํ•„์ˆ˜ UI(HP, Score) ๊ฐ€์‹œ์„ฑ ๋ฐ VFX ์™„์„ฑ๋„ | 7.0 | | **Front-end (11.0)** | ๋‚œ์ด๋„๋ณ„ ๋กœ์ง(์ฃผ๊ธฐ/์†๋„), ์ค‘๋ณต ์—†๋Š” ๋‹จ์–ด ๊ด€๋ฆฌ, ํƒ„ํ™˜ ์ขŒํ‘œ ์—ฐ์‚ฐ | 11.0 | | **Back-end (7.0)** | **DB ํ…Œ์ด๋ธ” ์„ค๊ณ„ ๋ฐ ๋ฐ์ดํ„ฐ ์˜์†์„ฑ**, TOP 5 ๋žญํ‚น API ์„ค๊ณ„ | 7.0 |