mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 07:56:24 +00:00
- 요구사항 분석 (기능적/비기능적, 6개 기술적 도전과제) - 18개 클라우드 패턴 정량적 평가 및 선정 - MVP: 8개 패턴 (API Gateway, Queue, Cache, Pub-Sub 등) - Phase 2: 6개 패턴 추가 (CQRS, Circuit Breaker, Retry 등) - Phase 3: 4개 패턴 추가 (Event Sourcing, Saga, Priority Queue 등) - 서비스별 패턴 매핑 (8개 마이크로서비스) - 3개 Mermaid 아키텍처 다이어그램 - 전체 시스템 구조 - 실시간 협업 플로우 - AI/STT 비동기 처리 플로우 - Todo 실시간 연동 플로우 (Saga) - Phase별 구현 로드맵 (MVP 3개월, Phase 2 6개월, Phase 3 12개월) - 구현 시 고려사항 (API Gateway, Queue, Cache, WebSocket, AI/LLM 등) - 예상 성과 지표 - Phase 1: 100명, 월 $500, 사용자당 $5 - Phase 2: 1,000명, 월 $2,000, 사용자당 $2 (60% 절감) - Phase 3: 10,000명, 월 $10,000, 사용자당 $1 (80% 절감) - 가이드 문서 다운로드 - 아키텍처 패턴 선정 가이드 - 클라우드 디자인 패턴 요약표 - Mermaid 문법 검사 가이드 - Mermaid 검사 스크립트 (PowerShell) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1275 lines
39 KiB
Markdown
1275 lines
39 KiB
Markdown
# 클라우드 아키텍처 패턴 적용 방안
|
||
|
||
## 문서 정보
|
||
- **작성일**: 2025-10-21
|
||
- **작성자**: 아키텍트 팀
|
||
- **버전**: 1.0
|
||
- **프로젝트**: 회의록 작성 및 공유 개선 서비스
|
||
|
||
---
|
||
|
||
## 1. 요구사항 분석 결과
|
||
|
||
### 1.1 기능적 요구사항
|
||
|
||
#### 핵심 기능
|
||
1. **실시간 회의록 작성 및 협업**
|
||
- 여러 참석자의 동시 수정 및 실시간 동기화
|
||
- 충돌 감지 및 해결 (Last Write Wins)
|
||
- 버전 관리 및 변경 이력 추적
|
||
- WebSocket 기반 3-5초 간격 업데이트
|
||
|
||
2. **AI 기반 회의록 자동 생성**
|
||
- STT 음성-텍스트 변환 (1초 이내 지연)
|
||
- LLM 기반 구조화된 회의록 작성
|
||
- Todo 자동 추출 및 담당자 식별
|
||
- 프롬프팅 기반 다양한 형식 변환
|
||
|
||
3. **맥락 기반 용어 설명 (RAG)**
|
||
- 전문용어 자동 감지 및 하이라이트
|
||
- 과거 회의록/사내 문서 기반 실용적 설명
|
||
- 벡터 유사도 검색 및 관련 문서 연결
|
||
|
||
4. **Todo 실시간 연동**
|
||
- AI 추출 Todo 자동 할당
|
||
- 회의록과 양방향 실시간 연결
|
||
- Todo 완료 시 회의록 자동 반영
|
||
- 캘린더 자동 등록 및 리마인더
|
||
|
||
#### 서비스 간 연계
|
||
- **Meeting ↔ STT**: 음성 녹음 → 텍스트 변환
|
||
- **STT ↔ AI**: 텍스트 → 회의록 자동 생성
|
||
- **AI ↔ RAG**: 용어 감지 → 맥락 기반 설명
|
||
- **Meeting ↔ Todo**: 회의록 확정 → Todo 추출/할당
|
||
- **Collaboration**: 모든 변경사항 실시간 동기화
|
||
|
||
### 1.2 비기능적 요구사항
|
||
|
||
#### 성능 요구사항
|
||
| 지표 | 목표 | 근거 |
|
||
|------|------|------|
|
||
| STT 발언 인식 지연 | 1초 이내 | 유저스토리 UFR-STT-010 |
|
||
| STT 변환 정확도 | 60% 이상 | 유저스토리 UFR-STT-020 |
|
||
| 화자 식별 정확도 | 90% 이상 | 유저스토리 UFR-STT-010 |
|
||
| 실시간 동기화 간격 | 3-5초 | 유저스토리 UFR-AI-010 |
|
||
| AI 회의록 생성 | 실시간 업데이트 | 유저스토리 UFR-AI-010 |
|
||
| RAG 검색 응답시간 | 2초 이내 | 사용자 경험 |
|
||
| Todo 할당 알림 | 즉시 발송 | 유저스토리 UFR-TODO-010 |
|
||
|
||
#### 가용성 및 신뢰성
|
||
- **회의 중 서비스 중단 불가**: 99.9% uptime 목표
|
||
- **장애 격리**: 한 서비스 장애가 전체 시스템에 영향 최소화
|
||
- **데이터 손실 방지**: 모든 회의록 변경사항 영구 저장
|
||
|
||
#### 확장성
|
||
- **동시 회의 처리**: MVP 100명 → Phase 2: 1,000명 → Phase 3: 10,000명
|
||
- **대용량 데이터**: 장시간 회의 (3시간+) 안정적 처리
|
||
- **글로벌 확장**: 다중 리전 배포 준비 (Phase 3)
|
||
|
||
#### 보안
|
||
- **사용자 인증**: LDAP 연동 SSO
|
||
- **권한 관리**: 회의록 접근 권한 제어
|
||
- **데이터 보호**: 민감한 회의 내용 암호화 저장
|
||
|
||
#### 데이터 일관성
|
||
- **Todo ↔ 회의록 동기화**: 실시간 양방향 연결
|
||
- **버전 관리**: 모든 수정사항 이력 추적
|
||
- **충돌 해결**: 동시 수정 시 일관성 보장
|
||
|
||
### 1.3 기술적 도전과제
|
||
|
||
#### 1. 실시간 협업 처리
|
||
**문제**:
|
||
- 여러 참석자의 동시 수정으로 인한 충돌
|
||
- WebSocket 연결 관리 및 메시지 전송 부하
|
||
- 3-5초 간격 실시간 업데이트 요구
|
||
|
||
**영향**:
|
||
- 사용자 경험 저하 (수정 내용 손실, 충돌)
|
||
- 서버 부하 증가 (다수 WebSocket 연결)
|
||
|
||
#### 2. 대용량 데이터 처리
|
||
**문제**:
|
||
- 음성 녹음 파일 (장시간 회의 시 GB 단위)
|
||
- STT 변환 처리 시간 증가
|
||
- 장시간 회의록 (수만 자 텍스트)
|
||
|
||
**영향**:
|
||
- 응답 시간 지연
|
||
- 저장소 비용 증가
|
||
|
||
#### 3. AI/LLM 통합 복잡성
|
||
**문제**:
|
||
- LLM API 호출 시간 (수 초 ~ 수십 초)
|
||
- API 비용 (토큰 기반 과금)
|
||
- API 장애 시 서비스 중단
|
||
|
||
**영향**:
|
||
- 사용자 대기 시간 증가
|
||
- 운영 비용 상승
|
||
- 가용성 저하
|
||
|
||
#### 4. RAG 시스템 성능
|
||
**문제**:
|
||
- 벡터 DB 검색 성능 (대량 회의록 축적 시)
|
||
- 관련 문서 추출 정확도
|
||
- 맥락 기반 설명 생성 시간
|
||
|
||
**영향**:
|
||
- 용어 설명 응답 지연
|
||
- 검색 정확도 저하
|
||
|
||
#### 5. 서비스 간 의존성 관리
|
||
**문제**:
|
||
- Meeting → STT → AI 순차 의존성
|
||
- Todo ↔ Meeting 양방향 의존성
|
||
- 한 서비스 장애 시 전체 기능 마비
|
||
|
||
**영향**:
|
||
- 장애 전파
|
||
- 가용성 저하
|
||
|
||
#### 6. 데이터 일관성 보장
|
||
**문제**:
|
||
- Todo 완료 → 회의록 반영 시 동기화
|
||
- 실시간 수정 충돌 해결
|
||
- 분산 트랜잭션 관리
|
||
|
||
**영향**:
|
||
- 데이터 불일치
|
||
- 사용자 혼란
|
||
|
||
---
|
||
|
||
## 2. 패턴 선정 및 평가
|
||
|
||
### 2.1 평가 기준
|
||
|
||
| 기준 | 가중치 | 평가 내용 |
|
||
|------|--------|-----------|
|
||
| **기능 적합성** | 35% | 요구사항을 직접 해결하는 능력 |
|
||
| **성능 효과** | 25% | 응답시간 및 처리량 개선 효과 |
|
||
| **운영 복잡도** | 20% | 구현 및 운영의 용이성 (낮을수록 좋음) |
|
||
| **확장성** | 15% | 미래 요구사항에 대한 대응력 |
|
||
| **비용 효율성** | 5% | 개발/운영 비용 대비 효과 (ROI) |
|
||
|
||
**평가 척도**: 1-10점 (10점이 가장 우수)
|
||
|
||
### 2.2 패턴 평가 매트릭스
|
||
|
||
| 패턴 | 기능 적합성<br/>(35%) | 성능 효과<br/>(25%) | 운영 복잡도<br/>(20%) | 확장성<br/>(15%) | 비용 효율성<br/>(5%) | **총점** | Phase |
|
||
|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||
| **API Gateway** | 9 × 0.35 = 3.15 | 8 × 0.25 = 2.0 | 8 × 0.20 = 1.6 | 9 × 0.15 = 1.35 | 8 × 0.05 = 0.4 | **8.50** | MVP |
|
||
| **Queue-Based Load Leveling** | 9 × 0.35 = 3.15 | 9 × 0.25 = 2.25 | 7 × 0.20 = 1.4 | 8 × 0.15 = 1.2 | 7 × 0.05 = 0.35 | **8.35** | MVP |
|
||
| **Cache-Aside** | 8 × 0.35 = 2.8 | 9 × 0.25 = 2.25 | 9 × 0.20 = 1.8 | 7 × 0.15 = 1.05 | 9 × 0.05 = 0.45 | **8.35** | MVP |
|
||
| **Publisher-Subscriber** | 9 × 0.35 = 3.15 | 7 × 0.25 = 1.75 | 8 × 0.20 = 1.6 | 9 × 0.15 = 1.35 | 8 × 0.05 = 0.4 | **8.25** | MVP |
|
||
| **Asynchronous Request-Reply** | 9 × 0.35 = 3.15 | 8 × 0.25 = 2.0 | 7 × 0.20 = 1.4 | 8 × 0.15 = 1.2 | 7 × 0.05 = 0.35 | **8.10** | MVP |
|
||
| **Gateway Offloading** | 8 × 0.35 = 2.8 | 6 × 0.25 = 1.5 | 9 × 0.20 = 1.8 | 7 × 0.15 = 1.05 | 8 × 0.05 = 0.4 | **7.55** | MVP |
|
||
| **Federated Identity** | 8 × 0.35 = 2.8 | 5 × 0.25 = 1.25 | 9 × 0.20 = 1.8 | 6 × 0.15 = 0.9 | 8 × 0.05 = 0.4 | **7.15** | MVP |
|
||
| **Circuit Breaker** | 8 × 0.35 = 2.8 | 6 × 0.25 = 1.5 | 8 × 0.20 = 1.6 | 7 × 0.15 = 1.05 | 8 × 0.05 = 0.4 | **7.35** | Phase 2 |
|
||
| **CQRS** | 7 × 0.35 = 2.45 | 8 × 0.25 = 2.0 | 5 × 0.20 = 1.0 | 8 × 0.15 = 1.2 | 6 × 0.05 = 0.3 | **6.95** | Phase 2 |
|
||
| **Retry** | 7 × 0.35 = 2.45 | 6 × 0.25 = 1.5 | 8 × 0.20 = 1.6 | 6 × 0.15 = 0.9 | 8 × 0.05 = 0.4 | **6.85** | Phase 2 |
|
||
| **Materialized View** | 6 × 0.35 = 2.1 | 8 × 0.25 = 2.0 | 6 × 0.20 = 1.2 | 7 × 0.15 = 1.05 | 7 × 0.05 = 0.35 | **6.70** | Phase 2 |
|
||
| **Event Sourcing** | 7 × 0.35 = 2.45 | 7 × 0.25 = 1.75 | 4 × 0.20 = 0.8 | 9 × 0.15 = 1.35 | 5 × 0.05 = 0.25 | **6.60** | Phase 3 |
|
||
| **Saga** | 7 × 0.35 = 2.45 | 6 × 0.25 = 1.5 | 4 × 0.20 = 0.8 | 8 × 0.15 = 1.2 | 5 × 0.05 = 0.25 | **6.20** | Phase 3 |
|
||
| **Bulkhead** | 6 × 0.35 = 2.1 | 6 × 0.25 = 1.5 | 7 × 0.20 = 1.4 | 6 × 0.15 = 0.9 | 7 × 0.05 = 0.35 | **6.25** | Phase 2 |
|
||
| **Valet Key** | 5 × 0.35 = 1.75 | 7 × 0.25 = 1.75 | 8 × 0.20 = 1.6 | 5 × 0.15 = 0.75 | 8 × 0.05 = 0.4 | **6.25** | Phase 2 |
|
||
| **Priority Queue** | 5 × 0.35 = 1.75 | 6 × 0.25 = 1.5 | 7 × 0.20 = 1.4 | 6 × 0.15 = 0.9 | 6 × 0.05 = 0.3 | **5.85** | Phase 3 |
|
||
| **Health Endpoint Monitoring** | 7 × 0.35 = 2.45 | 4 × 0.25 = 1.0 | 9 × 0.20 = 1.8 | 5 × 0.15 = 0.75 | 8 × 0.05 = 0.4 | **6.40** | MVP |
|
||
| **External Configuration Store** | 6 × 0.35 = 2.1 | 4 × 0.25 = 1.0 | 8 × 0.20 = 1.6 | 6 × 0.15 = 0.9 | 8 × 0.05 = 0.4 | **6.00** | Phase 3 |
|
||
|
||
### 2.3 선정 패턴 및 근거
|
||
|
||
#### MVP Phase (총 8개 패턴)
|
||
1. **API Gateway (8.50점)** ⭐ 최고점
|
||
- 단일 진입점으로 모든 클라이언트 요청 처리
|
||
- 서비스 라우팅 중앙화
|
||
- 높은 기능 적합성과 확장성
|
||
|
||
2. **Queue-Based Load Leveling (8.35점)**
|
||
- STT/AI 비동기 처리 필수
|
||
- 부하 분산으로 성능 안정화
|
||
- AI API 호출 최적화
|
||
|
||
3. **Cache-Aside (8.35점)**
|
||
- RAG 검색 결과 캐싱으로 성능 향상
|
||
- 구현 용이, 높은 비용 효율성
|
||
- 60% 검색 비용 절감 예상
|
||
|
||
4. **Publisher-Subscriber (8.25점)**
|
||
- Todo 상태 변경 이벤트
|
||
- 회의록 공유 알림
|
||
- 실시간 알림 발송
|
||
|
||
5. **Asynchronous Request-Reply (8.10점)**
|
||
- AI 회의록 생성 비동기 처리
|
||
- 사용자 대기 시간 단축
|
||
- 장시간 작업 효율적 처리
|
||
|
||
6. **Gateway Offloading (7.55점)**
|
||
- 인증(LDAP), 로깅, SSL 처리
|
||
- 서비스 복잡도 감소
|
||
- 핵심 비즈니스 로직에 집중
|
||
|
||
7. **Federated Identity (7.15점)**
|
||
- LDAP SSO 연동
|
||
- 사용자 관리 효율화
|
||
- 보안 강화
|
||
|
||
8. **Health Endpoint Monitoring (6.40점)**
|
||
- 서비스 상태 점검
|
||
- 장애 조기 발견
|
||
- 운영 안정성
|
||
|
||
#### Phase 2 - 확장 (총 6개 패턴 추가)
|
||
9. **Circuit Breaker (7.35점)**
|
||
- AI/STT API 장애 격리
|
||
- 장애 복구 시간 90% 단축
|
||
- 가용성 99.9% 달성
|
||
|
||
10. **CQRS (6.95점)**
|
||
- 회의록 읽기/쓰기 분리
|
||
- 읽기 성능 70% 향상
|
||
- 확장성 개선
|
||
|
||
11. **Retry (6.85점)**
|
||
- 일시적 오류 자동 복구
|
||
- Circuit Breaker와 통합
|
||
- 안정성 향상
|
||
|
||
12. **Materialized View (6.70점)**
|
||
- 회의록 목록, 요약 뷰
|
||
- 조회 성능 80% 향상
|
||
- 사용자 경험 개선
|
||
|
||
13. **Bulkhead (6.25점)**
|
||
- 서비스 격리로 장애 전파 방지
|
||
- 리소스 풀 분리
|
||
- 안정성 강화
|
||
|
||
14. **Valet Key (6.25점)**
|
||
- 음성 파일 직접 다운로드
|
||
- 네트워크 대역폭 절감
|
||
- Azure Storage SAS 토큰 활용
|
||
|
||
#### Phase 3 - 고도화 (총 4개 패턴 추가)
|
||
15. **Event Sourcing (6.60점)**
|
||
- 완벽한 변경 이력 추적
|
||
- 감사 추적 (Audit Trail)
|
||
- 데이터 복원 가능
|
||
|
||
16. **Saga (6.20점)**
|
||
- Todo 할당 분산 트랜잭션
|
||
- 데이터 일관성 보장
|
||
- 보상 트랜잭션
|
||
|
||
17. **Priority Queue (5.85점)**
|
||
- VIP 회의 우선 처리
|
||
- 중요 회의 응답시간 50% 단축
|
||
- 비즈니스 가치 향상
|
||
|
||
18. **External Configuration Store (6.00점)**
|
||
- 동적 설정 관리
|
||
- 재배포 없이 설정 변경
|
||
- 운영 효율성
|
||
|
||
---
|
||
|
||
## 3. 서비스별 패턴 적용 설계
|
||
|
||
### 3.1 서비스별 패턴 매핑
|
||
|
||
#### API Gateway Layer
|
||
- **API Gateway**: 모든 요청 진입점, 라우팅
|
||
- **Gateway Offloading**: LDAP 인증, 로깅, SSL 종료
|
||
- **Rate Limiting**: 사용자당 100 req/min
|
||
|
||
#### User Service
|
||
- **Federated Identity**: LDAP SSO 연동
|
||
- **Cache-Aside**: 사용자 정보 캐싱 (TTL 30분)
|
||
- **Health Endpoint**: /actuator/health
|
||
|
||
#### Meeting Service
|
||
- **CQRS**: 읽기(조회)/쓰기(작성) 모델 분리
|
||
- **Materialized View**: 회의록 목록, 대시보드 요약
|
||
- **Event Sourcing**: 회의록 변경 이력 (Phase 3)
|
||
- **Publisher-Subscriber**: 회의록 공유 이벤트
|
||
- **Cache-Aside**: 회의록 목록 (TTL 5분)
|
||
|
||
#### STT Service
|
||
- **Queue-Based Load Leveling**: 음성 변환 큐 처리
|
||
- **Asynchronous Request-Reply**: 변환 결과 비동기 반환
|
||
- **Valet Key**: Azure Blob Storage 음성 파일 직접 업로드
|
||
- **Circuit Breaker**: Azure Speech API 장애 격리
|
||
- **Retry**: STT API 일시적 오류 (최대 3회)
|
||
- **Priority Queue**: 중요 회의 우선 처리 (Phase 3)
|
||
|
||
#### AI Service
|
||
- **Queue-Based Load Leveling**: LLM 요청 큐 (배치 처리)
|
||
- **Asynchronous Request-Reply**: AI 생성 비동기 응답
|
||
- **Circuit Breaker**: OpenAI/Azure OpenAI API 장애 격리
|
||
- **Retry**: LLM API 오류 재시도 (Exponential Backoff)
|
||
- **Priority Queue**: VIP 회의 우선 처리 (Phase 3)
|
||
- **Cache-Aside**: 프롬프트 템플릿 캐싱
|
||
|
||
#### RAG Service
|
||
- **Cache-Aside**: 벡터 검색 결과 캐싱 (TTL 1시간)
|
||
- **Materialized View**: 용어 사전 인덱스
|
||
- **Circuit Breaker**: 벡터 DB 장애 격리
|
||
- **Retry**: 검색 실패 재시도
|
||
|
||
#### Collaboration Service
|
||
- **Publisher-Subscriber**: 실시간 동기화 이벤트 (WebSocket)
|
||
- **Event Sourcing**: 수정 이력 관리 (Phase 3)
|
||
- **Bulkhead**: WebSocket 연결 풀 격리
|
||
|
||
#### Todo Service
|
||
- **Saga**: Todo 할당 → 알림 → 캘린더 등록 (Phase 3)
|
||
- **Publisher-Subscriber**: Todo 상태 변경 이벤트
|
||
- **Cache-Aside**: Todo 목록 캐싱 (TTL 5분)
|
||
- **Asynchronous Request-Reply**: 캘린더 등록 비동기
|
||
|
||
#### Notification Service
|
||
- **Queue-Based Load Leveling**: 알림 발송 큐
|
||
- **Competing Consumers**: 병렬 알림 처리 (이메일/푸시)
|
||
- **Retry**: 알림 발송 실패 재시도
|
||
|
||
#### 공통 적용
|
||
- **Health Endpoint Monitoring**: 모든 서비스
|
||
- **External Configuration Store**: 환경 설정 중앙 관리 (Phase 3)
|
||
- **Bulkhead**: 서비스별 리소스 풀 격리
|
||
|
||
### 3.2 전체 시스템 아키텍처
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "Client Layer"
|
||
Web[Web Client]
|
||
Mobile[Mobile App]
|
||
end
|
||
|
||
subgraph "API Gateway Layer"
|
||
Gateway[API Gateway<br/>+ Gateway Offloading<br/>+ Rate Limiting]
|
||
end
|
||
|
||
subgraph "Authentication"
|
||
LDAP[LDAP Server<br/>Federated Identity]
|
||
end
|
||
|
||
subgraph "Microservices"
|
||
User[User Service<br/>Cache-Aside]
|
||
Meeting[Meeting Service<br/>CQRS + Event Sourcing]
|
||
STT[STT Service<br/>Queue + Async]
|
||
AI[AI Service<br/>Queue + Circuit Breaker]
|
||
RAG[RAG Service<br/>Cache-Aside]
|
||
Collab[Collaboration Service<br/>Pub-Sub + WebSocket]
|
||
Todo[Todo Service<br/>Saga + Pub-Sub]
|
||
Notif[Notification Service<br/>Queue + Competing Consumers]
|
||
end
|
||
|
||
subgraph "Data Layer"
|
||
Cache[(Redis Cache<br/>Cache-Aside)]
|
||
UserDB[(User DB)]
|
||
MeetingDB[(Meeting DB)]
|
||
STTDB[(STT DB)]
|
||
AIDB[(AI DB)]
|
||
RAGDB[(Vector DB)]
|
||
TodoDB[(Todo DB)]
|
||
end
|
||
|
||
subgraph "Messaging Layer"
|
||
Queue[Message Queue<br/>RabbitMQ/Kafka<br/>Queue-Based Load Leveling]
|
||
EventBus[Event Bus<br/>Publisher-Subscriber]
|
||
end
|
||
|
||
subgraph "External Services"
|
||
AzureSpeech[Azure Speech API<br/>Circuit Breaker]
|
||
OpenAI[OpenAI API<br/>Circuit Breaker]
|
||
AzureBlob[Azure Blob Storage<br/>Valet Key]
|
||
Email[Email Service]
|
||
end
|
||
|
||
Web --> Gateway
|
||
Mobile --> Gateway
|
||
|
||
Gateway --> LDAP
|
||
Gateway --> User
|
||
Gateway --> Meeting
|
||
Gateway --> STT
|
||
Gateway --> AI
|
||
Gateway --> RAG
|
||
Gateway --> Collab
|
||
Gateway --> Todo
|
||
|
||
User --> Cache
|
||
User --> UserDB
|
||
|
||
Meeting --> Cache
|
||
Meeting --> MeetingDB
|
||
Meeting --> EventBus
|
||
|
||
STT --> Queue
|
||
STT --> AzureSpeech
|
||
STT --> AzureBlob
|
||
STT --> STTDB
|
||
|
||
AI --> Queue
|
||
AI --> OpenAI
|
||
AI --> Cache
|
||
AI --> AIDB
|
||
|
||
RAG --> Cache
|
||
RAG --> RAGDB
|
||
|
||
Collab --> EventBus
|
||
|
||
Todo --> EventBus
|
||
Todo --> TodoDB
|
||
|
||
Notif --> Queue
|
||
Notif --> Email
|
||
|
||
Queue --> STT
|
||
Queue --> AI
|
||
Queue --> Notif
|
||
|
||
EventBus --> Meeting
|
||
EventBus --> Collab
|
||
EventBus --> Todo
|
||
EventBus --> Notif
|
||
```
|
||
|
||
### 3.3 실시간 협업 플로우
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Client1 as 참석자1
|
||
participant Client2 as 참석자2
|
||
participant Gateway as API Gateway
|
||
participant Collab as Collaboration Service
|
||
participant EventBus as Event Bus<br/>(Pub-Sub)
|
||
participant Meeting as Meeting Service
|
||
participant Cache as Redis Cache
|
||
|
||
Note over Client1,Client2: WebSocket 연결
|
||
Client1->>Gateway: WebSocket Connect
|
||
Gateway->>Collab: Establish Connection
|
||
Client2->>Gateway: WebSocket Connect
|
||
Gateway->>Collab: Establish Connection
|
||
|
||
Note over Client1,EventBus: 회의록 수정
|
||
Client1->>Collab: 회의록 수정 (Delta)
|
||
Collab->>Meeting: 수정 내용 저장
|
||
Meeting->>Cache: 캐시 무효화
|
||
Meeting->>EventBus: 수정 이벤트 발행<br/>(Publisher)
|
||
|
||
Note over EventBus,Client2: 실시간 동기화
|
||
EventBus->>Collab: 수정 이벤트 전달<br/>(Subscriber)
|
||
Collab->>Client2: WebSocket Push (Delta)
|
||
Client2->>Client2: 화면 실시간 업데이트
|
||
|
||
Note over Client1,Meeting: 충돌 처리 (Last Write Wins)
|
||
Client1->>Collab: 동시 수정 시도
|
||
Client2->>Collab: 동시 수정 시도
|
||
Collab->>Meeting: 충돌 감지
|
||
Meeting->>Meeting: Last Write Wins 적용
|
||
Meeting->>EventBus: 최종 수정 이벤트
|
||
EventBus->>Collab: 동기화
|
||
Collab->>Client1: 최종 버전 전송
|
||
Collab->>Client2: 최종 버전 전송
|
||
```
|
||
|
||
### 3.4 AI/STT 비동기 처리 플로우
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Client as Web Client
|
||
participant Gateway as API Gateway
|
||
participant Meeting as Meeting Service
|
||
participant STTQueue as STT Queue<br/>(Queue-Based)
|
||
participant STT as STT Service<br/>(Circuit Breaker)
|
||
participant AzureSpeech as Azure Speech API
|
||
participant AIQueue as AI Queue<br/>(Queue-Based)
|
||
participant AI as AI Service<br/>(Circuit Breaker)
|
||
participant OpenAI as OpenAI API
|
||
participant RAG as RAG Service<br/>(Cache-Aside)
|
||
participant Cache as Redis Cache
|
||
|
||
Note over Client,Meeting: 음성 녹음 시작
|
||
Client->>Gateway: 음성 녹음 업로드
|
||
Gateway->>Meeting: 녹음 데이터 전달
|
||
Meeting->>STTQueue: 변환 요청 적재<br/>(Async Request-Reply)
|
||
Meeting-->>Client: 202 Accepted (즉시 응답)
|
||
|
||
Note over STTQueue,AzureSpeech: STT 비동기 처리
|
||
STTQueue->>STT: 큐에서 메시지 가져오기
|
||
STT->>AzureSpeech: 음성-텍스트 변환 요청
|
||
|
||
alt API 정상
|
||
AzureSpeech-->>STT: 변환 결과
|
||
STT->>AIQueue: AI 회의록 작성 요청
|
||
else API 장애
|
||
AzureSpeech--xSTT: 오류
|
||
STT->>STT: Circuit Breaker OPEN
|
||
STT->>STT: Retry (최대 3회)
|
||
alt Retry 성공
|
||
STT->>AIQueue: AI 요청
|
||
else Retry 실패
|
||
STT->>Meeting: 실패 알림
|
||
Meeting->>Client: WebSocket Push (오류)
|
||
end
|
||
end
|
||
|
||
Note over AIQueue,OpenAI: AI 비동기 처리
|
||
AIQueue->>AI: 큐에서 메시지 가져오기
|
||
AI->>Cache: 프롬프트 템플릿 조회
|
||
Cache-->>AI: 캐시된 템플릿
|
||
AI->>OpenAI: 회의록 생성 요청
|
||
|
||
alt API 정상
|
||
OpenAI-->>AI: 회의록 초안
|
||
AI->>RAG: 용어 설명 요청
|
||
RAG->>Cache: 검색 결과 조회
|
||
|
||
alt 캐시 적중
|
||
Cache-->>RAG: 캐시된 설명
|
||
else 캐시 미스
|
||
RAG->>RAG: 벡터 검색 수행
|
||
RAG->>Cache: 결과 캐싱 (TTL 1시간)
|
||
end
|
||
|
||
RAG-->>AI: 용어 설명
|
||
AI->>Meeting: 최종 회의록 전달
|
||
Meeting->>Client: WebSocket Push (결과)
|
||
else API 장애
|
||
OpenAI--xAI: 오류
|
||
AI->>AI: Circuit Breaker OPEN
|
||
AI->>AI: Retry (Exponential Backoff)
|
||
end
|
||
```
|
||
|
||
### 3.5 Todo 실시간 연동 플로우 (Saga 패턴)
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Client as Web Client
|
||
participant Gateway as API Gateway
|
||
participant Meeting as Meeting Service
|
||
participant AI as AI Service
|
||
participant Todo as Todo Service<br/>(Saga Orchestrator)
|
||
participant EventBus as Event Bus<br/>(Pub-Sub)
|
||
participant Notif as Notification Service
|
||
participant Calendar as Calendar API
|
||
|
||
Note over Client,AI: 회의록 확정 및 Todo 추출
|
||
Client->>Gateway: 회의록 최종 확정
|
||
Gateway->>Meeting: 확정 요청
|
||
Meeting->>AI: Todo 자동 추출 요청
|
||
AI->>AI: LLM 분석<br/>(액션 아이템 추출)
|
||
AI-->>Meeting: 추출된 Todo 목록
|
||
|
||
Note over Meeting,Todo: Saga 시작 (Phase 3)
|
||
Meeting->>Todo: Todo 할당 요청 (Saga Start)
|
||
|
||
Note over Todo,Calendar: Saga Step 1: Todo 등록
|
||
Todo->>Todo: Todo 데이터 저장
|
||
Todo->>EventBus: TodoCreated 이벤트<br/>(Publisher)
|
||
|
||
Note over Todo,Calendar: Saga Step 2: 알림 발송
|
||
EventBus->>Notif: TodoCreated 수신<br/>(Subscriber)
|
||
Notif->>Notif: 이메일 발송
|
||
|
||
alt 알림 성공
|
||
Notif->>EventBus: NotificationSent 이벤트
|
||
else 알림 실패
|
||
Notif->>EventBus: NotificationFailed 이벤트
|
||
EventBus->>Todo: 보상 트랜잭션<br/>(Todo 상태 변경: 알림 실패)
|
||
end
|
||
|
||
Note over Todo,Calendar: Saga Step 3: 캘린더 등록
|
||
EventBus->>Todo: NotificationSent 수신
|
||
Todo->>Calendar: 일정 등록 요청 (비동기)
|
||
|
||
alt 캘린더 등록 성공
|
||
Calendar-->>Todo: 성공
|
||
Todo->>EventBus: TodoCompleted 이벤트<br/>(Saga 완료)
|
||
else 캘린더 등록 실패
|
||
Calendar--xTodo: 실패
|
||
Todo->>Todo: 보상 트랜잭션<br/>(Todo 상태: 캘린더 미등록)
|
||
Todo->>EventBus: SagaCompensated 이벤트
|
||
end
|
||
|
||
Note over EventBus,Meeting: 회의록 실시간 반영
|
||
EventBus->>Meeting: Todo 이벤트 수신
|
||
Meeting->>Meeting: 회의록에 Todo 링크 추가
|
||
Meeting->>EventBus: MeetingUpdated 이벤트
|
||
EventBus->>Client: WebSocket Push (Todo 상태)
|
||
Client->>Client: 화면 업데이트
|
||
|
||
Note over Client,Meeting: Todo 완료 처리
|
||
Client->>Todo: Todo 완료 요청
|
||
Todo->>Todo: 완료 시간 기록
|
||
Todo->>EventBus: TodoCompleted 이벤트
|
||
EventBus->>Meeting: Todo 완료 수신
|
||
Meeting->>Meeting: 회의록에 완료 표시
|
||
Meeting->>EventBus: MeetingUpdated 이벤트
|
||
EventBus->>Client: WebSocket Push (완료 상태)
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Phase별 구현 로드맵
|
||
|
||
### 4.1 Phase 1: MVP (3개월)
|
||
|
||
#### 목표
|
||
- 핵심 기능 구현 (회의록 작성, STT, AI, Todo)
|
||
- 안정적 서비스 출시
|
||
- 100명 동시 사용자 지원
|
||
|
||
#### 적용 패턴 (8개)
|
||
1. API Gateway
|
||
2. Gateway Offloading
|
||
3. Queue-Based Load Leveling
|
||
4. Cache-Aside
|
||
5. Publisher-Subscriber
|
||
6. Asynchronous Request-Reply
|
||
7. Federated Identity
|
||
8. Health Endpoint Monitoring
|
||
|
||
#### 마일스톤
|
||
| 주차 | 작업 내용 | 산출물 |
|
||
|------|-----------|--------|
|
||
| 1-2주 | 인프라 구축 | API Gateway, Redis, RabbitMQ 설정 |
|
||
| 3-4주 | User/Meeting 서비스 개발 | 인증, 회의 관리 API |
|
||
| 5-6주 | STT 서비스 개발 | 음성 녹음, 변환 API |
|
||
| 7-8주 | AI 서비스 개발 | 회의록 자동 생성, Todo 추출 |
|
||
| 9-10주 | RAG/Collaboration 서비스 | 용어 설명, 실시간 동기화 |
|
||
| 11-12주 | 통합 테스트 및 배포 | 프로덕션 배포, 모니터링 |
|
||
|
||
#### 예상 성과
|
||
- **성능**:
|
||
- STT 변환: 1초 이내 ✓
|
||
- AI 회의록 생성: 10초 이내
|
||
- RAG 검색: 2초 (캐시 적중 0.1초)
|
||
- 실시간 동기화: 3-5초 간격
|
||
- **가용성**: 99% uptime
|
||
- **동시 사용자**: 100명
|
||
- **비용**: 월 $500 (Azure 인프라)
|
||
|
||
### 4.2 Phase 2: 확장 (6개월, MVP 이후)
|
||
|
||
#### 목표
|
||
- 성능 최적화 (CQRS, Materialized View)
|
||
- 안정성 강화 (Circuit Breaker, Retry, Bulkhead)
|
||
- 1,000명 동시 사용자 지원
|
||
|
||
#### 추가 패턴 (6개)
|
||
9. CQRS
|
||
10. Circuit Breaker
|
||
11. Retry
|
||
12. Materialized View
|
||
13. Bulkhead
|
||
14. Valet Key
|
||
|
||
#### 마일스톤
|
||
| 월 | 작업 내용 | 성과 지표 |
|
||
|----|-----------|-----------|
|
||
| 1-2개월 | CQRS 적용 (Meeting 서비스) | 읽기 성능 70% 향상 |
|
||
| 3-4개월 | Circuit Breaker/Retry 적용 | 장애 복구 시간 90% 단축 |
|
||
| 5개월 | Materialized View 구현 | 목록 조회 80% 빠름 |
|
||
| 6개월 | 부하 테스트 및 최적화 | 1,000명 동시 사용자 |
|
||
|
||
#### 예상 성과
|
||
- **성능 개선**:
|
||
- 읽기 응답시간: 70% 단축 (CQRS)
|
||
- 목록 조회: 80% 빠름 (Materialized View)
|
||
- RAG 캐시 적중률: 80%
|
||
- **가용성**: 99.9% uptime (Circuit Breaker)
|
||
- **동시 사용자**: 1,000명 (10배 증가)
|
||
- **비용**: 월 $2,000 (Auto-scaling)
|
||
|
||
### 4.3 Phase 3: 고도화 (12개월, Phase 2 이후)
|
||
|
||
#### 목표
|
||
- 대규모 확장 (10,000명 동시 사용자)
|
||
- 완벽한 감사 추적 (Event Sourcing)
|
||
- 글로벌 배포 (다중 리전)
|
||
|
||
#### 추가 패턴 (4개)
|
||
15. Event Sourcing
|
||
16. Saga
|
||
17. Priority Queue
|
||
18. External Configuration Store
|
||
|
||
#### 마일스톤
|
||
| 분기 | 작업 내용 | 성과 지표 |
|
||
|------|-----------|-----------|
|
||
| Q1 | Event Sourcing 구현 | 완벽한 변경 이력 |
|
||
| Q2 | Saga 패턴 적용 (Todo) | 분산 트랜잭션 일관성 |
|
||
| Q3 | Priority Queue 도입 | VIP 회의 50% 빠름 |
|
||
| Q4 | 다중 리전 배포 | 글로벌 확장 |
|
||
|
||
#### 예상 성과
|
||
- **성능**:
|
||
- Priority Queue: VIP 회의 응답시간 50% 단축
|
||
- Event Sourcing: 완벽한 감사 추적
|
||
- **가용성**: 99.99% uptime (다중 리전)
|
||
- **동시 사용자**: 10,000명
|
||
- **글로벌**: 3개 리전 (한국, 미국, 유럽)
|
||
- **비용**: 월 $10,000 (글로벌 인프라)
|
||
|
||
### 4.4 비용 효율성 분석
|
||
|
||
| Phase | 인프라 비용 | 예상 절감 | ROI |
|
||
|-------|------------|----------|-----|
|
||
| MVP | $500/월 | - | - |
|
||
| Phase 2 | $2,000/월 | Cache-Aside: RAG 비용 60% 절감<br/>Async: AI API 30% 절감<br/>Auto-scaling: 유휴 자원 80% 절감 | **총 50% 절감** |
|
||
| Phase 3 | $10,000/월 | 글로벌 확장으로 사용자 10배 증가<br/>비용은 5배만 증가 (효율성 2배) | **비용 대비 2배 효율** |
|
||
|
||
---
|
||
|
||
## 5. 구현 시 고려사항
|
||
|
||
### 5.1 API Gateway 구현
|
||
|
||
**기술 스택**: Spring Cloud Gateway
|
||
|
||
**설정**:
|
||
```yaml
|
||
spring:
|
||
cloud:
|
||
gateway:
|
||
routes:
|
||
- id: user-service
|
||
uri: lb://user-service
|
||
predicates:
|
||
- Path=/api/users/**
|
||
filters:
|
||
- name: RequestRateLimiter
|
||
args:
|
||
redis-rate-limiter.replenishRate: 100
|
||
redis-rate-limiter.burstCapacity: 200
|
||
- id: meeting-service
|
||
uri: lb://meeting-service
|
||
predicates:
|
||
- Path=/api/meetings/**
|
||
```
|
||
|
||
**Gateway Offloading**:
|
||
- LDAP 인증: Spring Security LDAP
|
||
- 로깅: Spring Cloud Sleuth + Zipkin
|
||
- SSL 종료: Let's Encrypt 인증서
|
||
|
||
**Rate Limiting**:
|
||
- 사용자당: 100 req/min
|
||
- 익명 사용자: 10 req/min
|
||
- VIP: 500 req/min
|
||
|
||
### 5.2 Queue 설정
|
||
|
||
**기술 스택**: RabbitMQ (MVP), Kafka (Phase 2)
|
||
|
||
**Queue 구성**:
|
||
```yaml
|
||
queues:
|
||
stt:
|
||
name: stt-conversion-queue
|
||
type: priority # Priority Queue (Phase 3)
|
||
durable: true
|
||
ttl: 1800000 # 30분
|
||
dead-letter-exchange: stt-dlx
|
||
|
||
ai:
|
||
name: ai-generation-queue
|
||
type: priority
|
||
durable: true
|
||
ttl: 1800000
|
||
dead-letter-exchange: ai-dlx
|
||
|
||
notification:
|
||
name: notification-queue
|
||
durable: true
|
||
ttl: 300000 # 5분
|
||
```
|
||
|
||
**Dead Letter Queue**:
|
||
- 실패한 메시지 3회 재시도 후 DLQ로 이동
|
||
- DLQ 메시지 수동 확인 및 재처리
|
||
|
||
**메시지 우선순위** (Phase 3):
|
||
- VIP 회의: Priority 9
|
||
- 일반 회의: Priority 5
|
||
- 배치 작업: Priority 1
|
||
|
||
### 5.3 Cache 전략
|
||
|
||
**기술 스택**: Redis Cluster (고가용성)
|
||
|
||
**TTL 설정**:
|
||
```yaml
|
||
cache:
|
||
rag-search:
|
||
ttl: 3600 # 1시간
|
||
max-size: 10000
|
||
|
||
user-info:
|
||
ttl: 1800 # 30분
|
||
max-size: 5000
|
||
|
||
meeting-list:
|
||
ttl: 300 # 5분
|
||
max-size: 1000
|
||
|
||
todo-list:
|
||
ttl: 300 # 5분
|
||
max-size: 2000
|
||
```
|
||
|
||
**캐시 무효화**:
|
||
- 쓰기 작업 시 즉시 무효화
|
||
- 회의록 수정 → 해당 회의 캐시 삭제
|
||
- Todo 상태 변경 → Todo 목록 캐시 삭제
|
||
|
||
**캐시 워밍**:
|
||
- 애플리케이션 시작 시 인기 회의록 사전 로드
|
||
- 스케줄러: 매일 오전 6시 캐시 갱신
|
||
|
||
### 5.4 WebSocket 최적화
|
||
|
||
**기술 스택**: SockJS + STOMP
|
||
|
||
**설정**:
|
||
```yaml
|
||
websocket:
|
||
heartbeat:
|
||
client: 30000 # 30초
|
||
server: 30000
|
||
|
||
message-size-limit: 1048576 # 1MB
|
||
|
||
connection:
|
||
max-per-user: 5
|
||
timeout: 300000 # 5분
|
||
```
|
||
|
||
**재연결 정책**:
|
||
- Exponential Backoff: 1초, 2초, 4초, 8초, 16초
|
||
- 최대 재시도: 5회
|
||
|
||
**메시지 전송 최적화**:
|
||
- Delta 전송: 전체 내용이 아닌 변경 부분만
|
||
- 압축: gzip 압축 (1KB 이상 메시지)
|
||
- 배치: 100ms 내 변경사항 묶어서 전송
|
||
|
||
### 5.5 AI/LLM 최적화
|
||
|
||
**기술 스택**: Azure OpenAI Service
|
||
|
||
**배치 처리**:
|
||
```python
|
||
# 여러 요청 묶어서 처리
|
||
batch_requests = []
|
||
for i in range(batch_size):
|
||
request = queue.pop()
|
||
batch_requests.append(request)
|
||
|
||
# 한 번에 처리
|
||
responses = openai.ChatCompletion.create_batch(batch_requests)
|
||
```
|
||
|
||
**스트리밍 응답**:
|
||
- 긴 회의록 생성 시 스트리밍
|
||
- 클라이언트에 실시간 전달 (WebSocket)
|
||
|
||
**프롬프트 캐싱**:
|
||
- 동일 템플릿 재사용
|
||
- Redis에 프롬프트 템플릿 저장
|
||
|
||
**비용 최적화**:
|
||
- 토큰 제한: 요약 시 최대 500 토큰
|
||
- 모델 선택: GPT-3.5 (일반), GPT-4 (중요 회의)
|
||
|
||
### 5.6 Circuit Breaker 설정
|
||
|
||
**기술 스택**: Resilience4j
|
||
|
||
**설정**:
|
||
```yaml
|
||
resilience4j:
|
||
circuitbreaker:
|
||
instances:
|
||
azure-speech:
|
||
failure-rate-threshold: 50 # 50% 실패 시 OPEN
|
||
wait-duration-in-open-state: 30s
|
||
sliding-window-size: 10
|
||
minimum-number-of-calls: 5
|
||
|
||
openai:
|
||
failure-rate-threshold: 50
|
||
wait-duration-in-open-state: 60s # 1분
|
||
sliding-window-size: 20
|
||
|
||
retry:
|
||
instances:
|
||
azure-speech:
|
||
max-attempts: 3
|
||
wait-duration: 1s
|
||
retry-exceptions:
|
||
- java.net.SocketTimeoutException
|
||
- org.springframework.web.client.HttpServerErrorException
|
||
```
|
||
|
||
**Fallback 전략**:
|
||
- STT 실패 → 수동 입력 안내
|
||
- AI 실패 → 기본 템플릿 제공
|
||
- RAG 실패 → 일반 용어 설명
|
||
|
||
### 5.7 CQRS 구현 (Phase 2)
|
||
|
||
**Read Model** (조회):
|
||
```java
|
||
@Service
|
||
public class MeetingQueryService {
|
||
@Cacheable("meeting-list")
|
||
public List<MeetingListDTO> getMeetingList(Long userId) {
|
||
// Materialized View 조회
|
||
return materializedViewRepository.findByUserId(userId);
|
||
}
|
||
}
|
||
```
|
||
|
||
**Write Model** (쓰기):
|
||
```java
|
||
@Service
|
||
public class MeetingCommandService {
|
||
@CacheEvict(value = "meeting-list", key = "#userId")
|
||
public void updateMeeting(Long meetingId, MeetingUpdateRequest request) {
|
||
// DB 갱신
|
||
meetingRepository.update(meetingId, request);
|
||
|
||
// 이벤트 발행
|
||
eventBus.publish(new MeetingUpdatedEvent(meetingId));
|
||
}
|
||
}
|
||
```
|
||
|
||
**Materialized View 갱신**:
|
||
- 이벤트 기반 비동기 갱신
|
||
- 배치 작업: 매 10분마다 동기화
|
||
|
||
### 5.8 Event Sourcing 구현 (Phase 3)
|
||
|
||
**Event Store**:
|
||
```java
|
||
@Entity
|
||
public class MeetingEvent {
|
||
@Id
|
||
private UUID eventId;
|
||
private Long aggregateId; // Meeting ID
|
||
private String eventType; // CREATED, UPDATED, SHARED
|
||
private String eventData; // JSON
|
||
private LocalDateTime timestamp;
|
||
private Long userId;
|
||
}
|
||
```
|
||
|
||
**이벤트 재생**:
|
||
```java
|
||
public Meeting rebuildFromEvents(Long meetingId) {
|
||
List<MeetingEvent> events = eventStore.findByAggregateId(meetingId);
|
||
Meeting meeting = new Meeting();
|
||
for (MeetingEvent event : events) {
|
||
meeting.apply(event);
|
||
}
|
||
return meeting;
|
||
}
|
||
```
|
||
|
||
**스냅샷** (성능 최적화):
|
||
- 100개 이벤트마다 스냅샷 생성
|
||
- 재생 시 최신 스냅샷부터 시작
|
||
|
||
### 5.9 모니터링 및 운영
|
||
|
||
**Health Endpoint**:
|
||
```yaml
|
||
management:
|
||
endpoints:
|
||
web:
|
||
exposure:
|
||
include: health, metrics, prometheus
|
||
health:
|
||
circuitbreakers:
|
||
enabled: true
|
||
redis:
|
||
enabled: true
|
||
db:
|
||
enabled: true
|
||
```
|
||
|
||
**Metrics** (Prometheus + Grafana):
|
||
- 서비스 응답시간 (p50, p95, p99)
|
||
- 요청 처리량 (req/s)
|
||
- 에러율 (%)
|
||
- Circuit Breaker 상태
|
||
- 캐시 적중률
|
||
|
||
**분산 추적** (Zipkin):
|
||
- 요청 전체 흐름 추적
|
||
- 병목 구간 식별
|
||
|
||
**로그 중앙화** (ELK Stack):
|
||
- Elasticsearch: 로그 저장
|
||
- Logstash: 로그 수집 및 파싱
|
||
- Kibana: 로그 검색 및 시각화
|
||
|
||
**알림** (Phase 2):
|
||
- 에러율 5% 초과 → Slack 알림
|
||
- Circuit Breaker OPEN → 즉시 알림
|
||
- 디스크 사용량 80% → 경고
|
||
|
||
### 5.10 보안
|
||
|
||
**HTTPS 강제**:
|
||
- Let's Encrypt 무료 인증서
|
||
- HTTP → HTTPS 자동 리다이렉트
|
||
|
||
**CORS 설정**:
|
||
```yaml
|
||
spring:
|
||
web:
|
||
cors:
|
||
allowed-origins:
|
||
- https://meeting.example.com
|
||
allowed-methods: GET, POST, PUT, DELETE
|
||
allowed-headers: "*"
|
||
allow-credentials: true
|
||
```
|
||
|
||
**SQL Injection 방지**:
|
||
- JPA/Hibernate PreparedStatement 사용
|
||
- 동적 쿼리 금지
|
||
|
||
**XSS 방지**:
|
||
- Input Sanitization (OWASP Java Encoder)
|
||
- Output Encoding
|
||
|
||
**민감 정보 암호화**:
|
||
- DB 암호화: AES-256
|
||
- 전송 암호화: TLS 1.3
|
||
|
||
---
|
||
|
||
## 6. 예상 성과 지표
|
||
|
||
### 6.1 Phase별 성과 비교
|
||
|
||
| 지표 | MVP (Phase 1) | Phase 2 (확장) | Phase 3 (고도화) |
|
||
|------|---------------|----------------|------------------|
|
||
| **성능** | | | |
|
||
| STT 변환 | 1초 이내 | 0.8초 | 0.5초 |
|
||
| AI 회의록 생성 | 10초 | 7초 (배치 처리) | 5초 (스트리밍) |
|
||
| RAG 검색 (캐시 미스) | 2초 | 1.5초 | 1초 |
|
||
| RAG 검색 (캐시 적중) | 0.1초 | 0.1초 | 0.1초 |
|
||
| 실시간 동기화 | 3-5초 | 2-3초 | 1-2초 |
|
||
| 회의록 목록 조회 | 500ms | 100ms (Materialized View) | 50ms |
|
||
| **가용성** | | | |
|
||
| Uptime | 99% | 99.9% | 99.99% |
|
||
| MTTR (평균 복구 시간) | 30분 | 3분 (Circuit Breaker) | 1분 |
|
||
| **확장성** | | | |
|
||
| 동시 사용자 | 100명 | 1,000명 | 10,000명 |
|
||
| 회의당 최대 참석자 | 10명 | 50명 | 100명 |
|
||
| 일일 회의 처리 | 500건 | 5,000건 | 50,000건 |
|
||
| **비용** | | | |
|
||
| 인프라 비용 | $500/월 | $2,000/월 | $10,000/월 |
|
||
| 사용자당 비용 | $5/월 | $2/월 (2.5배 절감) | $1/월 (5배 절감) |
|
||
|
||
### 6.2 패턴별 기대 효과
|
||
|
||
#### Cache-Aside
|
||
- **RAG 검색 비용**: 60% 절감
|
||
- 캐시 미스: 2초 → 캐시 적중: 0.1초
|
||
- 캐시 적중률: 80% (Phase 2)
|
||
- **API 호출 감소**: 외부 API 호출 80% 감소
|
||
- **비용 절감**: 월 $500 → $200 (RAG API 비용)
|
||
|
||
#### Queue-Based Load Leveling
|
||
- **처리량 향상**: 동시 요청 100 → 1,000 (10배)
|
||
- **응답 안정성**: 피크 시간대 응답시간 편차 50% 감소
|
||
- **자원 효율**: CPU 사용률 평준화 (80% → 50%)
|
||
|
||
#### Asynchronous Request-Reply
|
||
- **사용자 대기 시간**: 10초 → 즉시 응답 (202 Accepted)
|
||
- **사용자 경험**: 응답 대기 중 다른 작업 가능
|
||
- **AI API 최적화**: 배치 처리로 30% 비용 절감
|
||
|
||
#### CQRS (Phase 2)
|
||
- **읽기 성능**: 응답시간 70% 단축 (500ms → 150ms)
|
||
- **쓰기 성능**: 독립적 최적화 가능
|
||
- **확장성**: 읽기/쓰기 DB 독립 스케일링
|
||
|
||
#### Circuit Breaker (Phase 2)
|
||
- **장애 복구**: MTTR 30분 → 3분 (90% 단축)
|
||
- **장애 격리**: 한 서비스 장애가 전체 영향 없음
|
||
- **가용성**: 99% → 99.9% uptime
|
||
|
||
#### Event Sourcing (Phase 3)
|
||
- **감사 추적**: 100% 변경 이력 보존
|
||
- **데이터 복원**: 임의 시점 상태 복원 가능
|
||
- **규제 준수**: 완벽한 감사 로그
|
||
|
||
#### Priority Queue (Phase 3)
|
||
- **VIP 회의**: 응답시간 50% 단축 (10초 → 5초)
|
||
- **비즈니스 가치**: 중요 회의 우선 처리
|
||
- **자원 활용**: 일반 회의는 유휴 시간 활용
|
||
|
||
### 6.3 비용 효율성 분석
|
||
|
||
#### Phase 1 (MVP)
|
||
- **인프라**: $500/월
|
||
- API Gateway: $100
|
||
- Redis: $50
|
||
- RabbitMQ: $50
|
||
- DB (PostgreSQL): $100
|
||
- 컴퓨팅 (VM): $200
|
||
- **외부 API**: $300/월
|
||
- Azure Speech: $100
|
||
- OpenAI: $200
|
||
- **총 비용**: $800/월
|
||
- **사용자**: 100명
|
||
- **사용자당 비용**: $8/월
|
||
|
||
#### Phase 2 (확장)
|
||
- **인프라**: $2,000/월 (4배 증가)
|
||
- **외부 API**: $600/월 (2배 증가)
|
||
- Cache-Aside로 60% 절감 → $240 절감
|
||
- Async 배치 처리로 30% 절감 → $60 절감
|
||
- 실제 비용: $600 - $300 = $300
|
||
- **총 비용**: $2,300/월
|
||
- **사용자**: 1,000명 (10배 증가)
|
||
- **사용자당 비용**: $2.3/월 (71% 절감)
|
||
|
||
#### Phase 3 (고도화)
|
||
- **인프라**: $10,000/월 (글로벌 배포)
|
||
- **외부 API**: $1,000/월
|
||
- **총 비용**: $11,000/월
|
||
- **사용자**: 10,000명
|
||
- **사용자당 비용**: $1.1/월 (86% 절감 대비 MVP)
|
||
|
||
**ROI 분석**:
|
||
- Phase 2: 투자 대비 2.5배 효율 (사용자 10배, 비용 4배)
|
||
- Phase 3: 투자 대비 7배 효율 (사용자 100배, 비용 14배)
|
||
|
||
---
|
||
|
||
## 7. 결론
|
||
|
||
### 7.1 핵심 성과
|
||
|
||
본 아키텍처 패턴 적용 방안은 회의록 작성 및 공유 개선 서비스의 기술적 도전과제를 체계적으로 해결합니다:
|
||
|
||
1. **실시간 협업 처리**: Publisher-Subscriber + WebSocket으로 3-5초 실시간 동기화 달성
|
||
2. **대용량 데이터 처리**: Queue-Based Load Leveling으로 안정적 비동기 처리
|
||
3. **AI/LLM 통합**: Asynchronous Request-Reply + Circuit Breaker로 안정성과 사용자 경험 보장
|
||
4. **RAG 성능**: Cache-Aside로 80% 캐시 적중률, 60% 비용 절감
|
||
5. **서비스 격리**: Circuit Breaker + Bulkhead로 99.9% 가용성 달성
|
||
6. **데이터 일관성**: Saga + Event Sourcing으로 완벽한 일관성 보장
|
||
|
||
### 7.2 차별화 포인트 실현
|
||
|
||
아키텍처 패턴 적용으로 서비스 차별화 포인트를 강화합니다:
|
||
|
||
- **맥락 기반 용어 설명**: RAG + Cache-Aside로 2초 이내 실용적 정보 제공
|
||
- **강화된 Todo 연결**: Saga 패턴으로 Todo ↔ 회의록 실시간 양방향 연동
|
||
- **프롬프팅 기반 회의록 개선**: Async Request-Reply로 즉시 응답, 백그라운드 생성
|
||
|
||
### 7.3 단계별 추진 전략
|
||
|
||
**Phase 1 (MVP)**: 핵심 패턴 8개로 안정적 출시
|
||
- API Gateway, Queue, Cache, Pub-Sub 중심
|
||
- 100명 사용자, 99% 가용성 목표
|
||
|
||
**Phase 2 (확장)**: 성능 최적화 및 안정성 강화
|
||
- CQRS, Circuit Breaker, Materialized View 추가
|
||
- 1,000명 사용자, 99.9% 가용성 목표
|
||
- 70% 성능 향상, 90% 장애 복구 시간 단축
|
||
|
||
**Phase 3 (고도화)**: 대규모 확장 및 글로벌 배포
|
||
- Event Sourcing, Saga, Priority Queue 적용
|
||
- 10,000명 사용자, 99.99% 가용성 목표
|
||
- 완벽한 감사 추적, 글로벌 3개 리전
|
||
|
||
### 7.4 비용 효율성
|
||
|
||
- **Phase 1**: 사용자당 $8/월
|
||
- **Phase 2**: 사용자당 $2.3/월 (71% 절감)
|
||
- **Phase 3**: 사용자당 $1.1/월 (86% 절감)
|
||
|
||
**투자 대비 수익**:
|
||
- Phase 2: 2.5배 효율 (사용자 10배 증가, 비용 4배 증가)
|
||
- Phase 3: 7배 효율 (사용자 100배 증가, 비용 14배 증가)
|
||
|
||
### 7.5 리스크 및 대응
|
||
|
||
| 리스크 | 영향 | 대응 패턴 |
|
||
|--------|------|-----------|
|
||
| AI/STT API 장애 | 서비스 중단 | Circuit Breaker + Retry |
|
||
| 동시 수정 충돌 | 데이터 손실 | Last Write Wins + Event Sourcing |
|
||
| 대용량 트래픽 | 응답 지연 | Queue-Based Load Leveling + Auto-scaling |
|
||
| 캐시 불일치 | 데이터 정합성 | Write-through + TTL 관리 |
|
||
| 분산 트랜잭션 실패 | 데이터 불일치 | Saga + 보상 트랜잭션 |
|
||
|
||
### 7.6 다음 단계
|
||
|
||
1. **MVP 개발 착수** (즉시)
|
||
- API Gateway, Queue, Cache 인프라 구축
|
||
- User/Meeting 서비스 개발 시작
|
||
|
||
2. **프로토타입 검증** (1개월 내)
|
||
- 핵심 패턴 PoC 구현
|
||
- 성능 및 안정성 테스트
|
||
|
||
3. **단계별 출시** (3-12개월)
|
||
- Phase 1: 3개월 MVP 출시
|
||
- Phase 2: 6개월 성능 최적화
|
||
- Phase 3: 12개월 글로벌 확장
|
||
|
||
---
|
||
|
||
## 부록
|
||
|
||
### A. 참고 문서
|
||
- [유저스토리](../userstory.md)
|
||
- [클라우드 디자인 패턴 개요](../../claude/cloud-design-patterns.md)
|
||
- [아키텍처 패턴 선정 가이드](../../claude/architecture-patterns.md)
|
||
|
||
### B. 기술 스택
|
||
- **API Gateway**: Spring Cloud Gateway
|
||
- **Message Queue**: RabbitMQ (MVP), Kafka (Phase 2)
|
||
- **Cache**: Redis Cluster
|
||
- **Database**: PostgreSQL (주 DB), MongoDB (Event Store)
|
||
- **WebSocket**: SockJS + STOMP
|
||
- **Circuit Breaker**: Resilience4j
|
||
- **모니터링**: Prometheus + Grafana, Zipkin, ELK Stack
|
||
- **외부 API**: Azure Speech, Azure OpenAI, Azure Blob Storage
|
||
|
||
### C. 용어 정의
|
||
- **STT**: Speech-to-Text (음성-텍스트 변환)
|
||
- **LLM**: Large Language Model (대규모 언어 모델)
|
||
- **RAG**: Retrieval-Augmented Generation (검색 증강 생성)
|
||
- **CQRS**: Command Query Responsibility Segregation (명령 쿼리 책임 분리)
|
||
- **Saga**: 분산 트랜잭션 관리 패턴
|
||
- **Event Sourcing**: 이벤트 기반 데이터 저장 패턴
|
||
- **Circuit Breaker**: 장애 격리 패턴
|
||
- **Pub-Sub**: Publisher-Subscriber (발행-구독) 패턴
|
||
|
||
### D. Mermaid 다이어그램 검증
|
||
모든 Mermaid 다이어그램은 https://mermaid.live/edit 에서 검증 완료되었습니다.
|
||
|
||
---
|
||
|
||
**문서 버전**: 1.0
|
||
**최종 수정**: 2025-10-21
|
||
**작성자**: 아키텍트 팀 (길동)
|