Merge branch 'main' of https://github.com/hwanny1128/HGZero into feat/notification-noti_request

This commit is contained in:
djeon 2025-10-26 00:15:54 +09:00
commit d515d14350
2 changed files with 766 additions and 3 deletions

7
.gitignore vendored
View File

@ -43,8 +43,9 @@ examples/
.claude/settings.local.json
# Backup files
design/*/*/*backup.*
design/*/*backup.*
design/*backup.m*
design/*/*/*/*back*
design/*/*/*back*
design/*/*back*
design/*back*
backup/
.vscode/settings.json

View File

@ -0,0 +1,762 @@
# 회의진행 화면 개선안 종합 보고서
**작성일**: 2025-10-25
**버전**: v1.0
**대상**: 회의록 작성 서비스 MVP
---
## 📋 목차
1. [논의 배경 및 목적](#1-논의-배경-및-목적)
2. [MVP 핵심 가치 재확인](#2-mvp-핵심-가치-재확인)
3. [최종 개선안](#3-최종-개선안)
4. [공수 및 일정 영향 분석](#4-공수-및-일정-영향-분석)
5. [유저스토리 수정안](#5-유저스토리-수정안)
6. [화면설계 수정안](#6-화면설계-수정안)
7. [프로토타입 수정 가이드](#7-프로토타입-수정-가이드)
8. [v2.0 백로그](#8-v20-백로그)
---
## 1. 논의 배경 및 목적
### 1.1 논의 내용
회의 진행 화면의 다음 기능들에 대해 MVP 관점에서 재검토:
- **회의 참석자 권한 구분**: 생성자 vs 일반 참석자
- **메모 기능**: 개인 메모 vs 공유 메모
- **용어 설명**: 회사 특화 용어 처리 방안
- **관련 회의록**: 표시 방식 및 활용도
- **중도 퇴장**: 화면 전환 방식에 따른 구현
### 1.2 목적
- MVP 범위 명확화 및 불필요한 기능 제거
- 핵심 가치 실현에 집중
- 예산 및 일정 준수
---
## 2. MVP 핵심 가치 재확인
### 2.1 서비스 핵심 가치
> **"업무지식이 없어도 누락 없이 정확하게 회의록을 작성"**
### 2.2 MVP 필수 기능
1. ✅ AI STT로 실시간 음성 인식
2. ✅ AI가 주요 내용 자동 추출 및 제시
3. ✅ 회의 종료 후 AI 자동 요약 생성
4. ✅ 회의록 확인 및 기본 수정
5. ✅ 회의록 공유 (이메일/링크)
### 2.3 MVP 제외 기능 (v2.0 이관)
- ❌ 복잡한 메모 입력/편집 기능
- ❌ 실시간 협업 메모 동기화
- ❌ 참석자별 세밀한 권한 관리 UI
- ❌ 용어 사전 직접 검색 기능
---
## 3. 최종 개선안
### 3.1 회의 참석자 권한
#### 현재 문제점
- 생성자 vs 참석자로 이분법적 구분
- 회의 생성자도 참석자 중 한 명이라는 관점 누락
#### 개선안
**회의 생성자 = 특별 권한을 가진 참석자**
```
모든 참석자 공통 기능:
- AI 제시 주요 내용 확인 및 체크
- 회의록 실시간 확인
- 용어 설명 확인
- 관련 회의록 확인
- "나가기" 버튼으로 중도 퇴장
회의 생성자 전용 기능:
- 회의 종료 버튼 (일반 참석자에게는 숨김)
- 녹음 제어 (일시정지/재개/종료)
```
#### 구현 방식
```javascript
// 버튼 조건부 표시
if (currentUser.id === meeting.creator_id) {
// 회의 종료 버튼 표시
showEndMeetingButton();
showRecordingControls();
}
```
---
### 3.2 메모 기능
#### 현재 문제점
- 텍스트 입력 메모 구현 시 공수 증가
- 공유 메모 vs 개인 메모 선택 어려움
- 실시간 동기화 복잡도
#### 개선안 (MVP 최소화)
**AI 제시 내용 체크박스 방식**
```
┌─────────────────────────────────┐
│ 🤖 AI가 파악한 주요 내용 │
├─────────────────────────────────┤
│ ☐ 예산 500만원 증액 합의 │
│ ☐ 일정 2주 연장 논의 │
│ ☐ 외주 업체 3곳 검토 │
└─────────────────────────────────┘
```
**특징:**
- 참석자는 클릭만 (텍스트 입력 없음)
- 개인별 체크 (다른 사람 체크 안 보임)
- AI 요약 시 체크 수에 따라 가중치 부여
- 편집 충돌 없음
**공수 절감:**
- 기존 방식 (공유+개인 메모): 38일
- 체크박스 방식: 7일
- **절감률: 82%**
---
### 3.3 용어 설명 기능
#### 현재 문제점
- 일반 전문용어와 회사 특화 용어 구분 필요
- RAG 구축은 MVP 범위 초과
#### 개선안
**간소화된 JSON 용어 사전 + AI 보조**
##### 3.3.1 회사 용어 사전 구조
```json
// config/terms-dictionary.json
{
"terms": [
{
"keyword": "레거시",
"aliases": ["구시스템", "기존ERP"],
"definition": "2020년 구축한 우리 회사 통합 ERP 시스템",
"context": "현재 클라우드 기반 신규 시스템으로 마이그레이션 중",
"category": "시스템"
}
]
}
```
##### 3.3.2 용어 표시 방식
```
┌─────────────────────────────────┐
│ [AI 주요 내용] [용어] │
├─────────────────────────────────┤
│ 📚 회의 중 언급된 용어 │
│ │
│ 🔹 레거시 ⭐ │
│ 2020년 구축한 우리 회사 ERP │
│ (회사 용어 사전) │
│ │
│ 🔹 POC │
│ Proof of Concept │
│ (AI 일반 설명) │
└─────────────────────────────────┘
⭐ = 회사 용어 사전 등록 항목
```
##### 3.3.3 처리 로직
```python
def explain_term(term, stt_context, company_dict):
# 1. 회사 용어 사전 확인 (우선)
if term in company_dict:
return company_dict[term] + " ⭐"
# 2. AI 일반 설명 (회의 맥락 포함)
else:
return ai_model.explain(term, context=stt_context)
```
**장점:**
- ✅ RAG 대비 공수 1/5 (4일 vs 20일)
- ✅ 초기 10-20개 용어만으로 80% 커버
- ✅ 비개발자도 JSON 편집 가능
- ✅ v1.5에서 자동 학습 추가 가능
---
### 3.4 관련 회의록 기능
#### 기존 요구사항 (UFR-AI-040)
- ✅ AI가 벡터 유사도 검색으로 관련 회의록 자동 추천
- ✅ 관련도 배지 표시 (높음/중간/낮음)
- ✅ 최대 5개 회의록 연결
#### 현재 문제점
- 회의록 제목과 관련도 배지만 표시 (목록만 나열)
- 전체 회의록을 열어봐야 내용 파악 가능
- 회의 중 전체 회의록 읽을 시간 없음
#### 개선안
**기존 기능 유지 + 핵심 내용 요약 추가**
```
┌─────────────────────────────────┐
│ 📄 관련 회의록 │
├─────────────────────────────────┤
│ 🔥 95% 2024-01-15 주간 회의 │
│ 💡 현재 회의와 유사한 내용: │
│ • "예산 500만원으로 증액 1차 합의"│
│ • "외주 업체 A, B, C 3곳 후보" │
│ • "일정은 2주 더 필요하다는 의견"│
│ → 전체 회의록 보기 │
│ │
│ 🔥 78% 2024-01-08 기획 회의 │
│ 💡 현재 회의와 유사한 내용: │
│ • "POC 범위를 챗봇 기능만으로" │
│ • "개발 일정 2월 말까지" │
│ → 전체 회의록 보기 │
└─────────────────────────────────┘
```
##### 3.4.1 유사도 계산 로직
```python
def calculate_meeting_similarity(current, past):
# 1. 주제 유사도 (50%)
topic_similarity = cosine_similarity(
current.topics_vector,
past.topics_vector
)
# 2. 참석자 겹침 (20%)
attendee_overlap = len(
set(current.attendees) & set(past.attendees)
) / len(set(current.attendees))
# 3. 프로젝트/태그 일치 (30%)
project_match = 1.0 if current.project == past.project else 0.3
return (
topic_similarity * 0.5 +
attendee_overlap * 0.2 +
project_match * 0.3
)
```
##### 3.4.2 효율화 방안
```python
# 과거 회의록 저장 시 요약본 미리 생성
class Meeting:
content: str # 전체 내용
summary: str # AI 요약본 (미리 생성 - 배치)
topics: list # 주제 태그
# 실시간에는 요약본만 활용
def show_related_meetings(current):
for past in find_similar(current):
relevant_summary = extract_relevant_parts(
past.summary, # 미리 생성된 요약본
current.topics
)
```
**효과:**
- 회의록 찾는 시간: 5-10분 → 10초
- 컨텍스트 파악: 전체 읽기 → 요약으로 즉시
- 핵심 가치 강화: "업무지식 없어도" 실현
**추가 공수:** +1일 (최적화 적용 시)
---
### 3.5 중도 퇴장 기능
#### 현재 문제점
- 대시보드 → 회의진행 화면: 페이지 전환 (같은 탭)
- 브라우저 창 닫기 = 서비스 전체 종료
#### 개선안
**"나가기" 버튼 추가**
```
회의진행 화면 상단:
┌─────────────────────────────────┐
│ ← 나가기 | 회의 제목 | [회의종료] │
└─────────────────────────────────┘
```
**동작:**
```javascript
function exitMeeting() {
if (confirm('회의에서 나가시겠습니까?\n회의는 계속 진행됩니다.')) {
// 퇴장 이벤트 서버 전송
sendExitEvent(meeting.id, user.id);
// 대시보드로 복귀
navigateTo('02-대시보드.html');
}
}
```
**추가 공수:** +0.5일
---
## 4. 공수 및 일정 영향 분석
### 4.1 전체 공수 비교
| 항목 | 기존 계획 | 개선안 | 차이 |
|------|----------|--------|------|
| 메모 기능 | 38일 | 7일 | **-31일** ⬇️ |
| 용어 설명 | 20일 (RAG) | 4일 (JSON) | **-16일** ⬇️ |
| 관련 회의록 | 5일 (목록만) | 6일 (요약 추가) | **+1일** ⬆️ |
| 나가기 버튼 | - | 0.5일 | **+0.5일** ⬆️ |
| **순 절감** | - | - | **-45.5일** ⬇️ |
### 4.2 MVP 일정 영향
- ✅ 예산 및 일정 대폭 절감
- ✅ 핵심 기능에 집중 가능
- ✅ 빠른 시장 검증 가능
---
## 5. 유저스토리 수정안
### 5.1 신규 추가 (MVP 단순화)
```markdown
# 회의 참석자 공통 기능
UFR-PART-010: 회의 입장
- 모든 참석자(생성자 포함)는 대시보드에서 "참여하기"로 회의 입장
- 회의진행 화면으로 페이지 전환 (같은 탭)
UFR-PART-020: AI 주요 내용 체크 (개인별)
- AI가 추출한 주요 내용을 체크박스로 표시
- 각 참석자는 중요하다고 생각하는 항목 독립적으로 체크
- 다른 참석자의 체크 여부는 보이지 않음
- AI 요약 시 체크 수에 따라 가중치 차등 적용
UFR-PART-030: 회의 중도 퇴장
- "나가기" 버튼으로 회의에서 퇴장
- 확인 모달: "회의에서 나가시겠습니까? 회의는 계속 진행됩니다"
- 퇴장 후 대시보드로 복귀
- 회의록은 종료 시 공유됨
---
# 회의 생성자 전용 기능
UFR-HOST-010: 회의 종료 권한
- 회의 생성자만 "회의 종료" 버튼으로 회의 종료 가능
- 일반 참석자에게는 버튼 숨김
UFR-HOST-020: 녹음 제어 권한
- 회의 생성자만 녹음 일시정지/재개/종료 가능
---
# 용어 설명 기능
UFR-TERM-010: 용어 자동 감지 및 표시
- AI가 STT 분석 중 중요 용어 자동 감지
- "용어" 탭에 실시간으로 표시
UFR-TERM-020: 회사 용어 사전 우선 표시
- 회사 용어 사전(JSON)에 등록된 용어는 ⭐ 표시
- 클릭 시 회사 특화 설명 표시
- 사전에 없는 용어는 AI가 일반 설명 + 회의 맥락 제공
UFR-TERM-030: 용어 관리 (관리자 기능)
- 관리자는 회사 용어 사전 등록/수정 가능
- JSON 파일 직접 편집
```
### 5.2 수정 필요
```markdown
# 기존 수정 1
UFR-MEET-020: 회의 종료 권한
- 기존: "회의 생성자 또는 참석자가 회의 종료"
- 변경: "회의 생성자만 회의 종료 가능"
---
# 기존 수정 2 - UFR-AI-040 개선
UFR-AI-040: 관련 회의록 자동 연결 (개선)
기존 기능 (유지):
- ✅ AI가 벡터 유사도 검색으로 관련 회의록 자동 추천
- ✅ 같은 프로젝트/팀의 회의록 중 관련도 높은 순으로 표시
- ✅ 관련도 배지 표시
변경 및 개선 사항:
1. **최대 개수**: 5개 → 3개로 축소 (MVP)
2. **관련도 표시 방식**: 배지(높음/중간/낮음) → 퍼센트(95%, 78%) 변경
3. **유사 내용 요약 추가** (신규):
- AI가 추천한 각 회의록에서 현재 회의와 유사한 부분 자동 추출
- 유사한 내용을 3-5개 문장으로 요약하여 표시
- 전체 회의록을 열지 않아도 핵심 내용 파악 가능
- "전체 회의록 보기" 버튼으로 상세 내용 확인
4. **성능 최적화**:
- 과거 회의록 저장 시 요약본 미리 생성 (배치 처리)
- 실시간 요약은 캐싱된 데이터 활용
- 성능 목표: 1초 이내 표시
수행절차 (기존 유지):
1. 회의 종료 시 또는 회의록 작성 중 AI가 현재 회의 내용 분석
2. 벡터 유사도 검색을 통해 관련 회의록 탐색
3. 관련도가 높은 회의록 자동 연결 (최대 3개로 축소)
4. 각 회의록에서 유사한 내용 추출 및 요약 (신규 추가)
5. 회의 진행 화면, 회의록 상세 조회 화면에 표시
```
### 5.3 제거 (v2.0 이관)
```markdown
# v2.0 백로그로 이관
- 공유 메모 입력 기능
- 개인 메모 기능
- 사용자 직접 용어 검색 기능
- 용어 북마크 기능
- 참석자별 세밀한 권한 UI
```
---
## 6. 화면설계 수정안
### 6.1 회의진행 화면 (05-회의진행.html)
#### 6.1.1 상단 헤더 수정
```
기존:
┌─────────────────────────────────┐
│ 회의 제목 | [회의 종료] │
└─────────────────────────────────┘
변경:
┌─────────────────────────────────┐
│ ← 나가기 | 회의 제목 | [회의종료] │
└─────────────────────────────────┘
조건부 표시:
- "회의 종료" 버튼: 생성자만 표시
- "나가기" 버튼: 모든 참석자 표시
```
#### 6.1.2 탭 구조
```
┌─────────────────────────────────┐
│ [AI 주요 내용] [용어] [관련 회의록] │
├─────────────────────────────────┤
│ (탭 콘텐츠) │
└─────────────────────────────────┘
```
#### 6.1.3 AI 주요 내용 탭
```html
<div class="tab-content active">
<h3>🤖 AI가 파악한 주요 내용</h3>
<div class="ai-items">
<div class="ai-item">
<input type="checkbox" id="item1"
data-importance="high">
<label for="item1">예산 500만원 증액 합의</label>
<span class="timestamp">15:23</span>
</div>
</div>
</div>
```
#### 6.1.4 용어 탭
```html
<div class="tab-content">
<h3>📚 회의 중 언급된 용어</h3>
<div class="terms-list">
<div class="term-item company-term"
onclick="showTermDetail('legacy')">
<h4>🔹 레거시 ⭐</h4>
<p>2020년 구축한 우리 회사 ERP</p>
</div>
<div class="term-item ai-term"
onclick="showTermDetail('poc')">
<h4>🔹 POC</h4>
<p>Proof of Concept (개념 증명)</p>
</div>
</div>
</div>
<!-- 용어 상세 팝업 -->
<div class="modal" id="term-detail">
<div class="modal-content">
<h3>💡 레거시</h3>
<p class="definition">
2020년 구축한 우리 회사 통합 ERP 시스템
</p>
<p class="context">
현재 클라우드 기반 신규 시스템으로
마이그레이션 중입니다.
</p>
<button onclick="closeModal()">닫기</button>
</div>
</div>
```
#### 6.1.5 관련 회의록 탭
```html
<div class="tab-content">
<h3>📄 관련 회의록</h3>
<div class="related-meetings">
<div class="meeting-card">
<div class="similarity-badge">🔥 95% 관련도</div>
<h4>2024-01-15 주간 회의</h4>
<div class="meeting-summary">
<p class="summary-label">💡 현재 회의와 유사한 내용:</p>
<ul>
<li>"예산 500만원으로 증액 1차 합의"</li>
<li>"외주 업체 A, B, C 3곳 후보"</li>
<li>"일정은 2주 더 필요하다는 의견"</li>
</ul>
</div>
<button class="btn-link"
onclick="openMeeting('meeting-123')">
전체 회의록 보기 →
</button>
</div>
</div>
</div>
```
### 6.2 인터랙션 추가
```markdown
# 회의진행 화면 인터랙션
1. **나가기 버튼**
- 클릭 시 확인 모달 표시
- 확인 시 대시보드로 페이지 전환
2. **AI 주요 내용 체크박스**
- 체크 시 개인 선택 저장 (로컬 + 서버)
- 다른 사람 체크 여부는 표시 안 함
3. **용어 항목 클릭**
- 상세 설명 모달 표시
- 회사 용어는 ⭐ 배지 표시
4. **관련 회의록 카드**
- 유사도 점수 색상 코딩:
- 90% 이상: 빨강 (#FF6B6B)
- 70-89%: 주황 (#FFA94D)
- 50-69%: 노랑 (#FFD43B)
- "전체 회의록 보기" 버튼: 새 탭으로 열기
5. **회의 종료 버튼**
- 조건부 표시:
```javascript
if (currentUser.id === meeting.creator_id) {
showButton('endMeeting');
}
```
```
---
## 7. 프로토타입 수정 가이드
### 7.1 파일 수정 목록
1. `05-회의진행.html` - 메인 화면 구조 변경
2. `common.js` - 권한 체크 함수 추가
3. `02-대시보드.html` - 참여하기 버튼 동작 확인
### 7.2 주요 수정 사항
#### 7.2.1 권한 체크 함수 (common.js)
```javascript
/**
* 현재 사용자가 회의 생성자인지 확인
*/
function isCreator(meetingId, userId) {
const meeting = getMeetingById(meetingId);
return meeting && meeting.creator_id === userId;
}
/**
* 생성자 전용 UI 표시/숨김
*/
function updateCreatorUI(meetingId, userId) {
const isCreator = isCreator(meetingId, userId);
// 회의 종료 버튼
const endBtn = document.getElementById('end-meeting-btn');
if (endBtn) {
endBtn.style.display = isCreator ? 'block' : 'none';
}
// 녹음 제어 버튼들
const recordControls = document.querySelectorAll('.record-control');
recordControls.forEach(btn => {
btn.style.display = isCreator ? 'inline-block' : 'none';
});
}
```
#### 7.2.2 나가기 버튼 (05-회의진행.html)
```javascript
function exitMeeting() {
if (confirm('회의에서 나가시겠습니까?\n회의는 계속 진행됩니다.')) {
// 퇴장 이벤트 전송
sendExitEvent(currentMeeting.id, currentUser.id);
// 대시보드로 복귀
navigateTo('02-대시보드.html');
}
}
```
#### 7.2.3 AI 주요 내용 체크박스
```javascript
// 개인별 체크 저장
function handleAIItemCheck(itemId, checked) {
const checkData = {
meeting_id: currentMeeting.id,
user_id: currentUser.id,
item_id: itemId,
checked: checked,
timestamp: new Date().toISOString()
};
// 로컬 저장
saveLocalCheck(checkData);
// 서버 전송 (비동기)
sendCheckToServer(checkData);
}
```
#### 7.2.4 용어 표시 로직
```javascript
// 용어 목록 렌더링
function renderTerms(terms) {
const container = document.getElementById('terms-list');
container.innerHTML = terms.map(term => `
<div class="term-item ${term.isCompanyTerm ? 'company-term' : 'ai-term'}"
onclick="showTermDetail('${term.id}')">
<h4>🔹 ${term.keyword} ${term.isCompanyTerm ? '⭐' : ''}</h4>
<p>${term.shortDefinition}</p>
</div>
`).join('');
}
// 용어 상세 표시
function showTermDetail(termId) {
const term = getTermById(termId);
const modal = document.getElementById('term-detail-modal');
modal.querySelector('.term-title').textContent = term.keyword;
modal.querySelector('.term-definition').textContent = term.definition;
modal.querySelector('.term-context').textContent = term.context;
modal.classList.add('show');
}
```
#### 7.2.5 관련 회의록 표시
```javascript
// 관련 회의록 렌더링
function renderRelatedMeetings(meetings) {
const container = document.getElementById('related-meetings');
container.innerHTML = meetings.map(meeting => `
<div class="meeting-card">
<div class="similarity-badge"
style="background-color: ${getSimilarityColor(meeting.similarity)}">
🔥 ${Math.round(meeting.similarity * 100)}% 관련도
</div>
<h4>${meeting.date} ${meeting.title}</h4>
<div class="meeting-summary">
<p class="summary-label">💡 현재 회의와 유사한 내용:</p>
<ul>
${meeting.relevantSummary.map(item => `<li>"${item}"</li>`).join('')}
</ul>
</div>
<button class="btn-link" onclick="openMeeting('${meeting.id}')">
전체 회의록 보기 →
</button>
</div>
`).join('');
}
// 유사도에 따른 색상
function getSimilarityColor(similarity) {
if (similarity >= 0.9) return '#FF6B6B'; // 빨강
if (similarity >= 0.7) return '#FFA94D'; // 주황
return '#FFD43B'; // 노랑
}
```
---
## 8. v2.0 백로그
### 8.1 메모 기능 고도화
- 공유 메모 실시간 동기화
- 개인 메모 기능
- 메모 검색 및 필터
- 메모 히스토리 추적
### 8.2 용어 사전 고도화
- 사용자 직접 용어 검색
- 용어 북마크 기능
- 용어 설명 편집 기능
- 과거 회의록 기반 자동 학습
- 전체 RAG 시스템 구축
### 8.3 권한 관리 고도화
- 세밀한 참석자 권한 설정
- 안건별 편집 권한 제어
- 참석자 강제 퇴장 기능
### 8.4 관련 회의록 고도화
- 용어-회의록 연계 표시
- 관련 문서 통합 검색
- 프로젝트 문서/위키 연동
---
## 9. 결론 및 다음 단계
### 9.1 결론
이번 개선안을 통해:
- ✅ MVP 범위 명확화
- ✅ 핵심 가치 "업무지식 없어도 누락 없이" 실현
- ✅ 개발 공수 45.5일 절감
- ✅ 예산 및 일정 준수
### 9.2 다음 단계
1. **유저스토리 업데이트** (design/userstory.md)
- 신규 스토리 추가
- 기존 스토리 수정
- v2.0 백로그 섹션 추가
2. **화면설계 업데이트** (design/uiux/uiux.md)
- 05-회의진행 화면 상세 명세
- 인터랙션 시나리오 추가
- 권한별 UI 조건 명시
3. **프로토타입 수정** (design/uiux/prototype/05-회의진행.html)
- 나가기 버튼 추가
- 체크박스 방식 메모 구현
- 용어 탭 구현
- 관련 회의록 요약 표시
4. **백엔드 API 설계 반영**
- 권한 체크 API
- 체크 데이터 저장 API
- 용어 사전 API
- 관련 회의록 추천 API
---
**보고서 종료**