# Meeting Service 데이터베이스 스키마 분석 문서 ## 생성된 문서 목록 본 분석은 Meeting Service의 데이터베이스 스키마를 전방위적으로 분석한 결과입니다. ### 1. SCHEMA-REPORT-SUMMARY.md (메인 보고서) **파일**: `/Users/jominseo/HGZero/claude/SCHEMA-REPORT-SUMMARY.md` **내용**: - Executive Summary (핵심 발견사항) - 데이터베이스 구조 개요 - 테이블별 상세 분석 (1.1~1.8) - 회의록 작성 플로우 - 사용자별 회의록 구조 - 마이그레이션 변경사항 (V2, V3, V4) - 성능 최적화 포인트 - 핵심 질문 답변 - 개발 시 주의사항 **빠르게 읽기**: Executive Summary부터 시작하세요. --- ### 2. database-schema-analysis.md (상세 분석) **파일**: `/Users/jominseo/HGZero/claude/database-schema-analysis.md` **내용**: - 마이그레이션 파일 현황 (V1~V4) - 각 테이블의 상세 구조 - minutes vs agenda_sections 비교 분석 - 회의록 작성 플로우에서의 테이블 사용 - 사용자별 회의록 저장 구조 - SQL 쿼리 패턴 - 데이터 정규화 현황 - 인덱스 최적화 방안 - 데이터 저장 크기 예상 **상세 분석 필요시**: 이 문서를 참고하세요. --- ### 3. data-flow-diagram.md (흐름도) **파일**: `/Users/jominseo/HGZero/claude/data-flow-diagram.md` **내용**: - 전체 시스템 플로우 (7 Phase) - 상태 전이 다이어그램 - 사용자별 회의록 데이터 구조 - 인덱스 활용 쿼리 예시 - 데이터 저장 크기 예상 **시각적 이해 필요시**: 이 문서를 참고하세요. --- ### 4. database-diagram.puml (ER 다이어그램) **파일**: `/Users/jominseo/HGZero/claude/database-diagram.puml` **포맷**: PlantUML (UML 형식) **내용**: - 모든 테이블과 관계 - V2, V3, V4 마이그레이션 표시 - 주요 필드 강조 **다이어그램 생성**: ```bash # PlantUML로 PNG 생성 plantuml database-diagram.puml -o database-diagram.png # 또는 온라인 에디터 https://www.plantuml.com/plantuml/uml/ ``` --- ## 핵심 발견사항 한눈에 보기 ### 1. Minutes 테이블 구조 ``` 잘못된 이해: minutes.content ← 회의록 내용 올바른 구조: minutes_sections.content ← 회의록 내용 minutes ← 메타데이터만 (title, status, version) ``` ### 2. 사용자별 회의록 (V3) ``` minutes.user_id = NULL → AI 통합 회의록 minutes.user_id = 'user@.com' → 개인 회의록 인덱스: idx_minutes_meeting_user(meeting_id, user_id) ``` ### 3. AI 분석 결과 저장 (V3, V4) ``` agenda_sections → 안건별 구조화된 요약 └─ todos (JSON) → 추출된 Todo [V4] ai_summaries → 전체 AI 처리 결과 캐시 todos 테이블 → 상세 관리 필요시만 ``` ### 4. 정규화 (V2) ``` 이전: meetings.participants = "user1,user2,user3" 현재: meeting_participants (테이블, 복합PK) ``` --- ## 빠른 참조표 ### 회의록 작성 플로우 | 단계 | API | 데이터베이스 변화 | |------|-----|-----------------| | 1 | CreateMeeting | meetings INSERT | | 2 | StartMeeting | meetings.status = IN_PROGRESS | | 3 | CreateMinutes | minutes INSERT (통합 + 개인) | | 4 | UpdateMinutes | minutes_sections.content UPDATE | | 5 | EndMeeting | meetings.status = COMPLETED, ended_at [V3] | | 6 | FinalizeMinutes | minutes.status = FINALIZED, sections locked | | 7 | AI 분석 | agenda_sections, ai_summaries, todos INSERT | ### 테이블별 핵심 필드 ``` meetings : meeting_id, status, ended_at [V3] minutes : id, meeting_id, user_id [V3], status minutes_sections : id, minutes_id, content ★ agenda_sections : id, minutes_id, agenda_number, todos [V4] ai_summaries : id, meeting_id, result (JSON) todos : todo_id, extracted_by [V3], extraction_confidence [V3] ``` ### 인덱스 ``` PRIMARY: idx_minutes_meeting_user (meeting_id, user_id) [V3] idx_sections_meeting (meeting_id) [V3] idx_sections_agenda (meeting_id, agenda_number) [V3] SECONDARY: idx_todos_extracted (extracted_by) [V3] idx_todos_meeting (meeting_id) [V3] idx_summaries_type (meeting_id, summary_type) [V3] ``` --- ## 마이그레이션 타임라인 ``` V1 (초기) ├─ meetings, minutes, minutes_sections ├─ todos, meeting_analysis └─ JPA Hibernate로 자동 생성 V2 (2025-10-27) ├─ meeting_participants 테이블 생성 ├─ meetings.participants (CSV) 마이그레이션 └─ 정규화 완료 V3 (2025-10-28) ★ 주요 변경 ├─ minutes.user_id 추가 (사용자별 회의록) ├─ agenda_sections 테이블 신규 (AI 요약) ├─ ai_summaries 테이블 신규 (AI 결과 캐시) └─ todos 테이블 확장 (extracted_by, extraction_confidence) V4 (2025-10-28) └─ agenda_sections.todos JSON 필드 추가 ``` --- ## 자주 묻는 질문 ### Q: minutes 테이블에 content 필드가 있나요? **A**: 없습니다. 실제 회의록 내용은 `minutes_sections.content`에 저장됩니다. `minutes` 테이블은 메타데이터만 보유합니다 (title, status, version 등). ### Q: 사용자별 회의록은 어떻게 구분되나요? **A**: `minutes.user_id` 컬럼으로 구분됩니다. - NULL: AI 통합 회의록 - NOT NULL: 개인별 회의록 (각 참석자마다 생성) ### Q: AI 분석은 모든 회의록을 처리하나요? **A**: 아니요. 통합 회의록(`user_id=NULL`)만 분석합니다. 개인별 회의록(`user_id NOT NULL`)은 개인 기록용이며 AI 분석 대상이 아닙니다. ### Q: agenda_sections와 minutes_sections의 차이는? **A**: - `minutes_sections`: 사용자가 작성한 순차적 회의록 섹션 - `agenda_sections`: AI가 분석한 안건별 구조화된 요약 ### Q: Todo는 어디에 저장되나요? **A**: 두 곳에 저장 가능합니다. 1. `agenda_sections.todos` (JSON): 안건별 요약의 일부 2. `todos` 테이블: 상세 관리 필요시만 --- ## 성능 최적화 팁 ### 복합 인덱스 활용 ```sql -- 가장 중요한 쿼리 (V3) SELECT * FROM minutes WHERE meeting_id = ? AND user_id = ?; └─ 인덱스: idx_minutes_meeting_user (meeting_id, user_id) ``` ### 추천 추가 인덱스 ```sql CREATE INDEX idx_minutes_status_created ON minutes(status, created_at DESC); CREATE INDEX idx_agenda_meeting_created ON agenda_sections(meeting_id, created_at DESC); ``` ### 쿼리 패턴 ```sql -- 통합 회의록 조회 (가장 흔함) SELECT m.*, ms.* FROM minutes m LEFT JOIN minutes_sections ms ON m.id = ms.minutes_id WHERE m.meeting_id = ? AND m.user_id IS NULL -- 개인 회의록 조회 SELECT m.*, ms.* FROM minutes m LEFT JOIN minutes_sections ms ON m.id = ms.minutes_id WHERE m.meeting_id = ? AND m.user_id = ? -- AI 분석 결과 조회 SELECT * FROM agenda_sections WHERE meeting_id = ? ORDER BY agenda_number ``` --- ## 문서 읽기 순서 추천 ### 1단계: 빠른 이해 (5분) → `SCHEMA-REPORT-SUMMARY.md`의 Executive Summary만 읽기 ### 2단계: 구조 이해 (15분) → `database-diagram.puml` (다이어그램 확인) → `data-flow-diagram.md`의 Phase 1~7 읽기 ### 3단계: 상세 이해 (30분) → `SCHEMA-REPORT-SUMMARY.md` 전체 읽기 → `database-schema-analysis.md`의 핵심 섹션 읽기 ### 4단계: 개발 참고 (필요시) → `database-schema-analysis.md`의 쿼리 예시 → `data-flow-diagram.md`의 인덱스 활용 섹션 --- ## 개발 체크리스트 회의록 작성 기능 개발시: ### 데이터 저장 - [ ] 회의록 내용은 `minutes_sections.content`에 저장 - [ ] `minutes` 테이블에는 메타데이터만 저장 (title, status) - [ ] 회의 종료시 `minutes.user_id` 값 확인 (NULL vs 사용자ID) ### AI 분석 - [ ] 통합 회의록(`user_id=NULL`)만 AI 분석 대상으로 처리 - [ ] `agenda_sections`은 통합 회의록에만 생성 - [ ] `ai_summaries`에 전체 결과 캐싱 ### 쿼리 성능 - [ ] 복합 인덱스 활용: `idx_minutes_meeting_user` - [ ] 조회시 `WHERE meeting_id AND user_id` 조건 사용 - [ ] 기존 인덱스 모두 생성 확인 ### 데이터 무결성 - [ ] 회의 종료시 `ended_at` 기록 (V3) - [ ] 최종화시 `minutes_sections` locked 처리 - [ ] AI 추출 Todo의 `extraction_confidence` 값 확인 --- ## 관련 파일 위치 **마이그레이션**: ``` /Users/jominseo/HGZero/meeting/src/main/resources/db/migration/ ├─ V2__create_meeting_participants_table.sql ├─ V3__add_meeting_end_support.sql └─ V4__add_todos_to_agenda_sections.sql ``` **엔티티**: ``` /Users/jominseo/HGZero/meeting/src/main/java/.../entity/ ├─ MeetingEntity.java ├─ MinutesEntity.java ├─ MinutesSectionEntity.java ├─ AgendaSectionEntity.java [V3] ├─ TodoEntity.java └─ MeetingParticipantEntity.java [V2] ``` **서비스**: ``` /Users/jominseo/HGZero/meeting/src/main/java/.../service/ ├─ MinutesService.java ├─ MinutesSectionService.java └─ MinutesAnalysisEventConsumer.java (비동기 AI 분석) ``` --- ## 지원 이 문서에 대한 추가 질문이나 불명확한 부분이 있으면: 1. `SCHEMA-REPORT-SUMMARY.md`의 "핵심 질문 답변" 섹션 확인 2. `database-schema-analysis.md`에서 상세 내용 검색 3. `data-flow-diagram.md`에서 흐름도 재확인 --- **문서 작성일**: 2025-10-28 **분석 대상**: Meeting Service (feat/meeting-ai 브랜치) **마이그레이션 버전**: V1~V4 **상태**: 완료 및 검증됨