나만의 팟캐스트 에피소드 북마크 - 들은 에피소드 & 메모 관리 - 바이브코딩 레시피
입문 PHP + JavaScript Laravel + React

나만의 팟캐스트 에피소드 북마크 - 들은 에피소드 & 메모 관리

리포지토리명 podcast-episode-bookmark-manager
조회수 25 0건 제출 어제

문제 설명

프로젝트 개요

좋아하는 팟캐스트 에피소드를 북마크하고, 들은 시간과 메모를 함께 기록할 수 있는 풀스택 웹 애플리케이션입니다. Laravel 12.x로 RESTful API 백엔드를 구축하고, React 19로 사용자 친화적인 프론트엔드를 만듭니다.

필수 기능

  • 에피소드 추가: 팟캐스트 제목, 에피소드 제목, URL, 청취 날짜를 입력하여 북마크 추가
  • 목록 조회: 저장된 모든 에피소드를 카드 형태로 표시
  • 메모 작성: 각 에피소드에 대한 개인 메모 및 핵심 내용 기록
  • 청취 상태 토글: '들음' / '나중에 들을 예정' 상태 표시 및 변경
  • 삭제 기능: 불필요한 북마크 삭제
  • 반응형 디자인: 모바일/데스크톱 모두 지원

보너스 기능 (선택)

  • 에피소드 검색 기능 (제목 기준)
  • 팟캐스트별 필터링
  • 별점 평가 시스템 (1~5점)
  • 다크 모드 지원
  • 청취 시간 통계 (이번 달 총 청취 시간)

기술 스택

  • 백엔드: Laravel 12.x (API 서버, SQLite 데이터베이스)
  • 프론트엔드: React 19 (Vite 번들러)
  • 스타일링: Tailwind CSS
  • HTTP 클라이언트: Axios (React에서 API 호출)

이 프로젝트를 통해 Laravel의 라우팅, 컨트롤러, Eloquent ORM과 React의 컴포넌트, 상태 관리(useState), API 연동을 학습할 수 있습니다.

제약 조건

  • Laravel 12.x 사용 (구버전 금지)
  • React 19 사용 (구버전 금지)
  • 데이터베이스는 SQLite 사용 (간편한 설정)
  • Laravel과 React는 별도 프로젝트로 분리 (Laravel은 API 서버, React는 Vite 프로젝트)
  • CORS 설정 필수 (Laravel API를 React에서 호출하기 위해)
  • 프론트엔드는 fetch 또는 axios로 백엔드 API 호출
  • 복잡한 상태관리 라이브러리(Redux, Zustand 등) 사용 금지 - useState만 사용
  • Tailwind CSS로 스타일링
  • 반응형 디자인 적용 (모바일 우선)

프롬프트 레시피

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

1
Step 1
Laravel 12.x 백엔드 API 프로젝트를 생성하고 기본 설정을 완료해주세요.

요구사항:
1. Laravel 12.x 프로젝트 생성
2. SQLite 데이터베이스 설정 (.env 파일에서 DB_CONNECTION=sqlite)
3. database/database.sqlite 파일 생성
4. CORS 설정 추가 (config/cors.php에서 localhost:5173 허용)
5. Podcast Episodes 테이블 마이그레이션 생성:
   - id (primary key)
   - podcast_title (string, 팟캐스트 이름)
   - episode_title (string, 에피소드 제목)
   - episode_url (string, nullable, 에피소드 링크)
   - listened_date (date, nullable, 청취 날짜)
   - notes (text, nullable, 메모)
   - is_listened (boolean, default false, 청취 여부)
   - timestamps
6. 마이그레이션 실행
7. PodcastEpisode 모델 생성 (fillable 속성 포함)

프로젝트 구조와 설정 파일을 보여주세요.

기대 결과: Laravel 12.x 프로젝트가 생성되고, SQLite 데이터베이스 연결이 완료되며, podcast_episodes 테이블이 생성됩니다. CORS 설정이 추가되어 React 앱에서 API를 호출할 수 있습니다. PodcastEpisode 모델이 생성됩니다.

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

요구사항:
1. PodcastEpisodeController 생성 (API 리소스 컨트롤러)
2. routes/api.php에 RESTful API 라우트 정의:
   - GET /api/episodes - 모든 에피소드 조회 (최신순 정렬)
   - POST /api/episodes - 새 에피소드 추가
   - PUT /api/episodes/{id} - 에피소드 수정 (메모, 청취 상태 변경)
   - DELETE /api/episodes/{id} - 에피소드 삭제
3. 컨트롤러 메서드 구현:
   - index(): 모든 에피소드를 JSON으로 반환
   - store(): 요청 데이터 검증 후 새 에피소드 생성
   - update(): 에피소드 정보 수정
   - destroy(): 에피소드 삭제
4. 유효성 검증 규칙:
   - podcast_title: required, string, max:255
   - episode_title: required, string, max:255
   - episode_url: nullable, url
   - listened_date: nullable, date
   - notes: nullable, string
   - is_listened: boolean

API 응답은 모두 JSON 형식으로 반환하고, 적절한 HTTP 상태 코드를 사용하세요.

기대 결과: PodcastEpisodeController가 생성되고, CRUD API 엔드포인트가 완성됩니다. Postman이나 curl로 테스트할 수 있는 완전한 RESTful API가 구축됩니다. 각 API는 JSON 응답을 반환합니다.

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

요구사항:
1. Vite를 사용하여 React 19 프로젝트 생성 (npm create vite@latest podcast-frontend -- --template react)
2. Tailwind CSS 설치 및 설정
3. Axios 설치 (npm install axios)
4. src 폴더 구조:
   - components/ (React 컴포넌트)
   - App.jsx (메인 앱 컴포넌트)
   - main.jsx (엔트리 포인트)
5. App.jsx에 기본 레이아웃 구성:
   - 헤더: "나만의 팟캐스트 북마크" 제목
   - 에피소드 추가 폼 영역 (나중에 구현)
   - 에피소드 목록 영역 (나중에 구현)
6. Tailwind CSS로 기본 스타일링 (배경색, 컨테이너, 반응형 그리드)
7. axios 인스턴스 생성 (baseURL을 http://localhost:8000/api로 설정)

개발 서버를 실행하면 기본 레이아웃이 보여야 합니다.

기대 결과: React 19 + Vite 프로젝트가 생성되고, Tailwind CSS가 설정됩니다. App.jsx에 헤더와 기본 레이아웃이 표시되며, axios가 Laravel API와 통신할 준비가 완료됩니다.

4
Step 4
React 앱에서 에피소드 목록 조회 및 표시 기능을 구현해주세요.

요구사항:
1. App.jsx에서 useState로 episodes 상태 관리
2. useEffect를 사용하여 컴포넌트 마운트 시 GET /api/episodes 호출
3. axios로 API 데이터를 가져와 episodes 상태에 저장
4. components/EpisodeCard.jsx 컴포넌트 생성:
   - props: episode 객체, onDelete 함수, onToggleListened 함수
   - 카드 디자인 (Tailwind CSS):
     - 팟캐스트 제목 (굵은 글씨)
     - 에피소드 제목
     - 청취 날짜 (있으면 표시)
     - 메모 (있으면 표시)
     - 청취 상태 배지 (들음/나중에)
     - URL 링크 버튼 (있으면 표시)
     - 삭제 버튼
5. App.jsx에서 episodes 배열을 map으로 순회하며 EpisodeCard 렌더링
6. 로딩 상태 및 에러 처리 추가
7. 에피소드가 없을 때 "아직 저장된 에피소드가 없습니다" 메시지 표시

카드는 그리드 레이아웃으로 표시하고, 반응형으로 만드세요 (모바일: 1열, 태블릿: 2열, 데스크톱: 3열).

기대 결과: React 앱이 Laravel API에서 에피소드 목록을 가져와 화면에 카드 형태로 표시합니다. 각 카드는 에피소드 정보를 보기 좋게 보여주며, 반응형 그리드 레이아웃이 적용됩니다.

5
Step 5
에피소드 추가 폼과 삭제 기능을 구현해주세요.

요구사항:
1. components/AddEpisodeForm.jsx 컴포넌트 생성:
   - 입력 필드:
     - 팟캐스트 제목 (required)
     - 에피소드 제목 (required)
     - 에피소드 URL (optional)
     - 청취 날짜 (date picker)
     - 메모 (textarea)
   - "추가하기" 버튼
   - Tailwind CSS로 폼 스타일링 (입력 필드, 버튼)
2. 폼 제출 시:
   - POST /api/episodes로 데이터 전송 (axios)
   - 성공하면 폼 초기화 및 목록 새로고침 (onAdd 콜백 호출)
   - 에러 처리 (alert 또는 에러 메시지 표시)
3. App.jsx에서 AddEpisodeForm 컴포넌트 추가
4. EpisodeCard에서 삭제 버튼 클릭 시:
   - DELETE /api/episodes/{id} 호출
   - 성공하면 목록에서 해당 에피소드 제거 (상태 업데이트)
   - 확인 다이얼로그 추가 ("정말 삭제하시겠습니까?")

폼은 카드 형태로 디자인하고, 목록 위에 배치하세요.

기대 결과: 사용자가 폼을 통해 새 에피소드를 추가할 수 있으며, 추가된 에피소드가 즉시 목록에 반영됩니다. 삭제 버튼을 누르면 확인 후 에피소드가 삭제되고 목록이 업데이트됩니다.

6
Step 6
청취 상태 토글 기능과 메모 편집 기능을 추가해주세요.

요구사항:
1. EpisodeCard에 청취 상태 토글 버튼 추가:
   - 현재 상태에 따라 "들음" 또는 "나중에" 배지 표시 (색상 구분)
   - 배지 클릭 시 is_listened 값 반전
   - PUT /api/episodes/{id} 호출하여 상태 업데이트
2. EpisodeCard에 메모 편집 기능 추가:
   - "메모 편집" 버튼 클릭 시 textarea 입력창 표시
   - 메모 저장 버튼 클릭 시 PUT /api/episodes/{id}로 메모 업데이트
   - 취소 버튼으로 편집 모드 종료
3. 상태 업데이트 후 목록 자동 새로고침
4. 로딩 인디케이터 추가 (API 호출 중)
5. 최종 스타일링 개선:
   - 카드 호버 효과
   - 버튼 색상 및 간격 조정
   - 반응형 디자인 최종 점검

모든 기능이 부드럽게 작동하도록 사용자 경험을 개선하세요.

기대 결과: 사용자가 에피소드의 청취 상태를 클릭 한 번으로 변경할 수 있으며, 메모를 인라인으로 편집할 수 있습니다. 모든 변경사항이 즉시 서버에 저장되고 UI에 반영됩니다. 앱이 완전히 작동하며 시각적으로 매력적입니다.

제출된 작품 (0)

로그인 후 제출

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

댓글 (1)

로그인 후 댓글을 남길 수 있습니다.
리자

2번 정도 만들어 봤는데 데이터 저장이 안되네요. 아무래도 프롬프트에 문제가 있거나 제 실력이 모자른가 봅니다 ㅠㅠ 이 레시피는 통과하겠습니다