공동구매 모집 플랫폼 - 함께 사면 더 저렴해요
group-buy-recruitment-platform
문제 설명
프로젝트 개요
트렌디한 공동구매 모집 플랫폼을 만들어봅니다. 사용자들이 원하는 상품에 대한 공동구매를 개설하고, 다른 사람들이 참여할 수 있는 간단한 풀스택 애플리케이션입니다.
필수 기능
- 공동구매 글 작성하기 (상품명, 목표인원, 마감일, 설명, 상품 이미지 URL)
- 공동구매 목록 보기 (진행중/마감 상태 표시)
- 공동구매 상세 페이지 (현재 참여 인원, 달성률 표시)
- 공동구매 참여하기 버튼 (참여 인원 증가)
- 목표 인원 달성 시 '성공' 배지 표시
- 마감일 지난 공구는 자동 마감 처리
- SQLite 데이터베이스 사용
선택 추가 기능 (보너스)
- 카테고리별 필터링 (식품, 생활용품, 패션 등)
- 참여자 닉네임 목록 표시
- 공동구매 검색 기능
- 달성률 프로그레스 바 애니메이션
- 인기순/마감임박순 정렬
기술 스택
- 백엔드: Laravel 13.x (RESTful API)
- 프론트엔드: React 19 (Vite)
- 데이터베이스: SQLite
- 스타일링: Tailwind CSS
학습 목표
- Laravel API 라우팅과 컨트롤러 구조 이해
- React에서 fetch/axios로 API 호출하기
- useState를 활용한 상태 관리
- CRUD 기본 개념 익히기
- 조건부 렌더링과 동적 UI 구현
제약 조건
- • Laravel 13.x와 React 19 최신 버전 사용
- • 백엔드(Laravel)와 프론트엔드(React)는 별도 프로젝트로 구성
- • Laravel은 RESTful API 서버 역할만 수행
- • React는 Vite로 별도 프로젝트 생성
- • 데이터베이스는 SQLite 사용 (간단한 설정)
- • 복잡한 상태관리 라이브러리 사용 금지 (useState만 사용)
- • 인증 기능 제외 (입문자 수준)
- • 실제 결제 연동 제외
- • Tailwind CSS로 깔끔한 UI 구현
프롬프트 레시피
아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
mkdir group-buy-recruitment-platform && cd group-buy-recruitment-platform
이 폴더에서 공동구매 모집 플랫폼 프로젝트를 시작합니다.
먼저 Laravel 13.x 백엔드 API 서버를 설정해주세요:
1. `backend` 폴더에 Laravel 13.x 프로젝트 생성
2. SQLite 데이터베이스 설정 (.env 파일에서 DB_CONNECTION=sqlite)
3. `group_buys` 테이블 마이그레이션 생성:
- id (primary key)
- title (상품명, string)
- description (설명, text)
- image_url (상품 이미지 URL, string, nullable)
- target_count (목표 인원, integer)
- current_count (현재 참여 인원, integer, default 0)
- deadline (마감일, date)
- status (상태: 'active' 또는 'closed', string, default 'active')
- timestamps
4. 마이그레이션 실행
5. API 라우트 설정 (routes/api.php):
- GET /api/group-buys - 전체 목록 조회
- POST /api/group-buys - 새 공동구매 생성
- GET /api/group-buys/{id} - 상세 조회
- POST /api/group-buys/{id}/join - 참여하기
6. GroupBuyController 생성 및 기본 메서드 구현
7. CORS 설정 (React 개발 서버 http://localhost:5173 허용)
모든 설정이 완료되면 `php artisan serve`로 서버를 실행했을 때 http://localhost:8000/api/group-buys 접근이 가능해야 합니다.
기대 결과: Laravel 백엔드 API 서버가 구성되고, SQLite 데이터베이스와 group_buys 테이블이 생성됩니다. API 엔드포인트가 정의되고 CORS가 설정되어 React에서 호출 가능한 상태가 됩니다.
이제 GroupBuyController의 비즈니스 로직을 구현해주세요: 1. index() 메서드: - 모든 공동구매 목록을 최신순으로 반환 - 마감일이 지난 항목은 자동으로 status를 'closed'로 업데이트 - JSON 형태로 반환 2. store() 메서드: - Request 유효성 검사 (title, description, target_count, deadline 필수) - 새 공동구매 생성 (current_count는 0, status는 'active'로 자동 설정) - 생성된 데이터 JSON 반환 3. show($id) 메서드: - 특정 공동구매 상세 정보 반환 - 존재하지 않으면 404 에러 4. join($id) 메서드: - current_count를 1 증가 - current_count >= target_count 이면 status를 'closed'로 변경 - 업데이트된 데이터 반환 5. GroupBuy 모델에 $fillable 속성 설정 테스트를 위해 Seeder를 만들어 더미 데이터 3~5개를 생성해주세요 (다양한 상태의 공동구매).
기대 결과: GroupBuyController의 모든 API 메서드가 구현되고, 유효성 검사와 비즈니스 로직이 작동합니다. Seeder로 더미 데이터가 생성되어 API 테스트가 가능한 상태입니다.
이제 React 19 프론트엔드를 설정해주세요:
1. 프로젝트 루트에서 `frontend` 폴더에 React + Vite 프로젝트 생성
2. Tailwind CSS 설치 및 설정
3. axios 설치 (`npm install axios`)
4. src/api/groupBuys.js 파일 생성:
- axios 인스턴스 설정 (baseURL: http://localhost:8000/api)
- getGroupBuys() - 전체 목록 가져오기
- getGroupBuy(id) - 상세 정보 가져오기
- createGroupBuy(data) - 새 공동구매 생성
- joinGroupBuy(id) - 참여하기
5. App.jsx에서 기본 레이아웃 구성:
- 헤더 ("공동구매 모집 플랫폼" 제목)
- 메인 컨테이너
- Tailwind CSS로 깔끔한 디자인
6. 개발 서버 실행 시 http://localhost:5173 접근 가능하도록 설정
vite.config.js에서 포트를 5173으로 명시하고, React 프로젝트가 정상 실행되는지 확인해주세요.
기대 결과: React 프론트엔드 프로젝트가 생성되고 Tailwind CSS가 설정됩니다. API 호출 함수들이 준비되고 기본 레이아웃이 구성되어 개발 서버가 실행 가능한 상태입니다.
공동구매 목록을 보여주는 컴포넌트를 만들어주세요:
1. src/components/GroupBuyList.jsx 컴포넌트 생성:
- useState로 groupBuys 상태 관리
- useEffect에서 getGroupBuys() API 호출하여 데이터 로드
- 로딩 상태 표시
- 공동구매 카드 형태로 목록 렌더링:
* 상품 이미지 (image_url이 있으면 표시, 없으면 기본 이미지)
* 제목 (title)
* 목표 인원 / 현재 인원 (예: "5명 / 10명")
* 달성률 퍼센트 표시
* 마감일 (deadline)
* 상태 배지 (active: 초록색 "모집중", closed: 회색 "마감")
* 목표 달성 시 "성공" 배지 추가 표시
- 카드 클릭 시 상세 페이지로 이동 (나중에 구현)
2. Tailwind CSS로 그리드 레이아웃 (grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3)
3. 각 카드에 hover 효과 추가
4. App.jsx에서 GroupBuyList 컴포넌트 렌더링
목록이 예쁘게 표시되고 데이터가 정상적으로 로드되는지 확인해주세요.
기대 결과: 공동구매 목록이 카드 형태로 보기 좋게 렌더링됩니다. API에서 데이터를 가져와 상태별로 다른 배지를 표시하고, 반응형 그리드 레이아웃이 적용됩니다.
공동구매 상세 페이지와 참여하기 기능을 구현해주세요:
1. src/components/GroupBuyDetail.jsx 컴포넌트 생성:
- URL에서 id를 받아와 해당 공동구매 상세 정보 로드
- 상품 이미지 (크게 표시)
- 제목, 설명 전체 내용
- 프로그레스 바로 달성률 시각화 (Tailwind로 구현)
- 현재 인원 / 목표 인원 숫자 표시
- 마감일까지 남은 일수 계산하여 표시
- "참여하기" 버튼:
* status가 'active'일 때만 활성화
* 클릭 시 joinGroupBuy(id) API 호출
* 참여 후 데이터 새로고침하여 인원 증가 반영
* 목표 달성 시 "성공" 메시지 표시
- "목록으로 돌아가기" 버튼
2. React Router 설치 및 설정:
- App.jsx에서 라우팅 설정
- / : GroupBuyList
- /group-buy/:id : GroupBuyDetail
3. GroupBuyList에서 카드 클릭 시 상세 페이지로 이동하도록 Link 추가
참여하기 버튼을 누르면 실시간으로 인원이 증가하고, 목표 달성 시 UI가 변경되는지 확인해주세요.
기대 결과: 상세 페이지가 구현되고 라우팅이 작동합니다. 참여하기 버튼을 클릭하면 API를 통해 인원이 증가하고, 프로그레스 바와 배지가 동적으로 업데이트됩니다.
새 공동구매를 작성하는 폼을 만들어주세요:
1. src/components/CreateGroupBuy.jsx 컴포넌트 생성:
- useState로 폼 입력 상태 관리 (title, description, image_url, target_count, deadline)
- 폼 필드:
* 상품명 (text input)
* 설명 (textarea)
* 상품 이미지 URL (text input, 선택사항)
* 목표 인원 (number input, min=2)
* 마감일 (date input, 오늘 이후만 선택 가능)
- "공동구매 등록하기" 버튼:
* 클릭 시 createGroupBuy(data) API 호출
* 성공 시 목록 페이지로 리다이렉트
* 실패 시 에러 메시지 표시
- Tailwind CSS로 깔끔한 폼 디자인
2. App.jsx에 라우트 추가: /create
3. GroupBuyList 상단에 "+ 새 공동구매 만들기" 버튼 추가하여 /create로 이동
4. 전체 앱 테스트:
- 새 공동구매 생성
- 목록에서 확인
- 상세 페이지 접근
- 참여하기 기능
- 목표 달성 시 상태 변화
모든 기능이 연결되어 작동하는지 최종 확인해주세요. README.md에 프로젝트 설명과 실행 방법을 작성해주세요.
기대 결과: 공동구매 작성 폼이 완성되고 CRUD 모든 기능이 연결됩니다. 사용자가 새 공동구매를 등록하고, 목록을 보고, 상세 정보를 확인하고, 참여할 수 있는 완전한 풀스택 애플리케이션이 완성됩니다.