# 회의록 + TODO 기능 작업계획서 > 작성일: 2026-01-10 > 예상 기간: 5~7일 > 우선순위: 1 (가장 쉬움) --- ## 1. 기능 개요 ### 1.1 핵심 컨셉 - 두서없이 작성한 회의 내용을 AI가 주제별로 정리 - 결정/미결정 사항 자동 분류 - 미결정 사항 중 액션 필요한 것을 TODO로 추출 - TODO는 "언젠가 할 일" / "검토 필요한 것" / "보류된 것" 성격 ### 1.2 회의록 유형 | 유형 | 설명 | |:---:|------| | 프로젝트 회의 | 특정 프로젝트에 종속 | | 내부업무 회의 | 프로젝트 무관 (일반 내부 회의) | --- ## 2. 데이터 모델 ### 2.1 회의록 테이블 (wr_meeting) ```sql CREATE TABLE wr_meeting ( meeting_id SERIAL PRIMARY KEY, -- 기본 정보 meeting_title VARCHAR(200) NOT NULL, -- 회의 제목 meeting_type VARCHAR(20) NOT NULL, -- PROJECT: 프로젝트, INTERNAL: 내부업무 project_id INTEGER REFERENCES wr_project_info(project_id), -- 프로젝트 (선택) -- 일시/장소 meeting_date DATE NOT NULL, -- 회의 일자 start_time TIME, -- 시작 시간 end_time TIME, -- 종료 시간 location VARCHAR(100), -- 장소 -- 내용 raw_content TEXT, -- 원본 내용 (위키 에디터 HTML) ai_summary TEXT, -- AI 정리 결과 (JSON) ai_status VARCHAR(20) DEFAULT 'NONE', -- NONE: 미분석, PENDING: 미확정, CONFIRMED: 확정 ai_processed_at TIMESTAMP, -- AI 처리 일시 ai_confirmed_at TIMESTAMP, -- 확정 일시 -- 메타 author_id INTEGER NOT NULL REFERENCES wr_employee_info(employee_id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), created_ip VARCHAR(50), created_email VARCHAR(100), updated_ip VARCHAR(50), updated_email VARCHAR(100) ); -- 인덱스 CREATE INDEX idx_meeting_project ON wr_meeting(project_id); CREATE INDEX idx_meeting_date ON wr_meeting(meeting_date); CREATE INDEX idx_meeting_author ON wr_meeting(author_id); ``` ### 2.2 회의 참석자 테이블 (wr_meeting_attendee) ```sql CREATE TABLE wr_meeting_attendee ( attendee_id SERIAL PRIMARY KEY, meeting_id INTEGER NOT NULL REFERENCES wr_meeting(meeting_id) ON DELETE CASCADE, -- 내부 직원 (선택) employee_id INTEGER REFERENCES wr_employee_info(employee_id), -- 외부 참석자 (직접 입력) external_name VARCHAR(50), -- 외부인 이름 external_company VARCHAR(100), -- 외부인 소속 -- 하나는 필수 CONSTRAINT chk_attendee CHECK (employee_id IS NOT NULL OR external_name IS NOT NULL) ); CREATE INDEX idx_attendee_meeting ON wr_meeting_attendee(meeting_id); ``` ### 2.3 회의 안건 테이블 (wr_meeting_agenda) ```sql CREATE TABLE wr_meeting_agenda ( agenda_id SERIAL PRIMARY KEY, meeting_id INTEGER NOT NULL REFERENCES wr_meeting(meeting_id) ON DELETE CASCADE, agenda_no INTEGER NOT NULL, -- 안건 번호 (1, 2, 3...) agenda_title VARCHAR(200) NOT NULL, -- 안건 제목 agenda_content TEXT, -- 안건 상세 내용 -- 결정 상태 decision_status VARCHAR(20) NOT NULL DEFAULT 'PENDING', -- DECIDED: 결정됨, PENDING: 미결정, IN_PROGRESS: 진행중 decision_content TEXT, -- 결정 내용 (결정된 경우) created_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX idx_agenda_meeting ON wr_meeting_agenda(meeting_id); ``` ### 2.4 TODO 테이블 (wr_todo) ```sql CREATE TABLE wr_todo ( todo_id SERIAL PRIMARY KEY, -- 출처 (회의록에서 추출 시) source_type VARCHAR(20), -- MEETING: 회의록, MANUAL: 직접생성 meeting_id INTEGER REFERENCES wr_meeting(meeting_id), agenda_id INTEGER REFERENCES wr_meeting_agenda(agenda_id), -- 프로젝트 연결 (선택) project_id INTEGER REFERENCES wr_project_info(project_id), -- 내용 todo_title VARCHAR(300) NOT NULL, -- TODO 제목 todo_description TEXT, -- 상세 설명 -- 담당/상태 assignee_id INTEGER REFERENCES wr_employee_info(employee_id), -- 담당자 (선택) todo_status VARCHAR(20) NOT NULL DEFAULT 'PENDING', -- PENDING: 대기, COMPLETED: 완료, DISCARDED: 폐기 completed_at TIMESTAMP, -- 완료 일시 discarded_at TIMESTAMP, -- 폐기 일시 discard_reason VARCHAR(200), -- 폐기 사유 -- 주간보고 연계 linked_report_id INTEGER REFERENCES wr_weekly_report(report_id), -- 연계된 주간보고 linked_at TIMESTAMP, -- 연계 일시 -- 메타 author_id INTEGER NOT NULL REFERENCES wr_employee_info(employee_id), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), created_ip VARCHAR(50), created_email VARCHAR(100), updated_ip VARCHAR(50), updated_email VARCHAR(100) ); -- 인덱스 CREATE INDEX idx_todo_assignee ON wr_todo(assignee_id); CREATE INDEX idx_todo_status ON wr_todo(todo_status); CREATE INDEX idx_todo_meeting ON wr_todo(meeting_id); CREATE INDEX idx_todo_project ON wr_todo(project_id); ``` --- ## 3. API 설계 ### 3.1 회의록 API | Method | Endpoint | 설명 | |--------|----------|------| | GET | /api/meeting/list | 회의록 목록 조회 | | GET | /api/meeting/[id]/detail | 회의록 상세 조회 | | POST | /api/meeting/create | 회의록 작성 (저장 시 AI 분석 자동 실행) | | PUT | /api/meeting/[id]/update | 회의록 수정 | | DELETE | /api/meeting/[id]/delete | 회의록 삭제 | | POST | /api/meeting/[id]/reanalyze | AI 재분석 실행 | | POST | /api/meeting/[id]/confirm | 분석 결과 확정 (→ TODO 생성) | ### 3.2 TODO API | Method | Endpoint | 설명 | |--------|----------|------| | GET | /api/todo/list | TODO 목록 조회 | | GET | /api/todo/my | 내 TODO 목록 | | POST | /api/todo/create | TODO 직접 생성 | | PUT | /api/todo/[id]/update | TODO 수정 | | PUT | /api/todo/[id]/complete | TODO 완료 처리 | | PUT | /api/todo/[id]/discard | TODO 폐기 처리 | | DELETE | /api/todo/[id]/delete | TODO 삭제 | ### 3.3 주간보고 연계 API | Method | Endpoint | 설명 | |--------|----------|------| | GET | /api/todo/suggest-for-report | 주간보고 작성 시 유사 TODO 추천 | | POST | /api/todo/[id]/link-report | TODO-주간보고 연계 + 완료 처리 | --- ## 4. 화면 설계 ### 4.0 에디터 선택: Tiptap Vue3 네이티브 지원, 가볍고 커스터마이징 우수한 **Tiptap** 사용 ```bash npm install @tiptap/vue-3 @tiptap/starter-kit @tiptap/extension-link @tiptap/extension-placeholder ``` ### 4.1 회의록 목록 (/meeting) - 필터: 전체 / 프로젝트별 / 내부업무 - 기간 검색 - 카드형 또는 테이블형 목록 - **분석 상태 표시**: 미분석 / 미확정 / 확정 ### 4.2 회의록 작성 (/meeting/write) ``` ┌─────────────────────────────────────────────┐ │ 회의록 작성 │ ├─────────────────────────────────────────────┤ │ 회의 유형: ○ 프로젝트 회의 ○ 내부업무 회의 │ │ 프로젝트: [선택 (프로젝트 회의 시)] │ │ │ │ 제목: [_________________________] │ │ 일시: [2026-01-10] [14:00] ~ [16:00] │ │ 장소: [회의실 A] │ │ │ │ 참석자: [내부직원 선택] [+ 외부 추가] │ │ - 조효성, 서혜원 │ │ - 홍길동 (고객사) │ │ │ │ 회의 내용: (Tiptap 위키 에디터) │ │ ┌─────────────────────────────────────────┐ │ │ │ [B] [I] [U] [H1] [H2] [•] [1.] [Link] │ │ │ │ ───────────────────────────────────────── │ │ │ 오늘 PIMS 관련해서 얘기했는데... │ │ │ │ • 화면 디자인은 기존 거 쓰기로 했고 │ │ │ │ • DB 마이그레이션은 아직... │ │ │ └─────────────────────────────────────────┘ │ │ │ │ [임시저장] [저장] │ └─────────────────────────────────────────────┘ * 저장 시 자동으로 AI 분석 실행 → 상세 페이지로 이동 ``` ### 4.3 회의록 상세 보기 (/meeting/[id]) ``` ┌─────────────────────────────────────────────────────────┐ │ 📋 PIMS 프로젝트 킥오프 회의 [수정] │ ├─────────────────────────────────────────────────────────┤ │ 일시: 2026-01-10 14:00~16:00 │ │ 장소: 회의실 A │ │ 참석자: 조효성, 서혜원, 홍길동(고객사) │ ├─────────────────────────────────────────────────────────┤ │ 📝 회의 내용 │ │ ─────────────────────────────────────────────────────── │ │ (위키 에디터로 작성된 원본 내용 렌더링 - HTML) │ │ │ │ 오늘 PIMS 관련해서 얘기했는데... │ │ • 화면 디자인은 기존 거 쓰기로 했고 │ │ • DB 마이그레이션은 아직 범위가... │ │ │ ├─────────────────────────────────────────────────────────┤ │ 🤖 AI 분석 결과 [재분석] [확정하기] │ │ ─────────────────────────────────────────────────────── │ │ │ │ 1. 화면 디자인 │ │ ✅ 결정: 기존 디자인 재사용 │ │ │ │ 2. DB 마이그레이션 │ │ ⏳ 미결정: 범위 미확정, 다음주 재논의 │ │ ☑ TODO: DB 마이그레이션 범위 정의 │ │ │ │ 3. 테스트 서버 │ │ ⏳ 진행중 │ │ ☑ TODO: AWS 견적 확인 (@조효성) │ │ │ │ ─────────────────────────────────────────────────────── │ │ 상태: ⚠️ 미확정 (확정 시 선택된 TODO가 생성됩니다) │ └─────────────────────────────────────────────────────────┘ * [확정하기] 클릭 → 체크된 TODO 항목 자동 생성 * 이미 확정된 경우: "✅ 확정됨 (2026-01-10)" 표시, TODO 목록 링크 ``` ### 4.4 회의록 수정 시 플로우 ``` [수정 페이지에서 저장 클릭] ↓ 내용 변경 감지? ├─ NO → 그냥 저장 └─ YES ↓ ┌─────────────────────────────────────┐ │ 회의 내용이 변경되었습니다. │ │ │ │ AI 분석을 다시 실행할까요? │ │ (기존 분석 결과가 대체됩니다) │ │ │ │ [예, 재분석] [아니오] │ └─────────────────────────────────────┘ * 이미 확정된 분석이 있으면 경고: "기존 TODO가 유지됩니다. 새 분석 결과로 추가 TODO를 생성할 수 있습니다." ``` ### 4.5 AI 분석 상태 | 상태 | 값 | 설명 | |:---:|:---:|------| | 미분석 | `NONE` | 아직 AI 분석 안됨 | | 미확정 | `PENDING` | 분석 완료, 사용자 확정 대기 | | 확정 | `CONFIRMED` | 확정됨, TODO 생성 완료 | ### 4.6 TODO 목록 (/todo) - 필터: 전체 / 내 TODO / 프로젝트별 - 상태 필터: 대기 / 완료 / 폐기 - 드래그앤드롭 또는 버튼으로 상태 변경 ### 4.5 주간보고 작성 시 TODO 연계 ``` ┌─────────────────────────────────────────────┐ │ 💡 유사한 TODO가 있습니다 │ ├─────────────────────────────────────────────┤ │ 작성 중인 실적: │ │ "AWS 테스트 서버 구축 완료" │ │ │ │ 유사 TODO: │ │ ⏳ "AWS 견적 확인" (1/8 회의에서 생성) │ │ │ │ 이 TODO도 완료 처리할까요? │ │ [예, 완료 처리] [아니오] │ └─────────────────────────────────────────────┘ ``` --- ## 5. AI 프롬프트 설계 ### 5.1 회의 내용 정리 프롬프트 ``` 당신은 회의록 정리 전문가입니다. 아래 회의 내용을 분석하여 JSON 형식으로 정리해주세요. ## 입력 - 회의 제목: {title} - 프로젝트: {project_name} - 참석자: {attendees} - 원본 내용: {raw_content} ## 출력 형식 { "agendas": [ { "no": 1, "title": "안건 제목", "content": "상세 내용", "status": "DECIDED | PENDING | IN_PROGRESS", "decision": "결정 내용 (결정된 경우)", "todos": [ { "title": "TODO 제목", "assignee": "담당자명 또는 null", "reason": "TODO로 추출한 이유" } ] } ], "summary": "전체 회의 요약 (2-3문장)" } ## 규칙 1. 안건은 주제별로 분리하여 넘버링 2. 결정된 사항은 DECIDED, 추후 논의는 PENDING, 진행중은 IN_PROGRESS 3. 미결정/진행중 사항 중 액션이 필요한 것은 todos로 추출 4. 담당자가 언급되면 assignee에 기록 (없으면 null) 5. JSON 외 다른 텍스트 출력 금지 ``` --- ## 6. 작업 일정 ### Phase 1: 기본 구조 (2일) ✅ 완료 - [x] 시작: 2026-01-11 17:05 - [x] 완료: 2026-01-11 17:45 - [x] 소요시간: 40분 **작업 내용:** - [x] DB 테이블 생성 (meeting, attendee, agenda, todo) ✅ 기존 존재 - [x] Tiptap 에디터 컴포넌트 구성 ⚠️ textarea로 구현 (Tiptap 설치 필요) - [x] 회의록 CRUD API ✅ - [x] 회의록 목록/작성 화면 ✅ **생성된 파일:** - backend/api/meeting/list.get.ts - backend/api/meeting/create.post.ts - backend/api/meeting/[id]/detail.get.ts - backend/api/meeting/[id]/update.put.ts - backend/api/meeting/[id]/delete.delete.ts - frontend/meeting/index.vue - frontend/meeting/write.vue - frontend/meeting/[id].vue --- ### Phase 2: AI 분석 연동 (2일) - [ ] 시작: - [ ] 완료: - [ ] 소요시간: **작업 내용:** - [ ] 회의 내용 AI 분석 API (저장 시 자동 실행) - [ ] AI 정리 결과 → 안건 + TODO 추출 로직 - [ ] 회의록 상세 화면 (원본 + AI 분석 결과) - [ ] 분석 결과 확정 기능 (→ TODO 자동 생성) --- ### Phase 3: TODO 기능 (2일) - [ ] 시작: - [ ] 완료: - [ ] 소요시간: **작업 내용:** - [ ] TODO CRUD API - [ ] TODO 목록/상세 화면 - [ ] 상태 변경 기능 (대기/완료/폐기) - [ ] 담당자 지정 기능 --- ### Phase 4: 주간보고 연계 (1일) - [ ] 시작: - [ ] 완료: - [ ] 소요시간: **작업 내용:** - [ ] 주간보고 작성 시 유사 TODO 감지 (AI) - [ ] TODO 완료 연계 처리 (확인 후 업데이트) - [ ] 테스트 및 버그 수정 --- ## 작업 완료 결과 ### Phase별 작업 시간 | Phase | 작업 내용 | 시작 | 완료 | 소요시간 | |:-----:|----------|:----:|:----:|:--------:| | 1 | 기본 구조 (DB, API, 화면) | 01-11 17:05 | 01-11 17:45 | 40분 ✅ | | 2 | AI 분석 연동 | - | - | - | | 3 | TODO 기능 | - | - | - | | 4 | 주간보고 연계 | - | - | - | | | | | **총 소요시간** | **-** | --- ### 생성/수정된 파일 | 구분 | 파일 | 작업 | |------|------|:----:| | **DB** | wr_meeting | 신규 테이블 | | **DB** | wr_meeting_attendee | 신규 테이블 | | **DB** | wr_meeting_agenda | 신규 테이블 | | **DB** | wr_todo | 신규 테이블 | | **API** | backend/api/meeting/*.ts | 신규 | | **API** | backend/api/todo/*.ts | 신규 | | **Frontend** | frontend/pages/meeting/*.vue | 신규 | | **Frontend** | frontend/pages/todo/*.vue | 신규 | | **Frontend** | frontend/components/editor/TiptapEditor.vue | 신규 | | **Utils** | backend/utils/openai.ts | 수정 (프롬프트 추가) | --- ## 7. 기술 스택 - **Backend**: Nitro (H3) + PostgreSQL - **Frontend**: Nuxt3 + Vue3 + Bootstrap 5 - **에디터**: Tiptap (WYSIWYG 위키 에디터) - **AI**: OpenAI GPT-4o-mini - **인증**: 기존 세션 기반 (requireAuth) --- ## 8. 향후 확장 고려 1. **첨부파일**: 회의자료/사진 업로드 (2단계) 2. **알림**: TODO 담당자에게 알림 발송 3. **반복 회의**: 정기 회의 템플릿 4. **회의록 공유**: 참석자 이메일 발송 5. **음성 회의록**: 녹음 파일 → 텍스트 변환 (STT)