웨딩 청첩장 RSVP 플랫폼 - 하객 참석 응답 & 식사 선택
wedding-rsvp-platform-inertia
문제 설명
🎊 웨딩 청첩장 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에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
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 데이터베이스가 생성되고 마이그레이션이 완료되었습니다.
**데이터베이스 설계 및 마이그레이션 생성** 웨딩 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 모델에 관계가 설정되었습니다. 마이그레이션이 성공적으로 실행되었습니다.
**초대장 생성 페이지 구현 (신랑신부용)**
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 링크로 표시됩니다.
**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 응답 페이지가 완성되고, 하객이 폼을 제출하면 데이터베이스에 저장됩니다. 참석 여부에 따라 동적으로 폼이 변경됩니다.
**축하 메시지 게시판 구현**
하객들이 축하 메시지를 남기고, 공개 메시지는 모두가 볼 수 있는 게시판을 만듭니다.
**작업 내용:**
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` 페이지에서 축하 메시지를 작성하고 볼 수 있습니다.
- 공개 메시지만 게시판에 표시됩니다.
기대 결과: 축하 메시지 게시판이 완성되고, 하객이 메시지를 작성하면 공개 여부에 따라 표시됩니다. 메시지 목록이 최신순으로 정렬됩니다.
**응답 현황 대시보드 구현 (신랑신부 전용)**
신랑신부가 하객 응답 현황을 확인할 수 있는 대시보드를 만듭니다.
**작업 내용:**
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)
로그인 후 제출아직 제출된 작품이 없습니다. 첫 번째 도전자가 되어보세요!