팀 프로젝트 마일스톤 타임라인 - 일정 시각화 & 진행률 추적 - 바이브코딩 레시피
중급 PHP + JavaScript Laravel + React + Inertia.js AI: Claude

팀 프로젝트 마일스톤 타임라인 - 일정 시각화 & 진행률 추적

리포지토리명 project-milestone-timeline-tracker
조회수 88 0건 제출

문제 설명

📊 프로젝트 개요

팀 프로젝트의 주요 마일스톤을 시각적 타임라인으로 표현하고, 각 마일스톤의 진행률을 실시간으로 추적하는 협업 도구입니다. 프로젝트 매니저와 팀원 모두가 프로젝트 전체 일정을 한눈에 파악하고, 현재 어느 단계에 있는지 직관적으로 확인할 수 있습니다.

✨ 필수 기능

1. 프로젝트 관리

  • 프로젝트 생성 (제목, 설명, 시작일, 종료일)
  • 프로젝트 목록 조회 (카드 형태)
  • 프로젝트 상세 페이지 (타임라인 뷰)

2. 마일스톤 관리

  • 마일스톤 추가/수정/삭제
  • 각 마일스톤: 제목, 설명, 예정일, 상태(예정/진행중/완료), 진행률(0-100%)
  • 드래그 앤 드롭으로 마일스톤 순서 변경
  • 마일스톤별 색상 라벨링

3. 타임라인 시각화

  • 수평 타임라인 형태로 마일스톤 표시
  • 각 마일스톤을 날짜 기준으로 배치
  • 현재 날짜 표시선(Today Marker)
  • 마일스톤 진행률을 프로그레스 바로 표시
  • 완료된 마일스톤은 체크 표시

4. 진행률 대시보드

  • 프로젝트 전체 진행률 계산 및 표시
  • 완료/진행중/예정 마일스톤 개수 통계
  • 지연된 마일스톤 경고 표시

5. 반응형 UI

  • 데스크톱: 수평 타임라인
  • 모바일: 세로 타임라인으로 자동 전환

🎁 보너스 기능

  • 마일스톤 필터링 (상태별, 날짜 범위)
  • 마일스톤 검색
  • 프로젝트 아카이브 (완료된 프로젝트 보관)
  • 마일스톤 코멘트 기능
  • 마일스톤 첨부파일 업로드
  • 프로젝트 진행률 차트 (파이 차트, 바 차트)
  • 다크 모드 지원

🎯 학습 목표

  • Laravel 13.x + Inertia.js + React 19 모노리스 아키텍처 이해
  • Eloquent ORM을 활용한 관계형 데이터 모델링 (1:N 관계)
  • Inertia.js의 서버-클라이언트 데이터 전달 방식 이해
  • React Hooks(useState, useEffect)를 활용한 상태 관리
  • 드래그 앤 드롭 라이브러리 통합 (react-beautiful-dnd)
  • 날짜 계산 및 시각화 로직 구현
  • Tailwind CSS를 활용한 반응형 UI 디자인

제약 조건

  • • Laravel 13.x + Inertia.js + React 19 모노리스 구조 사용
  • • Laravel Breeze (React + Inertia) starter kit으로 프로젝트 초기화
  • • 데이터베이스: SQLite 사용
  • • 스타일링: Tailwind CSS 필수
  • • 날짜 처리: date-fns 라이브러리 사용
  • • 드래그 앤 드롭: @hello-pangea/dnd (react-beautiful-dnd 후속) 사용
  • • 별도 API 라우트 없이 Inertia::render()로 데이터 전달
  • • React 컴포넌트는 resources/js/Pages 디렉토리에 구성
  • • 프로그레스 바 및 통계는 클라이언트 사이드에서 계산
  • • 모든 폼 제출은 Inertia form helper 사용

프롬프트 레시피

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

1
Step 1
mkdir project-milestone-timeline-tracker && cd project-milestone-timeline-tracker

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

다음 명령으로 Laravel Breeze (React + Inertia) starter kit을 사용하여 프로젝트를 생성하세요:

```bash
npx create laravel@latest . --breeze --stack=react --typescript=no
```

프로젝트 생성 후:
1. .env 파일에서 DB_CONNECTION=sqlite로 설정
2. database/database.sqlite 파일 생성
3. npm install 및 npm run dev 실행
4. php artisan migrate 실행

프로젝트가 정상적으로 설정되었는지 확인하고, Breeze 기본 인증 페이지(로그인/회원가입)가 작동하는지 테스트하세요.

기대 결과: Laravel 13.x + Breeze (React + Inertia) 프로젝트가 생성되고, 기본 인증 시스템이 작동합니다. SQLite 데이터베이스가 설정되고 마이그레이션이 완료됩니다.

2
Step 2
프로젝트(Project)와 마일스톤(Milestone) 모델 및 마이그레이션을 생성하세요.

**요구사항:**

1. Project 모델 생성:
```bash
php artisan make:model Project -m
```

마이그레이션 파일에 다음 컬럼 추가:
- title (string, 필수)
- description (text, nullable)
- start_date (date, 필수)
- end_date (date, 필수)
- user_id (foreignId, users 테이블 참조)
- is_archived (boolean, 기본값 false)
- timestamps

2. Milestone 모델 생성:
```bash
php artisan make:model Milestone -m
```

마이그레이션 파일에 다음 컬럼 추가:
- project_id (foreignId, projects 테이블 참조, onDelete cascade)
- title (string, 필수)
- description (text, nullable)
- due_date (date, 필수)
- status (enum: 'pending', 'in_progress', 'completed', 기본값 'pending')
- progress (integer, 0-100, 기본값 0)
- color (string, 기본값 '#3B82F6')
- order (integer, 정렬 순서용)
- timestamps

3. 모델 관계 설정:
- Project 모델: hasMany(Milestone::class), belongsTo(User::class)
- Milestone 모델: belongsTo(Project::class)

4. 마이그레이션 실행:
```bash
php artisan migrate
```

모델과 데이터베이스 구조가 올바르게 설정되었는지 확인하세요.

기대 결과: Project와 Milestone 모델이 생성되고, 데이터베이스 테이블이 올바른 관계와 컬럼으로 마이그레이션됩니다. 1:N 관계가 설정됩니다.

3
Step 3
프로젝트 목록 및 생성 기능을 구현하세요.

**요구사항:**

1. ProjectController 생성:
```bash
php artisan make:controller ProjectController
```

2. 라우트 설정 (routes/web.php):
```php
Route::middleware('auth')->group(function () {
    Route::get('/projects', [ProjectController::class, 'index'])->name('projects.index');
    Route::post('/projects', [ProjectController::class, 'store'])->name('projects.store');
    Route::get('/projects/{project}', [ProjectController::class, 'show'])->name('projects.show');
});
```

3. ProjectController 메서드 구현:
- index(): 현재 로그인한 사용자의 프로젝트 목록 조회 (is_archived = false만), Inertia::render('Projects/Index')로 전달
- store(): Request 유효성 검사 후 프로젝트 생성, 리다이렉트
- show(): 특정 프로젝트와 관련 마일스톤 조회(order 기준 정렬), Inertia::render('Projects/Show')로 전달

4. React 컴포넌트 생성 (resources/js/Pages/Projects/Index.jsx):
- 프로젝트 목록을 카드 형태로 표시
- 각 카드: 제목, 설명(일부), 시작일~종료일, 전체 진행률(마일스톤 평균)
- "새 프로젝트 만들기" 버튼 및 모달 폼
- Inertia form helper 사용하여 프로젝트 생성
- Tailwind CSS로 스타일링

5. 네비게이션 메뉴에 "프로젝트" 링크 추가 (resources/js/Layouts/AuthenticatedLayout.jsx)

프로젝트 목록 페이지와 생성 기능이 정상 작동하는지 테스트하세요.

기대 결과: 사용자가 로그인 후 프로젝트 목록 페이지(/projects)에 접근할 수 있고, 새 프로젝트를 생성할 수 있습니다. 카드 형태로 프로젝트가 표시됩니다.

4
Step 4
프로젝트 상세 페이지에 마일스톤 CRUD 기능을 구현하세요.

**요구사항:**

1. MilestoneController 생성:
```bash
php artisan make:controller MilestoneController
```

2. 라우트 설정 (routes/web.php):
```php
Route::middleware('auth')->group(function () {
    Route::post('/projects/{project}/milestones', [MilestoneController::class, 'store'])->name('milestones.store');
    Route::put('/milestones/{milestone}', [MilestoneController::class, 'update'])->name('milestones.update');
    Route::delete('/milestones/{milestone}', [MilestoneController::class, 'destroy'])->name('milestones.destroy');
});
```

3. MilestoneController 메서드 구현:
- store(): 마일스톤 생성, order는 기존 마일스톤 개수 + 1
- update(): 마일스톤 수정 (제목, 설명, 예정일, 상태, 진행률, 색상)
- destroy(): 마일스톤 삭제

4. React 컴포넌트 생성 (resources/js/Pages/Projects/Show.jsx):
- 프로젝트 정보 헤더 (제목, 설명, 기간, 전체 진행률 프로그레스 바)
- 마일스톤 목록을 리스트 형태로 표시
- 각 마일스톤: 제목, 예정일, 상태 배지, 진행률 프로그레스 바, 색상 인디케이터
- "마일스톤 추가" 버튼 및 폼
- 각 마일스톤에 수정/삭제 버튼
- Inertia form helper 사용

5. 마일스톤 컴포넌트 (resources/js/Components/Milestone.jsx) 분리:
- 재사용 가능한 마일스톤 카드 컴포넌트
- 상태에 따라 다른 색상 표시
- 진행률 프로그레스 바 포함

CRUD 기능이 정상 작동하는지 테스트하세요.

기대 결과: 프로젝트 상세 페이지에서 마일스톤을 추가, 수정, 삭제할 수 있습니다. 각 마일스톤의 정보가 카드 형태로 표시됩니다.

5
Step 5
타임라인 시각화 기능을 구현하세요.

**요구사항:**

1. date-fns 라이브러리 설치:
```bash
npm install date-fns
```

2. Timeline 컴포넌트 생성 (resources/js/Components/Timeline.jsx):
- 수평 타임라인 레이아웃
- 프로젝트 시작일~종료일을 기준으로 타임라인 생성
- 각 마일스톤을 예정일 기준으로 타임라인에 배치
- 현재 날짜를 표시하는 "Today" 마커 (빨간 세로선)
- 마일스톤 노드: 원형 아이콘, 제목, 예정일, 진행률 표시
- 완료된 마일스톤은 체크 아이콘으로 표시
- 지연된 마일스톤(예정일 지났는데 미완료)은 경고 색상

3. 날짜 계산 로직:
- date-fns의 differenceInDays, format, isAfter, isBefore 등 활용
- 타임라인 상에서 마일스톤 위치 계산 (퍼센트)

4. Projects/Show.jsx에 Timeline 컴포넌트 추가:
- 마일스톤 목록 위에 타임라인 뷰 표시
- "타임라인 뷰" / "리스트 뷰" 토글 버튼 추가

5. 반응형 디자인:
- 데스크톱: 수평 타임라인
- 모바일(768px 이하): 세로 타임라인으로 자동 전환

타임라인이 시각적으로 표시되고, 날짜 계산이 정확한지 테스트하세요.

기대 결과: 프로젝트 상세 페이지에 수평 타임라인이 표시되고, 각 마일스톤이 날짜 기준으로 배치됩니다. 현재 날짜 마커와 진행률이 시각적으로 표현됩니다.

6
Step 6
드래그 앤 드롭으로 마일스톤 순서 변경 기능을 구현하세요.

**요구사항:**

1. @hello-pangea/dnd 라이브러리 설치:
```bash
npm install @hello-pangea/dnd
```

2. 마일스톤 순서 변경 라우트 추가 (routes/web.php):
```php
Route::put('/projects/{project}/milestones/reorder', [MilestoneController::class, 'reorder'])->name('milestones.reorder');
```

3. MilestoneController에 reorder 메서드 추가:
- Request에서 milestones 배열 받기 (id와 새로운 order)
- 각 마일스톤의 order 컬럼 업데이트

4. Projects/Show.jsx에 DragDropContext, Droppable, Draggable 적용:
- 마일스톤 리스트를 드래그 가능하게 만들기
- onDragEnd 핸들러에서 순서 변경 로직 구현
- Inertia router.put()으로 서버에 순서 저장

5. 드래그 중 시각적 피드백:
- 드래그 중인 아이템 스타일 변경
- 드롭 가능 영역 하이라이트

6. 타임라인 뷰에서는 드래그 비활성화 (리스트 뷰에서만 가능)

드래그 앤 드롭으로 마일스톤 순서를 변경하고, 새로고침 후에도 순서가 유지되는지 테스트하세요.

기대 결과: 리스트 뷰에서 마일스톤을 드래그 앤 드롭으로 순서 변경할 수 있고, 변경된 순서가 데이터베이스에 저장됩니다.

7
Step 7
진행률 대시보드 및 통계 기능을 구현하세요.

**요구사항:**

1. Dashboard 컴포넌트 생성 (resources/js/Components/ProjectDashboard.jsx):
- 프로젝트 전체 진행률 계산 (모든 마일스톤 진행률 평균)
- 원형 프로그레스 바로 전체 진행률 표시
- 통계 카드:
  - 전체 마일스톤 개수
  - 완료된 마일스톤 개수
  - 진행중인 마일스톤 개수
  - 예정된 마일스톤 개수
  - 지연된 마일스톤 개수 (예정일 지났는데 미완료)
- 각 통계는 아이콘과 함께 카드 형태로 표시

2. Projects/Show.jsx에 Dashboard 컴포넌트 추가:
- 페이지 상단에 대시보드 배치
- Tailwind CSS로 그리드 레이아웃 구성

3. 지연 경고 표시:
- 지연된 마일스톤이 있으면 경고 배너 표시
- 지연된 마일스톤 목록 표시

4. 프로젝트 완료율에 따른 시각적 피드백:
- 100% 완료 시 축하 메시지
- 50% 이상 시 격려 메시지

대시보드가 정확한 통계를 표시하는지 테스트하세요.

기대 결과: 프로젝트 상세 페이지 상단에 진행률 대시보드가 표시되고, 마일스톤 통계가 실시간으로 계산됩니다. 지연된 마일스톤에 대한 경고가 표시됩니다.

8
Step 8
마일스톤 필터링 및 검색 기능을 추가하세요.

**요구사항:**

1. Projects/Show.jsx에 필터 UI 추가:
- 상태별 필터 버튼 (전체/예정/진행중/완료)
- 검색 입력 필드 (마일스톤 제목 검색)
- 날짜 범위 필터 (시작일~종료일)

2. 클라이언트 사이드 필터링 로직:
- useState로 필터 상태 관리
- useMemo로 필터링된 마일스톤 목록 계산
- 검색어, 상태, 날짜 범위를 모두 고려한 필터링

3. 필터 적용 시 타임라인과 리스트 모두 업데이트:
- 필터링된 마일스톤만 표시
- 필터 개수 표시 (예: "5개 중 3개 표시")

4. 필터 초기화 버튼:
- 모든 필터를 기본값으로 리셋

5. URL 쿼리 파라미터로 필터 상태 유지 (선택):
- Inertia router를 사용하여 필터 상태를 URL에 반영
- 페이지 새로고침 후에도 필터 유지

필터링과 검색이 정상 작동하는지 테스트하세요.

기대 결과: 프로젝트 상세 페이지에서 마일스톤을 상태별, 검색어, 날짜 범위로 필터링할 수 있습니다. 필터 적용 시 타임라인과 리스트가 즉시 업데이트됩니다.

제출된 작품 (0)

로그인 후 제출

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

댓글 (0)

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