hgzero/docs/회의종료-개발계획.md
Minseo-Jo 92e4863fc7 feat: 회의종료 기능을 위한 DB 스키마 추가
## 변경 내용
- minutes 테이블에 user_id 컬럼 추가 (참석자별 회의록 지원)
  * user_id IS NULL: AI 통합 회의록
  * user_id IS NOT NULL: 참석자별 회의록

- agenda_sections 테이블 생성 (안건별 AI 요약 저장)
  * agenda_number, agenda_title
  * ai_summary_short, discussions, decisions (JSON)
  * pending_items (JSON), opinions (JSON)

- ai_summaries 테이블 생성 (AI 결과 캐싱)
  * summary_type: CONSOLIDATED, TODO_EXTRACTION
  * keywords, statistics (JSON)
  * processing_time_ms (성능 모니터링)

- todos 테이블 확장 (AI 추출 정보)
  * extracted_by: AI, MANUAL
  * section_reference: 관련 안건 참조
  * extraction_confidence: 0.00~1.00

## 문서
- DB-Schema-회의종료.md: 상세 스키마 문서
- ERD-회의종료.puml: ERD 다이어그램
- 회의종료-개발계획.md: 전체 개발 계획

## 설계 개선
- is_consolidated 컬럼 제거 (user_id로 구분 가능)
- 중복 정보 제거로 데이터 일관성 향상
2025-10-28 11:21:32 +09:00

9.9 KiB

회의종료 기능 개발 계획

📋 개요

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

🎯 핵심 기능

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

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

1. minutes (회의록 테이블) - 확장

-- 기존 테이블 확장
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 (안건별 섹션 테이블) - 신규

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 요약 결과 캐시) - 신규

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 테이블) - 확장

-- 기존 테이블 확장
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. 참석자별 회의록 조회

GET /meetings/{meetingId}/minutes/by-participants
Response:
  participantMinutes:
    - userId: "user1"
      userName: "김민준"
      minutesId: "uuid"
      content: "회의록 내용..."
      status: "DRAFT"
    - userId: "user2"
      userName: "박서연"
      ...

2. 안건별 섹션 조회

GET /meetings/{meetingId}/agenda-sections
Response:
  sections:
    - agendaNumber: 1
      agendaTitle: "신제품 기획 방향성"
      aiSummaryShort: "타겟 고객을 20-30대로 설정..."
      discussions: "..."
      decisions: [...]
      todos: [...]

3. 회의 통계 조회

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

AI Service API

1. 통합 회의록 요약 API (신규)

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 (기존)

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 프롬프트 버전 관리
  • 성능 모니터링 설정
  • 에러 로깅 및 알림 설정
  • 백업 및 롤백 계획 수립

📝 참고 문서