풀스택 여행 경비 분담 계산기 - 바이브코딩 레시피
입문 PHP + JavaScript Laravel + React AI: Claude

풀스택 여행 경비 분담 계산기

리포지토리명 travel-expense-split-calculator
조회수 56 0건 제출

문제 설명

풀스택 여행 경비 분담 계산기

친구들과 여행을 다녀온 후 누가 얼마를 냈고, 각자 얼마씩 정산해야 하는지 계산하는 간단한 풀스택 웹 애플리케이션입니다. Laravel 13.x로 RESTful API 백엔드를 만들고, React 19로 인터랙티브한 프론트엔드를 구현합니다.

필수 기능

  • 여행 생성: 여행 제목(예: "제주도 3박 4일") 입력
  • 참가자 추가: 이름 입력하여 여행 참가자 등록 (최소 2명)
  • 경비 항목 추가: 항목명(예: "숙박비", "식비"), 금액, 지불자 선택
  • 자동 정산 계산: 각 참가자가 지불한 총액과 1/n 공평 분담 금액을 비교하여 "누가 누구에게 얼마를 보내야 하는지" 자동 계산
  • 경비 내역 조회: 입력한 모든 경비 항목을 리스트로 표시
  • 정산 결과 표시: "A가 B에게 10,000원 송금" 형태로 최종 정산 내역 표시

기술 스택

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

선택 추가 기능 (보너스)

  • 경비 항목 삭제/수정 기능
  • 참가자별 지출 통계 그래프 (간단한 막대 차트)
  • 여행별 저장 기능 (여러 여행 관리)
  • 정산 결과 복사하기 버튼 (클립보드 복사)
  • 반응형 디자인 (모바일 친화적 UI)

학습 목표

  • Laravel API 라우트와 컨트롤러 설계
  • Eloquent ORM을 활용한 간단한 DB CRUD
  • React에서 useState로 상태 관리
  • fetch API로 Laravel 백엔드와 데이터 통신
  • JSON 응답 처리 및 에러 핸들링
  • 간단한 비즈니스 로직 구현 (정산 알고리즘)

제약 조건

  • • Laravel 13.x 최신 버전 사용 (구버전 금지)
  • • React 19 최신 버전 사용
  • • SQLite 데이터베이스 사용 (마이그레이션 필수)
  • • 백엔드와 프론트엔드는 별도 폴더로 분리 (laravel-api, react-frontend)
  • • Laravel은 API 전용 (blade 템플릿 사용 안 함)
  • • React는 Vite로 프로젝트 생성
  • • CORS 설정 필수 (Laravel에서 React 도메인 허용)
  • • Tailwind CSS로 스타일링
  • • 복잡한 상태관리 라이브러리 사용 금지 (useState만 사용)
  • • 실시간 채팅/WebSocket 사용 금지
  • • 모든 API 응답은 JSON 형식
  • • 프론트엔드는 localhost:5173, 백엔드는 localhost:8000 포트 사용

프롬프트 레시피

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

1
Step 1
mkdir travel-expense-split-calculator && cd travel-expense-split-calculator

이 폴더에서 프로젝트를 시작합니다.

# 1단계: Laravel 13.x API 백엔드 프로젝트 생성

`laravel-api` 폴더에 Laravel 13.x 프로젝트를 생성하고 기본 설정을 완료하세요.

## 요구사항

1. Laravel 13.x 최신 버전으로 `laravel-api` 폴더에 프로젝트 생성
2. SQLite 데이터베이스 설정 (.env 파일 수정)
3. 데이터베이스 마이그레이션 파일 생성:
   - `trips` 테이블: id, title, created_at, updated_at
   - `participants` 테이블: id, trip_id, name, created_at, updated_at
   - `expenses` 테이블: id, trip_id, participant_id (지불자), description, amount, created_at, updated_at
4. 모델 생성: Trip, Participant, Expense (Eloquent 관계 설정)
   - Trip hasMany Participants
   - Trip hasMany Expenses
   - Expense belongsTo Participant
5. CORS 설정: `php artisan install:api` 실행하여 API 라우트 활성화 및 CORS 미들웨어 설정
6. `.env` 파일에서 `APP_URL=http://localhost:8000` 확인

## 실행 명령어 예시

```bash
composer create-project laravel/laravel laravel-api
cd laravel-api
php artisan install:api
# .env 파일 수정: DB_CONNECTION=sqlite, DB_DATABASE=database/database.sqlite
touch database/database.sqlite
php artisan make:model Trip -m
php artisan make:model Participant -m
php artisan make:model Expense -m
# 마이그레이션 파일 작성 후
php artisan migrate
```

마이그레이션 파일 작성 시 외래키 제약조건도 추가해주세요.

기대 결과: `laravel-api` 폴더에 Laravel 13.x 프로젝트가 생성되고, SQLite 데이터베이스가 설정되며, trips, participants, expenses 테이블이 생성됩니다. Trip, Participant, Expense 모델이 Eloquent 관계와 함께 준비되고, CORS 설정이 완료되어 React에서 API 호출이 가능한 상태가 됩니다.

2
Step 2
# 2단계: Laravel API 라우트 및 컨트롤러 구현

여행 경비 분담 계산기의 핵심 API 엔드포인트를 구현하세요.

## 요구사항

1. API 라우트 설계 (`routes/api.php`):
   - POST `/api/trips` - 여행 생성
   - GET `/api/trips/{id}` - 여행 상세 조회 (참가자, 경비 포함)
   - POST `/api/trips/{id}/participants` - 참가자 추가
   - POST `/api/trips/{id}/expenses` - 경비 항목 추가
   - GET `/api/trips/{id}/settlement` - 정산 계산 결과 조회

2. 컨트롤러 생성 및 구현:
   - `TripController`: 여행 생성, 조회
   - `ParticipantController`: 참가자 추가
   - `ExpenseController`: 경비 항목 추가
   - `SettlementController`: 정산 계산 로직

3. 정산 계산 로직 구현 (SettlementController):
   - 각 참가자의 총 지출 금액 계산
   - 전체 경비를 참가자 수로 나눈 1/n 금액 계산
   - 각 참가자의 지출 금액 - 1/n 금액 = 차액 계산
   - 차액이 양수(더 많이 냄)인 사람과 음수(덜 냄)인 사람을 매칭하여 송금 내역 생성
   - JSON 형식으로 반환: `[{"from": "참가자A", "to": "참가자B", "amount": 10000}]`

4. JSON 응답 형식:
   - 성공: `{"success": true, "data": {...}}`
   - 실패: `{"success": false, "message": "에러 메시지"}`

5. 유효성 검증 (Validation):
   - 여행 제목 필수
   - 참가자 이름 필수
   - 경비 금액은 양수, 지불자 ID 필수

## 실행 명령어 예시

```bash
php artisan make:controller Api/TripController
php artisan make:controller Api/ParticipantController
php artisan make:controller Api/ExpenseController
php artisan make:controller Api/SettlementController
```

정산 알고리즘은 간단한 그리디 방식으로 구현하세요.

기대 결과: Laravel API 백엔드에 여행 생성, 참가자 추가, 경비 항목 추가, 정산 계산 API가 구현됩니다. Postman이나 curl로 테스트 시 JSON 응답이 정상적으로 반환되며, 정산 계산 로직이 올바르게 작동하여 누가 누구에게 얼마를 보내야 하는지 계산 결과가 나옵니다.

3
Step 3
# 3단계: React 19 프론트엔드 프로젝트 생성 및 기본 구조

`react-frontend` 폴더에 React 19 + Vite 프로젝트를 생성하고 Tailwind CSS를 설정하세요.

## 요구사항

1. Vite를 사용하여 React 19 프로젝트 생성 (`react-frontend` 폴더)
2. Tailwind CSS 설치 및 설정
3. 프로젝트 폴더 구조:
   ```
   src/
     components/
       TripForm.jsx         (여행 생성 폼)
       ParticipantList.jsx  (참가자 목록)
       ExpenseForm.jsx      (경비 입력 폼)
       ExpenseList.jsx      (경비 내역)
       SettlementResult.jsx (정산 결과)
     App.jsx
     main.jsx
   ```
4. `App.jsx`에 기본 레이아웃 구성:
   - 헤더: "여행 경비 분담 계산기" 제목
   - 여행 생성 폼
   - 참가자 추가 섹션
   - 경비 입력 섹션
   - 정산 결과 섹션
5. API 호출을 위한 기본 fetch 함수 준비 (utils/api.js 또는 App.jsx 내부)
6. `.env` 파일 생성: `VITE_API_URL=http://localhost:8000/api`

## 실행 명령어 예시

```bash
cd ..
npm create vite@latest react-frontend -- --template react
cd react-frontend
npm install
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
# tailwind.config.js 설정
npm run dev
```

Tailwind CSS는 간단하고 깔끔한 카드 기반 레이아웃으로 디자인하세요.

기대 결과: `react-frontend` 폴더에 React 19 + Vite 프로젝트가 생성되고, Tailwind CSS가 설정됩니다. localhost:5173에서 개발 서버가 실행되며, 헤더와 기본 섹션 레이아웃이 화면에 표시됩니다. 아직 기능은 없지만 UI 틀이 준비된 상태입니다.

4
Step 4
# 4단계: 여행 생성 및 참가자 추가 기능 구현

React 프론트엔드에서 여행을 생성하고 참가자를 추가하는 기능을 구현하세요.

## 요구사항

1. `TripForm.jsx` 컴포넌트:
   - 여행 제목 입력 필드
   - "여행 만들기" 버튼
   - 버튼 클릭 시 `POST /api/trips` 호출하여 여행 생성
   - 생성 성공 시 tripId를 상태로 저장하고 다음 단계(참가자 추가) UI 표시

2. `ParticipantList.jsx` 컴포넌트:
   - 참가자 이름 입력 필드
   - "참가자 추가" 버튼
   - 버튼 클릭 시 `POST /api/trips/{tripId}/participants` 호출
   - 추가된 참가자 목록을 카드 형태로 표시 (이름과 삭제 버튼은 보너스)
   - 최소 2명 이상 추가해야 다음 단계 진행 가능

3. 상태 관리 (App.jsx):
   - `tripId`: 생성된 여행 ID
   - `participants`: 참가자 배열
   - useState를 사용하여 관리

4. 에러 핸들링:
   - API 호출 실패 시 alert 또는 에러 메시지 표시
   - 입력 필드 비어있을 때 경고

5. UI/UX:
   - Tailwind CSS로 폼 스타일링 (input, button, card)
   - 참가자 추가 시 부드러운 애니메이션 (선택 사항)

## fetch 예시

```javascript
const createTrip = async (title) => {
  const response = await fetch(`${import.meta.env.VITE_API_URL}/trips`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ title })
  });
  const data = await response.json();
  return data;
};
```

Laravel 백엔드가 실행 중이어야 합니다 (`php artisan serve`).

기대 결과: React 프론트엔드에서 여행 제목을 입력하고 "여행 만들기" 버튼을 누르면 Laravel API를 통해 여행이 생성되고, tripId가 저장됩니다. 이후 참가자 이름을 입력하고 추가할 수 있으며, 추가된 참가자가 화면에 카드 형태로 표시됩니다. 최소 2명 이상 추가하면 다음 단계로 진행할 수 있습니다.

5
Step 5
# 5단계: 경비 항목 추가 및 정산 결과 표시

경비 항목을 입력하고 자동으로 정산 결과를 계산하여 표시하는 기능을 구현하세요.

## 요구사항

1. `ExpenseForm.jsx` 컴포넌트:
   - 경비 항목명 입력 필드 (예: "숙박비")
   - 금액 입력 필드 (숫자만 입력 가능)
   - 지불자 선택 드롭다운 (participants 배열에서 선택)
   - "경비 추가" 버튼
   - 버튼 클릭 시 `POST /api/trips/{tripId}/expenses` 호출

2. `ExpenseList.jsx` 컴포넌트:
   - 추가된 경비 항목을 테이블 또는 리스트로 표시
   - 항목명, 금액, 지불자 이름 표시
   - 총 경비 금액 합계 표시

3. `SettlementResult.jsx` 컴포넌트:
   - "정산 계산하기" 버튼
   - 버튼 클릭 시 `GET /api/trips/{tripId}/settlement` 호출
   - 정산 결과를 "A가 B에게 10,000원 송금" 형태로 표시
   - 결과가 없으면 "모두 정산 완료!" 메시지 표시

4. 상태 관리 (App.jsx):
   - `expenses`: 경비 항목 배열
   - `settlement`: 정산 결과 배열
   - useState로 관리

5. UI/UX:
   - Tailwind CSS로 테이블 스타일링
   - 금액은 천 단위 콤마 표시 (toLocaleString())
   - 정산 결과는 강조 색상(예: 초록색 배경)으로 표시

6. 에러 핸들링:
   - 경비 추가 시 필수 필드 검증
   - API 호출 실패 시 에러 메시지 표시

## fetch 예시

```javascript
const addExpense = async (tripId, expenseData) => {
  const response = await fetch(`${import.meta.env.VITE_API_URL}/trips/${tripId}/expenses`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(expenseData)
  });
  return await response.json();
};

const getSettlement = async (tripId) => {
  const response = await fetch(`${import.meta.env.VITE_API_URL}/trips/${tripId}/settlement`);
  return await response.json();
};
```

정산 알고리즘은 Laravel 백엔드에서 처리하므로 프론트엔드는 결과만 표시하면 됩니다.

기대 결과: React 프론트엔드에서 경비 항목(항목명, 금액, 지불자)을 입력하고 추가할 수 있으며, 추가된 경비가 리스트로 표시됩니다. "정산 계산하기" 버튼을 누르면 Laravel 백엔드에서 계산된 정산 결과가 "A가 B에게 ₩10,000 송금" 형태로 화면에 표시됩니다. 전체 플로우(여행 생성 → 참가자 추가 → 경비 입력 → 정산 계산)가 완성되어 실제로 사용 가능한 상태가 됩니다.

제출된 작품 (0)

로그인 후 제출

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

댓글 (0)

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