풀스택 간단 메모장 - 카테고리별 노트 정리 - 바이브코딩 레시피
입문 PHP + JavaScript Laravel + React AI: Claude

풀스택 간단 메모장 - 카테고리별 노트 정리

리포지토리명 simple-notes-app-laravel-react
조회수 56 0건 제출

문제 설명

📝 프로젝트 개요

Laravel 13.x API 백엔드와 React 19 프론트엔드로 구성된 간단한 메모장 애플리케이션을 만듭니다. 사용자가 메모를 작성하고, 카테고리별로 분류하며, 검색할 수 있는 기본적인 CRUD 기능을 구현합니다.

✨ 필수 기능

  • 메모 작성: 제목과 본문을 입력하여 새로운 메모 생성
  • 카테고리 관리: 메모를 '업무', '개인', '아이디어' 등 카테고리로 분류
  • 메모 목록: 전체 메모를 카드 형식으로 표시
  • 카테고리 필터링: 특정 카테고리의 메모만 보기
  • 메모 수정/삭제: 기존 메모 편집 및 삭제
  • 검색 기능: 제목이나 본문에서 키워드 검색
  • 반응형 디자인: 모바일에서도 사용 가능한 UI

🎁 선택 추가 기능 (보너스)

  • 메모에 색상 태그 추가
  • 중요 메모 즐겨찾기(별표) 기능
  • 메모 작성일/수정일 표시
  • 메모 정렬 기능 (최신순, 오래된순, 제목순)
  • 다크 모드 지원
  • 메모 개수 카운터

🛠 기술 스택

  • 백엔드: Laravel 13.x (RESTful API)
  • 프론트엔드: React 19 (Vite)
  • 데이터베이스: SQLite
  • 스타일링: Tailwind CSS
  • HTTP 클라이언트: Axios

📚 학습 목표

  • Laravel API 라우트 및 컨트롤러 설계
  • React에서 API 호출 및 상태 관리 (useState, useEffect)
  • RESTful API 설계 원칙 이해
  • CORS 설정 및 프론트엔드-백엔드 연동
  • React 컴포넌트 분리 및 props 전달

제약 조건

  • • Laravel 13.x 사용 (구버전 금지)
  • • React 19 사용 (구버전 금지)
  • • 프론트엔드는 Vite로 별도 프로젝트 구성
  • • 백엔드는 RESTful API로만 응답 (Blade 템플릿 사용 금지)
  • • SQLite 데이터베이스 사용
  • • Tailwind CSS로 스타일링
  • • 복잡한 상태관리 라이브러리 사용 금지 (useState만 사용)
  • • 실시간 기능(WebSocket) 사용 금지

프롬프트 레시피

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

1
Step 1
mkdir simple-notes-app-laravel-react && cd simple-notes-app-laravel-react

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

다음 작업을 수행해주세요:

1. Laravel 13.x 프로젝트 생성 (폴더명: backend)
2. SQLite 데이터베이스 설정 (.env 파일에서 DB_CONNECTION=sqlite로 변경)
3. database/database.sqlite 파일 생성
4. Note 모델 및 마이그레이션 생성:
   - 필드: id, title (string), content (text), category (string, nullable), created_at, updated_at
5. 마이그레이션 실행
6. CORS 설정: config/cors.php에서 'paths' => ['api/*'], 'allowed_origins' => ['http://localhost:5173']
7. NoteController 생성 및 API 라우트 설정:
   - GET /api/notes (전체 메모 목록)
   - POST /api/notes (새 메모 생성)
   - GET /api/notes/{id} (특정 메모 조회)
   - PUT /api/notes/{id} (메모 수정)
   - DELETE /api/notes/{id} (메모 삭제)
   - GET /api/notes/search?q={keyword} (검색)

모든 API는 JSON 형식으로 응답하도록 설정하세요.

기대 결과: Laravel 백엔드 프로젝트가 생성되고, SQLite 데이터베이스와 Note 모델이 설정됩니다. API 라우트와 컨트롤러가 준비되어 Postman이나 curl로 테스트 가능한 상태가 됩니다. php artisan serve로 서버를 실행하면 http://localhost:8000에서 API에 접근할 수 있습니다.

2
Step 2
이제 React 19 프론트엔드 프로젝트를 생성합니다.

다음 작업을 수행해주세요:

1. 현재 폴더(simple-notes-app-laravel-react)에서 Vite + React 19 프로젝트 생성 (폴더명: frontend)
2. axios 설치: npm install axios
3. Tailwind CSS 설치 및 설정
4. src/api/noteApi.js 파일 생성:
   - axios 인스턴스 생성 (baseURL: 'http://localhost:8000/api')
   - getAllNotes(), createNote(data), updateNote(id, data), deleteNote(id), searchNotes(query) 함수 작성
5. src/App.jsx 기본 구조 작성:
   - useState로 notes 배열, selectedCategory, searchQuery 상태 관리
   - useEffect로 컴포넌트 마운트 시 전체 메모 불러오기
   - 메모 목록 표시 (카드 형식)
   - 새 메모 작성 폼 (제목, 본문, 카테고리 선택)
   - 카테고리 필터 버튼 (전체, 업무, 개인, 아이디어)
   - 검색창

Tailwind CSS로 깔끔한 UI를 디자인하세요. 카드는 그리드 레이아웃으로 배치하고, 반응형 디자인을 적용하세요.

기대 결과: React 프론트엔드 프로젝트가 생성되고, API 호출 함수가 준비됩니다. App.jsx에 메모 목록, 작성 폼, 필터링, 검색 UI가 구현됩니다. npm run dev로 개발 서버를 실행하면 http://localhost:5173에서 애플리케이션에 접근할 수 있습니다.

3
Step 3
메모 CRUD 기능을 완성하고 UI 인터랙션을 개선합니다.

다음 작업을 수행해주세요:

1. 메모 작성 기능:
   - 폼 제출 시 createNote API 호출
   - 성공 시 메모 목록 새로고침 및 폼 초기화
   - 로딩 상태 표시
2. 메모 수정 기능:
   - 각 메모 카드에 '수정' 버튼 추가
   - 클릭 시 폼에 기존 내용 채우기 (편집 모드)
   - 수정 완료 시 updateNote API 호출
3. 메모 삭제 기능:
   - 각 메모 카드에 '삭제' 버튼 추가
   - 클릭 시 확인 다이얼로그 표시 후 deleteNote API 호출
4. 카테고리 필터링:
   - 카테고리 버튼 클릭 시 해당 카테고리 메모만 표시
   - '전체' 버튼으로 모든 메모 표시
5. 검색 기능:
   - 검색창에 입력 시 실시간으로 메모 필터링 (프론트엔드에서 처리)
   - 또는 검색 버튼 클릭 시 searchNotes API 호출
6. 에러 처리:
   - API 호출 실패 시 에러 메시지 표시
   - 네트워크 오류 처리
7. UI 개선:
   - 메모가 없을 때 안내 메시지 표시
   - 버튼 호버 효과 및 트랜지션 추가
   - 메모 카드에 그림자 효과

모든 기능이 Laravel API와 정상적으로 연동되는지 확인하세요.

기대 결과: 메모 작성, 수정, 삭제 기능이 모두 동작하고, 카테고리 필터링과 검색 기능이 완성됩니다. 사용자가 메모를 자유롭게 관리할 수 있으며, UI가 직관적이고 반응형으로 작동합니다. 에러 처리가 적용되어 안정적인 사용자 경험을 제공합니다. 최종적으로 Laravel 백엔드(port 8000)와 React 프론트엔드(port 5173)가 함께 실행되어 풀스택 메모장 애플리케이션이 완성됩니다.

제출된 작품 (0)

로그인 후 제출

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

댓글 (0)

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