나만의 학습 플래시카드 - 암기 복습 시스템 - 바이브코딩 레시피
중급 PHP + JavaScript Laravel + React + Inertia.js

나만의 학습 플래시카드 - 암기 복습 시스템

리포지토리명 flashcard-learning-system
조회수 12 1건 제출 18시간 전

문제 설명

프로젝트 개요

간격 반복 학습(Spaced Repetition) 원리를 적용한 플래시카드 암기 시스템을 만듭니다. 사용자는 주제별 덱(Deck)을 만들고, 각 덱에 앞면/뒷면이 있는 카드를 추가하여 학습할 수 있습니다. 카드를 넘기며 복습하고, '알았음/모르겠음' 버튼으로 학습 진행도를 추적합니다.

필수 기능

  1. 덱(Deck) 관리: 주제별 플래시카드 덱 생성/수정/삭제 (예: "영어 단어", "역사 연표", "프로그래밍 용어")
  2. 카드(Card) CRUD: 각 덱에 카드 추가/수정/삭제 (앞면: 질문/단어, 뒷면: 답변/의미)
  3. 학습 모드: 덱을 선택하면 카드가 하나씩 표시되고, 클릭/버튼으로 뒤집기 가능
  4. 진행도 추적: 각 카드마다 "알았음(Mastered)"/"다시 보기(Review)" 상태 저장
  5. 통계 대시보드: 덱별 총 카드 수, 마스터한 카드 수, 복습 필요 카드 수를 시각적으로 표시
  6. 반응형 UI: 모바일에서도 카드 넘기기가 자연스럽게 작동

보너스 기능

  • 카드 셔플(랜덤 순서) 옵션
  • 학습 세션 타이머 (집중 시간 측정)
  • 덱 공유 기능 (JSON Export/Import)
  • 다크 모드 토글
  • 카드에 이미지 첨부 기능

기술 스택

  • 백엔드: Laravel 12.x (Eloquent ORM, SQLite)
  • 프론트엔드: React 19 + Inertia.js (모노리스 풀스택)
  • 스타일링: Tailwind CSS
  • 상태 관리: React useState/useReducer

학습 목표

  • Laravel과 React를 Inertia.js로 매끄럽게 연결하는 방법
  • 부모-자식 관계(Deck-Card) 데이터 모델링
  • 조건부 렌더링과 상태 관리로 인터랙티브 UI 구현
  • 사용자 경험(UX)을 고려한 학습 흐름 설계

제약 조건

  • Laravel 12.x + Inertia.js + React 19 스택 필수 (별도 REST API 라우트 사용 금지)
  • npx create laravel 또는 Laravel Breeze (React + Inertia) starter kit으로 프로젝트 생성
  • SQLite 데이터베이스 사용 (간편한 로컬 개발)
  • Tailwind CSS로 스타일링 (CDN 또는 npm 설치)
  • 카드 뒤집기는 CSS transform 또는 React 상태로 구현 (애니메이션 포함)
  • 덱과 카드는 1:N 관계 (Eloquent 관계 설정)
  • 학습 모드에서 카드 상태(mastered/review) 업데이트는 Ajax 없이 Inertia 폼 제출로 처리
  • 반응형 디자인 (모바일 터치 제스처 고려)

프롬프트 레시피

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

1
Step 1
Laravel 12.x + Inertia.js + React 19 프로젝트를 생성하고 초기 설정을 완료해줘.

요구사항:
1. `npx create laravel flashcard-learning-system` 명령으로 프로젝트 생성 (또는 Laravel Breeze React+Inertia starter kit 사용)
2. .env 파일에서 DB_CONNECTION=sqlite 설정하고, database/database.sqlite 파일 생성
3. Tailwind CSS 설정 확인 (Breeze 사용 시 이미 포함됨)
4. 기본 레이아웃 컴포넌트 생성: resources/js/Layouts/AppLayout.jsx (헤더에 "Flashcard Learning" 타이틀, 네비게이션 링크 포함)
5. 홈페이지 라우트(/) 생성: resources/js/Pages/Home.jsx - 간단한 환영 메시지와 "시작하기" 버튼
6. `php artisan serve` 및 `npm run dev` 실행 방법 안내

프로젝트 구조가 정상적으로 작동하는지 확인할 수 있도록 기본 페이지를 만들어줘.

기대 결과: Laravel + Inertia + React 프로젝트가 생성되고, 브라우저에서 localhost:8000 접속 시 홈페이지가 정상 렌더링됨. Tailwind CSS가 적용된 기본 레이아웃과 환영 메시지가 보임.

2
Step 2
Deck(덱) 모델과 CRUD 기능을 구현해줘.

요구사항:
1. Deck 모델 생성: `php artisan make:model Deck -m`
   - 필드: id, title (string, 덱 제목), description (text, 설명, nullable), created_at, updated_at
2. 마이그레이션 실행: `php artisan migrate`
3. DeckController 생성 및 라우트 설정:
   - GET /decks (index): 모든 덱 목록 페이지 (Inertia::render('Decks/Index'))
   - GET /decks/create (create): 덱 생성 폼 페이지
   - POST /decks (store): 덱 저장
   - GET /decks/{deck}/edit (edit): 덱 수정 폼 페이지
   - PUT /decks/{deck} (update): 덱 업데이트
   - DELETE /decks/{deck} (destroy): 덱 삭제
4. React 페이지 컴포넌트 생성:
   - resources/js/Pages/Decks/Index.jsx: 덱 목록 (카드 형태로 표시, 제목/설명/편집/삭제 버튼)
   - resources/js/Pages/Decks/Create.jsx: 덱 생성 폼 (제목, 설명 입력)
   - resources/js/Pages/Decks/Edit.jsx: 덱 수정 폼
5. Tailwind CSS로 스타일링 (카드 그리드 레이아웃)

덱 목록에서 "새 덱 만들기" 버튼을 눌러 생성 폼으로 이동하고, 덱을 추가하면 목록에 표시되도록 해줘.

기대 결과: /decks 페이지에서 덱 목록이 보이고, 덱 생성/수정/삭제가 정상 작동함. Inertia 폼 제출 후 리다이렉트되며 목록이 업데이트됨.

3
Step 3
Card(카드) 모델과 CRUD 기능을 구현해줘. 카드는 특정 덱에 속해야 해.

요구사항:
1. Card 모델 생성: `php artisan make:model Card -m`
   - 필드: id, deck_id (foreign key), front (text, 앞면 내용), back (text, 뒷면 내용), status (enum: 'new', 'review', 'mastered', 기본값 'new'), created_at, updated_at
   - Deck 모델에 hasMany('App\Models\Card') 관계 추가
   - Card 모델에 belongsTo('App\Models\Deck') 관계 추가
2. 마이그레이션 실행
3. CardController 생성 및 라우트 설정:
   - GET /decks/{deck}/cards (index): 특정 덱의 카드 목록 페이지
   - GET /decks/{deck}/cards/create (create): 카드 추가 폼
   - POST /decks/{deck}/cards (store): 카드 저장
   - GET /cards/{card}/edit (edit): 카드 수정 폼
   - PUT /cards/{card} (update): 카드 업데이트
   - DELETE /cards/{card} (destroy): 카드 삭제
4. React 페이지 컴포넌트:
   - resources/js/Pages/Cards/Index.jsx: 카드 목록 (테이블 또는 리스트, 앞면/뒷면/상태 표시, 편집/삭제 버튼)
   - resources/js/Pages/Cards/Create.jsx: 카드 추가 폼 (앞면, 뒷면 textarea)
   - resources/js/Pages/Cards/Edit.jsx: 카드 수정 폼
5. 덱 목록(Index.jsx)에서 각 덱 카드에 "카드 관리" 링크 추가 (/decks/{deck}/cards)

카드 목록에서 "새 카드 추가" 버튼을 눌러 카드를 추가하고, 목록에 표시되도록 해줘.

기대 결과: 특정 덱의 카드 목록 페이지가 작동하고, 카드 추가/수정/삭제가 정상 동작함. 덱과 카드의 1:N 관계가 정확히 반영됨.

4
Step 4
학습 모드(Study Mode)를 구현해줘. 사용자가 덱을 선택하면 카드를 하나씩 넘기며 학습할 수 있어야 해.

요구사항:
1. 라우트 추가: GET /decks/{deck}/study - 학습 모드 페이지
2. DeckController에 study 메서드 추가:
   - 해당 덱의 모든 카드를 가져와 Inertia::render('Decks/Study', ['deck' => $deck, 'cards' => $cards])
3. React 페이지: resources/js/Pages/Decks/Study.jsx
   - 현재 카드 인덱스를 useState로 관리
   - 카드 앞면/뒷면을 토글하는 상태 (isFlipped)
   - "카드 뒤집기" 버튼 (클릭 시 isFlipped 토글)
   - "다음 카드" 버튼 (인덱스 증가)
   - "이전 카드" 버튼 (인덱스 감소)
   - 카드 뒤집기 애니메이션 (CSS transform rotateY 또는 React transition 라이브러리 사용)
   - 마지막 카드 도달 시 "학습 완료" 메시지 및 "처음부터 다시" 버튼
4. 덱 목록(Index.jsx)에서 각 덱에 "학습 시작" 버튼 추가 (/decks/{deck}/study)
5. 학습 페이지 UI: 카드 중앙에 크게 표시, 진행률 표시 (예: "3 / 10")

카드 뒤집기가 부드럽게 애니메이션되고, 키보드 방향키로도 카드 넘기기가 가능하도록 해줘 (선택 사항).

기대 결과: 학습 모드 페이지에서 카드를 하나씩 넘기며 앞면/뒷면을 확인할 수 있음. 애니메이션이 자연스럽고, 진행률이 표시됨.

5
Step 5
학습 모드에서 카드 상태(status) 업데이트 기능을 추가해줘. 사용자가 카드를 보고 "알았음" 또는 "다시 보기" 버튼을 눌러 상태를 변경할 수 있어야 해.

요구사항:
1. CardController에 updateStatus 메서드 추가:
   - POST /cards/{card}/status
   - 요청 본문에서 status 값 받아 카드 업데이트 (validation: 'new', 'review', 'mastered' 중 하나)
2. Study.jsx에서 카드 뒷면 확인 후 두 개의 버튼 표시:
   - "알았음 (Mastered)" 버튼: status를 'mastered'로 업데이트하고 다음 카드로 이동
   - "다시 보기 (Review)" 버튼: status를 'review'로 업데이트하고 다음 카드로 이동
3. Inertia 폼 제출 또는 useForm 훅 사용하여 상태 업데이트
4. 학습 완료 시 통계 표시:
   - "마스터한 카드: X개"
   - "다시 볼 카드: Y개"
   - "새 카드: Z개"
5. 학습 모드 시작 시 필터 옵션 추가 (선택 사항):
   - "모든 카드" / "복습 필요 카드만" 선택 가능

상태 업데이트가 즉시 반영되고, 학습 완료 화면에서 통계가 정확히 표시되도록 해줘.

기대 결과: 학습 모드에서 "알았음"/"다시 보기" 버튼으로 카드 상태가 업데이트되고, 학습 완료 시 통계가 정확히 표시됨.

6
Step 6
대시보드 페이지를 만들어 전체 학습 통계를 시각적으로 표시해줘.

요구사항:
1. 라우트 추가: GET /dashboard (홈페이지를 대시보드로 변경해도 됨)
2. DashboardController 생성 및 메서드:
   - 모든 덱의 카드 통계 집계 (덱별 총 카드 수, mastered/review/new 개수)
   - Inertia::render('Dashboard', ['decks' => $decksWithStats])
3. React 페이지: resources/js/Pages/Dashboard.jsx
   - 전체 통계 요약 (총 덱 수, 총 카드 수, 마스터한 카드 비율)
   - 덱별 카드 통계를 카드 형태로 표시 (제목, 진행률 바, 마스터/복습/새 카드 개수)
   - 진행률 바는 Tailwind CSS로 구현 (예: 배경색 그라데이션)
4. 각 덱 카드에 "학습 시작" 버튼 추가
5. 네비게이션에 "대시보드" 링크 추가
6. 반응형 그리드 레이아웃 (모바일: 1열, 태블릿: 2열, 데스크톱: 3열)

대시보드가 학습 진행 상황을 한눈에 보여주고, 시각적으로 매력적이도록 디자인해줘.

기대 결과: 대시보드 페이지에서 모든 덱의 학습 통계가 시각적으로 표시되고, 진행률 바가 정확히 렌더링됨. 반응형 레이아웃이 작동함.

제출된 작품 (1)

로그인 후 제출

효과적인 암기와 반복 학습을 위한 개인 맞춤형 플래시카드 학습 시스템

조회수 11 댓글수 0 추천수 0

댓글 (0)

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