웨딩 청첩장 RSVP 플랫폼 - 하객 참석 응답 & 식사 선택 - 바이브코딩 레시피
중급 PHP + JavaScript Laravel + React + Inertia.js AI: Claude

웨딩 청첩장 RSVP 플랫폼 - 하객 참석 응답 & 식사 선택

리포지토리명 wedding-rsvp-platform-inertia
조회수 221 0건 제출

문제 설명

🎊 웨딩 청첩장 RSVP 플랫폼

결혼식 하객들이 온라인으로 참석 여부를 응답하고, 식사 메뉴를 선택하며, 축하 메시지를 남길 수 있는 풀스택 플랫폼입니다. Laravel 13.x + Inertia.js + React 19 모노리스 아키텍처로 구현하며, 신랑신부는 실시간으로 응답 현황을 확인할 수 있습니다.

필수 기능

  • 하객 초대 관리: 신랑신부가 초대장 링크 생성 (고유 코드)
  • RSVP 응답 폼: 이름, 참석 여부(예/아니오), 동반 인원, 식사 선택(한식/양식/채식), 알레르기 정보
  • 축하 메시지 게시판: 하객들이 축하 메시지 남기기 (공개/비공개 선택)
  • 응답 현황 대시보드: 신랑신부 전용 - 총 참석 인원, 식사 옵션별 통계, 메시지 목록
  • 반응형 디자인: 모바일 친화적 UI (대부분 모바일에서 접속)
  • 검색 & 필터: 응답 상태별, 식사 옵션별 하객 필터링

보너스 기능

  • 카카오맵 API 연동으로 예식장 위치 표시
  • 갤러리 섹션 (커플 사진 업로드)
  • 이메일 알림 (응답 완료 시 신랑신부에게 자동 발송)
  • 응답 수정 기능 (고유 코드로 재접속)
  • CSV 다운로드 (하객 명단 엑셀 내보내기)

기술 스택

  • 백엔드: Laravel 13.x (Eloquent ORM, 마이그레이션, 컨트롤러)
  • 프론트엔드: React 19 (함수형 컴포넌트, useState, useEffect)
  • 풀스택 연결: Inertia.js (Laravel 라우트 ↔ React 페이지 컴포넌트)
  • 스타일링: Tailwind CSS (우아한 웨딩 테마)
  • 데이터베이스: SQLite (개발 환경) / MySQL (프로덕션)

학습 목표

  • Inertia.js로 Laravel과 React를 모노리스로 연결하는 방법
  • Laravel 컨트롤러에서 Inertia::render()로 데이터 전달
  • React에서 useForm 훅으로 폼 상태 관리
  • Eloquent 관계 설정 (하객 ↔ 메시지)
  • 조건부 렌더링 & 동적 UI 업데이트

제약 조건

  • • Laravel 13.x + Inertia.js + React 19 모노리스 구조 (별도 API 라우트 없음)
  • • Laravel Breeze (React + Inertia) starter kit으로 프로젝트 초기화
  • • SQLite 데이터베이스 사용 (마이그레이션으로 테이블 생성)
  • • Tailwind CSS로 웨딩 테마 디자인 (파스텔 톤, 우아한 폰트)
  • • 모바일 우선 반응형 디자인 (Tailwind 반응형 클래스 활용)
  • • Laravel 컨트롤러에서 Inertia::render()로 React 컴포넌트에 데이터 전달
  • • React에서 Inertia의 useForm 훅으로 폼 제출
  • • 실시간 채팅 기능 없음 (메시지 게시판만 제공)
  • • 외부 결제 연동 없음 (RSVP 응답만 처리)
  • • 파일 업로드는 보너스 기능 (갤러리 사진)

프롬프트 레시피

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

1
Step 1
mkdir wedding-rsvp-platform-inertia && cd wedding-rsvp-platform-inertia

이 폴더에서 Laravel 13.x + Inertia.js + React 19 프로젝트를 시작합니다.

**작업 내용:**
1. Laravel Breeze (React + Inertia) starter kit으로 프로젝트 초기화
   - `composer create-project laravel/laravel .`
   - `composer require laravel/breeze --dev`
   - `php artisan breeze:install react` (Inertia + React 스택 선택)
   - `npm install && npm run dev`
2. `.env` 파일에서 DB 설정을 SQLite로 변경
   - `DB_CONNECTION=sqlite`
   - `touch database/database.sqlite` (SQLite 파일 생성)
3. 기본 인증 마이그레이션 실행: `php artisan migrate`
4. 개발 서버 실행: `php artisan serve` (http://localhost:8000)
5. Vite 개발 서버 실행: `npm run dev` (별도 터미널)

**프로젝트 구조 확인:**
- `app/Http/Controllers`: Laravel 컨트롤러
- `resources/js/Pages`: React 페이지 컴포넌트 (Inertia)
- `routes/web.php`: 웹 라우트 (Inertia 라우트 정의)
- `database/migrations`: 마이그레이션 파일

**예상 결과:**
- Laravel Breeze 기본 인증 화면 (로그인/회원가입) 동작 확인
- React 컴포넌트가 정상적으로 렌더링되는지 확인
- Tailwind CSS 적용 확인

기대 결과: Laravel + Inertia + React 프로젝트가 초기화되고, 기본 인증 화면이 http://localhost:8000에서 정상 작동합니다. SQLite 데이터베이스가 생성되고 마이그레이션이 완료되었습니다.

2
Step 2
**데이터베이스 설계 및 마이그레이션 생성**

웨딩 RSVP 시스템에 필요한 테이블을 설계합니다.

**작업 내용:**
1. `invitations` 테이블 마이그레이션 생성
   ```bash
   php artisan make:migration create_invitations_table
   ```
   - 컬럼: id, couple_name (신랑신부 이름), wedding_date (예식 날짜), venue_name (예식장 이름), venue_address, unique_code (초대장 고유 코드), created_at, updated_at
   - unique_code는 unique 인덱스 설정

2. `guests` 테이블 마이그레이션 생성
   ```bash
   php artisan make:migration create_guests_table
   ```
   - 컬럼: id, invitation_id (외래키), name (하객 이름), attendance (참석 여부: 'yes'/'no'), companion_count (동반 인원), meal_option (식사 선택: 'korean'/'western'/'vegetarian'), allergy_info (알레르기 정보, nullable), phone (연락처, nullable), created_at, updated_at
   - invitation_id는 invitations 테이블 외래키

3. `messages` 테이블 마이그레이션 생성
   ```bash
   php artisan make:migration create_messages_table
   ```
   - 컬럼: id, invitation_id (외래키), guest_name (작성자 이름), content (메시지 내용), is_public (공개 여부, boolean), created_at, updated_at

4. 마이그레이션 파일 작성 후 실행
   ```bash
   php artisan migrate
   ```

**Eloquent 모델 생성:**
1. `php artisan make:model Invitation`
2. `php artisan make:model Guest`
3. `php artisan make:model Message`

각 모델에 관계 설정:
- `Invitation` 모델: `hasMany(Guest::class)`, `hasMany(Message::class)`
- `Guest` 모델: `belongsTo(Invitation::class)`
- `Message` 모델: `belongsTo(Invitation::class)`

**예상 결과:**
- 3개의 테이블이 SQLite 데이터베이스에 생성됩니다.
- Eloquent 모델이 관계와 함께 정의됩니다.

기대 결과: invitations, guests, messages 테이블이 생성되고, Eloquent 모델에 관계가 설정되었습니다. 마이그레이션이 성공적으로 실행되었습니다.

3
Step 3
**초대장 생성 페이지 구현 (신랑신부용)**

Inertia.js를 사용하여 초대장 생성 폼을 만듭니다.

**작업 내용:**
1. `InvitationController` 생성
   ```bash
   php artisan make:controller InvitationController
   ```

2. `routes/web.php`에 라우트 추가
   ```php
   use App\Http\Controllers\InvitationController;

   Route::get('/create-invitation', [InvitationController::class, 'create'])->name('invitation.create');
   Route::post('/invitations', [InvitationController::class, 'store'])->name('invitation.store');
   ```

3. `InvitationController`에 메서드 구현
   - `create()`: Inertia::render('Invitation/Create') 반환
   - `store(Request $request)`: 
     - 유효성 검사 (couple_name, wedding_date, venue_name, venue_address 필수)
     - unique_code 자동 생성 (예: Str::random(10))
     - Invitation 모델 생성 후 저장
     - 생성된 초대장 링크 반환 (예: `/rsvp/{unique_code}`)

4. React 컴포넌트 생성: `resources/js/Pages/Invitation/Create.jsx`
   - Inertia의 `useForm` 훅 사용
   - 입력 필드: 신랑신부 이름, 예식 날짜, 예식장 이름, 주소
   - 제출 버튼 클릭 시 `form.post(route('invitation.store'))`
   - 성공 시 생성된 초대장 링크 표시 (복사 가능)

5. Tailwind CSS로 우아한 웨딩 테마 디자인
   - 파스텔 핑크/골드 컬러 스킴
   - 부드러운 그림자와 둥근 모서리
   - 반응형 레이아웃

**예상 결과:**
- `/create-invitation` 페이지에서 초대장 정보를 입력하고 생성할 수 있습니다.
- 생성 후 고유 코드가 포함된 RSVP 링크가 표시됩니다.

기대 결과: 초대장 생성 페이지가 완성되고, 폼 제출 시 데이터베이스에 초대장이 저장됩니다. 고유 코드가 자동 생성되어 RSVP 링크로 표시됩니다.

4
Step 4
**RSVP 응답 페이지 구현 (하객용)**

하객들이 초대장 링크로 접속하여 참석 여부를 응답하는 페이지를 만듭니다.

**작업 내용:**
1. `GuestController` 생성
   ```bash
   php artisan make:controller GuestController
   ```

2. `routes/web.php`에 라우트 추가
   ```php
   use App\Http\Controllers\GuestController;

   Route::get('/rsvp/{code}', [GuestController::class, 'show'])->name('rsvp.show');
   Route::post('/rsvp/{code}', [GuestController::class, 'store'])->name('rsvp.store');
   ```

3. `GuestController`에 메서드 구현
   - `show($code)`: 
     - unique_code로 Invitation 조회
     - 없으면 404 에러
     - Inertia::render('RSVP/Form', ['invitation' => $invitation]) 반환
   - `store(Request $request, $code)`:
     - 유효성 검사 (name, attendance, meal_option 필수)
     - Guest 모델 생성 후 저장
     - 응답 완료 메시지와 함께 리다이렉트

4. React 컴포넌트 생성: `resources/js/Pages/RSVP/Form.jsx`
   - props로 invitation 데이터 받기
   - 초대장 정보 표시 (신랑신부 이름, 예식 날짜, 장소)
   - RSVP 폼:
     - 이름 입력
     - 참석 여부 라디오 버튼 (예/아니오)
     - 참석 선택 시: 동반 인원 숫자 입력, 식사 옵션 선택 (한식/양식/채식), 알레르기 정보 텍스트 입력
     - 연락처 입력 (선택)
   - 제출 버튼: `form.post(route('rsvp.store', code))`

5. 조건부 렌더링
   - 참석 '아니오' 선택 시 식사 옵션 숨김
   - 제출 완료 시 감사 메시지 표시

6. Tailwind CSS로 모바일 친화적 디자인

**예상 결과:**
- `/rsvp/{고유코드}` 페이지에서 하객이 참석 여부를 응답할 수 있습니다.
- 응답 데이터가 guests 테이블에 저장됩니다.

기대 결과: RSVP 응답 페이지가 완성되고, 하객이 폼을 제출하면 데이터베이스에 저장됩니다. 참석 여부에 따라 동적으로 폼이 변경됩니다.

5
Step 5
**축하 메시지 게시판 구현**

하객들이 축하 메시지를 남기고, 공개 메시지는 모두가 볼 수 있는 게시판을 만듭니다.

**작업 내용:**
1. `MessageController` 생성
   ```bash
   php artisan make:controller MessageController
   ```

2. `routes/web.php`에 라우트 추가
   ```php
   use App\Http\Controllers\MessageController;

   Route::get('/rsvp/{code}/messages', [MessageController::class, 'index'])->name('messages.index');
   Route::post('/rsvp/{code}/messages', [MessageController::class, 'store'])->name('messages.store');
   ```

3. `MessageController`에 메서드 구현
   - `index($code)`:
     - unique_code로 Invitation 조회
     - 공개 메시지만 가져오기: `$invitation->messages()->where('is_public', true)->latest()->get()`
     - Inertia::render('Messages/Index', ['invitation' => $invitation, 'messages' => $messages]) 반환
   - `store(Request $request, $code)`:
     - 유효성 검사 (guest_name, content, is_public 필수)
     - Message 모델 생성 후 저장
     - 메시지 목록 페이지로 리다이렉트

4. React 컴포넌트 생성: `resources/js/Pages/Messages/Index.jsx`
   - 초대장 정보 헤더
   - 공개 메시지 목록 표시 (카드 형식)
     - 작성자 이름, 메시지 내용, 작성 시간
   - 메시지 작성 폼:
     - 이름 입력
     - 메시지 내용 텍스트 영역
     - 공개/비공개 체크박스
     - 제출 버튼

5. Tailwind CSS로 게시판 디자인
   - 메시지 카드에 부드러운 그림자
   - 스크롤 가능한 메시지 목록

**예상 결과:**
- `/rsvp/{고유코드}/messages` 페이지에서 축하 메시지를 작성하고 볼 수 있습니다.
- 공개 메시지만 게시판에 표시됩니다.

기대 결과: 축하 메시지 게시판이 완성되고, 하객이 메시지를 작성하면 공개 여부에 따라 표시됩니다. 메시지 목록이 최신순으로 정렬됩니다.

6
Step 6
**응답 현황 대시보드 구현 (신랑신부 전용)**

신랑신부가 하객 응답 현황을 확인할 수 있는 대시보드를 만듭니다.

**작업 내용:**
1. `DashboardController` 생성
   ```bash
   php artisan make:controller DashboardController
   ```

2. `routes/web.php`에 라우트 추가
   ```php
   use App\Http\Controllers\DashboardController;

   Route::get('/dashboard/{code}', [DashboardController::class, 'index'])->name('dashboard.index');
   ```

3. `DashboardController`에 메서드 구현
   - `index($code)`:
     - unique_code로 Invitation 조회
     - 통계 계산:
       - 총 응답 수: `$invitation->guests()->count()`
       - 참석 인원: `$invitation->guests()->where('attendance', 'yes')->sum('companion_count') + 참석자 수`
       - 불참 인원: `$invitation->guests()->where('attendance', 'no')->count()`
       - 식사 옵션별 통계: 한식/양식/채식 각각 카운트
     - 모든 메시지 가져오기 (공개/비공개 포함)
     - Inertia::render('Dashboard/Index', ['invitation' => $invitation, 'stats' => $stats, 'guests' => $guests, 'messages' => $messages]) 반환

4. React 컴포넌트 생성: `resources/js/Pages/Dashboard/Index.jsx`
   - 초대장 정보 헤더
   - 통계 카드 섹션:
     - 총 응답 수, 참석 인원, 불참 인원
     - 식사 옵션별 통계 (한식/양식/채식)
   - 하객 목록 테이블:
     - 이름, 참석 여부, 동반 인원, 식사 옵션, 연락처
     - 검색 & 필터 기능 (참석 여부별, 식사 옵션별)
   - 메시지 목록:
     - 공개/비공개 메시지 모두 표시
     - 비공개 메시지는 배경색 구분

5. Tailwind CSS로 대시보드 디자인
   - 반응형 그리드 레이아웃
   - 통계 카드에 아이콘 추가

**예상 결과:**
- `/dashboard/{고유코드}` 페이지에서 신랑신부가 응답 현황을 한눈에 확인할 수 있습니다.
- 통계, 하객 목록, 메시지가 모두 표시됩니다.

기대 결과: 응답 현황 대시보드가 완성되고, 통계 데이터와 하객 목록, 메시지가 정상적으로 표시됩니다. 필터링 기능이 작동합니다.

제출된 작품 (0)

로그인 후 제출

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

댓글 (0)

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