풀스택 헬스장 PT 수업 예약 플랫폼
gym-pt-booking-platform
문제 설명
풀스택 헬스장 PT 수업 예약 플랫폼
헬스장이나 필라테스 스튜디오에서 사용할 수 있는 PT(개인 트레이닝) 수업 예약 시스템을 만듭니다. 트레이너별로 시간대를 확인하고, 고객이 원하는 시간을 예약할 수 있습니다.
필수 기능
- 트레이너 목록 조회 (이름, 전문분야, 프로필 사진)
- 트레이너별 예약 가능한 시간대 표시 (날짜/시간 슬롯)
- 예약 신청 폼 (이름, 연락처, 선택한 트레이너/시간)
- 예약 내역 목록 조회 (나의 예약 확인)
- 예약 취소 기능
- 반응형 디자인 (모바일 친화적)
선택 추가 기능 (보너스)
- 트레이너별 리뷰/별점 시스템
- 예약 시간 30분 전 알림 (이메일 또는 화면 표시)
- 예약 시간대 필터링 (오전/오후/저녁)
- 트레이너 검색 기능 (전문분야별)
- 예약 대기열 (만약 시간대가 꽉 찬 경우)
기술 스택
- 백엔드: Laravel 13.x (RESTful API 서버)
- 프론트엔드: React 19 (Vite)
- 데이터베이스: SQLite (개발 환경용)
- 스타일링: Tailwind CSS
- HTTP 클라이언트: Axios
학습 포인트
- Laravel API 라우팅과 컨트롤러 설계
- React에서 fetch/axios로 API 호출
- 폼 입력 처리와 유효성 검사
- 날짜/시간 데이터 다루기
- 조건부 렌더링 (예약 가능 여부 표시)
이 프로젝트는 실제 비즈니스에서 바로 활용 가능한 서비스 모델이며, 프론트엔드와 백엔드의 데이터 흐름을 명확히 이해할 수 있습니다.
제약 조건
- • Laravel 13.x 사용 (구버전 금지)
- • React 19 사용 (구버전 금지)
- • Laravel은 API 서버로만 동작 (Blade 템플릿 사용 금지)
- • React는 별도 Vite 프로젝트로 구성
- • 데이터베이스는 SQLite 사용 (마이그레이션 필수)
- • API 엔드포인트는 RESTful 방식으로 설계
- • CORS 설정 필수 (Laravel에서 React 요청 허용)
- • 프론트엔드에서 useState만 사용 (복잡한 상태관리 라이브러리 금지)
- • Tailwind CSS로 스타일링
- • 반응형 디자인 적용 (모바일 우선)
- • 실시간 채팅 기능 금지 (HTTP 기반만 사용)
프롬프트 레시피
아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
mkdir gym-pt-booking-platform && cd gym-pt-booking-platform
이 폴더에서 프로젝트를 시작합니다.
# Laravel 13.x API 백엔드 초기 설정
1. Laravel 프로젝트 생성:
- `backend` 폴더에 Laravel 13.x 프로젝트 생성
- SQLite 데이터베이스 사용 설정 (.env 파일 수정)
2. 데이터베이스 마이그레이션 생성:
- `trainers` 테이블: id, name, specialty, profile_image, bio
- `time_slots` 테이블: id, trainer_id, date, start_time, end_time, is_available
- `bookings` 테이블: id, trainer_id, time_slot_id, customer_name, customer_phone, status (pending/confirmed/cancelled)
3. 모델 생성:
- Trainer, TimeSlot, Booking 모델 생성
- 관계 설정 (Trainer hasMany TimeSlots, TimeSlot hasOne Booking 등)
4. 시더(Seeder) 생성:
- 3명의 샘플 트레이너 데이터
- 각 트레이너당 오늘부터 7일간의 시간대 데이터 (09:00~18:00, 1시간 단위)
5. API 라우트 설계 (routes/api.php):
- GET /api/trainers - 트레이너 목록
- GET /api/trainers/{id}/time-slots - 트레이너별 예약 가능 시간대
- POST /api/bookings - 예약 생성
- GET /api/bookings - 예약 목록
- DELETE /api/bookings/{id} - 예약 취소
6. CORS 설정:
- React 개발 서버(localhost:5173)에서 API 호출 허용
모든 설정 후 `php artisan migrate --seed` 실행하여 데이터베이스 준비.
기대 결과: Laravel 백엔드 프로젝트가 초기화되고, 데이터베이스 마이그레이션과 시더가 준비됩니다. API 라우트가 정의되고, CORS 설정이 완료됩니다. `php artisan serve` 실행 시 http://localhost:8000에서 API 서버가 동작합니다.
# Laravel API 컨트롤러 구현
1. TrainerController 생성:
- `index()` 메서드: 모든 트레이너 목록 반환 (JSON)
- `show($id)` 메서드: 특정 트레이너 정보 반환
- `timeSlots($id)` 메서드: 특정 트레이너의 예약 가능한 시간대 반환 (is_available = true인 것만)
2. BookingController 생성:
- `store(Request $request)` 메서드:
- 예약 정보 유효성 검사 (customer_name, customer_phone, time_slot_id 필수)
- 해당 시간대가 예약 가능한지 확인
- 예약 생성 후 시간대 is_available을 false로 업데이트
- 생성된 예약 정보 반환
- `index()` 메서드: 모든 예약 목록 반환 (트레이너, 시간대 정보 포함)
- `destroy($id)` 메서드:
- 예약 삭제
- 해당 시간대 is_available을 true로 복구
3. 각 메서드에서 적절한 HTTP 상태 코드 반환:
- 성공: 200 (조회), 201 (생성), 204 (삭제)
- 실패: 400 (잘못된 요청), 404 (찾을 수 없음)
4. API 테스트:
- Postman 또는 curl로 각 엔드포인트 테스트
- 예약 생성 → 시간대 unavailable 확인
- 예약 취소 → 시간대 available 복구 확인
기대 결과: Laravel API 컨트롤러가 완성되고, 모든 엔드포인트가 정상 동작합니다. Postman으로 테스트 시 트레이너 목록, 시간대 조회, 예약 생성/취소가 정상 작동합니다.
# React 19 프론트엔드 프로젝트 초기 설정
1. `frontend` 폴더에 React + Vite 프로젝트 생성:
- `npm create vite@latest frontend -- --template react`
- `cd frontend && npm install`
2. Tailwind CSS 설치 및 설정:
- `npm install -D tailwindcss postcss autoprefixer`
- `npx tailwindcss init -p`
- tailwind.config.js에 content 경로 설정
- src/index.css에 Tailwind 디렉티브 추가
3. Axios 설치:
- `npm install axios`
4. 프로젝트 구조 설정:
- src/components 폴더 생성
- src/services 폴더 생성 (API 호출 함수 모음)
- src/pages 폴더 생성
5. API 서비스 함수 작성 (src/services/api.js):
- `getTrainers()` - GET /api/trainers
- `getTimeSlots(trainerId)` - GET /api/trainers/{id}/time-slots
- `createBooking(data)` - POST /api/bookings
- `getBookings()` - GET /api/bookings
- `cancelBooking(id)` - DELETE /api/bookings/{id}
- axios baseURL을 http://localhost:8000으로 설정
6. 기본 레이아웃 컴포넌트 생성:
- Header 컴포넌트 (로고, 네비게이션)
- Footer 컴포넌트
`npm run dev` 실행하여 개발 서버 시작 (localhost:5173).
기대 결과: React 프론트엔드 프로젝트가 초기화되고, Tailwind CSS와 Axios가 설치됩니다. API 서비스 함수가 준비되고, 기본 레이아웃 컴포넌트가 생성됩니다. 개발 서버가 localhost:5173에서 실행됩니다.
# 트레이너 목록 페이지 구현
1. TrainerList 컴포넌트 생성 (src/components/TrainerList.jsx):
- useEffect로 컴포넌트 마운트 시 getTrainers() 호출
- useState로 트레이너 목록 상태 관리
- 로딩 상태 표시 (데이터 fetch 중)
- 트레이너 카드 형태로 목록 표시:
- 프로필 이미지 (placeholder 이미지 사용)
- 이름, 전문분야, 간단한 소개
- "예약하기" 버튼 (클릭 시 해당 트레이너의 시간대 선택 화면으로 이동)
2. Tailwind CSS로 스타일링:
- 그리드 레이아웃 (모바일: 1열, 태블릿: 2열, 데스크톱: 3열)
- 카드 호버 효과 (shadow, scale 애니메이션)
- 반응형 디자인
3. App.jsx에서 TrainerList 렌더링:
- 간단한 헤더 추가 ("PT 수업 예약 시스템")
- TrainerList 컴포넌트 배치
4. 에러 처리:
- API 호출 실패 시 에러 메시지 표시
- try-catch로 예외 처리
브라우저에서 localhost:5173 접속 시 트레이너 목록이 카드 형태로 보여야 합니다.
기대 결과: React 앱에서 트레이너 목록이 카드 형태로 표시됩니다. 각 카드에는 트레이너 정보와 "예약하기" 버튼이 있습니다. 반응형 그리드 레이아웃이 적용되어 화면 크기에 따라 열 개수가 변경됩니다.
# 시간대 선택 및 예약 폼 구현
1. TimeSlotSelector 컴포넌트 생성 (src/components/TimeSlotSelector.jsx):
- props로 trainerId 받기
- useEffect로 getTimeSlots(trainerId) 호출하여 시간대 목록 가져오기
- useState로 선택된 시간대 ID 관리
- 시간대 목록을 날짜별로 그룹화하여 표시:
- 날짜 헤더 (예: "2024년 1월 15일 월요일")
- 해당 날짜의 시간대 버튼들 (예: "09:00-10:00", "10:00-11:00")
- 선택된 시간대는 배경색 변경
2. BookingForm 컴포넌트 생성 (src/components/BookingForm.jsx):
- props로 trainerId, selectedTimeSlotId 받기
- 고객 정보 입력 폼:
- 이름 (input)
- 연락처 (input, type="tel")
- 폼 제출 시:
- createBooking() API 호출
- 성공 시 성공 메시지 표시 및 예약 내역 페이지로 이동
- 실패 시 에러 메시지 표시
3. App.jsx 라우팅 개선:
- React Router 설치: `npm install react-router-dom`
- 라우트 설정:
- `/` - TrainerList
- `/book/:trainerId` - TimeSlotSelector + BookingForm
- `/my-bookings` - 예약 내역 페이지 (다음 단계에서 구현)
4. Tailwind CSS로 폼 스타일링:
- 입력 필드 스타일 (border, padding, focus 효과)
- 버튼 스타일 (primary color, hover 효과)
- 시간대 버튼 (grid 레이아웃, 선택/비선택 상태 구분)
5. 유효성 검사:
- 시간대 선택 여부 확인
- 이름, 연락처 입력 여부 확인
- 미입력 시 경고 메시지 표시
기대 결과: 트레이너 카드의 "예약하기" 버튼 클릭 시 시간대 선택 화면으로 이동합니다. 날짜별로 그룹화된 시간대 버튼이 표시되고, 클릭하여 선택할 수 있습니다. 시간대 선택 후 고객 정보 입력 폼이 나타나며, 제출 시 예약이 생성됩니다.
# 예약 내역 조회 및 취소 기능 구현
1. MyBookings 컴포넌트 생성 (src/components/MyBookings.jsx):
- useEffect로 getBookings() 호출하여 예약 목록 가져오기
- useState로 예약 목록 상태 관리
- 예약 목록을 테이블 또는 카드 형태로 표시:
- 트레이너 이름
- 예약 날짜/시간
- 고객 이름
- 예약 상태 (pending/confirmed/cancelled)
- "취소" 버튼 (status가 cancelled가 아닌 경우만 표시)
2. 예약 취소 기능:
- "취소" 버튼 클릭 시 확인 다이얼로그 표시 (window.confirm)
- 확인 시 cancelBooking(id) API 호출
- 성공 시:
- 예약 목록 다시 불러오기 (새로고침)
- 성공 메시지 표시
- 실패 시 에러 메시지 표시
3. 네비게이션 추가:
- Header 컴포넌트에 "예약 내역" 링크 추가
- React Router Link 컴포넌트 사용
4. 빈 상태 처리:
- 예약 내역이 없을 경우 "아직 예약 내역이 없습니다" 메시지 표시
- "트레이너 둘러보기" 버튼 추가 (TrainerList로 이동)
5. Tailwind CSS로 스타일링:
- 테이블 스타일 (stripe 효과)
- 상태 배지 (pending: 노란색, confirmed: 초록색, cancelled: 회색)
- 취소 버튼 (빨간색 계열)
6. 최종 테스트:
- 트레이너 선택 → 시간대 선택 → 예약 생성 → 예약 내역 확인 → 예약 취소
- 취소 후 해당 시간대가 다시 예약 가능해지는지 확인
모든 기능이 정상 작동하는지 확인하고, README.md 파일에 프로젝트 실행 방법과 주요 기능 설명을 작성하세요.
기대 결과: 예약 내역 페이지가 완성되어 모든 예약 정보가 표시됩니다. 취소 버튼 클릭 시 예약이 취소되고, 해당 시간대가 다시 예약 가능 상태로 변경됩니다. 전체 예약 플로우(트레이너 선택 → 시간대 선택 → 예약 생성 → 내역 확인 → 취소)가 완벽하게 동작합니다. README.md에 실행 방법이 문서화되어 있습니다.
제출된 작품 (0)
로그인 후 제출아직 제출된 작품이 없습니다. 첫 번째 도전자가 되어보세요!