풀스택 독서 타이머 - 책 읽은 시간 기록하기 - 바이브코딩 레시피
입문 PHP + JavaScript Laravel + React AI: Claude

풀스택 독서 타이머 - 책 읽은 시간 기록하기

리포지토리명 reading-timer-tracker
조회수 57 0건 제출

문제 설명

📚 풀스택 독서 타이머 - 책 읽은 시간 기록하기

독서 습관을 기르고 싶은 사람들을 위한 간단한 타이머 기록 앱입니다. 책을 읽을 때마다 타이머를 시작하고, 멈추면 자동으로 읽은 시간이 기록됩니다.

🎯 필수 기능

  • 책 목록 관리: 현재 읽고 있는 책 제목을 등록하고 목록으로 관리
  • 타이머 기능: 특정 책에 대해 독서 시작/정지 타이머 (프론트엔드에서 작동)
  • 읽은 시간 기록: 타이머 종료 시 읽은 시간(분 단위)을 해당 책에 저장
  • 누적 시간 표시: 각 책별로 총 읽은 시간을 누적하여 표시
  • 기록 목록: 날짜별로 언제 얼마나 읽었는지 히스토리 확인

🎁 보너스 기능 (선택)

  • 오늘/이번 주/이번 달 총 독서 시간 통계
  • 책 완독 체크 기능
  • 목표 독서 시간 설정 및 진행률 표시
  • 책 표지 이미지 업로드

🛠 기술 스택

  • 백엔드: Laravel 13.x (RESTful API 서버, SQLite 데이터베이스)
  • 프론트엔드: React 19 (Vite 프로젝트, fetch API로 Laravel API 호출)
  • 스타일링: Tailwind CSS 권장

📋 구현 포인트

  • Laravel은 순수 API 서버 역할 (JSON 응답)
  • React는 별도 Vite 프로젝트로 구성하여 프론트엔드 구현
  • 타이머는 React에서 useState로 관리 (시작/정지/리셋)
  • 타이머 종료 시 읽은 시간을 POST 요청으로 Laravel API에 전송하여 저장
  • CORS 설정 필수 (Laravel에서 React 개발 서버 허용)

제약 조건

  • • Laravel 13.x + React 19 풀스택 구성 (API + 프론트엔드 분리)
  • • Laravel은 RESTful API 서버만 담당 (routes/api.php 사용)
  • • React는 Vite 기반 별도 프로젝트로 구성
  • • 데이터베이스는 SQLite 사용
  • • 타이머는 React에서 useState로 구현 (외부 라이브러리 사용 금지)
  • • fetch 또는 axios로 Laravel API와 통신
  • • CORS 설정 필수 (config/cors.php)
  • • Tailwind CSS 사용 권장
  • • 복잡한 상태관리 라이브러리(Redux, Zustand 등) 사용 금지

프롬프트 레시피

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

1
Step 1
mkdir reading-timer-tracker && cd reading-timer-tracker

이 폴더에서 Laravel 13.x 백엔드 API 프로젝트를 시작합니다.

## 요구사항

1. Laravel 13.x 프로젝트 생성 (폴더명: backend)
2. SQLite 데이터베이스 설정 (.env 파일에서 DB_CONNECTION=sqlite 설정)
3. 다음 두 개의 마이그레이션 파일 생성:
   - `books` 테이블: id, title (책 제목), is_completed (완독 여부, 기본값 false), created_at, updated_at
   - `reading_sessions` 테이블: id, book_id (외래키), duration_minutes (읽은 시간, 정수), read_at (읽은 날짜), created_at, updated_at
4. 마이그레이션 실행
5. Book 모델과 ReadingSession 모델 생성 (관계 설정: Book hasMany ReadingSessions)
6. CORS 설정 (config/cors.php에서 'paths' => ['api/*'], 'allowed_origins' => ['http://localhost:5173'])

백엔드 폴더 구조와 기본 설정이 완료되면 확인 메시지를 출력해주세요.

기대 결과: Laravel 13.x 프로젝트가 backend 폴더에 생성되고, SQLite 데이터베이스가 설정됩니다. books와 reading_sessions 테이블이 마이그레이션되며, Book과 ReadingSession 모델이 생성됩니다. CORS 설정이 완료되어 React 개발 서버(localhost:5173)에서 API 호출이 가능합니다.

2
Step 2
Laravel API 라우트와 컨트롤러를 구현해주세요.

## 요구사항

### API 엔드포인트 (routes/api.php)

1. **책 관리 API**
   - GET /api/books - 모든 책 목록 조회 (각 책의 총 읽은 시간 포함)
   - POST /api/books - 새 책 등록 (title 필드 필수)
   - PATCH /api/books/{id}/complete - 책 완독 상태 토글
   - DELETE /api/books/{id} - 책 삭제

2. **독서 기록 API**
   - GET /api/books/{bookId}/sessions - 특정 책의 독서 기록 목록 (최신순)
   - POST /api/books/{bookId}/sessions - 새 독서 기록 추가 (duration_minutes, read_at 필드)
   - GET /api/sessions/recent - 전체 최근 독서 기록 (모든 책, 최신 10개)

### 컨트롤러 구현

- BookController: 책 CRUD 및 완독 토글 로직
- ReadingSessionController: 독서 기록 CRUD 로직
- JSON 응답 형식 통일 (성공 시 data 키, 실패 시 error 키)
- GET /api/books 응답에 각 책의 total_duration_minutes (읽은 시간 합계) 포함

모든 API 엔드포인트가 정상 작동하는지 확인해주세요.

기대 결과: Laravel API 라우트가 routes/api.php에 정의되고, BookController와 ReadingSessionController가 생성됩니다. 책 목록 조회 시 각 책의 총 읽은 시간이 계산되어 함께 반환됩니다. JSON 형식으로 일관된 응답을 제공하며, CORS가 적용되어 React에서 호출 가능합니다.

3
Step 3
React 19 프론트엔드 프로젝트를 생성하고 기본 구조를 설정해주세요.

## 요구사항

1. Vite 기반 React 19 프로젝트 생성 (폴더명: frontend)
2. Tailwind CSS 설치 및 설정
3. 다음 컴포넌트 파일 구조 생성:
   - src/App.jsx (메인 앱)
   - src/components/BookList.jsx (책 목록 표시)
   - src/components/BookForm.jsx (새 책 등록 폼)
   - src/components/Timer.jsx (독서 타이머)
   - src/components/SessionList.jsx (독서 기록 목록)
4. src/api/books.js 파일 생성 (Laravel API 호출 함수들)
   - fetchBooks() - GET /api/books
   - createBook(title) - POST /api/books
   - toggleComplete(bookId) - PATCH /api/books/{id}/complete
   - deleteBook(bookId) - DELETE /api/books/{id}
   - fetchSessions(bookId) - GET /api/books/{bookId}/sessions
   - createSession(bookId, durationMinutes, readAt) - POST /api/books/{bookId}/sessions
5. API 베이스 URL을 환경변수로 설정 (.env 파일에 VITE_API_URL=http://localhost:8000)

기본 구조가 완성되면 확인 메시지를 출력해주세요.

기대 결과: frontend 폴더에 React 19 + Vite 프로젝트가 생성되고, Tailwind CSS가 설정됩니다. 컴포넌트 파일 구조가 생성되며, src/api/books.js에 Laravel API 호출 함수들이 구현됩니다. 환경변수로 API URL이 설정되어 fetch 호출 시 사용됩니다.

4
Step 4
책 목록 표시 및 등록 기능을 구현해주세요.

## 요구사항

### App.jsx
- useState로 books 상태 관리
- useEffect로 컴포넌트 마운트 시 fetchBooks() 호출하여 책 목록 로드
- BookForm과 BookList 컴포넌트 렌더링

### BookForm.jsx
- 책 제목 입력 필드 (input)
- 등록 버튼 클릭 시 createBook() 호출
- 등록 성공 시 부모 컴포넌트에 알림 (콜백 함수)
- 입력 필드 초기화

### BookList.jsx
- props로 받은 books 배열을 map으로 렌더링
- 각 책 카드에 표시:
  - 책 제목
  - 총 읽은 시간 (total_duration_minutes를 "X시간 Y분" 형식으로 변환)
  - 완독 여부 (체크박스 또는 배지)
  - 완독 토글 버튼 (클릭 시 toggleComplete() 호출)
  - 삭제 버튼 (클릭 시 deleteBook() 호출)
  - 타이머 시작 버튼 (클릭 시 해당 책 선택 상태로 변경)
- Tailwind CSS로 카드 스타일링 (그리드 레이아웃)

책 등록 및 목록 표시가 정상 작동하는지 확인해주세요.

기대 결과: App.jsx에서 책 목록을 상태로 관리하고, BookForm으로 새 책을 등록할 수 있습니다. BookList에서 책 목록이 카드 형태로 표시되며, 각 책의 총 읽은 시간, 완독 여부, 완독 토글, 삭제 기능이 작동합니다. Tailwind CSS로 깔끔하게 스타일링됩니다.

5
Step 5
독서 타이머 기능을 구현해주세요.

## 요구사항

### Timer.jsx
- props로 selectedBook (현재 선택된 책 객체) 받기
- useState로 다음 상태 관리:
  - isRunning (타이머 실행 중 여부)
  - seconds (경과 시간, 초 단위)
- useEffect로 타이머 로직:
  - isRunning이 true일 때 1초마다 seconds 증가
  - cleanup 함수로 interval 정리
- 시작/정지/리셋 버튼
- 경과 시간을 "MM:SS" 형식으로 표시
- 정지 버튼 클릭 시:
  - 경과 시간을 분 단위로 변환 (Math.ceil(seconds / 60))
  - createSession(selectedBook.id, durationMinutes, new Date()) 호출
  - 타이머 리셋 (seconds = 0, isRunning = false)
  - 부모 컴포넌트에 알림 (콜백 함수)
- selectedBook이 없으면 "책을 선택해주세요" 메시지 표시

### App.jsx 수정
- selectedBook 상태 추가
- BookList에서 타이머 시작 버튼 클릭 시 selectedBook 설정
- Timer 컴포넌트 렌더링 (selectedBook props 전달)
- 타이머 정지 후 콜백에서 books 목록 새로고침

타이머가 정상 작동하고, 기록이 저장되는지 확인해주세요.

기대 결과: Timer.jsx에서 선택된 책에 대해 타이머를 시작/정지/리셋할 수 있습니다. 타이머 정지 시 읽은 시간이 분 단위로 계산되어 Laravel API에 POST 요청으로 전송됩니다. App.jsx에서 selectedBook 상태로 현재 타이머 대상 책을 관리하며, 기록 저장 후 책 목록이 자동으로 새로고침되어 총 읽은 시간이 업데이트됩니다.

6
Step 6
독서 기록 목록 표시 기능을 추가하고 최종 마무리해주세요.

## 요구사항

### SessionList.jsx
- props로 bookId 받기 (선택 사항, 없으면 전체 최근 기록 표시)
- useState로 sessions 상태 관리
- useEffect로 컴포넌트 마운트 시:
  - bookId가 있으면 fetchSessions(bookId) 호출
  - bookId가 없으면 fetchRecentSessions() 호출 (전체 최근 기록, API 수정 필요)
- 기록 목록을 테이블 또는 리스트로 렌더링:
  - 날짜 (read_at를 "YYYY-MM-DD HH:mm" 형식으로 표시)
  - 읽은 시간 (duration_minutes를 "X분" 형식으로 표시)
  - 책 제목 (전체 기록 표시 시)
- Tailwind CSS로 스타일링

### App.jsx 수정
- SessionList 컴포넌트 렌더링 (bookId 없이, 전체 최근 기록 표시)
- 레이아웃 조정:
  - 상단: 책 등록 폼
  - 중단: 책 목록 (그리드)
  - 하단 왼쪽: 타이머
  - 하단 오른쪽: 최근 독서 기록

### 최종 점검
- Laravel API 서버 실행 (php artisan serve)
- React 개발 서버 실행 (npm run dev)
- 모든 기능 테스트:
  - 책 등록/삭제/완독 토글
  - 타이머 시작/정지 및 기록 저장
  - 책 목록의 총 읽은 시간 업데이트
  - 최근 독서 기록 표시
- README.md 작성 (프로젝트 설명, 설치 및 실행 방법)

모든 기능이 정상 작동하는지 확인하고 완성 메시지를 출력해주세요.

기대 결과: SessionList.jsx에서 최근 독서 기록을 표시합니다. App.jsx에서 전체 레이아웃이 완성되며, 책 등록-목록 표시-타이머-기록 저장-기록 표시 흐름이 모두 연결됩니다. Laravel API와 React 프론트엔드가 정상적으로 통신하며, 독서 타이머 앱의 모든 필수 기능이 작동합니다. README.md에 프로젝트 설명과 실행 방법이 문서화됩니다.

제출된 작품 (0)

로그인 후 제출

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

댓글 (0)

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