풀스택 간단 영단어 암기장
vocabulary-flashcard-app
문제 설명
📚 프로젝트 개요
Laravel 13.x API 백엔드와 React 19 프론트엔드를 분리하여 구성하는 풀스택 영단어 암기 애플리케이션입니다. 단어를 등록하고, 뜻을 가리고 맞춰보는 간단한 학습 도구를 만듭니다.
✨ 필수 기능
- 단어 등록: 영단어와 한글 뜻을 입력하여 저장
- 단어 목록 조회: 등록된 모든 단어를 카드 형태로 표시
- 뜻 가리기/보기: 카드를 클릭하면 뜻이 보이고, 다시 클릭하면 가려지는 플립 효과
- 단어 삭제: 학습이 완료된 단어 제거
- SQLite 데이터베이스: 간단한 로컬 DB로 데이터 영구 저장
🎁 보너스 기능 (선택)
- 단어 수정 기능
- 랜덤 단어 학습 모드 (셔플)
- 학습 완료 체크 표시
- 검색 필터링
- 카테고리별 분류 (토익, 토플, 일상 등)
🛠 기술 스택
- 백엔드: Laravel 13.x (RESTful API)
- 프론트엔드: React 19 (Vite)
- 데이터베이스: SQLite
- 스타일링: Tailwind CSS
제약 조건
- • Laravel 13.x와 React 19 최신 버전 사용 필수
- • Laravel은 API 전용 백엔드로 구성 (resources/views 사용 안 함)
- • React는 별도 Vite 프로젝트로 구성
- • SQLite 데이터베이스 사용 (MySQL 설치 불필요)
- • CORS 설정으로 React에서 Laravel API 호출 가능하도록 구성
- • RESTful API 설계 원칙 준수 (GET, POST, DELETE)
- • React에서 fetch 또는 axios로 API 호출
- • useState만 사용하여 상태 관리 (Redux, Zustand 등 금지)
- • 카드 플립 효과는 CSS transform 활용
- • 반응형 디자인 (모바일에서도 사용 가능)
프롬프트 레시피
아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
mkdir vocabulary-flashcard-app && cd vocabulary-flashcard-app 이 폴더에서 풀스택 영단어 암기장 프로젝트를 시작합니다. ## 백엔드 (Laravel 13.x API) 설정 1. `backend` 폴더를 만들고 Laravel 13.x 프로젝트를 생성하세요. 2. SQLite 데이터베이스를 사용하도록 `.env` 파일을 설정하세요 (`DB_CONNECTION=sqlite`, `database/database.sqlite` 파일 생성). 3. `vocabularies` 테이블을 생성하는 마이그레이션 파일을 만드세요. 필드: `id`, `word` (string, 영단어), `meaning` (text, 한글 뜻), `timestamps`. 4. 마이그레이션을 실행하여 테이블을 생성하세요. 5. `Vocabulary` 모델을 생성하세요 (fillable: word, meaning). 6. CORS를 설정하여 React 프론트엔드(http://localhost:5173)에서 API 호출이 가능하도록 하세요 (`config/cors.php`에서 `'allowed_origins' => ['http://localhost:5173']` 설정). 백엔드 폴더 구조: ``` backend/ ├── app/Models/Vocabulary.php ├── database/migrations/xxxx_create_vocabularies_table.php ├── database/database.sqlite ├── .env (SQLite 설정) └── config/cors.php (CORS 설정) ``` 명령어 예시를 포함하여 상세히 안내해주세요.
기대 결과: backend 폴더에 Laravel 13.x 프로젝트가 생성되고, SQLite 데이터베이스가 설정되며, vocabularies 테이블이 생성됩니다. CORS 설정이 완료되어 React에서 API 호출이 가능한 상태가 됩니다.
## Laravel API 라우트 및 컨트롤러 구현
`backend` 폴더에서 작업합니다.
1. `VocabularyController`를 생성하세요.
2. 다음 RESTful API 엔드포인트를 구현하세요:
- `GET /api/vocabularies`: 모든 단어 목록 반환 (JSON)
- `POST /api/vocabularies`: 새 단어 저장 (요청 body: word, meaning)
- `DELETE /api/vocabularies/{id}`: 특정 단어 삭제
3. `routes/api.php`에 라우트를 등록하세요.
4. 각 API는 JSON 형식으로 응답하도록 구현하세요.
5. POST 요청 시 유효성 검사를 추가하세요 (word, meaning 필수).
API 응답 예시:
```json
// GET /api/vocabularies
[
{"id": 1, "word": "apple", "meaning": "사과", "created_at": "...", "updated_at": "..."},
{"id": 2, "word": "book", "meaning": "책", "created_at": "...", "updated_at": "..."}
]
// POST /api/vocabularies (성공)
{"id": 3, "word": "cat", "meaning": "고양이", "created_at": "...", "updated_at": "..."}
```
Postman이나 curl로 API 테스트가 가능하도록 Laravel 개발 서버를 실행하세요 (`php artisan serve`).
기대 결과: VocabularyController가 생성되고, RESTful API 엔드포인트가 구현됩니다. Laravel 개발 서버(http://localhost:8000)가 실행되어 API 테스트가 가능한 상태가 됩니다.
## 프론트엔드 (React 19 + Vite) 설정 프로젝트 루트 폴더로 돌아와서 작업합니다. 1. `frontend` 폴더를 만들고 React 19 + Vite 프로젝트를 생성하세요 (`npm create vite@latest frontend -- --template react`). 2. `frontend` 폴더로 이동하여 의존성을 설치하세요 (`npm install`). 3. Tailwind CSS를 설치하고 설정하세요. 4. `src/App.jsx`를 다음과 같이 구성하세요: - 상단에 단어 입력 폼 (영단어, 한글 뜻 입력 필드와 추가 버튼) - 하단에 단어 카드 목록 (그리드 레이아웃) - useState로 단어 목록 상태 관리 5. 개발 서버를 실행하세요 (`npm run dev`, http://localhost:5173). 초기 UI 구조만 만들고, API 연동은 다음 단계에서 진행합니다. 입력 폼과 카드 레이아웃이 보이도록 더미 데이터를 사용하세요. Tailwind CSS로 깔끔하게 스타일링하세요 (카드는 그림자와 둥근 모서리 적용).
기대 결과: frontend 폴더에 React 19 + Vite 프로젝트가 생성되고, Tailwind CSS가 설정됩니다. App.jsx에 입력 폼과 카드 목록 UI가 더미 데이터로 표시됩니다.
## React에서 Laravel API 연동
`frontend/src/App.jsx`에서 작업합니다.
1. 컴포넌트가 마운트될 때 Laravel API (`http://localhost:8000/api/vocabularies`)에서 단어 목록을 가져와 상태에 저장하세요 (useEffect + fetch).
2. 입력 폼에서 새 단어를 추가할 때 POST 요청을 보내고, 성공하면 상태를 업데이트하여 화면에 즉시 반영하세요.
3. 각 카드에 삭제 버튼을 추가하고, 클릭 시 DELETE 요청을 보낸 후 상태에서 해당 단어를 제거하세요.
4. 에러 처리를 추가하세요 (API 호출 실패 시 콘솔 에러 로그 또는 알림 표시).
API 호출 예시:
```javascript
// GET
fetch('http://localhost:8000/api/vocabularies')
.then(res => res.json())
.then(data => setVocabularies(data));
// POST
fetch('http://localhost:8000/api/vocabularies', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ word: '...', meaning: '...' })
})
.then(res => res.json())
.then(newVocab => setVocabularies([...vocabularies, newVocab]));
// DELETE
fetch(`http://localhost:8000/api/vocabularies/${id}`, { method: 'DELETE' })
.then(() => setVocabularies(vocabularies.filter(v => v.id !== id)));
```
백엔드 서버(http://localhost:8000)와 프론트엔드 서버(http://localhost:5173)를 모두 실행하여 CRUD 기능이 정상 작동하는지 확인하세요.
기대 결과: React 앱이 Laravel API와 연동되어 단어 목록을 불러오고, 추가하고, 삭제할 수 있습니다. 브라우저에서 CRUD 기능이 정상 작동합니다.
## 카드 플립 효과 구현
`frontend/src` 폴더에 `VocabularyCard.jsx` 컴포넌트를 생성하세요.
1. 카드를 클릭하면 앞면(영단어)과 뒷면(한글 뜻)이 뒤집히는 플립 애니메이션을 구현하세요.
2. useState로 각 카드의 플립 상태를 관리하세요 (isFlipped).
3. CSS transform과 transition을 사용하여 3D 플립 효과를 만드세요.
4. 앞면에는 영단어만, 뒷면에는 한글 뜻만 표시하세요.
5. 삭제 버튼은 카드 우측 상단에 작은 X 아이콘으로 배치하세요.
CSS 예시:
```css
.card {
transition: transform 0.6s;
transform-style: preserve-3d;
}
.card.flipped {
transform: rotateY(180deg);
}
.card-front, .card-back {
backface-visibility: hidden;
}
.card-back {
transform: rotateY(180deg);
}
```
`App.jsx`에서 VocabularyCard 컴포넌트를 사용하여 카드 목록을 렌더링하세요.
카드 클릭 시 부드러운 플립 애니메이션이 작동하는지 확인하세요.
기대 결과: VocabularyCard 컴포넌트가 생성되고, 카드를 클릭하면 3D 플립 애니메이션으로 앞면과 뒷면이 전환됩니다. 삭제 버튼이 카드 우측 상단에 표시됩니다.