๐ฏ ํด์ฆ ๋ฐฐํ ์๋ ๋ - ์น๊ตฌ์ ์ค์๊ฐ ๋๊ฒฐํ๋ ํด์ฆ ๊ฒ์
quiz-battle-arena-fullstack
๋ฌธ์ ์ค๋ช
๐ฎ ํ๋ก์ ํธ ๊ฐ์
์น๊ตฌ๋ค๊ณผ ํจ๊ป ์ฆ๊ธฐ๋ ์ค์๊ฐ ํด์ฆ ๋๊ฒฐ ํ๋ซํผ์ ๋ง๋ญ๋๋ค! ์ฌ์ฉ์๋ ๋ค์ํ ์นดํ ๊ณ ๋ฆฌ(์ํ, ์์ , ์คํฌ์ธ , ๊ณผํ ๋ฑ)์ ํด์ฆ ๋ฐฉ์ ์์ฑํ๊ณ , ์น๊ตฌ๋ฅผ ์ด๋ํ์ฌ ๋๊ฐ ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ๋งํ๋์ง ๊ฒฝ์ํ ์ ์์ต๋๋ค.
โจ ํ์ ๊ธฐ๋ฅ
- ํด์ฆ ๋ฐฉ ์์ฑ: ์นดํ ๊ณ ๋ฆฌ ์ ํ, ๋ฌธ์ ๊ฐ์ ์ค์ , ๋ฐฉ ์ ๋ชฉ ์ ๋ ฅ
- ํด์ฆ ๋ชฉ๋ก ํ์ด์ง: ํ์ฌ ์งํ ์ค์ธ ํด์ฆ ๋ฐฉ ๋ชฉ๋ก (์นด๋ ํํ๋ก ํ์)
- ํด์ฆ ํ๋ ์ด ํ์ด์ง: ๋ฌธ์ ํ์, 4๊ฐ์ ์ ํ์ง, ํ์ด๋จธ(30์ด), ์ ๋ต/์ค๋ต ํผ๋๋ฐฑ
- ์ ์ ์ง๊ณ: ๋งํ ๋ฌธ์ ๊ฐ์, ์ ๋ต๋ฅ , ์์ ์๊ฐ ๊ธฐ๋ก
- ๊ฒฐ๊ณผ ํ์ด์ง: ์ต์ข ์ ์, ์์, ์ ๋ต ํ์ธ
๐ ๋ณด๋์ค ๊ธฐ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ๋ณ ๋์ด๋ ์กฐ์ (์ฌ์/๋ณดํต/์ด๋ ค์)
- ์ฐ์ ์ ๋ต ์ฝค๋ณด ์์คํ (3์ฐ์ ์ ๋ต ์ ๋ณด๋์ค ์ ์)
- ํด์ฆ ํ์คํ ๋ฆฌ (๋ด๊ฐ ์ฐธ์ฌํ ํด์ฆ ๊ธฐ๋ก)
- ๋ฆฌ๋๋ณด๋ (์ ์ฒด ์ฌ์ฉ์ ์ค ์ต๊ณ ์ ์)
- ๊ณต์ ๊ธฐ๋ฅ (๊ฒฐ๊ณผ๋ฅผ SNS์ ๊ณต์ )
๐จ ๋์์ธ ํฌ์ธํธ
- ๊ฒ์๋ค์ด ์๋๊ฐ ์๋ UI (๋ฒํผ ํธ๋ฒ ์ ๋๋ฉ์ด์ , ์ ๋ต ์ ์ถํ ํจ๊ณผ)
- ํ์ด๋จธ ์งํ๋ฐ (์๊ฐ์ด ์ค์ด๋ค์๋ก ์์ ๋ณํ)
- ์นด๋ ํ๋ฆฝ ์ ๋๋ฉ์ด์ (๋ฌธ์ ์ ํ ์)
- ๋ฐ์ํ ๋์์ธ (๋ชจ๋ฐ์ผ์์๋ ์พ์ ํ๊ฒ)
๐ ๊ธฐ์ ์คํ
- ๋ฐฑ์๋: Laravel 13.x (RESTful API)
- ํ๋ก ํธ์๋: React 19 (Vite)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: SQLite
- ์คํ์ผ๋ง: Tailwind CSS
์ ์ฝ ์กฐ๊ฑด
- โข Laravel 13.x ์ต์ ๋ฒ์ ์ฌ์ฉ ํ์
- โข React 19 ์ต์ ๋ฒ์ ์ฌ์ฉ ํ์
- โข ๋ฐฑ์๋๋ RESTful API ์๋ฒ๋ก ๊ตฌ์ฑ (Laravel API)
- โข ํ๋ก ํธ์๋๋ Vite ๊ธฐ๋ฐ React ํ๋ก์ ํธ๋ก ๋ณ๋ ๊ตฌ์ฑ
- โข fetch ๋๋ axios๋ก API ํธ์ถํ์ฌ ๋ฐ์ดํฐ ์ฐ๋
- โข SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ (๊ฐ๋จํ ์ค์ )
- โข Tailwind CSS๋ก ์คํ์ผ๋ง
- โข ์ค์๊ฐ ์ฑํ /WebSocket ๊ธฐ๋ฅ ๊ธ์ง (HTTP ๊ธฐ๋ฐ ํต์ ๋ง ์ฌ์ฉ)
- โข ๋ณต์กํ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๊ธ์ง (useState๋ง ์ฌ์ฉ)
- โข Git ์ปค๋ฐ์ ๊ฐ ๋จ๊ณ๋ง๋ค ์ํ
ํ๋กฌํํธ ๋ ์ํผ
์๋ ํ๋กฌํํธ๋ฅผ ์์๋๋ก AI์๊ฒ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ๋ณต์ฌ ๋ฒํผ์ ๋๋ฌ ๋ฐ๋ก ์ฌ์ฉํ์ธ์.
mkdir quiz-battle-arena-fullstack && cd quiz-battle-arena-fullstack
์ด ํด๋์์ ํ๋ก์ ํธ๋ฅผ ์์ํฉ๋๋ค.
## 1๋จ๊ณ: Laravel ๋ฐฑ์๋ API ํ๋ก์ ํธ ์์ฑ
Laravel 13.x ์ต์ ๋ฒ์ ์ผ๋ก API ๋ฐฑ์๋ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ณธ ์ค์ ์ ์๋ฃํฉ๋๋ค.
### ์๊ตฌ์ฌํญ:
1. `backend` ํด๋์ Laravel 13.x ํ๋ก์ ํธ ์์ฑ
2. SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ (.env ํ์ผ ์์ )
3. CORS ์ค์ (React ํ๋ก ํธ์๋์์ API ํธ์ถ ๊ฐ๋ฅํ๋๋ก)
4. ๋ค์ ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ ์์ฑ:
- `quizzes` ํ
์ด๋ธ: id, title, category, difficulty, question_count, timestamps
- `questions` ํ
์ด๋ธ: id, quiz_id (foreign key), question_text, option_a, option_b, option_c, option_d, correct_answer, timestamps
- `quiz_results` ํ
์ด๋ธ: id, quiz_id (foreign key), player_name, score, correct_count, total_time, timestamps
5. ๊ฐ ํ
์ด๋ธ์ ๋์ํ๋ Eloquent ๋ชจ๋ธ ์์ฑ (Quiz, Question, QuizResult)
6. ๊ด๊ณ ์ค์ :
- Quiz hasMany Questions
- Quiz hasMany QuizResults
7. API ๋ผ์ฐํธ ์ค๊ณ (routes/api.php):
- GET /api/quizzes (ํด์ฆ ๋ชฉ๋ก ์กฐํ)
- POST /api/quizzes (ํด์ฆ ์์ฑ)
- GET /api/quizzes/{id} (ํด์ฆ ์์ธ ์กฐํ - ๋ฌธ์ ํฌํจ)
- POST /api/quiz-results (ํด์ฆ ๊ฒฐ๊ณผ ์ ์ถ)
- GET /api/quiz-results/{quizId} (ํน์ ํด์ฆ์ ๊ฒฐ๊ณผ ๋ชฉ๋ก)
8. ์ปจํธ๋กค๋ฌ ์์ฑ (QuizController, QuizResultController)
9. Seeder ์์ฑ (์ํ ํด์ฆ ๋ฐ์ดํฐ 5๊ฐ, ๊ฐ ํด์ฆ๋น 5๊ฐ ๋ฌธ์ )
### ๋ช
๋ น์ด ์์:
```bash
composer create-project laravel/laravel:^13.0 backend
cd backend
php artisan migrate
php artisan db:seed
php artisan serve --port=8000
```
### ์นดํ
๊ณ ๋ฆฌ ์์:
- ์ํ
- ์์
- ์คํฌ์ธ
- ๊ณผํ
- ์ญ์ฌ
### ๋์ด๋:
- easy (์ฌ์)
- medium (๋ณดํต)
- hard (์ด๋ ค์)
๋ชจ๋ ์ค์ ์ด ์๋ฃ๋๋ฉด `php artisan serve`๋ก ์๋ฒ๋ฅผ ์คํํ๊ณ , Postman์ด๋ curl๋ก API๊ฐ ์ ์ ์๋ํ๋์ง ํ
์คํธํด์ฃผ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: Laravel ๋ฐฑ์๋ API ์๋ฒ๊ฐ http://localhost:8000 ์์ ์คํ๋๊ณ , ๋ค์์ด ์๋ฃ๋จ: - SQLite DB ์์ฑ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃ - Quiz, Question, QuizResult ๋ชจ๋ธ ๋ฐ ๊ด๊ณ ์ค์ - RESTful API ์๋ํฌ์ธํธ ๊ตฌํ (CRUD) - ์ํ ๋ฐ์ดํฐ 5๊ฐ ํด์ฆ, ๊ฐ 5๊ฐ ๋ฌธ์ ์๋ฉ - CORS ์ค์ ์ผ๋ก React์์ API ํธ์ถ ๊ฐ๋ฅ - Postman์ผ๋ก GET /api/quizzes ํธ์ถ ์ ํด์ฆ ๋ชฉ๋ก JSON ์๋ต ํ์ธ
## 2๋จ๊ณ: React ํ๋ก ํธ์๋ ํ๋ก์ ํธ ์์ฑ ๋ฐ ๊ธฐ๋ณธ UI ๊ตฌ์ฑ Vite ๊ธฐ๋ฐ React 19 ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ , Tailwind CSS๋ฅผ ์ค์ ํ ํ ๊ธฐ๋ณธ ๋ ์ด์์๊ณผ ํด์ฆ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ๊ตฌํํฉ๋๋ค. ### ์๊ตฌ์ฌํญ: 1. `frontend` ํด๋์ Vite + React 19 ํ๋ก์ ํธ ์์ฑ 2. Tailwind CSS ์ค์น ๋ฐ ์ค์ 3. React Router DOM v6 ์ค์น (ํ์ด์ง ๋ผ์ฐํ ) 4. ๋ค์ ํ์ด์ง ์ปดํฌ๋ํธ ์์ฑ: - `HomePage.jsx` (ํด์ฆ ๋ชฉ๋ก ํ์ด์ง) - `CreateQuizPage.jsx` (ํด์ฆ ์์ฑ ํ์ด์ง) - `QuizPlayPage.jsx` (ํด์ฆ ํ๋ ์ด ํ์ด์ง) - `ResultPage.jsx` (๊ฒฐ๊ณผ ํ์ด์ง) 5. `App.jsx`์์ React Router๋ก ๋ผ์ฐํ ์ค์ 6. `HomePage.jsx` ๊ตฌํ: - useState๋ก ํด์ฆ ๋ชฉ๋ก ์ํ ๊ด๋ฆฌ - useEffect์์ fetch๋ก Laravel API (http://localhost:8000/api/quizzes) ํธ์ถํ์ฌ ํด์ฆ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ - ํด์ฆ ๋ชฉ๋ก์ ์นด๋ ํํ๋ก ํ์ (์ ๋ชฉ, ์นดํ ๊ณ ๋ฆฌ, ๋์ด๋, ๋ฌธ์ ๊ฐ์) - ๊ฐ ์นด๋ ํด๋ฆญ ์ ํด๋น ํด์ฆ ํ๋ ์ด ํ์ด์ง๋ก ์ด๋ (Link ์ฌ์ฉ) - "์ ํด์ฆ ๋ง๋ค๊ธฐ" ๋ฒํผ (CreateQuizPage๋ก ์ด๋) 7. ํค๋ ์ปดํฌ๋ํธ ์์ฑ (`Header.jsx`): - ๋ก๊ณ /ํ์ดํ "ํด์ฆ ๋ฐฐํ ์๋ ๋ ๐ฏ" - ํ/ํด์ฆ ์์ฑ ๋ค๋น๊ฒ์ด์ ๋งํฌ 8. Tailwind CSS๋ก ๊ฒ์๋ค์ด ๋์์ธ: - ๊ทธ๋ผ๋ฐ์ด์ ๋ฐฐ๊ฒฝ - ์นด๋ ํธ๋ฒ ํจ๊ณผ (scale, shadow) - ๋ฒํผ ์ ๋๋ฉ์ด์ - ๋ฐ์ํ ๊ทธ๋ฆฌ๋ ๋ ์ด์์ (๋ชจ๋ฐ์ผ: 1์ด, ํ๋ธ๋ฆฟ: 2์ด, ๋ฐ์คํฌํฑ: 3์ด) ### ๋ช ๋ น์ด ์์: ```bash cd .. npm create vite@latest frontend -- --template react cd frontend npm install npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p npm install react-router-dom npm run dev ``` ### ๋์์ธ ์ปจ์ : - ๋ฐฐ๊ฒฝ: ๋ณด๋ผ-ํ๋ ๊ทธ๋ผ๋ฐ์ด์ - ์นด๋: ํฐ์ ๋ฐฐ๊ฒฝ, ๋ฅ๊ทผ ๋ชจ์๋ฆฌ, ๊ทธ๋ฆผ์ - ๋ฒํผ: ์ฃผํฉ์ ๋๋ ํ๋์, ํธ๋ฒ ์ ์ด์ง ์ปค์ง - ํฐํธ: ๊ตต์ ์ ๋ชฉ, ๊น๋ํ ๋ณธ๋ฌธ ํ๋ก ํธ์๋ ์๋ฒ๊ฐ http://localhost:5173 ์์ ์คํ๋๊ณ , ํํ์ด์ง์์ Laravel API๋ก๋ถํฐ ํด์ฆ ๋ชฉ๋ก์ ๋ถ๋ฌ์ ์นด๋๋ก ํ์๋๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: React ํ๋ก ํธ์๋๊ฐ http://localhost:5173 ์์ ์คํ๋๊ณ , ๋ค์์ด ์๋ฃ๋จ: - Vite + React 19 ํ๋ก์ ํธ ์์ฑ - Tailwind CSS ์ค์ ์๋ฃ - React Router๋ก ํ์ด์ง ๋ผ์ฐํ ๊ตฌ์ฑ - HomePage์์ fetch๋ก Laravel API ํธ์ถํ์ฌ ํด์ฆ ๋ชฉ๋ก ํ์ - ํด์ฆ ์นด๋๊ฐ ๊ทธ๋ฆฌ๋ ํํ๋ก ํ์๋๋ฉฐ, ํธ๋ฒ ์ ์ ๋๋ฉ์ด์ ํจ๊ณผ - ํค๋์ ๋ค๋น๊ฒ์ด์ ๋งํฌ ํ์ - ๋ฐ์ํ ๋์์ธ ์ ์ฉ (๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ)
## 3๋จ๊ณ: ํด์ฆ ํ๋ ์ด ํ์ด์ง ๋ฐ ๊ฒฐ๊ณผ ์ ์ถ ๊ธฐ๋ฅ ๊ตฌํ
์ฌ์ฉ์๊ฐ ํด์ฆ๋ฅผ ํ๋ ์ดํ๊ณ , ์ ๋ต์ ์ ํํ๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ์ ์ถํ๋ ์ ์ฒด ํ๋ก์ฐ๋ฅผ ๊ตฌํํฉ๋๋ค.
### ์๊ตฌ์ฌํญ:
1. `QuizPlayPage.jsx` ๊ตฌํ:
- URL ํ๋ผ๋ฏธํฐ๋ก quizId ๋ฐ๊ธฐ (useParams)
- useEffect์์ GET /api/quizzes/{quizId} ํธ์ถํ์ฌ ํด์ฆ ๋ฐ์ดํฐ(๋ฌธ์ ํฌํจ) ๊ฐ์ ธ์ค๊ธฐ
- useState๋ก ๋ค์ ์ํ ๊ด๋ฆฌ:
- currentQuestionIndex (ํ์ฌ ๋ฌธ์ ์ธ๋ฑ์ค, ์ด๊ธฐ๊ฐ 0)
- selectedAnswer (์ ํํ ๋ต)
- score (์ ์)
- correctCount (๋งํ ๊ฐ์)
- isAnswered (ํ์ฌ ๋ฌธ์ ์ ๋ตํ๋์ง ์ฌ๋ถ)
- startTime (ํด์ฆ ์์ ์๊ฐ)
- ํ์ฌ ๋ฌธ์ ํ์:
- ๋ฌธ์ ํ
์คํธ
- 4๊ฐ์ ์ ํ์ง ๋ฒํผ (option_a, option_b, option_c, option_d)
- ์ ํ์ง ํด๋ฆญ ์ selectedAnswer ์
๋ฐ์ดํธ ๋ฐ isAnswered๋ฅผ true๋ก ์ค์
- ์ ๋ต ํ์ธ ๋ก์ง:
- ์ ํํ ๋ต๊ณผ correct_answer ๋น๊ต
- ์ ๋ต์ด๋ฉด score +10, correctCount +1
- ์ ๋ต/์ค๋ต ํผ๋๋ฐฑ ํ์ (์ด๋ก์/๋นจ๊ฐ์ ๋ฐฐ๊ฒฝ, ๋ฉ์์ง)
- "๋ค์ ๋ฌธ์ " ๋ฒํผ:
- ํด๋ฆญ ์ currentQuestionIndex +1
- ๋ง์ง๋ง ๋ฌธ์ ๋ผ๋ฉด ๊ฒฐ๊ณผ ์ ์ถ ๋ฐ ResultPage๋ก ์ด๋
- ํ์ด๋จธ (์ ํ ๊ธฐ๋ฅ, ๋ณด๋์ค):
- 30์ด ์นด์ดํธ๋ค์ด
- ์๊ฐ ์ด๊ณผ ์ ์๋์ผ๋ก ๋ค์ ๋ฌธ์ ๋ก ๋์ด๊ฐ
- ์งํ๋ฐ๋ก ์๊ฐํ (์๊ฐ์ด ์ค์ด๋ค์๋ก ๋นจ๊ฐ์์ผ๋ก ๋ณํ)
2. ๊ฒฐ๊ณผ ์ ์ถ:
- ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ๋ฉด POST /api/quiz-results๋ก ๊ฒฐ๊ณผ ์ ์ถ
- ์์ฒญ ๋ณธ๋ฌธ: { quiz_id, player_name, score, correct_count, total_time }
- player_name์ ๊ฐ๋จํ ์
๋ ฅ ํผ์ผ๋ก ๋ฐ๊ฑฐ๋ "์ต๋ช
" ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ
- ์ ์ถ ํ ResultPage๋ก ์ด๋ (navigate ์ฌ์ฉ)
3. `ResultPage.jsx` ๊ตฌํ:
- URL state๋ก ์ ๋ฌ๋ฐ์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ์
- ์ต์ข
์ ์, ๋งํ ๊ฐ์ / ์ ์ฒด ๋ฌธ์ ์, ์ ๋ต๋ฅ (%)
- "๋ค์ ๋์ ํ๊ธฐ" ๋ฒํผ (๊ฐ์ ํด์ฆ ๋ค์ ํ๋ ์ด)
- "ํ์ผ๋ก ๋์๊ฐ๊ธฐ" ๋ฒํผ
- (๋ณด๋์ค) GET /api/quiz-results/{quizId} ํธ์ถํ์ฌ ๋ค๋ฅธ ํ๋ ์ด์ด๋ค์ ์ ์ ๋ฆฌ๋๋ณด๋ ํ์
4. ์ ๋๋ฉ์ด์
ํจ๊ณผ:
- ๋ฌธ์ ์ ํ ์ ์นด๋ ํ๋ฆฝ ๋๋ ํ์ด๋ ์ธ/์์
- ์ ๋ต ์ ์ถํ ํจ๊ณผ (confetti ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅ, ์ ํ)
- ๋ฒํผ ํธ๋ฒ ์ scale ์ ๋๋ฉ์ด์
### ํ๋ ์ด์ด ์ด๋ฆ ์
๋ ฅ:
- ํด์ฆ ์์ ์ ๊ฐ๋จํ ๋ชจ๋ฌ ๋๋ ์
๋ ฅ ํ๋๋ก ์ด๋ฆ ์
๋ ฅ๋ฐ๊ธฐ
- localStorage์ ์ ์ฅํ์ฌ ๋ค์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
### ๋์์ธ:
- ๋ฌธ์ ์นด๋: ํฐ ํฐํธ, ์ค์ ์ ๋ ฌ
- ์ ํ์ง ๋ฒํผ: 4๊ฐ๊ฐ 2x2 ๊ทธ๋ฆฌ๋ ๋๋ ์ธ๋ก๋ก ๋์ด
- ์ ๋ต ํผ๋๋ฐฑ: ํ๋ฉด ์๋จ์ ํ ์คํธ ๋ฉ์์ง ๋๋ ๋ชจ๋ฌ
- ๊ฒฐ๊ณผ ํ์ด์ง: ํฐ ์ ์ ์ซ์, ์ถํ ๋ฉ์์ง, ์ด๋ชจ์ง
๋ชจ๋ ๊ธฐ๋ฅ์ด ์๋ฃ๋๋ฉด ํด์ฆ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ํ๋ ์ดํ๊ณ , ๊ฒฐ๊ณผ๊ฐ DB์ ์ ์ฅ๋๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: QuizPlayPage์์ ํด์ฆ๋ฅผ ํ๋ ์ดํ ์ ์์ผ๋ฉฐ, ๋ค์์ด ์๋ฃ๋จ: - API๋ก๋ถํฐ ํด์ฆ ๋ฌธ์ ๋ฐ์ดํฐ ๋ก๋ - ์ ํ์ง ํด๋ฆญ์ผ๋ก ๋ต ์ ํ ๋ฐ ์ ๋ต ํ์ธ - ๋งํ ๊ฐ์์ ์ ์ ๊ณ์ฐ - ๋ชจ๋ ๋ฌธ์ ์๋ฃ ํ POST /api/quiz-results๋ก ๊ฒฐ๊ณผ ์ ์ถ - ResultPage์์ ์ต์ข ์ ์, ์ ๋ต๋ฅ , ๋ฆฌ๋๋ณด๋ ํ์ - ์ ๋๋ฉ์ด์ ํจ๊ณผ (๋ฌธ์ ์ ํ, ์ ๋ต ํผ๋๋ฐฑ) - ํ์ด๋จธ ๊ธฐ๋ฅ (์ ํ) - ๋ฐ์ํ ๋์์ธ์ผ๋ก ๋ชจ๋ฐ์ผ์์๋ ์พ์ ํ๊ฒ ํ๋ ์ด ๊ฐ๋ฅ
์ ์ถ๋ ์ํ (0)
๋ก๊ทธ์ธ ํ ์ ์ถ์์ง ์ ์ถ๋ ์ํ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋์ ์๊ฐ ๋์ด๋ณด์ธ์!