팀 문서 공동 편집기 - 버전 히스토리 & 실시간 알림 - 바이브코딩 레시피
중급 PHP + JavaScript Laravel + React + Inertia.js AI: Claude

팀 문서 공동 편집기 - 버전 히스토리 & 실시간 알림

리포지토리명 team-document-collaborative-editor
조회수 82 1건 제출

문제 설명

프로젝트 개요

팀원들이 함께 문서를 작성하고 편집할 수 있는 협업 문서 편집 시스템입니다. Laravel 13.x + Inertia.js + React 19를 활용한 모노리스 풀스택 구조로, 문서의 모든 변경 이력을 추적하고 버전별로 되돌릴 수 있습니다.

필수 기능

  • 문서 CRUD: 제목, 내용(Markdown 지원), 작성자 정보를 포함한 문서 생성/수정/삭제
  • 버전 히스토리: 문서 수정 시마다 스냅샷 저장, 버전 목록 조회 및 특정 버전으로 복원
  • 문서 목록: 최근 수정순, 작성자별 필터링, 검색 기능
  • 수정 알림: 문서가 수정되면 해당 문서를 보고 있던 사용자에게 알림 표시 (폴링 방식)
  • Markdown 프리뷰: 실시간 마크다운 렌더링 및 편집 화면 토글

선택 추가 기능 (보너스)

  • 문서별 댓글 시스템
  • 버전 간 Diff 비교 UI
  • 문서 즐겨찾기/북마크
  • 문서 공유 링크 생성 (읽기 전용)
  • 태그 기반 문서 분류

기술 스택

  • 백엔드: Laravel 13.x (Eloquent ORM, 마이그레이션)
  • 프론트엔드: React 19 (useState, useEffect, 컴포넌트 분리)
  • 풀스택 연결: Inertia.js (Laravel 라우트 ↔ React 페이지 컴포넌트)
  • 스타일링: Tailwind CSS
  • DB: SQLite (개발 환경)

이 프로젝트를 통해 Laravel 컨트롤러에서 Inertia::render()로 데이터를 전달하는 방식, React 컴포넌트 구조 설계, 그리고 버전 관리 로직 구현 방법을 익힐 수 있습니다.

제약 조건

  • • Laravel 13.x 필수 사용
  • • React 19 필수 사용
  • • Inertia.js로 Laravel과 React 연결 (별도 API 라우트 없음)
  • • Laravel Breeze (React + Inertia) starter kit 사용 권장
  • • SQLite 데이터베이스 사용
  • • Tailwind CSS로 스타일링
  • • 문서 버전은 별도 테이블(document_versions)에 저장
  • • Markdown 렌더링은 react-markdown 라이브러리 활용
  • • 실시간 알림은 폴링 방식(5초 간격)으로 구현
  • • 모든 라우트는 web.php에 정의하고 Inertia::render()로 React 컴포넌트 반환

프롬프트 레시피

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

1
Step 1
mkdir team-document-collaborative-editor && cd team-document-collaborative-editor

이 폴더에서 Laravel 13.x + Inertia.js + React 19 프로젝트를 생성합니다.

다음 작업을 수행해주세요:

1. Laravel Breeze (React + Inertia) starter kit으로 프로젝트 초기화
   - `composer create-project laravel/laravel . "13.*"`
   - `composer require laravel/breeze --dev`
   - `php artisan breeze:install react --inertia`
   - `npm install`

2. .env 파일 설정
   - DB_CONNECTION=sqlite
   - DB_DATABASE=database/database.sqlite 경로 설정
   - database/database.sqlite 파일 생성

3. 기본 마이그레이션 실행
   - `php artisan migrate`

4. 개발 서버 실행 확인
   - `php artisan serve` (백엔드)
   - `npm run dev` (프론트엔드)
   - 브라우저에서 localhost:8000 접속하여 Laravel Breeze 기본 화면 확인

5. 프로젝트 구조 확인
   - app/Http/Controllers/ (Laravel 컨트롤러)
   - resources/js/Pages/ (React 페이지 컴포넌트)
   - routes/web.php (라우트 정의)

모든 설정이 완료되면 "Laravel + Inertia + React 프로젝트 초기화 완료" 메시지를 출력해주세요.

기대 결과: Laravel 13.x + Breeze + Inertia + React 19 프로젝트가 생성되고, SQLite 데이터베이스가 설정되며, 개발 서버가 정상 작동합니다. 기본 인증 화면(로그인/회원가입)이 표시됩니다.

2
Step 2
문서(Document)와 버전(DocumentVersion) 모델 및 마이그레이션을 생성합니다.

다음 작업을 수행해주세요:

1. Document 모델 및 마이그레이션 생성
   - `php artisan make:model Document -m`
   - 마이그레이션 파일에 다음 컬럼 추가:
     - title (string, 255)
     - content (text, nullable)
     - user_id (foreignId, users 테이블 참조, onDelete cascade)
     - last_edited_at (timestamp, nullable)
     - timestamps

2. DocumentVersion 모델 및 마이그레이션 생성
   - `php artisan make:model DocumentVersion -m`
   - 마이그레이션 파일에 다음 컬럼 추가:
     - document_id (foreignId, documents 테이블 참조, onDelete cascade)
     - version_number (integer)
     - title (string, 255)
     - content (text, nullable)
     - user_id (foreignId, users 테이블 참조)
     - timestamps

3. 모델 관계 설정
   - Document 모델:
     - belongsTo(User::class)
     - hasMany(DocumentVersion::class)
   - DocumentVersion 모델:
     - belongsTo(Document::class)
     - belongsTo(User::class)

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

5. Document 모델에 fillable 속성 추가
   - ['title', 'content', 'user_id', 'last_edited_at']

6. DocumentVersion 모델에 fillable 속성 추가
   - ['document_id', 'version_number', 'title', 'content', 'user_id']

완료되면 "Document 및 DocumentVersion 모델 생성 완료" 메시지를 출력해주세요.

기대 결과: documents와 document_versions 테이블이 생성되고, Document와 DocumentVersion 모델에 관계가 설정됩니다. 데이터베이스 스키마가 준비됩니다.

3
Step 3
문서 목록 및 생성 기능을 구현합니다.

다음 작업을 수행해주세요:

1. DocumentController 생성
   - `php artisan make:controller DocumentController`

2. DocumentController에 index 메서드 구현
   - 로그인한 사용자의 모든 문서를 최근 수정순(last_edited_at desc)으로 조회
   - 검색어(query 파라미터)가 있으면 제목으로 필터링
   - Inertia::render('Documents/Index', ['documents' => $documents]) 반환

3. DocumentController에 create 메서드 구현
   - Inertia::render('Documents/Create') 반환

4. DocumentController에 store 메서드 구현
   - 요청 검증: title(required, max:255), content(nullable)
   - Document 생성 (user_id는 auth()->id(), last_edited_at은 now())
   - 첫 번째 버전(version_number = 1)을 DocumentVersion에 저장
   - 문서 목록으로 리다이렉트

5. routes/web.php에 라우트 추가
   - Route::middleware('auth')->group(function () {
       Route::get('/documents', [DocumentController::class, 'index'])->name('documents.index');
       Route::get('/documents/create', [DocumentController::class, 'create'])->name('documents.create');
       Route::post('/documents', [DocumentController::class, 'store'])->name('documents.store');
     });

6. React 페이지 컴포넌트 생성
   - resources/js/Pages/Documents/Index.jsx
     - 문서 목록을 테이블로 표시 (제목, 최종 수정일, 작성자)
     - 검색 입력 필드 (Inertia.get()으로 검색)
     - "새 문서 작성" 버튼 (Inertia.visit('/documents/create'))
   - resources/js/Pages/Documents/Create.jsx
     - 제목, 내용 입력 폼
     - Inertia.post('/documents', data)로 제출
     - Tailwind CSS로 스타일링

7. 네비게이션 메뉴에 "문서" 링크 추가
   - resources/js/Layouts/AuthenticatedLayout.jsx에 문서 목록 링크 추가

완료되면 "문서 목록 및 생성 기능 구현 완료" 메시지를 출력해주세요.

기대 결과: 로그인 후 /documents 경로에서 문서 목록을 확인할 수 있고, 새 문서를 작성하여 저장할 수 있습니다. 문서 생성 시 첫 번째 버전이 자동으로 저장됩니다.

4
Step 4
문서 상세 조회 및 편집 기능을 구현합니다.

다음 작업을 수행해주세요:

1. DocumentController에 show 메서드 구현
   - Document와 user, versions 관계를 eager load하여 조회
   - Inertia::render('Documents/Show', ['document' => $document]) 반환

2. DocumentController에 edit 메서드 구현
   - Document 조회 (작성자 본인만 수정 가능하도록 검증)
   - Inertia::render('Documents/Edit', ['document' => $document]) 반환

3. DocumentController에 update 메서드 구현
   - 요청 검증: title(required, max:255), content(nullable)
   - 기존 문서의 최신 버전 번호 조회
   - 새 버전(version_number + 1)을 DocumentVersion에 저장
   - Document의 title, content, last_edited_at 업데이트
   - 문서 상세 페이지로 리다이렉트

4. routes/web.php에 라우트 추가
   - Route::get('/documents/{document}', [DocumentController::class, 'show'])->name('documents.show');
   - Route::get('/documents/{document}/edit', [DocumentController::class, 'edit'])->name('documents.edit');
   - Route::put('/documents/{document}', [DocumentController::class, 'update'])->name('documents.update');

5. React 페이지 컴포넌트 생성
   - resources/js/Pages/Documents/Show.jsx
     - 문서 제목, 내용(Markdown 렌더링), 작성자, 최종 수정일 표시
     - react-markdown 라이브러리 설치 및 사용 (`npm install react-markdown`)
     - "편집" 버튼 (작성자 본인만 표시)
     - "목록으로" 버튼
   - resources/js/Pages/Documents/Edit.jsx
     - 제목, 내용 입력 폼 (기존 값 pre-fill)
     - Markdown 프리뷰 토글 버튼 (useState로 프리뷰 모드 관리)
     - Inertia.put(`/documents/${document.id}`, data)로 제출
     - Tailwind CSS로 스타일링

6. Documents/Index.jsx 수정
   - 문서 제목 클릭 시 상세 페이지로 이동 (Inertia.visit())

완료되면 "문서 상세 조회 및 편집 기능 구현 완료" 메시지를 출력해주세요.

기대 결과: 문서 목록에서 문서를 클릭하면 상세 페이지로 이동하고, Markdown 형식의 내용이 렌더링됩니다. 작성자는 편집 버튼을 눌러 문서를 수정할 수 있으며, 수정 시 새 버전이 자동으로 생성됩니다. 편집 화면에서 Markdown 프리뷰를 토글할 수 있습니다.

5
Step 5
버전 히스토리 조회 및 복원 기능을 구현합니다.

다음 작업을 수행해주세요:

1. DocumentController에 versions 메서드 구현
   - Document의 모든 버전을 최신순으로 조회 (user 관계 포함)
   - Inertia::render('Documents/Versions', ['document' => $document, 'versions' => $versions]) 반환

2. DocumentController에 restore 메서드 구현
   - 특정 버전(DocumentVersion)을 조회
   - 해당 버전의 title, content를 Document에 반영
   - 새 버전(복원 버전)을 DocumentVersion에 저장
   - last_edited_at 업데이트
   - 문서 상세 페이지로 리다이렉트 ("버전 X로 복원되었습니다" 플래시 메시지)

3. routes/web.php에 라우트 추가
   - Route::get('/documents/{document}/versions', [DocumentController::class, 'versions'])->name('documents.versions');
   - Route::post('/documents/{document}/versions/{version}/restore', [DocumentController::class, 'restore'])->name('documents.versions.restore');

4. React 페이지 컴포넌트 생성
   - resources/js/Pages/Documents/Versions.jsx
     - 버전 목록을 카드 형태로 표시 (버전 번호, 수정 시간, 수정자)
     - 각 버전 클릭 시 해당 버전의 title, content 프리뷰 표시 (모달 또는 아코디언)
     - "이 버전으로 복원" 버튼 (Inertia.post()로 복원 요청)
     - 현재 버전 표시 (최신 버전 강조)
     - Tailwind CSS로 스타일링

5. Documents/Show.jsx 수정
   - "버전 히스토리" 버튼 추가 (Inertia.visit('/documents/{id}/versions'))

6. 플래시 메시지 표시
   - resources/js/Layouts/AuthenticatedLayout.jsx에 flash 메시지 표시 로직 추가
   - Laravel 세션 flash('success', '메시지')를 Inertia props로 전달

완료되면 "버전 히스토리 조회 및 복원 기능 구현 완료" 메시지를 출력해주세요.

기대 결과: 문서 상세 페이지에서 버전 히스토리 버튼을 클릭하면 모든 버전 목록이 표시됩니다. 각 버전을 클릭하여 내용을 미리보고, 특정 버전으로 복원할 수 있습니다. 복원 시 새 버전이 생성되며 플래시 메시지가 표시됩니다.

6
Step 6
문서 수정 알림 및 삭제 기능을 구현하여 프로젝트를 완성합니다.

다음 작업을 수행해주세요:

1. 문서 삭제 기능 구현
   - DocumentController에 destroy 메서드 추가
     - Document 및 관련 버전 삭제 (onDelete cascade로 자동 처리)
     - 문서 목록으로 리다이렉트
   - routes/web.php에 라우트 추가
     - Route::delete('/documents/{document}', [DocumentController::class, 'destroy'])->name('documents.destroy');
   - Documents/Show.jsx에 "삭제" 버튼 추가 (작성자만 표시, 확인 다이얼로그 포함)

2. 문서 수정 알림 기능 구현 (폴링 방식)
   - DocumentController에 checkUpdates 메서드 추가
     - 클라이언트가 마지막으로 확인한 시간(last_check) 이후 수정된 문서 목록 반환
     - JSON 응답: { updated_documents: [{id, title, last_edited_at}] }
   - routes/web.php에 라우트 추가
     - Route::get('/documents/check-updates', [DocumentController::class, 'checkUpdates'])->name('documents.checkUpdates');
   - Documents/Show.jsx 수정
     - useEffect로 5초마다 fetch('/documents/check-updates?last_check={timestamp}') 호출
     - 현재 보고 있는 문서가 수정되었으면 상단에 알림 배너 표시 ("이 문서가 수정되었습니다. 새로고침하시겠습니까?")
     - 새로고침 버튼 클릭 시 페이지 리로드 (Inertia.reload())

3. 검색 기능 개선
   - Documents/Index.jsx에 검색 입력 필드 추가
   - 입력값 변경 시 debounce 처리 (lodash.debounce 사용)
   - Inertia.get('/documents', { query: searchTerm }, { preserveState: true })로 검색

4. UI/UX 개선
   - 문서 목록에 페이지네이션 추가 (Laravel paginate() + Inertia Links)
   - 버튼 hover 효과, 로딩 상태 표시
   - 반응형 디자인 (모바일/태블릿 대응)

5. README.md 작성
   - 프로젝트 개요, 기능 목록, 설치 방법, 실행 방법 작성
   - 스크린샷 추가 (선택)

6. 최종 테스트
   - 문서 생성/수정/삭제 동작 확인
   - 버전 히스토리 및 복원 동작 확인
   - 알림 폴링 동작 확인
   - 검색 기능 확인

완료되면 "팀 문서 공동 편집기 프로젝트 완성" 메시지를 출력하고, 주요 기능 및 접근 URL을 요약해주세요.

기대 결과: 문서 삭제 기능이 추가되고, 문서 수정 시 다른 사용자에게 알림이 표시됩니다. 검색 기능이 개선되고 페이지네이션이 적용됩니다. 프로젝트가 완성되어 모든 필수 기능이 정상 작동합니다.

제출된 작품 (1)

로그인 후 제출

팀 문서 공동 편집기

리자
리자
· Claude Code

버전 히스토리 관리와 실시간 알림 기능을 제공하는 협업 문서 편집 플랫폼

조회수 156 댓글수 1 추천수 0

댓글 (0)

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