풀스택 미니 퀴즈 앱 - 객관식 문제 풀이 - 바이브코딩 레시피
입문 PHP + JavaScript Laravel + React AI: Claude

풀스택 미니 퀴즈 앱 - 객관식 문제 풀이

리포지토리명 quiz-app-fullstack
조회수 109 0건 제출

문제 설명

프로젝트 개요

Laravel 13.x API 백엔드와 React 19 프론트엔드를 활용하여 간단한 퀴즈 앱을 만듭니다. 사용자는 객관식 문제를 풀고, 정답을 확인하며, 점수를 확인할 수 있습니다. Laravel은 RESTful API 서버로 동작하며, React는 Vite 기반 별도 프로젝트로 구성됩니다.

필수 기능

  1. 퀴즈 목록 조회: Laravel API에서 퀴즈 문제 목록을 JSON으로 반환
  2. 퀴즈 풀이 화면: React에서 한 문제씩 표시하고 선택지 클릭
  3. 정답 확인: 사용자가 선택한 답과 정답 비교 후 피드백 표시
  4. 점수 계산: 전체 문제 풀이 후 맞은 개수와 점수 표시
  5. 데이터베이스: SQLite로 퀴즈 문제(질문, 선택지, 정답) 저장
  6. CORS 설정: Laravel API와 React 프론트엔드 간 통신 허용

선택 추가 기능 (보너스)

  • 카테고리별 퀴즈 필터링 (예: 일반상식, 과학, 역사)
  • 타이머 기능 (문제당 제한 시간)
  • 결과 저장 및 히스토리 조회
  • 난이도 선택 (쉬움/보통/어려움)
  • 랜덤 문제 순서 섞기

기술 스택

  • 백엔드: Laravel 13.x (API 서버, SQLite 데이터베이스)
  • 프론트엔드: React 19 (Vite 기반)
  • 스타일링: Tailwind CSS
  • 통신: fetch API 또는 axios

학습 목표

  • Laravel API 라우트 및 컨트롤러 설계
  • React 컴포넌트와 useState 훅 활용
  • RESTful API 설계 및 JSON 응답 처리
  • CORS 설정 및 프론트엔드-백엔드 연동
  • 간단한 CRUD 및 데이터 검증

제약 조건

  • • Laravel 13.x 사용 (구버전 금지)
  • • React 19 사용 (구버전 금지)
  • • Laravel은 API 서버로만 동작 (Blade 템플릿 사용 금지)
  • • React는 Vite 기반 별도 프로젝트로 구성
  • • 데이터베이스는 SQLite 사용
  • • 복잡한 상태관리 라이브러리 사용 금지 (useState만 사용)
  • • CORS 미들웨어 설정 필수
  • • Tailwind CSS로 스타일링
  • • API 엔드포인트는 RESTful 규칙 준수 (/api/quizzes 등)

프롬프트 레시피

아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.

1
Step 1
mkdir quiz-app-fullstack && cd quiz-app-fullstack

이 폴더에서 풀스택 퀴즈 앱 프로젝트를 시작합니다.

## Laravel 13.x API 백엔드 설정

1. `backend` 폴더에 Laravel 13.x 프로젝트를 생성하세요.
   - `composer create-project laravel/laravel backend`
   - Laravel 13.x 최신 버전 사용 확인

2. 데이터베이스를 SQLite로 설정하세요.
   - `.env` 파일에서 `DB_CONNECTION=sqlite` 설정
   - `database/database.sqlite` 파일 생성

3. `quizzes` 테이블 마이그레이션 생성:
   - `php artisan make:migration create_quizzes_table`
   - 컬럼: `id`, `question` (text), `option_a` (string), `option_b` (string), `option_c` (string), `option_d` (string), `correct_answer` (string, 'A'/'B'/'C'/'D'), `timestamps`
   - 마이그레이션 실행: `php artisan migrate`

4. 시더로 샘플 퀴즈 데이터 5개 추가:
   - `php artisan make:seeder QuizSeeder`
   - 다양한 일반상식 문제 5개 생성 (예: "대한민국의 수도는?", "태양계에서 가장 큰 행성은?" 등)
   - 시더 실행: `php artisan db:seed --class=QuizSeeder`

5. CORS 미들웨어 설정:
   - `config/cors.php`에서 `'allowed_origins' => ['http://localhost:5173']` 설정 (React Vite 기본 포트)
   - `bootstrap/app.php` 또는 `app/Http/Kernel.php`에서 CORS 미들웨어 활성화

6. API 라우트 생성 (`routes/api.php`):
   - `GET /api/quizzes` - 모든 퀴즈 목록 반환
   - QuizController 생성: `php artisan make:controller QuizController`
   - `index()` 메서드에서 `Quiz::all()` JSON 반환

7. Laravel 개발 서버 실행:
   - `php artisan serve` (기본 포트 8000)

완료 후 `http://localhost:8000/api/quizzes`에서 JSON 응답 확인 가능해야 합니다.

기대 결과: Laravel 13.x API 서버가 설정되고, SQLite 데이터베이스에 퀴즈 테이블과 샘플 데이터 5개가 생성됩니다. `/api/quizzes` 엔드포인트가 JSON 형식으로 퀴즈 목록을 반환합니다. CORS가 설정되어 React 앱에서 API 호출이 가능합니다.

2
Step 2
## React 19 프론트엔드 설정

1. 프로젝트 루트에서 `frontend` 폴더에 React 19 + Vite 프로젝트 생성:
   - `npm create vite@latest frontend -- --template react`
   - `cd frontend && npm install`

2. Tailwind CSS 설치 및 설정:
   - `npm install -D tailwindcss postcss autoprefixer`
   - `npx tailwindcss init -p`
   - `tailwind.config.js`에서 `content: ['./index.html', './src/**/*.{js,jsx}']` 설정
   - `src/index.css`에 Tailwind 지시어 추가:
     ```css
     @tailwind base;
     @tailwind components;
     @tailwind utilities;
     ```

3. `src/App.jsx` 수정:
   - 기존 코드 삭제하고 기본 레이아웃 생성
   - 제목: "퀴즈 앱" (중앙 정렬, 큰 폰트)
   - "퀴즈 시작하기" 버튼 (Tailwind로 스타일링)
   - 버튼 클릭 시 콘솔에 "퀴즈 시작!" 출력 (나중에 퀴즈 로드 기능으로 대체)

4. React 개발 서버 실행:
   - `npm run dev` (기본 포트 5173)

완료 후 `http://localhost:5173`에서 "퀴즈 앱" 제목과 버튼이 표시되어야 합니다.

기대 결과: React 19 + Vite 프론트엔드가 설정되고, Tailwind CSS가 적용됩니다. 기본 UI(제목과 시작 버튼)가 표시되며, 버튼 클릭 시 콘솔 로그가 출력됩니다.

3
Step 3
## Laravel API에서 퀴즈 데이터 가져오기

`src/App.jsx`를 수정하여 Laravel API에서 퀴즈 목록을 가져오고 화면에 표시하세요.

1. `useState`로 상태 관리:
   - `quizzes`: 퀴즈 목록 배열
   - `currentIndex`: 현재 문제 인덱스 (0부터 시작)
   - `selectedAnswer`: 사용자가 선택한 답
   - `showResult`: 결과 화면 표시 여부
   - `score`: 맞은 문제 개수

2. `useEffect`로 컴포넌트 마운트 시 API 호출:
   - `fetch('http://localhost:8000/api/quizzes')`로 데이터 가져오기
   - 응답을 JSON으로 파싱 후 `quizzes` 상태에 저장
   - 에러 처리 추가 (console.error)

3. 퀴즈 문제 표시:
   - `quizzes[currentIndex]`로 현재 문제 가져오기
   - 문제 질문 표시 (큰 폰트, 볼드)
   - 선택지 4개 (A, B, C, D) 버튼으로 표시
   - 각 버튼은 `option_a`, `option_b`, `option_c`, `option_d` 값 표시
   - 버튼 클릭 시 `selectedAnswer` 상태 업데이트

4. UI 조건부 렌더링:
   - 퀴즈 로딩 중: "퀴즈를 불러오는 중..." 메시지
   - 퀴즈 로드 완료: 현재 문제와 선택지 표시

완료 후 화면에 첫 번째 퀴즈 문제와 선택지가 표시되어야 합니다.

기대 결과: React 앱이 Laravel API에서 퀴즈 데이터를 성공적으로 가져와 화면에 첫 번째 문제와 4개의 선택지를 표시합니다. 선택지 버튼 클릭 시 `selectedAnswer` 상태가 업데이트됩니다.

4
Step 4
## 정답 확인 및 다음 문제 이동 기능 구현

`src/App.jsx`를 수정하여 정답 확인 및 다음 문제로 이동하는 기능을 추가하세요.

1. "정답 확인" 버튼 추가:
   - 선택지 아래에 "정답 확인" 버튼 표시
   - `selectedAnswer`가 없으면 버튼 비활성화 (disabled)

2. 정답 확인 로직:
   - 버튼 클릭 시 `selectedAnswer`와 `quizzes[currentIndex].correct_answer` 비교
   - 정답이면 `score` 1 증가
   - 정답 여부를 alert 또는 화면에 피드백 표시 (예: "정답입니다!" 또는 "오답입니다. 정답은 B입니다.")

3. 다음 문제로 이동:
   - 정답 확인 후 1초 뒤 자동으로 다음 문제로 이동
   - `currentIndex` 1 증가
   - `selectedAnswer` 초기화 (null)
   - 마지막 문제인 경우 `showResult`를 true로 설정 (결과 화면 표시)

4. 결과 화면 표시:
   - `showResult`가 true일 때 결과 화면 렌더링
   - 전체 문제 수와 맞은 문제 수 표시 (예: "5문제 중 3문제 정답!")
   - 점수 퍼센트 계산 및 표시 (예: "점수: 60%")
   - "다시 시작" 버튼 추가 (클릭 시 상태 초기화)

완료 후 퀴즈를 풀고 정답 확인, 다음 문제 이동, 최종 결과 표시가 동작해야 합니다.

기대 결과: 사용자가 선택지를 선택하고 "정답 확인" 버튼을 클릭하면 정답 여부 피드백이 표시되고, 1초 후 자동으로 다음 문제로 이동합니다. 마지막 문제 후 결과 화면이 표시되며, 맞은 문제 수와 점수가 계산되어 보여집니다. "다시 시작" 버튼으로 퀴즈를 재시작할 수 있습니다.

제출된 작품 (0)

로그인 후 제출

아직 제출된 작품이 없습니다. 첫 번째 도전자가 되어보세요!

댓글 (0)

로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!