492 lines
19 KiB
Markdown
492 lines
19 KiB
Markdown
# 회의록 + 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)
|