๐ฏ ์จ๋ผ์ธ ํด์ฆ ์ ์ & ๊ณต์ ํ๋ซํผ - ์น๊ตฌ๋ค๊ณผ ํจ๊ปํ๋ ํด์ฆ ํ์
quiz-creator-sharing-platform
๋ฌธ์ ์ค๋ช
๐ฏ ํ๋ก์ ํธ ๊ฐ์
๋๊ตฌ๋ ์ฝ๊ฒ ํด์ฆ๋ฅผ ๋ง๋ค๊ณ ๊ณต์ ํ ์ ์๋ ํ๋ซํผ์ ๋ง๋ญ๋๋ค. ์ ์๋, ํ์, ์ง์ฅ์ธ ๋๊ตฌ๋ ์์ ๋ง์ ํด์ฆ๋ฅผ ๋ง๋ค์ด ๋งํฌ๋ก ๊ณต์ ํ๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ง๋ ํด์ฆ์ ๋์ ํ ์ ์์ต๋๋ค.
โจ ํ์ ๊ธฐ๋ฅ
- ํด์ฆ ์ ์ ํผ: ์ ๋ชฉ, ์ค๋ช , ๊ฐ๊ด์ ๋ฌธ์ 3~10๊ฐ ์ ๋ ฅ (๊ฐ ๋ฌธ์ ๋น 4๊ฐ ๋ณด๊ธฐ, ์ ๋ต ์ ํ)
- ํด์ฆ ๋ชฉ๋ก ํ์ด์ง: ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ง๋ ํด์ฆ ๋ฆฌ์คํธ (์นด๋ํ ๋ ์ด์์)
- ํด์ฆ ํ๊ธฐ ํ์ด์ง: ๋ฌธ์ ๋ฅผ ํ๋์ฉ ๋ณด์ฌ์ฃผ๊ณ ๋ต ์ ํ, ์ ์ถ ์ ์ฆ์ ์ฑ์
- ๊ฒฐ๊ณผ ํ์ด์ง: ์ด ๋ช ๋ฌธ์ ๋ง์ท๋์ง, ์ ๋ต๋ฅ ํ์
- ํด์ฆ ์์ธ ์ ๋ณด: ์ ์์, ๋์ด๋, ๋ฌธ์ ์, ํ๊ท ์ ๋ต๋ฅ ํ์
- ๋ฐ์ํ ๋์์ธ: Tailwind CSS๋ก ๋ชจ๋ฐ์ผ/๋ฐ์คํฌํฑ ๋ชจ๋ ์ง์
๐ ์ ํ ์ถ๊ฐ ๊ธฐ๋ฅ (๋ณด๋์ค)
- ํด์ฆ ๋์ด๋ ์ ํ (์ฌ์/๋ณดํต/์ด๋ ค์) ๋ฐ ํํฐ๋ง
- ํด์ฆ ์นดํ ๊ณ ๋ฆฌ (์ผ๋ฐ์์/์์ด/๊ณผํ/์ญ์ฌ ๋ฑ)
- ์ข์์ ๊ธฐ๋ฅ (์ธ๊ธฐ ํด์ฆ ํ์)
- ํด์ฆ ๊ฒ์ ๊ธฐ๋ฅ
- ๋ด๊ฐ ๋ง๋ ํด์ฆ ๊ด๋ฆฌ (์์ /์ญ์ )
- ํด์ฆ ํ์ด ํต๊ณ (์ด ํด์ฆ๋ฅผ ๋ช ๋ช ์ด ํ์๋์ง)
๐จ UI/UX ํฌ์ธํธ
- ํด์ฆ ์นด๋์ ๊ทธ๋ผ๋ฐ์ด์ ๋ฐฐ๊ฒฝ ๋๋ ์์ด์ฝ์ผ๋ก ์๊ฐ์ ๋งค๋ ฅ ์ถ๊ฐ
- ๋ฌธ์ ํ์ด ์ ์ ํํ ๋ณด๊ธฐ์ ํธ๋ฒ/์ ํ ํจ๊ณผ
- ์ ๋ต/์ค๋ต ์ฆ์ ํผ๋๋ฐฑ (์ด๋ก/๋นจ๊ฐ ์์ ํ์)
- ๊ฒฐ๊ณผ ํ์ด์ง์ ์ฑ์ทจ ๋ฉ์์ง ("์๋ฒฝํด์!", "์์ฌ์์, ๋ค์ ๋์ !" ๋ฑ)
- ๋ก๋ฉ ์ํ ํ์ (๋ฌธ์ ์ ์ถ ์)
๐ก ํ์ต ํฌ์ธํธ
- Laravel 13.x + Blade ํ ํ๋ฆฟ ๊ธฐ๋ณธ ๊ตฌ์กฐ
- SQLite ๊ธฐ๋ฐ ๊ฐ๋จํ DB ์ค๊ณ (quizzes, questions, options, results ํ ์ด๋ธ)
- ํผ ์ ํจ์ฑ ๊ฒ์ฌ (Laravel Validation)
- ๋ค๋๋ค ๊ด๊ณ (ํด์ฆ - ๋ฌธ์ - ๋ณด๊ธฐ)
- Blade ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ
- Tailwind CSS ์ ํธ๋ฆฌํฐ ํด๋์ค ํ์ฉ
์ ์ฝ ์กฐ๊ฑด
- โข Laravel 13.x + Blade ํ ํ๋ฆฟ ์ฌ์ฉ (React/Vue ๋ฑ SPA ํ๋ ์์ํฌ ์ฌ์ฉ ๊ธ์ง)
- โข Tailwind CSS๋ก ์คํ์ผ๋ง (CDN ๋๋ Vite ๋น๋)
- โข SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ (๋ณ๋ DB ์๋ฒ ๋ถํ์)
- โข ํด์ฆ๋ ๋๊ตฌ๋ ์ต๋ช ์ผ๋ก ์ ์ ๊ฐ๋ฅ (๋ก๊ทธ์ธ ๋ถํ์)
- โข ํด์ฆ ํ์ด ๊ฒฐ๊ณผ๋ ์ธ์ ๋๋ DB์ ์์ ์ ์ฅ
- โข ๋ฌธ์ ๋ ์ต์ 3๊ฐ, ์ต๋ 10๊ฐ๊น์ง ์ ํ
- โข ๊ฐ ๋ฌธ์ ๋ 4๊ฐ ๋ณด๊ธฐ ์ค 1๊ฐ๋ง ์ ๋ต
- โข ๋ฐ์ํ ๋์์ธ ํ์ (๋ชจ๋ฐ์ผ ์ฐ์ )
ํ๋กฌํํธ ๋ ์ํผ
์๋ ํ๋กฌํํธ๋ฅผ ์์๋๋ก AI์๊ฒ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ๋ณต์ฌ ๋ฒํผ์ ๋๋ฌ ๋ฐ๋ก ์ฌ์ฉํ์ธ์.
mkdir quiz-creator-sharing-platform && cd quiz-creator-sharing-platform
์ด ํด๋์์ Laravel 13.x ํ๋ก์ ํธ๋ฅผ ์์ํฉ๋๋ค.
๋ค์ ๋ช
๋ น์ด๋ก Laravel 13 ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ธ์:
```bash
composer create-project laravel/laravel . "^13.0"
```
ํ๋ก์ ํธ ์์ฑ ํ:
1. `.env` ํ์ผ์์ DB_CONNECTION์ sqlite๋ก ๋ณ๊ฒฝ
2. `database/database.sqlite` ํ์ผ ์์ฑ (๋น ํ์ผ)
3. Tailwind CSS ์ค์น ๋ฐ ์ค์ :
- `npm install -D tailwindcss postcss autoprefixer`
- `npx tailwindcss init -p`
- `tailwind.config.js`์์ content ๊ฒฝ๋ก ์ค์ : `['./resources/**/*.blade.php', './resources/**/*.js']`
- `resources/css/app.css`์ Tailwind ๋๋ ํฐ๋ธ ์ถ๊ฐ:
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
- `resources/views/layouts/app.blade.php` ๋ ์ด์์ ํ์ผ ์์ฑ (Vite๋ก CSS/JS ๋ก๋)
4. `npm install && npm run dev` ์คํํ์ฌ Vite ๊ฐ๋ฐ ์๋ฒ ์์
5. `php artisan serve` ์คํํ์ฌ Laravel ์๋ฒ ์์
๋ ์ด์์ ํ์ผ์๋ ๋ค์ ์์ ํฌํจ:
- ์๋จ ๋ค๋น๊ฒ์ด์
๋ฐ (๋ก๊ณ , "ํด์ฆ ๋ง๋ค๊ธฐ", "ํด์ฆ ๋ชฉ๋ก" ๋งํฌ)
- @yield('content') ์น์
- Tailwind CSS ๊ธฐ๋ณธ ์คํ์ผ (๋ฐฐ๊ฒฝ์, ํฐํธ ๋ฑ)
์๋ฃ ํ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8000 ์ ์ํ์ฌ ๋ ์ด์์์ด ์ ์์ ์ผ๋ก ๋ณด์ด๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: Laravel 13.x ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ , Tailwind CSS๊ฐ ์ค์ ๋๋ฉฐ, ๊ธฐ๋ณธ ๋ ์ด์์ ํ์ผ์ด ์ค๋น๋ฉ๋๋ค. Vite ๊ฐ๋ฐ ์๋ฒ์ Laravel ์๋ฒ๊ฐ ์คํ๋์ด ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ ํ์ด์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ํด์ฆ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ณ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์์ฑํฉ๋๋ค. ๋ค์ 4๊ฐ ํ ์ด๋ธ์ ๋ง๋์ธ์: 1. **quizzes ํ ์ด๋ธ** (ํด์ฆ ์ ๋ณด): - id (primary key) - title (string, ํด์ฆ ์ ๋ชฉ) - description (text, ํด์ฆ ์ค๋ช ) - difficulty (enum: 'easy', 'medium', 'hard', ๊ธฐ๋ณธ๊ฐ 'medium') - category (string, nullable, ์นดํ ๊ณ ๋ฆฌ) - total_attempts (integer, ๊ธฐ๋ณธ๊ฐ 0, ํ์ด ์๋ ํ์) - timestamps 2. **questions ํ ์ด๋ธ** (๋ฌธ์ ): - id (primary key) - quiz_id (foreign key -> quizzes.id, onDelete cascade) - question_text (text, ๋ฌธ์ ๋ด์ฉ) - order (integer, ๋ฌธ์ ์์) - timestamps 3. **options ํ ์ด๋ธ** (๋ณด๊ธฐ): - id (primary key) - question_id (foreign key -> questions.id, onDelete cascade) - option_text (string, ๋ณด๊ธฐ ๋ด์ฉ) - is_correct (boolean, ์ ๋ต ์ฌ๋ถ) - timestamps 4. **results ํ ์ด๋ธ** (ํด์ฆ ํ์ด ๊ฒฐ๊ณผ): - id (primary key) - quiz_id (foreign key -> quizzes.id) - score (integer, ๋ง์ถ ๋ฌธ์ ์) - total_questions (integer, ์ ์ฒด ๋ฌธ์ ์) - timestamps ๋ค์ ๋ช ๋ น์ด๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ๋ค์ ์์ฑํ์ธ์: ```bash php artisan make:migration create_quizzes_table php artisan make:migration create_questions_table php artisan make:migration create_options_table php artisan make:migration create_results_table ``` ๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์ ์คํค๋ง๋ฅผ ๊ตฌํํ ํ ์คํํ์ธ์: ```bash php artisan migrate ``` ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃ ํ `database/database.sqlite` ํ์ผ์ ํ ์ด๋ธ๋ค์ด ์์ฑ๋์๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: 4๊ฐ์ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ด ์์ฑ๋๊ณ , ์คํํ๋ฉด SQLite DB์ quizzes, questions, options, results ํ ์ด๋ธ์ด ์์ฑ๋ฉ๋๋ค. ์ธ๋ํค ๊ด๊ณ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์์ต๋๋ค.
ํด์ฆ ์ ์ ํผ ํ์ด์ง๋ฅผ ๋ง๋ญ๋๋ค.
1. **๋ผ์ฐํธ ์ถ๊ฐ** (`routes/web.php`):
- `GET /quizzes/create` โ ํด์ฆ ์ ์ ํผ ํ์
- `POST /quizzes` โ ํด์ฆ ์ ์ฅ
2. **์ปจํธ๋กค๋ฌ ์์ฑ**:
```bash
php artisan make:controller QuizController
```
- `create()` ๋ฉ์๋: ํด์ฆ ์ ์ ํผ ๋ทฐ ๋ฐํ
- `store(Request $request)` ๋ฉ์๋:
- ํผ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ (์ ๋ชฉ ํ์, ๋ฌธ์ 3~10๊ฐ, ๊ฐ ๋ฌธ์ ๋น 4๊ฐ ๋ณด๊ธฐ, ์ ๋ต 1๊ฐ ์ ํ)
- Quiz ๋ชจ๋ธ ์์ฑ ํ ์ ์ฅ
- ๊ฐ ๋ฌธ์ (Question)์ ๋ณด๊ธฐ(Option) ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ ์ฅ
- ์ฑ๊ณต ์ ํด์ฆ ๋ชฉ๋ก ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ (์ฑ๊ณต ๋ฉ์์ง ํฌํจ)
3. **๋ทฐ ํ์ผ ์์ฑ** (`resources/views/quizzes/create.blade.php`):
- ๋ ์ด์์ ์์ (`@extends('layouts.app')`)
- ํผ ํ๋:
- ํด์ฆ ์ ๋ชฉ (input text)
- ํด์ฆ ์ค๋ช
(textarea)
- ๋์ด๋ ์ ํ (select: ์ฌ์/๋ณดํต/์ด๋ ค์)
- ์นดํ
๊ณ ๋ฆฌ (input text, optional)
- ๋ฌธ์ ์ถ๊ฐ ๋ฒํผ (JavaScript๋ก ๋์ ์ผ๋ก ๋ฌธ์ ์
๋ ฅ๋ ์ถ๊ฐ, ์ต๋ 10๊ฐ)
- ๊ฐ ๋ฌธ์ ๋ง๋ค:
- ๋ฌธ์ ๋ด์ฉ (textarea)
- 4๊ฐ ๋ณด๊ธฐ (input text)
- ์ ๋ต ์ ํ (radio button)
- ์ ์ถ ๋ฒํผ
- Tailwind CSS๋ก ์คํ์ผ๋ง (์นด๋ํ ๋ ์ด์์, ๊ทธ๋ผ๋ฐ์ด์
๋ฐฐ๊ฒฝ)
4. **JavaScript ์ถ๊ฐ** (Blade ํ์ผ ๋ด `<script>` ํ๊ทธ):
- "๋ฌธ์ ์ถ๊ฐ" ๋ฒํผ ํด๋ฆญ ์ ๋ฌธ์ ์
๋ ฅ๋ ๋์ ์์ฑ
- ์ต์ 3๊ฐ, ์ต๋ 10๊ฐ ๋ฌธ์ ์ ํ
- ๋ฌธ์ ์ญ์ ๋ฒํผ๋ ์ถ๊ฐ
5. **๋ชจ๋ธ ์์ฑ**:
```bash
php artisan make:model Quiz
php artisan make:model Question
php artisan make:model Option
```
- Quiz ๋ชจ๋ธ: `hasMany` ๊ด๊ณ๋ก questions ์ฐ๊ฒฐ
- Question ๋ชจ๋ธ: `belongsTo` quiz, `hasMany` options
- Option ๋ชจ๋ธ: `belongsTo` question
์๋ฃ ํ ๋ธ๋ผ์ฐ์ ์์ `/quizzes/create` ์ ์ํ์ฌ ํผ์ด ์ ์์ ์ผ๋ก ๋ณด์ด๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ํด์ฆ ์ ์ ํผ ํ์ด์ง๊ฐ ์์ฑ๋๊ณ , ๋์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ถ๊ฐ/์ญ์ ํ ์ ์์ต๋๋ค. ํผ ์ ์ถ ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์๋ํ๋ฉฐ, ํด์ฆ ๋ฐ์ดํฐ๊ฐ DB์ ์ ์ฅ๋ฉ๋๋ค.
ํด์ฆ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ๋ง๋ญ๋๋ค.
1. **๋ผ์ฐํธ ์ถ๊ฐ** (`routes/web.php`):
- `GET /` โ ํด์ฆ ๋ชฉ๋ก ํ์ด์ง (ํ)
- `GET /quizzes` โ ํด์ฆ ๋ชฉ๋ก ํ์ด์ง
2. **์ปจํธ๋กค๋ฌ ๋ฉ์๋ ์ถ๊ฐ** (`QuizController`):
- `index()` ๋ฉ์๋:
- ๋ชจ๋ ํด์ฆ๋ฅผ ์ต์ ์์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ (with 'questions' eager loading)
- ๊ฐ ํด์ฆ์ ๋ฌธ์ ์ ๊ณ์ฐ
- ๋ทฐ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
3. **๋ทฐ ํ์ผ ์์ฑ** (`resources/views/quizzes/index.blade.php`):
- ๋ ์ด์์ ์์
- ํ์ด์ง ์ ๋ชฉ: "๐ ํด์ฆ ๋ชฉ๋ก - ๋์ ํด๋ณด์ธ์!"
- ํด์ฆ ์นด๋ ๊ทธ๋ฆฌ๋ ๋ ์ด์์ (grid-cols-1 md:grid-cols-2 lg:grid-cols-3)
- ๊ฐ ํด์ฆ ์นด๋์ ํ์:
- ํด์ฆ ์ ๋ชฉ (ํฐ ๊ธ์จ, ๋ณผ๋)
- ํด์ฆ ์ค๋ช
(2์ค ๋ง์ค์)
- ๋์ด๋ ๋ฐฐ์ง (์ฌ์=์ด๋ก, ๋ณดํต=๋
ธ๋, ์ด๋ ค์=๋นจ๊ฐ)
- ๋ฌธ์ ์ ("๐ 10๋ฌธ์ ")
- ์นดํ
๊ณ ๋ฆฌ (์์ผ๋ฉด ํ์)
- ํ์ด ์๋ ํ์ ("๐ฅ 23๋ช
๋์ ")
- "ํด์ฆ ํ๊ธฐ" ๋ฒํผ (๋งํฌ: `/quizzes/{id}/play`)
- Tailwind CSS๋ก ์นด๋ ๋์์ธ (๊ทธ๋ฆผ์, ํธ๋ฒ ํจ๊ณผ, ๊ทธ๋ผ๋ฐ์ด์
๋ฐฐ๊ฒฝ)
- ํด์ฆ๊ฐ ์์ผ๋ฉด "์์ง ํด์ฆ๊ฐ ์์ด์. ์ฒซ ํด์ฆ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์!" ๋ฉ์์ง + ํด์ฆ ๋ง๋ค๊ธฐ ๋ฒํผ
4. **๋ค๋น๊ฒ์ด์
๋ฐ ์
๋ฐ์ดํธ** (`layouts/app.blade.php`):
- "ํด์ฆ ๋ชฉ๋ก" ๋งํฌ๋ฅผ ํ(`/`)์ผ๋ก ์ฐ๊ฒฐ
์๋ฃ ํ ๋ธ๋ผ์ฐ์ ์์ `/` ์ ์ํ์ฌ ํด์ฆ ๋ชฉ๋ก์ด ์นด๋ ํํ๋ก ๋ณด์ด๋์ง ํ์ธํ์ธ์. ์์ง ํด์ฆ๊ฐ ์๋ค๋ฉด `/quizzes/create`์์ ํ
์คํธ์ฉ ํด์ฆ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ํด์ฆ ๋ชฉ๋ก ํ์ด์ง๊ฐ ์นด๋ํ ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ผ๋ก ํ์๋ฉ๋๋ค. ๊ฐ ์นด๋์ ํด์ฆ ์ ๋ณด๊ฐ ๋ณด๊ธฐ ์ข๊ฒ ์ ๋ฆฌ๋์ด ์์ผ๋ฉฐ, ํธ๋ฒ ํจ๊ณผ์ ๊ทธ๋ผ๋ฐ์ด์ ์ด ์ ์ฉ๋์ด ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ ๋๋ค.
ํด์ฆ ํ๊ธฐ ํ์ด์ง๋ฅผ ๋ง๋ญ๋๋ค.
1. **๋ผ์ฐํธ ์ถ๊ฐ** (`routes/web.php`):
- `GET /quizzes/{id}/play` โ ํด์ฆ ํ๊ธฐ ํ์ด์ง
- `POST /quizzes/{id}/submit` โ ํด์ฆ ์ ์ถ ๋ฐ ์ฑ์
2. **์ปจํธ๋กค๋ฌ ๋ฉ์๋ ์ถ๊ฐ** (`QuizController`):
- `play($id)` ๋ฉ์๋:
- ํด์ฆ ID๋ก ํด์ฆ ์ฐพ๊ธฐ (with 'questions.options' eager loading)
- ๋ฌธ์ ๋ฅผ ์์๋๋ก ์ ๋ ฌ
- ๋ทฐ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
- `submit(Request $request, $id)` ๋ฉ์๋:
- ์ฌ์ฉ์๊ฐ ์ ํํ ๋ต์ ๋ฐฐ์ด ๋ฐ๊ธฐ (question_id => option_id)
- ๊ฐ ๋ฌธ์ ์ ์ ๋ต๊ณผ ๋น๊ตํ์ฌ ์ ์ ๊ณ์ฐ
- Result ๋ชจ๋ธ์ ๊ฒฐ๊ณผ ์ ์ฅ
- Quiz์ total_attempts ์ฆ๊ฐ
- ๊ฒฐ๊ณผ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ (์ ์, ์ ์ฒด ๋ฌธ์ ์ ์ ๋ฌ)
3. **๋ทฐ ํ์ผ ์์ฑ** (`resources/views/quizzes/play.blade.php`):
- ๋ ์ด์์ ์์
- ํด์ฆ ์ ๋ชฉ ๋ฐ ์ค๋ช
ํ์
- ํผ ์์ (POST /quizzes/{id}/submit)
- ๊ฐ ๋ฌธ์ ๋ฅผ ์นด๋๋ก ํ์:
- ๋ฌธ์ ๋ฒํธ ๋ฐ ๋ด์ฉ
- 4๊ฐ ๋ณด๊ธฐ๋ฅผ ๋ผ๋์ค ๋ฒํผ์ผ๋ก ํ์
- ๊ฐ ๋ณด๊ธฐ์ ํธ๋ฒ ํจ๊ณผ (๋ฐฐ๊ฒฝ์ ๋ณ๊ฒฝ)
- "์ ์ถํ๊ธฐ" ๋ฒํผ (๋ชจ๋ ๋ฌธ์ ์ ๋ตํ๋์ง JavaScript๋ก ํ์ธ)
- Tailwind CSS๋ก ์คํ์ผ๋ง (๋ฌธ์ ์นด๋, ๋ณด๊ธฐ ๋ฒํผ ๋์์ธ)
4. **JavaScript ์ถ๊ฐ**:
- ์ ์ถ ๋ฒํผ ํด๋ฆญ ์ ๋ชจ๋ ๋ฌธ์ ์ ๋ตํ๋์ง ํ์ธ
- ๋ตํ์ง ์์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ฉ์์ง ํ์
์๋ฃ ํ ํด์ฆ ๋ชฉ๋ก์์ "ํด์ฆ ํ๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ฌธ์ ๊ฐ ์ ์์ ์ผ๋ก ํ์๋๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ํด์ฆ ํ๊ธฐ ํ์ด์ง๊ฐ ์์ฑ๋๊ณ , ๋ฌธ์ ์ ๋ณด๊ธฐ๊ฐ ์นด๋ ํํ๋ก ๋ณด๊ธฐ ์ข๊ฒ ํ์๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ต์ ์ ํํ๋ฉด ์๊ฐ์ ํผ๋๋ฐฑ์ด ์์ผ๋ฉฐ, ์ ์ถ ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์๋ํฉ๋๋ค.
ํด์ฆ ๊ฒฐ๊ณผ ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ๋ง๋ฌด๋ฆฌํฉ๋๋ค.
1. **๋ผ์ฐํธ ์ถ๊ฐ** (`routes/web.php`):
- `GET /quizzes/{id}/result` โ ํด์ฆ ๊ฒฐ๊ณผ ํ์ด์ง (์ธ์
์์ ์ ์ ์ฝ๊ธฐ)
2. **์ปจํธ๋กค๋ฌ ๋ฉ์๋ ์์ ** (`QuizController`):
- `submit()` ๋ฉ์๋์์ ๊ฒฐ๊ณผ๋ฅผ ์ธ์
์ ์ ์ฅํ๊ณ `/quizzes/{id}/result`๋ก ๋ฆฌ๋ค์ด๋ ํธ
- `result($id)` ๋ฉ์๋ ์ถ๊ฐ:
- ์ธ์
์์ ์ ์, ์ ์ฒด ๋ฌธ์ ์ ๊ฐ์ ธ์ค๊ธฐ
- ์ ๋ต๋ฅ ๊ณ์ฐ (score / total * 100)
- ํด์ฆ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
- ๋ทฐ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
3. **๋ทฐ ํ์ผ ์์ฑ** (`resources/views/quizzes/result.blade.php`):
- ๋ ์ด์์ ์์
- ํฐ ์ ์ ํ์ ("10 / 10" ํํ, ํฐ ํฐํธ ์ฌ์ด์ฆ)
- ์ ๋ต๋ฅ ํ์ ("์ ๋ต๋ฅ : 100%")
- ์ฑ์ทจ ๋ฉ์์ง:
- 100%: "๐ ์๋ฒฝํด์! ์ฒ์ฌ์๋ค์!"
- 80~99%: "๐ ํ๋ฅญํด์! ๊ฑฐ์ ๋ค ๋ง์ท์ด์!"
- 60~79%: "๐ ์ํ์ด์! ์กฐ๊ธ๋ง ๋ ๊ณต๋ถํ๋ฉด ์๋ฒฝ!"
- 60% ๋ฏธ๋ง: "๐ช ์์ฌ์์! ๋ค์ ๋์ ํด๋ณด์ธ์!"
- ๋ฒํผ๋ค:
- "๋ค์ ํ๊ธฐ" (๊ฐ์ ํด์ฆ ๋ค์ ํ๊ธฐ)
- "๋ค๋ฅธ ํด์ฆ ํ๊ธฐ" (ํด์ฆ ๋ชฉ๋ก์ผ๋ก)
- "๋ด ํด์ฆ ๋ง๋ค๊ธฐ" (ํด์ฆ ์ ์ ํ์ด์ง๋ก)
- Tailwind CSS๋ก ํ๋ คํ ๊ฒฐ๊ณผ ํ์ด์ง ๋์์ธ (๊ทธ๋ผ๋ฐ์ด์
, ์ ๋๋ฉ์ด์
)
4. **์ถ๊ฐ ๊ฐ์ ์ฌํญ**:
- ํด์ฆ ๋ชฉ๋ก ํ์ด์ง์ ๊ฒ์ ๊ธฐ๋ฅ ์ถ๊ฐ (์ ๋ชฉ์ผ๋ก ๊ฒ์)
- ๋์ด๋๋ณ ํํฐ ๋ฒํผ ์ถ๊ฐ
- ํด์ฆ ์นด๋์ ์ข์์ ๋ฒํผ ์ถ๊ฐ (์ ํ์ฌํญ)
5. **์ต์ข
ํ
์คํธ**:
- ํด์ฆ ๋ง๋ค๊ธฐ โ ๋ชฉ๋ก์์ ํ์ธ โ ํด์ฆ ํ๊ธฐ โ ๊ฒฐ๊ณผ ํ์ธ ์ ์ฒด ํ๋ก์ฐ ํ
์คํธ
- ๋ฐ์ํ ๋์์ธ ํ์ธ (๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ)
- ์๋ฌ ์ฒ๋ฆฌ ํ์ธ (์๋ชป๋ ํด์ฆ ID ์ ๊ทผ ์)
์๋ฃ ํ ์ ์ฒด ๊ธฐ๋ฅ์ ํ
์คํธํ๊ณ , README.md ํ์ผ์ ์์ฑํ์ฌ ํ๋ก์ ํธ ์ค๋ช
, ์ค์น ๋ฐฉ๋ฒ, ์คํ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: ํด์ฆ ๊ฒฐ๊ณผ ํ์ด์ง๊ฐ ํ๋ คํ๊ณ ๋ณด๊ธฐ ์ข๊ฒ ์์ฑ๋ฉ๋๋ค. ์ ์์ ๋ฐ๋ฅธ ์ฑ์ทจ ๋ฉ์์ง๊ฐ ํ์๋๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋ค์ ํ๊ธฐ ๋๋ ๋ค๋ฅธ ํด์ฆ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ์ ์ฒด ํด์ฆ ํ๋ซํผ์ด ์์ฑ๋์ด ์ฌ์ฉ์๊ฐ ํด์ฆ๋ฅผ ๋ง๋ค๊ณ , ๊ณต์ ํ๊ณ , ํ ์ ์์ต๋๋ค.
์ ์ถ๋ ์ํ (0)
๋ก๊ทธ์ธ ํ ์ ์ถ์์ง ์ ์ถ๋ ์ํ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋์ ์๊ฐ ๋์ด๋ณด์ธ์!