# 회의종료 기능 개발 계획

## 📋 개요
회의가 종료되면 모든 참석자의 회의록을 수집하여 Claude AI가 통합 요약하고 Todo를 자동 추출하는 기능

## 🎯 핵심 기능
1. **참석자별 회의록 통합**: 모든 참석자가 작성한 회의록을 DB에서 조회
2. **AI 통합 요약**: Claude AI가 안건별로 요약 및 구조화
3. **Todo 자동 추출**: AI가 회의록에서 액션 아이템 자동 추출
4. **통계 생성**: 참석자 수, 회의 시간, 안건 수, Todo 수 통계

---

## 🗄️ 데이터베이스 스키마 설계

### 1. minutes (회의록 테이블) - 확장
```sql
-- 기존 테이블 확장
ALTER TABLE minutes ADD COLUMN user_id VARCHAR(50);  -- 작성자 ID
ALTER TABLE minutes ADD COLUMN is_consolidated BOOLEAN DEFAULT FALSE;  -- 통합 회의록 여부
ALTER TABLE minutes ADD COLUMN consolidated_by VARCHAR(255);  -- 통합 처리자 (AI)

-- 인덱스 추가
CREATE INDEX idx_minutes_meeting_user ON minutes(meeting_id, user_id);
CREATE INDEX idx_minutes_consolidated ON minutes(is_consolidated);
```

### 2. agenda_sections (안건별 섹션 테이블) - 신규
```sql
CREATE TABLE agenda_sections (
    id VARCHAR(36) PRIMARY KEY,
    minutes_id VARCHAR(36) NOT NULL,
    meeting_id VARCHAR(36) NOT NULL,
    agenda_number INT NOT NULL,  -- 안건 번호 (1, 2, 3...)
    agenda_title VARCHAR(200) NOT NULL,  -- 안건 제목

    -- AI 요약 결과
    ai_summary_short TEXT,  -- 짧은 요약 (1줄)
    discussion TEXT,  -- 논의 사항
    decisions JSON,  -- 결정 사항 배열
    pending_items JSON,  -- 보류 사항 배열
    opinions JSON,  -- 참석자별 의견 배열

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    FOREIGN KEY (minutes_id) REFERENCES minutes(id) ON DELETE CASCADE,
    FOREIGN KEY (meeting_id) REFERENCES meetings(id) ON DELETE CASCADE,

    INDEX idx_sections_meeting (meeting_id),
    INDEX idx_sections_agenda (meeting_id, agenda_number)
);
```

### 3. ai_summaries (AI 요약 결과 캐시) - 신규
```sql
CREATE TABLE ai_summaries (
    id VARCHAR(36) PRIMARY KEY,
    meeting_id VARCHAR(36) NOT NULL,
    summary_type VARCHAR(50) NOT NULL,  -- 'CONSOLIDATED', 'TODO_EXTRACTION'

    -- 입력 정보
    source_minutes_ids JSON NOT NULL,  -- 통합에 사용된 회의록 ID 배열

    -- AI 처리 결과
    result JSON NOT NULL,  -- AI 응답 전체 결과
    processing_time_ms INT,  -- 처리 시간 (밀리초)
    model_version VARCHAR(50),  -- 사용한 AI 모델 버전

    -- 통계
    keywords JSON,  -- 주요 키워드 배열
    statistics JSON,  -- 통계 정보 (참석자 수, 안건 수 등)

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY (meeting_id) REFERENCES meetings(id) ON DELETE CASCADE,

    INDEX idx_summaries_meeting (meeting_id),
    INDEX idx_summaries_type (meeting_id, summary_type)
);
```

### 4. todos (Todo 테이블) - 확장
```sql
-- 기존 테이블 확장
ALTER TABLE todos ADD COLUMN extracted_by VARCHAR(50) DEFAULT 'AI';  -- 'AI' 또는 'MANUAL'
ALTER TABLE todos ADD COLUMN section_reference VARCHAR(200);  -- 관련 안건 참조
ALTER TABLE todos ADD COLUMN extraction_confidence DECIMAL(3,2);  -- AI 추출 신뢰도 (0.00~1.00)

-- 인덱스 추가
CREATE INDEX idx_todos_extracted ON todos(extracted_by);
CREATE INDEX idx_todos_meeting ON todos(meeting_id);
```

---

## 🔌 API 설계

### Meeting Service API

#### 1. 참석자별 회의록 조회
```yaml
GET /meetings/{meetingId}/minutes/by-participants
Response:
  participantMinutes:
    - userId: "user1"
      userName: "김민준"
      minutesId: "uuid"
      content: "회의록 내용..."
      status: "DRAFT"
    - userId: "user2"
      userName: "박서연"
      ...
```

#### 2. 안건별 섹션 조회
```yaml
GET /meetings/{meetingId}/agenda-sections
Response:
  sections:
    - agendaNumber: 1
      agendaTitle: "신제품 기획 방향성"
      aiSummaryShort: "타겟 고객을 20-30대로 설정..."
      discussions: "..."
      decisions: [...]
      todos: [...]
```

#### 3. 회의 통계 조회
```yaml
GET /meetings/{meetingId}/statistics
Response:
  participantsCount: 4
  durationMinutes: 90
  agendasCount: 3
  todosCount: 5
  keywords: ["신제품기획", "예산편성", ...]
```

### AI Service API

#### 1. 통합 회의록 요약 API (신규)
```yaml
POST /transcripts/consolidate
Request:
  meetingId: "uuid"
  participantMinutes:
    - userId: "user1"
      content: "회의록 내용..."
    - userId: "user2"
      content: "회의록 내용..."
  agendas:
    - number: 1
      title: "신제품 기획 방향성"

Response:
  consolidatedMinutesId: "uuid"
  agendaSections:
    - agendaNumber: 1
      aiSummaryShort: "타겟 고객을 20-30대로 설정..."
      discussions: "..."
      decisions: [...]
      pendingItems: [...]
  keywords: ["신제품기획", "예산편성"]
  processingTimeMs: 3500
```

#### 2. Todo 자동 추출 API (기존)
```yaml
POST /todos/extract
Request:
  meetingId: "uuid"
  minutesContent: "통합된 회의록 전체 내용..."

Response:
  todos:
    - content: "시장 조사 보고서 작성"
      assignee: "김민준"
      dueDate: "2025-11-01"
      priority: "HIGH"
      sectionReference: "안건 1"
      confidence: 0.92
```

---

## 🤖 Claude AI 프롬프트 설계

### 1. 통합 회의록 요약 프롬프트
```
당신은 회의록 통합 전문가입니다.

입력:
- 회의 제목: {meetingTitle}
- 안건 목록: {agendas}
- 참석자별 회의록:
  * {userName1}: {content1}
  * {userName2}: {content2}
  ...

작업:
각 안건별로 다음을 생성하세요:
1. 짧은 요약 (1줄, 20자 이내)
2. 논의 사항 (핵심 내용 3-5문장)
3. 결정 사항 (배열 형태)
4. 보류 사항 (배열 형태)
5. 참석자별 의견 (speaker, opinion)

출력 형식 (JSON):
{
  "agendaSections": [
    {
      "agendaNumber": 1,
      "aiSummaryShort": "...",
      "discussions": "...",
      "decisions": ["결정1", "결정2"],
      "pendingItems": ["보류1"],
      "opinions": [
        {"speaker": "김민준", "opinion": "..."}
      ]
    }
  ],
  "keywords": ["키워드1", "키워드2", ...]
}
```

### 2. Todo 자동 추출 프롬프트
```
당신은 Todo 추출 전문가입니다.

입력:
- 회의록 전체 내용: {minutesContent}
- 참석자 목록: {participants}

작업:
회의록에서 액션 아이템(Todo)을 추출하세요.
- "~하기로 함", "~가 작성", "~까지 완료" 등의 패턴 탐지
- 담당자와 마감일 식별
- 우선순위 판단 (HIGH/MEDIUM/LOW)

출력 형식 (JSON):
{
  "todos": [
    {
      "content": "시장 조사 보고서 작성",
      "assignee": "김민준",
      "dueDate": "2025-11-01",
      "priority": "HIGH",
      "sectionReference": "안건 1",
      "confidence": 0.92
    }
  ]
}
```

---

## 🔄 통합 플로우

### 회의 종료 처리 시퀀스
```
1. 사용자가 "회의 종료" 버튼 클릭
   ↓
2. Meeting Service: 회의 상태를 'ENDED'로 변경
   ↓
3. Meeting Service: 모든 참석자의 회의록 조회 (GET /meetings/{meetingId}/minutes/by-participants)
   ↓
4. AI Service 호출: 통합 요약 요청 (POST /transcripts/consolidate)
   ↓
5. Claude AI: 안건별 요약 및 구조화
   ↓
6. AI Service: agenda_sections 테이블에 저장
   ↓
7. AI Service 호출: Todo 자동 추출 (POST /todos/extract)
   ↓
8. Claude AI: Todo 추출 및 담당자 식별
   ↓
9. Meeting Service: todos 테이블에 저장
   ↓
10. Meeting Service: ai_summaries 테이블에 캐시 저장
   ↓
11. 프론트엔드: 07-회의종료.html 화면 렌더링
```

---

## 📊 성능 고려사항

### 1. 처리 시간 목표
- AI 통합 요약: 3-5초 이내
- Todo 추출: 2-3초 이내
- 전체 회의 종료 처리: 10초 이내

### 2. 최적화 방안
- **병렬 처리**: 통합 요약과 Todo 추출을 병렬로 실행
- **캐싱**: ai_summaries 테이블에 결과 캐싱 (재조회 시 0.5초 이내)
- **비동기 처리**: 회의 종료 후 백그라운드에서 AI 처리
- **진행 상태 표시**: WebSocket으로 실시간 진행률 전달

### 3. 대용량 처리
- 10명 이상 참석자: 회의록을 청크 단위로 분할 처리
- 긴 회의 (2시간 이상): 안건별 병렬 처리

---

## 🧪 테스트 시나리오

### 1. 단위 테스트
- [ ] 참석자별 회의록 조회 API 테스트
- [ ] AI 통합 요약 API 테스트
- [ ] Todo 자동 추출 API 테스트
- [ ] 안건별 섹션 저장 및 조회 테스트

### 2. 통합 테스트
- [ ] 회의 종료 → AI 요약 → Todo 추출 전체 플로우
- [ ] 다수 참석자 (10명) 회의록 통합 테스트
- [ ] 긴 회의록 (5000자 이상) 처리 테스트

### 3. 성능 테스트
- [ ] AI 요약 응답 시간 측정 (목표: 5초 이내)
- [ ] 동시 다발적 회의 종료 처리 (10개 동시)
- [ ] 대용량 회의록 (10000자 이상) 처리 시간

---

## 📅 개발 일정 (예상)

### Phase 1: DB 및 기본 API (3일)
- Day 1: DB 스키마 설계 및 마이그레이션
- Day 2: Meeting Service API 개발
- Day 3: 단위 테스트 및 API 검증

### Phase 2: AI 통합 (4일)
- Day 1-2: Claude AI 프롬프트 설계 및 테스트
- Day 3: AI Service API 개발
- Day 4: 통합 테스트

### Phase 3: 최적화 및 배포 (2일)
- Day 1: 성능 최적화 및 캐싱
- Day 2: 프론트엔드 연동 테스트 및 배포

**총 예상 기간: 9일**

---

## 🚀 배포 체크리스트
- [ ] DB 마이그레이션 스크립트 준비
- [ ] API 명세서 업데이트
- [ ] AI 프롬프트 버전 관리
- [ ] 성능 모니터링 설정
- [ ] 에러 로깅 및 알림 설정
- [ ] 백업 및 롤백 계획 수립

---

## 📝 참고 문서
- [유저스토리](../design/userstory.md)
- [AI Service API 명세](../design/backend/api/ai-service-api.yaml)
- [Meeting Service API 명세](../design/backend/api/meeting-service-api.yaml)
- [07-회의종료.html 프로토타입](../design/uiux/prototype/07-회의종료.html)
