19 KiB
19 KiB
회의록 + TODO 기능 작업계획서
작성일: 2026-01-10 예상 기간: 5~7일 우선순위: 1 (가장 쉬움)
1. 기능 개요
1.1 핵심 컨셉
- 두서없이 작성한 회의 내용을 AI가 주제별로 정리
- 결정/미결정 사항 자동 분류
- 미결정 사항 중 액션 필요한 것을 TODO로 추출
- TODO는 "언젠가 할 일" / "검토 필요한 것" / "보류된 것" 성격
1.2 회의록 유형
| 유형 | 설명 |
|---|---|
| 프로젝트 회의 | 특정 프로젝트에 종속 |
| 내부업무 회의 | 프로젝트 무관 (일반 내부 회의) |
2. 데이터 모델
2.1 회의록 테이블 (wr_meeting)
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)
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)
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)
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 사용
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일) ✅ 완료
- 시작: 2026-01-11 17:05
- 완료: 2026-01-11 17:45
- 소요시간: 40분
작업 내용:
- DB 테이블 생성 (meeting, attendee, agenda, todo) ✅ 기존 존재
- Tiptap 에디터 컴포넌트 구성 ⚠️ textarea로 구현 (Tiptap 설치 필요)
- 회의록 CRUD API ✅
- 회의록 목록/작성 화면 ✅
생성된 파일:
- 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. 향후 확장 고려
- 첨부파일: 회의자료/사진 업로드 (2단계)
- 알림: TODO 담당자에게 알림 발송
- 반복 회의: 정기 회의 템플릿
- 회의록 공유: 참석자 이메일 발송
- 음성 회의록: 녹음 파일 → 텍스트 변환 (STT)