나만의 학습 플래시카드 - 암기 복습 시스템
flashcard-learning-system
문제 설명
프로젝트 개요
간격 반복 학습(Spaced Repetition) 원리를 적용한 플래시카드 암기 시스템을 만듭니다. 사용자는 주제별 덱(Deck)을 만들고, 각 덱에 앞면/뒷면이 있는 카드를 추가하여 학습할 수 있습니다. 카드를 넘기며 복습하고, '알았음/모르겠음' 버튼으로 학습 진행도를 추적합니다.
필수 기능
- 덱(Deck) 관리: 주제별 플래시카드 덱 생성/수정/삭제 (예: "영어 단어", "역사 연표", "프로그래밍 용어")
- 카드(Card) CRUD: 각 덱에 카드 추가/수정/삭제 (앞면: 질문/단어, 뒷면: 답변/의미)
- 학습 모드: 덱을 선택하면 카드가 하나씩 표시되고, 클릭/버튼으로 뒤집기 가능
- 진행도 추적: 각 카드마다 "알았음(Mastered)"/"다시 보기(Review)" 상태 저장
- 통계 대시보드: 덱별 총 카드 수, 마스터한 카드 수, 복습 필요 카드 수를 시각적으로 표시
- 반응형 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에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
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가 적용된 기본 레이아웃과 환영 메시지가 보임.
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 폼 제출 후 리다이렉트되며 목록이 업데이트됨.
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 관계가 정확히 반영됨.
학습 모드(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")
카드 뒤집기가 부드럽게 애니메이션되고, 키보드 방향키로도 카드 넘기기가 가능하도록 해줘 (선택 사항).
기대 결과: 학습 모드 페이지에서 카드를 하나씩 넘기며 앞면/뒷면을 확인할 수 있음. 애니메이션이 자연스럽고, 진행률이 표시됨.
학습 모드에서 카드 상태(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. 학습 모드 시작 시 필터 옵션 추가 (선택 사항):
- "모든 카드" / "복습 필요 카드만" 선택 가능
상태 업데이트가 즉시 반영되고, 학습 완료 화면에서 통계가 정확히 표시되도록 해줘.
기대 결과: 학습 모드에서 "알았음"/"다시 보기" 버튼으로 카드 상태가 업데이트되고, 학습 완료 시 통계가 정확히 표시됨.
대시보드 페이지를 만들어 전체 학습 통계를 시각적으로 표시해줘.
요구사항:
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열)
대시보드가 학습 진행 상황을 한눈에 보여주고, 시각적으로 매력적이도록 디자인해줘.
기대 결과: 대시보드 페이지에서 모든 덱의 학습 통계가 시각적으로 표시되고, 진행률 바가 정확히 렌더링됨. 반응형 레이아웃이 작동함.