실시간 협업 칸반 보드 with WebSocket
realtime-kanban-board-laravel
문제 설명
프로젝트 개요
Laravel 12.x와 WebSocket(Laravel Reverb)을 활용하여 여러 사용자가 실시간으로 협업할 수 있는 칸반 보드 시스템을 구축합니다. 드래그 앤 드롭으로 카드를 이동하면 모든 접속자에게 즉시 반영되며, 누가 어떤 작업을 하고 있는지 실시간으로 확인할 수 있습니다.
필수 기능
- 사용자 인증: Laravel Breeze 또는 Jetstream을 사용한 회원가입/로그인
- 보드 관리: 여러 개의 보드 생성, 수정, 삭제 (CRUD)
- 컬럼 관리: 보드 내 컬럼(Todo, In Progress, Done 등) 생성, 수정, 삭제, 순서 변경
- 카드 관리: 컬럼 내 카드 생성, 수정, 삭제, 담당자 지정, 우선순위 설정
- 실시간 동기화: Laravel Reverb(WebSocket)를 사용하여 카드 이동, 생성, 수정 시 모든 사용자에게 즉시 반영
- 드래그 앤 드롭: 카드를 컬럼 간 이동 및 순서 변경
- 활동 로그: 누가 언제 무엇을 변경했는지 기록
- 실시간 사용자 현황: 현재 보드를 보고 있는 사용자 표시
보너스 기능
- 카드 상세 모달에서 댓글 기능 (실시간 업데이트)
- 카드에 라벨/태그 추가 및 필터링
- 카드 검색 및 정렬 기능
- 보드 멤버 초대 및 권한 관리 (Owner, Editor, Viewer)
- 카드 마감일 설정 및 알림
- 다크 모드 지원
- 카드 첨부파일 업로드 (AWS S3 연동)
기술 스택
- Backend: Laravel 12.x, Laravel Reverb (WebSocket), MySQL 8.0+
- Frontend: Blade + Alpine.js + Livewire 3.x (또는 Inertia.js + Vue 3/React 19)
- 드래그 앤 드롭: Sortable.js
- 실시간 통신: Laravel Echo + Pusher Protocol
- 인증: Laravel Breeze/Jetstream
제약 조건
- • Laravel 12.x 최신 버전 사용 필수
- • Laravel Reverb를 사용한 WebSocket 구현 (Pusher 대신)
- • MySQL 8.0 이상 사용
- • RESTful API 설계 원칙 준수
- • Repository Pattern 또는 Service Layer 적용
- • Laravel Pint로 코드 스타일 통일
- • PHPUnit 테스트 코드 작성 (최소 주요 기능)
- • Eloquent Relationship 적절히 활용
- • Database Transaction 처리
- • N+1 쿼리 문제 해결 (Eager Loading)
- • Frontend는 Livewire 3.x 또는 Inertia.js 중 선택
- • 반응형 디자인 (Tailwind CSS 사용 권장)
- • Git commit 메시지 컨벤션 준수
프롬프트 레시피
아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
Laravel 12.x 프로젝트를 생성하고 기본 설정을 완료해주세요. 요구사항: 1. 프로젝트명: realtime-kanban-board 2. Laravel Breeze 설치 (Blade + Alpine.js 스택) 3. Tailwind CSS 설정 완료 4. MySQL 데이터베이스 연결 (.env 파일 설정 가이드 포함) 5. 기본 인증 시스템 구축 (회원가입, 로그인, 로그아웃) 6. 다음 모델과 마이그레이션 파일 생성: - Board (보드): id, user_id, title, description, timestamps - Column (컬럼): id, board_id, title, position, timestamps - Card (카드): id, column_id, title, description, assigned_user_id, priority, position, due_date, timestamps - Activity (활동 로그): id, board_id, user_id, action, target_type, target_id, metadata(json), timestamps 7. 모델 간 관계 설정: - Board hasMany Columns, hasMany Cards, belongsTo User - Column hasMany Cards, belongsTo Board - Card belongsTo Column, belongsTo User (assigned) 8. Database Seeder 작성 (테스트용 더미 데이터) 9. README.md에 설치 및 실행 방법 작성 실행 후 `php artisan migrate:fresh --seed`로 확인 가능해야 합니다.
기대 결과: Laravel 프로젝트 기본 구조 완성, 인증 시스템 작동, 데이터베이스 마이그레이션 완료, 테스트 데이터 삽입 완료. 브라우저에서 회원가입/로그인이 정상 작동해야 함.
보드 관리 기능을 구현해주세요.
요구사항:
1. BoardController 생성 (Resource Controller)
2. 라우트 설정:
- GET /boards - 내 보드 목록
- GET /boards/create - 보드 생성 폼
- POST /boards - 보드 저장
- GET /boards/{board} - 보드 상세 (칸반 보드 화면)
- GET /boards/{board}/edit - 보드 수정 폼
- PUT /boards/{board} - 보드 업데이트
- DELETE /boards/{board} - 보드 삭제
3. Blade 뷰 파일:
- boards/index.blade.php: 보드 목록 (카드 형태로 표시)
- boards/create.blade.php: 보드 생성 폼
- boards/show.blade.php: 칸반 보드 메인 화면 (아직 빈 화면)
- boards/edit.blade.php: 보드 수정 폼
4. Policy 생성: BoardPolicy (본인이 만든 보드만 수정/삭제 가능)
5. Form Request Validation: StoreBoardRequest, UpdateBoardRequest
6. 보드 목록에서 각 보드의 카드 개수 표시
7. Tailwind CSS로 깔끔한 UI 구현
모든 기능은 인증된 사용자만 접근 가능해야 합니다.
기대 결과: 보드 CRUD 기능 완성. 사용자가 보드를 생성/수정/삭제할 수 있고, 보드 목록에서 자신의 보드만 볼 수 있음. 권한 검증 작동 확인.
컬럼과 카드 관리 기능을 구현해주세요.
요구사항:
1. ColumnController와 CardController 생성 (API Controller)
2. API 라우트 설정 (/api/boards/{board}/...):
- POST /columns - 컬럼 생성
- PUT /columns/{column} - 컬럼 수정
- DELETE /columns/{column} - 컬럼 삭제
- POST /columns/{column}/reorder - 컬럼 순서 변경
- POST /columns/{column}/cards - 카드 생성
- PUT /cards/{card} - 카드 수정
- DELETE /cards/{card} - 카드 삭제
- POST /cards/{card}/move - 카드 이동 (컬럼 간 이동 및 순서 변경)
3. boards/show.blade.php 완성:
- 보드 제목과 설명 표시
- 컬럼들을 가로로 나열 (스크롤 가능)
- 각 컬럼 내 카드들을 세로로 나열
- "+ 컬럼 추가" 버튼
- 각 컬럼에 "+ 카드 추가" 버튼
4. Alpine.js로 인터랙션 구현:
- 컬럼 추가 모달
- 카드 추가/수정 모달 (제목, 설명, 담당자, 우선순위, 마감일)
- 카드 클릭 시 상세 정보 모달
5. Sortable.js 통합:
- 카드 드래그 앤 드롭으로 컬럼 간 이동
- 카드 순서 변경
- 컬럼 순서 변경
6. Form Request Validation 추가
7. N+1 쿼리 방지 (Eager Loading 적용)
JSON 응답 형식 통일 (success, message, data 포함)
기대 결과: 칸반 보드 기본 기능 완성. 컬럼과 카드를 생성/수정/삭제할 수 있고, 드래그 앤 드롭으로 카드를 이동할 수 있음. 모달 UI 작동 확인.
Laravel Reverb를 설치하고 실시간 동기화 기능을 구현해주세요.
요구사항:
1. Laravel Reverb 설치 및 설정:
```bash
php artisan install:broadcasting
```
2. .env 파일에 Reverb 설정 추가
3. Laravel Echo 프론트엔드 설정 (resources/js/echo.js)
4. Broadcasting Event 생성:
- CardMoved: 카드 이동 시
- CardCreated: 카드 생성 시
- CardUpdated: 카드 수정 시
- CardDeleted: 카드 삭제 시
- ColumnCreated: 컬럼 생성 시
- ColumnUpdated: 컬럼 수정 시
- ColumnDeleted: 컬럼 삭제 시
5. 각 이벤트는 PrivateChannel 사용 (board.{boardId})
6. Controller에서 작업 완료 후 이벤트 브로드캐스트
7. 프론트엔드에서 Echo로 이벤트 수신:
- 카드 이동 시 DOM 업데이트 (애니메이션 포함)
- 카드/컬럼 생성 시 추가
- 카드/컬럼 삭제 시 제거
- 카드 수정 시 내용 업데이트
8. 채널 인증 설정 (routes/channels.php)
9. 실시간 동기화 테스트 가이드 작성
Reverb 서버 실행: `php artisan reverb:start`
기대 결과: 실시간 동기화 작동. 여러 브라우저 창을 열어 테스트 시, 한 창에서 카드를 이동하면 다른 창에도 즉시 반영됨. WebSocket 연결 상태 확인 가능.
활동 로그와 실시간 사용자 현황 기능을 구현해주세요.
요구사항:
1. ActivityService 생성:
- 모든 보드 작업(생성, 수정, 삭제, 이동)을 Activity 테이블에 기록
- logActivity($board, $action, $targetType, $targetId, $metadata) 메서드
2. Controller에서 ActivityService 호출
3. boards/show.blade.php에 활동 로그 사이드바 추가:
- 최근 활동 20개 표시
- 사용자 이름, 액션, 시간 표시
- 실시간 업데이트 (ActivityLogged 이벤트)
4. 실시간 사용자 현황:
- Laravel Presence Channel 사용 (presence-board.{boardId})
- 현재 보드를 보고 있는 사용자 목록 표시 (우측 상단)
- 사용자 아바타 또는 이니셜 표시
- 사용자가 페이지를 떠나면 목록에서 제거
5. Presence Channel 설정:
- routes/channels.php에 인증 로직
- 프론트엔드에서 Echo.join() 사용
- here(), joining(), leaving() 이벤트 처리
6. 활동 로그 필터링 기능 (전체/카드/컬럼)
활동 로그 예시: "홍길동님이 '백엔드 개발' 카드를 'In Progress'로 이동했습니다. (2분 전)"
기대 결과: 활동 로그가 실시간으로 업데이트되고, 현재 보드를 보고 있는 사용자 목록이 실시간으로 표시됨. 여러 사용자가 동시에 접속 시 서로의 존재를 확인 가능.
고급 기능과 성능 최적화를 구현해주세요. 요구사항: 1. 카드 검색 기능: - 보드 내 전체 카드 검색 (제목, 설명) - Laravel Scout + Database Driver 사용 - 검색 결과 하이라이팅 2. 카드 필터링: - 담당자별 필터 - 우선순위별 필터 (High, Medium, Low) - 마감일별 필터 (오늘, 이번 주, 지난 마감일) 3. 보드 멤버 관리: - BoardMember 모델 및 마이그레이션 (board_id, user_id, role) - 역할: owner, editor, viewer - 멤버 초대 기능 (이메일로 검색) - 권한에 따른 기능 제한 (viewer는 읽기만 가능) 4. 성능 최적화: - 카드 목록 조회 시 Eager Loading 적용 - 보드 목록에 캐싱 적용 (Redis) - Database Indexing (board_id, column_id, position 등) - 페이지네이션 또는 무한 스크롤 (카드가 많을 경우) 5. 카드 댓글 기능: - Comment 모델 (card_id, user_id, content, timestamps) - 카드 상세 모달에서 댓글 작성/삭제 - 댓글 실시간 업데이트 (CommentCreated 이벤트) 6. 알림 기능: - 카드에 할당되었을 때 알림 - 마감일 임박 알림 (Laravel Queue + Scheduler) - 댓글이 달렸을 때 알림 7. 다크 모드 토글 (Tailwind CSS dark: 클래스 활용) Redis 설정 필요: CACHE_DRIVER=redis, QUEUE_CONNECTION=redis
기대 결과: 모든 고급 기능 작동. 검색/필터링이 빠르고 정확하게 작동하며, 멤버 권한 관리가 제대로 적용됨. 성능 최적화로 대량의 카드도 부드럽게 처리.
테스트 코드 작성과 배포 준비를 완료해주세요.
요구사항:
1. PHPUnit 테스트 작성:
- Feature 테스트:
* BoardControllerTest: 보드 CRUD 테스트
* CardControllerTest: 카드 이동, 생성, 수정, 삭제 테스트
* AuthorizationTest: 권한 검증 테스트
* RealtimeTest: WebSocket 이벤트 브로드캐스팅 테스트
- Unit 테스트:
* ActivityServiceTest: 활동 로그 기록 테스트
* CardMovementTest: 카드 이동 로직 테스트
2. Laravel Pint 실행하여 코드 스타일 통일:
```bash
./vendor/bin/pint
```
3. 환경 변수 예시 파일 (.env.example) 업데이트
4. Docker 설정 (선택):
- docker-compose.yml (PHP, MySQL, Redis, Reverb)
- Dockerfile
5. 배포 가이드 작성 (README.md):
- 로컬 개발 환경 설정
- Reverb 서버 실행 방법
- Queue Worker 실행 방법
- 프로덕션 배포 체크리스트
6. API 문서화:
- Postman Collection 또는 OpenAPI (Swagger) 문서
7. 성능 테스트:
- Laravel Telescope 설치하여 쿼리 분석
- N+1 쿼리 문제 최종 확인
8. 보안 점검:
- CSRF 토큰 검증
- XSS 방지
- SQL Injection 방지 (Eloquent 사용)
- Rate Limiting 설정
테스트 실행: `php artisan test --parallel`
기대 결과: 모든 테스트 통과. 코드 품질이 높고 배포 준비 완료. README.md에 명확한 설치 및 실행 가이드 제공. Docker로 쉽게 실행 가능.
UI/UX 개선 및 최종 마무리를 해주세요. 요구사항: 1. 애니메이션 추가: - 카드 이동 시 부드러운 전환 효과 - 모달 열기/닫기 애니메이션 - 로딩 스피너 (API 호출 중) - 토스트 알림 (성공/실패 메시지) 2. 반응형 디자인 완성: - 모바일 화면에서 컬럼을 세로로 스택 - 터치 제스처 지원 (모바일 드래그 앤 드롭) - 햄버거 메뉴 (모바일) 3. 접근성 개선: - ARIA 라벨 추가 - 키보드 네비게이션 지원 - 포커스 상태 표시 4. 에러 처리: - 네트워크 에러 시 사용자 친화적 메시지 - WebSocket 연결 끊김 시 재연결 로직 - 폼 유효성 검사 에러 표시 5. 온보딩 경험: - 첫 방문 사용자를 위한 튜토리얼 (선택) - 빈 상태 UI (보드가 없을 때, 카드가 없을 때) 6. 설정 페이지: - 프로필 수정 - 알림 설정 - 테마 설정 (다크/라이트) 7. 내보내기 기능: - 보드를 JSON으로 내보내기 - 보드를 Markdown으로 내보내기 8. 최종 점검: - 모든 기능 크로스 브라우저 테스트 - 성능 프로파일링 (Lighthouse) - SEO 메타 태그 추가 - 파비콘 및 앱 아이콘 추가 Lighthouse 점수 목표: Performance 90+, Accessibility 95+
기대 결과: 완성도 높은 프로덕션 레벨의 칸반 보드 애플리케이션. 모든 기능이 부드럽게 작동하고, 사용자 경험이 우수함. 모바일에서도 완벽하게 작동.
제출된 작품 (2)
로그인 후 제출댓글 (1)
바이브코딩 시간만 2~3시간 정도 해야 완성도 있는 결과물을 볼 수 있습니다. 제출된 작품에 올린 소스는 마지막단계(8step) 까지 바이브코딩 했는데 완벽하지 않습니다. 참고하시라고 올려 둡니다.