mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 05:36:23 +00:00
논리아키텍처설계
This commit is contained in:
parent
3a1cc5be83
commit
b98db59c7c
@ -23,9 +23,16 @@
|
||||
"Bash(git commit -m \"$(cat <<''EOF''\n프로토타입 개발 완료 (다람지팀)\n\n- 스타일 가이드 작성 (style-guide.md)\n - 14개 섹션으로 구성된 완전한 디자인 시스템\n - Mobile First 철학 및 접근성 기준 정의\n \n- 공통 리소스 개발\n - common.css: 700+ 라인 반응형 스타일시트\n - common.js: 400+ 라인 유틸리티 라이브러리\n \n- 9개 프로토타입 화면 개발\n - 01-로그인: 사용자 인증\n - 02-대시보드: 메인 대시보드\n - 03-회의예약: 회의 생성 폼\n - 04-템플릿선택: 회의록 템플릿 선택\n - 05-회의진행: 실시간 회의 진행\n - 06-검증완료: 섹션별 검증\n - 07-회의종료: 회의 통계\n - 08-회의록공유: 공유 설정\n - 09-Todo관리: Todo 목록 및 진행 관리\n \n- 주요 특징\n - Mobile First 반응형 디자인\n - WCAG 2.1 Level AA 접근성 준수\n - 실제 동작하는 인터랙션 구현\n - 일관된 예제 데이터 활용\n - Playwright 브라우저 테스트 완료\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nEOF\n)\")",
|
||||
"Bash(git commit -m \"UI/UX 프로토타입 디렉토리 정리\n\n- 기존 프로토타입 파일 삭제\n- 백업 디렉토리(uiux_bk) 추가\n- 프로젝트 구조 정리\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\")",
|
||||
"Bash(curl -s https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/architecture-patterns.md -o claude/architecture-patterns.md)",
|
||||
"Bash(cp:*)",
|
||||
"Bash(git commit -m \"$(cat <<''EOF''\n아키텍처 패턴 설계서 업데이트 및 백업\n\n- 클라우드 아키텍처 패턴 적용 방안 재작성\n- 기존 버전을 architecture-pattern_bk.md로 백업\n- .claude/settings.local.json 설정 업데이트\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nEOF\n)\")",
|
||||
"Bash(git commit:*)"
|
||||
"Bash(curl -s \"https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/references/Cloud%20Design%20Patterns(%EA%B0%9C%EC%9A%94).md\" -o claude/cloud-design-patterns.md)",
|
||||
"Bash(curl -s https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/mermaid-guide.md -o claude/mermaid-guide.md)",
|
||||
"Bash(curl -s https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/tools/check-mermaid.ps1 -o tools/check-mermaid.ps1)",
|
||||
"Bash(git add:*)",
|
||||
"Bash(git commit:*)",
|
||||
"Bash(curl -s https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/common-principles.md -o claude/common-principles.md)",
|
||||
"Bash(curl -s https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/guides/design/logical-architecture-design.md -o claude/logical-architecture-design.md)",
|
||||
"Bash(curl:*)",
|
||||
"Bash(chmod:*)",
|
||||
"Bash(./tools/check-mermaid.sh:*)"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
|
||||
197
claude/common-principles.md
Normal file
197
claude/common-principles.md
Normal file
@ -0,0 +1,197 @@
|
||||
# 공통설계원칙
|
||||
|
||||
모든 설계 단계에서 공통으로 적용되는 핵심 원칙과 전략
|
||||
|
||||
## 🎯 핵심 원칙
|
||||
|
||||
### 1. 🚀 실행 우선 원칙
|
||||
- **프롬프트 우선**: 바로 실행할 수 있는 프롬프트로 작업 시작
|
||||
- **가이드 학습**: 원리와 방법론은 가이드로 깊이 있게 학습
|
||||
- **점진적 이해**: 실행 → 결과 확인 → 원리 학습 순서
|
||||
|
||||
### 2. 🔄 병렬 처리 전략
|
||||
- **서브 에이전트 활용**: Task 도구로 서비스별 동시 작업
|
||||
- **의존성 기반 그룹화**: 의존 관계에 따른 순차/병렬 처리 결정
|
||||
- **통합 검증**: 병렬 작업 완료 후 전체적 일관성 검증
|
||||
|
||||
### 3. 🏗️ 마이크로서비스 설계 원칙
|
||||
- **서비스 독립성**: 캐시를 통한 직접 의존성 최소화
|
||||
- **선택적 비동기**: 장시간 작업(AI 일정 생성)만 비동기 처리
|
||||
- **캐시 우선**: Redis를 통한 성능 최적화
|
||||
- **독립 배포**: 서비스별 독립적 배포 가능한 구조
|
||||
|
||||
### 4. 📝 표준화 원칙
|
||||
- **PlantUML**: 모든 다이어그램 표준 (`!theme mono`)
|
||||
- **OpenAPI 3.0**: API 명세 표준
|
||||
- **자동 검증**: PlantUML, OpenAPI 문법 검사 필수
|
||||
- **일관된 네이밍**: kebab-case 파일명, 표준화된 스키마명
|
||||
|
||||
### 5. ✅ 검증 우선 원칙
|
||||
- **각 단계마다 자동 검증**: 품질 보장
|
||||
- **실시간 피드백**: 오류 조기 발견 및 수정
|
||||
- **CI/CD 통합**: 자동화된 검증 프로세스
|
||||
- **PlantUML 스크립트 파일 생성 즉시 검사 실행**: 'PlantUML 문법 검사 가이드' 준용
|
||||
|
||||
### 6. 🚀 점진적 구현 원칙
|
||||
- **MVP → 확장 → 고도화**: 단계별 접근
|
||||
- **YAGNI 적용**: 꼭 필요한 기능만 구현(YAGNI원칙:You aren't gonna need it)
|
||||
- **지속적 개선**: 피드백 기반 점진적 발전
|
||||
|
||||
## 🔧 의존성 분석 및 병렬 처리
|
||||
|
||||
### 의존성 분석 방법
|
||||
|
||||
1. **서비스 간 의존성 파악**
|
||||
```
|
||||
일정 서비스 → 프로파일 서비스 (멤버/여행 정보 조회)
|
||||
일정 서비스 → 장소 서비스 (장소 정보 조회)
|
||||
장소 서비스: 독립적 (외부 API만 사용)
|
||||
```
|
||||
|
||||
2. **의존성 기반 그룹화**
|
||||
```
|
||||
Group A (순차 처리): 프로파일 → 일정 서비스
|
||||
Group B (독립 처리): 장소 서비스
|
||||
```
|
||||
|
||||
3. **에이전트 할당 및 병렬 처리**
|
||||
```
|
||||
Agent 1: Group A 담당
|
||||
- 프로파일 서비스 설계
|
||||
- 일정 서비스 설계 (프로파일 참조)
|
||||
|
||||
Agent 2: Group B 담당
|
||||
- 장소 서비스 설계 (독립적)
|
||||
```
|
||||
|
||||
### 병렬 처리 적용 가이드
|
||||
|
||||
#### API 설계 단계
|
||||
- **독립 서비스**: 각각 별도 에이전트
|
||||
- **의존 서비스**: 동일 에이전트 내 순차 처리
|
||||
- **공통 검증**: 모든 에이전트 완료 후 swagger-cli 검증
|
||||
|
||||
#### 시퀀스 설계 단계
|
||||
- **외부 시퀀스**: 플로우별 병렬 처리 (각 플로우는 독립적)
|
||||
- **내부 시퀀스**: 서비스별 병렬 처리 (서비스 내부는 독립적)
|
||||
|
||||
#### 클래스/데이터 설계 단계
|
||||
- **의존성 그룹별**: 참조 관계가 있는 서비스들은 순차 처리
|
||||
- **독립 서비스**: 병렬 처리
|
||||
- **공통 클래스**: 모든 서비스 설계 완료 후 마지막 처리
|
||||
|
||||
## 🎨 PlantUML 작성 표준
|
||||
|
||||
### 기본 템플릿
|
||||
```plantuml
|
||||
@startuml
|
||||
!theme mono
|
||||
|
||||
title [다이어그램 제목]
|
||||
|
||||
' 다이어그램 내용
|
||||
@enduml
|
||||
```
|
||||
|
||||
### 필수 검증
|
||||
- **각 파일 생성 직후 PlantUML 문법 검사 수행**
|
||||
- **파이프 방식 권장**: `cat "파일" | docker exec -i plantuml ...`
|
||||
- **화살표 문법 주의**: sequence diagram에서 `..>` 사용 금지
|
||||
|
||||
### 스타일 가이드
|
||||
- **폰트 크기**: 적절한 가독성 확보
|
||||
- **색상 구분**: 서비스별, 레이어별 색상 구분
|
||||
- **설명 추가**: note를 활용한 상세 설명
|
||||
|
||||
## 🔌 API 설계 표준
|
||||
|
||||
### 파일 구조
|
||||
```
|
||||
design/backend/api/{service-name}-api.yaml
|
||||
```
|
||||
|
||||
### 필수 필드
|
||||
```yaml
|
||||
paths:
|
||||
/endpoint:
|
||||
get:
|
||||
summary: API 목적 설명
|
||||
operationId: 고유 식별자
|
||||
x-user-story: 유저스토리 ID
|
||||
x-controller: 담당 컨트롤러
|
||||
tags: [API 그룹]
|
||||
```
|
||||
|
||||
### 스키마 원칙
|
||||
- **서비스별 독립**: 각 서비스 파일에 모든 스키마 포함
|
||||
- **중복 허용**: 초기에는 중복을 허용하고 점진적으로 공통화
|
||||
- **명확한 네이밍**: Request/Response DTO 네이밍 표준
|
||||
|
||||
## 🔄 시퀀스 설계 표준
|
||||
|
||||
### 외부 시퀀스 (서비스 간)
|
||||
- **참여 서비스만**: 해당 플로우에 참여하는 서비스만 표시
|
||||
- **API 호출 중심**: 서비스 간 API 호출 순서 표현
|
||||
- **한글 설명**: 각 호출의 목적을 한글로 명시
|
||||
|
||||
### 내부 시퀀스 (서비스 내부)
|
||||
- **모든 API 표시**: 해당 서비스의 모든 API 포함
|
||||
- **내부 처리 흐름**: 컨트롤러 → 서비스 → 레포지토리 플로우
|
||||
- **기술적 세부사항**: 캐시, DB 접근 등 포함
|
||||
|
||||
### 동기/비동기 구분
|
||||
- **실선 (→)**: 동기 호출
|
||||
- **점선 (->>)**: 비동기 호출
|
||||
- **양방향**: 필요시에만 사용
|
||||
|
||||
## 📊 클래스 설계 표준
|
||||
|
||||
### 아키텍처 적용
|
||||
- **Clean Architecture**: Port/Adapter 용어 대신 표준 Clean 용어 사용
|
||||
- **멀티프로젝트**: 서비스별 독립 모듈
|
||||
- **패키지 구조 표준**: 일관된 패키지 구조 적용
|
||||
|
||||
### 관계 표현
|
||||
- **Generalization**: 상속 관계
|
||||
- **Realization**: 인터페이스 구현
|
||||
- **Dependency**: 의존 관계
|
||||
- **Association**: 연관 관계
|
||||
- **Aggregation/Composition**: 집약/합성 관계
|
||||
|
||||
### 상세 정보
|
||||
- **프로퍼티와 메소드**: 모두 명시
|
||||
- **접근 제한자**: 적절한 가시성 설정
|
||||
- **타입 정보**: 정확한 데이터 타입 명시
|
||||
|
||||
## 🗄️ 데이터 설계 표준
|
||||
|
||||
### 서비스별 DB 분리
|
||||
- **각 서비스마다 독립적인 데이터베이스**
|
||||
- **서비스 간 데이터 공유 최소화**
|
||||
- **캐시를 통한 성능 최적화**
|
||||
|
||||
### 클래스 설계와 일치
|
||||
- **Entity 클래스와 테이블 매핑**
|
||||
- **일관된 네이밍 컨벤션**
|
||||
- **적절한 정규화 수준**
|
||||
|
||||
## 🚨 주의사항
|
||||
|
||||
### PlantUML 문법
|
||||
- **sequence diagram에서 `..>` 사용 금지**
|
||||
- **비동기는 `->>` 또는 `-->>` 사용**
|
||||
- **테마는 반드시 `mono` 사용**
|
||||
|
||||
### 병렬 처리
|
||||
- **의존성 분석 선행**: 병렬 처리 전 반드시 의존성 파악
|
||||
- **순차 처리 필요시**: 무리한 병렬화보다는 안전한 순차 처리
|
||||
- **검증 단계 필수**: 병렬 처리 후 통합 검증
|
||||
|
||||
### API 설계
|
||||
- **유저스토리 ID 필수**: x-user-story 필드 누락 금지
|
||||
- **Controller 명시**: x-controller 필드로 담당 컨트롤러 명시
|
||||
- **스키마 완전성**: 모든 Request/Response 스키마 정의
|
||||
|
||||
---
|
||||
|
||||
💡 **이 원칙들은 모든 설계 단계에서 일관되게 적용되어야 하며, 각 단계별 세부 가이드에서 구체적으로 구현됩니다.**
|
||||
64
claude/logical-architecture-design.md
Normal file
64
claude/logical-architecture-design.md
Normal file
@ -0,0 +1,64 @@
|
||||
# 논리아키텍처설계가이드
|
||||
|
||||
[요청사항]
|
||||
- <작성원칙>을 준용하여 설계
|
||||
- <작성순서>에 따라 설계
|
||||
- [결과파일] 안내에 따라 파일 작성
|
||||
- 완료 후 mermaid 스크립트 테스트 방법 안내
|
||||
- https://mermaid.live/edit 에 접근
|
||||
- 스크립트 내용을 붙여넣어 확인
|
||||
|
||||
[가이드]
|
||||
<작성원칙>
|
||||
- **유저스토리와 매칭**되어야 함. **불필요한 추가 설계 금지**
|
||||
- UI/UX설계서의 '사용자 플로우'참조하여 설계
|
||||
- '아키텍처패턴'에 선정된 클라우드 디자인 패턴을 적용하여 설계
|
||||
- 사용자 관점의 컴포넌트 다이어그램 작성
|
||||
- Context Map 스타일로 서비스 내부 구조는 생략하고 서비스 간 관계에 집중
|
||||
- 클라이언트에서 API Gateway로는 단일 연결선으로 표현
|
||||
<작성순서>
|
||||
- 준비:
|
||||
- 유저스토리, UI/UX설계서, 아키텍처패턴 분석 및 이해
|
||||
- "@analyze --play" 프로토타입이 있는 경우 웹브라우저에서 실행하여 서비스 이해
|
||||
- 실행:
|
||||
- 논리아키텍처 설계서(logical-architecture.md) 작성: 아래 항목은 필수 포함하고 필요 시 항목 추가
|
||||
- 개요: 설계 원칙, 핵심 컴포넌트 정의
|
||||
- 서비스 아키텍처
|
||||
- 서비스별 책임
|
||||
- 서비스 간 통신 전략
|
||||
- 주요 사용자 플로우
|
||||
- 데이터 흐름 및 캐싱 전략
|
||||
- 확장성 및 성능 고려사항
|
||||
- 보안 고려사항
|
||||
- 논리아키텍처 다이어그램
|
||||
- Mermaid 형식으로 작성하며 별도 파일로 작성: logical-architecture.mmd
|
||||
- <통신전략>과 <의존성 표현 방법>을 준수
|
||||
- **Mermaid 스크립트 파일 검사 실행**: 'Mermaid문법검사가이드' 준용
|
||||
- 검토:
|
||||
- <작성원칙> 준수 검토
|
||||
- 스쿼드 팀원 리뷰: 누락 및 개선 사항 검토
|
||||
- 수정 사항 선택 및 반영
|
||||
<통신 전략>
|
||||
- **동기 통신**: 즉시 응답이 필요한 단순 조회
|
||||
- **캐시 우선**: 자주 사용되는 데이터는 캐시에서 직접 읽기
|
||||
- **비동기 처리**: 외부 API 다중 호출 등 장시간 작업
|
||||
<의존성 표현 방법>
|
||||
- 실선 화살표(→): 동기적 의존성 (필수)
|
||||
- 비동기 화살표(->>): 비동기 의존성 (fire-and-forget)
|
||||
- 점선 화살표(-->): 선택적 의존성 또는 느슨한 결합
|
||||
- 양방향 화살표(↔): 상호 의존성
|
||||
- 의존성 레이블에 목적 명시 (예: "멤버 정보 조회")
|
||||
- 플로우 라벨 형식: [요청서비스약어]액션 (예: [Trip]AI 일정 생성 요청)
|
||||
|
||||
[참고자료]
|
||||
- 유저스토리
|
||||
- UI/UX설계서
|
||||
- 프로토타입
|
||||
- 아키텍처패턴
|
||||
|
||||
[예시]
|
||||
- 논리아키텍처 다이어그램: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/samples/sample-논리아키텍처.mmd
|
||||
|
||||
[결과파일]
|
||||
- design/backend/logical/logical-architecture.md
|
||||
- design/backend/logical/logical-architecture.mmd
|
||||
706
design/backend/logical/logical-architecture.md
Normal file
706
design/backend/logical/logical-architecture.md
Normal file
@ -0,0 +1,706 @@
|
||||
# 논리 아키텍처 설계서
|
||||
|
||||
## 1. 개요
|
||||
|
||||
### 1.1 목적
|
||||
회의록 작성 및 공유 개선 서비스의 논리 아키텍처를 정의하고, 마이크로서비스 간 통신 전략과 클라우드 디자인 패턴 적용 방안을 제시합니다.
|
||||
|
||||
### 1.2 설계 원칙
|
||||
|
||||
#### 1.2.1 마이크로서비스 설계 원칙
|
||||
- **서비스 독립성**: 각 서비스는 독립적으로 배포 가능하며, 서비스 간 직접 의존성 최소화
|
||||
- **단일 책임**: 각 서비스는 명확한 비즈니스 책임을 가지며, 하나의 도메인 영역에 집중
|
||||
- **느슨한 결합**: 이벤트 기반 통신을 통한 서비스 간 결합도 최소화
|
||||
- **캐시 우선**: Redis를 통한 성능 최적화 및 서비스 간 데이터 공유 최소화
|
||||
|
||||
#### 1.2.2 통신 전략
|
||||
- **동기 통신**: 즉시 응답이 필요한 단순 조회 (REST API)
|
||||
- **비동기 통신**: 장시간 작업 및 이벤트 기반 통신 (RabbitMQ)
|
||||
- **캐시 우선**: 자주 사용되는 데이터는 Redis 캐시에서 직접 읽기
|
||||
- **API Gateway**: 모든 클라이언트 요청의 단일 진입점
|
||||
|
||||
#### 1.2.3 클라우드 디자인 패턴 적용
|
||||
- **API Gateway**: 라우팅, 인증, Rate Limiting
|
||||
- **Queue-Based Load Leveling**: 부하 분산 및 비동기 처리
|
||||
- **Cache-Aside**: 성능 최적화 및 DB 부하 감소
|
||||
- **Publisher-Subscriber**: 이벤트 기반 통신
|
||||
- **Asynchronous Request-Reply**: 장시간 작업 비동기 처리
|
||||
- **Health Endpoint Monitoring**: 서비스 상태 모니터링
|
||||
|
||||
### 1.3 핵심 컴포넌트
|
||||
|
||||
#### 1.3.1 클라이언트 레이어
|
||||
- **Web Application**: 브라우저 기반 SPA (Single Page Application)
|
||||
- **Mobile Application**: iOS/Android 네이티브 앱 (향후 확장)
|
||||
|
||||
#### 1.3.2 API Gateway
|
||||
- **Kong Gateway** 또는 **Spring Cloud Gateway**
|
||||
- 역할: 라우팅, 인증/인가, Rate Limiting, 로깅
|
||||
|
||||
#### 1.3.3 백엔드 서비스 (8개)
|
||||
1. **User Service**: 사용자 인증 및 권한 관리
|
||||
2. **Meeting Service**: 회의 관리, 회의록 생성 및 관리, 회의록 공유
|
||||
3. **STT Service**: 음성 녹음 관리, 음성-텍스트 변환, 화자 식별
|
||||
4. **AI Service**: LLM 기반 회의록 자동 작성, Todo 자동 추출, 프롬프팅 기반 회의록 개선
|
||||
5. **RAG Service**: 맥락 기반 용어 설명, 관련 문서 검색 및 연결, 업무 이력 통합
|
||||
6. **Collaboration Service**: 실시간 동기화, 버전 관리, 충돌 해결
|
||||
7. **Todo Service**: Todo 할당 및 관리, 진행 상황 추적, 회의록 실시간 연동
|
||||
8. **Notification Service**: 알림 발송 및 리마인더 관리
|
||||
|
||||
#### 1.3.4 인프라 컴포넌트
|
||||
- **PostgreSQL**: 각 서비스별 독립 데이터베이스
|
||||
- **Redis**: 분산 캐시 및 세션 관리
|
||||
- **RabbitMQ**: 메시지 큐 및 이벤트 버스
|
||||
- **Azure Storage**: 음성 파일 저장
|
||||
- **Azure Speech API**: STT(Speech-to-Text) 엔진
|
||||
- **LLM API**: AI 회의록 자동 작성 엔진
|
||||
|
||||
---
|
||||
|
||||
## 2. 서비스 아키텍처
|
||||
|
||||
### 2.1 서비스별 책임
|
||||
|
||||
#### 2.1.1 User Service
|
||||
**책임**: 사용자 인증 및 권한 관리
|
||||
- LDAP 연동 인증
|
||||
- JWT 토큰 발급 및 검증
|
||||
- 사용자 프로필 관리
|
||||
- 권한 관리
|
||||
|
||||
**데이터**:
|
||||
- 사용자 정보 (user_db)
|
||||
- 세션 정보 (Redis 캐시)
|
||||
|
||||
**외부 의존성**:
|
||||
- LDAP 서버
|
||||
|
||||
---
|
||||
|
||||
#### 2.1.2 Meeting Service
|
||||
**책임**: 회의 관리, 회의록 생성 및 관리, 회의록 공유
|
||||
- 회의 예약 및 참석자 초대
|
||||
- 회의 템플릿 관리
|
||||
- 회의 시작/종료 관리
|
||||
- 회의록 조회 및 수정
|
||||
- 회의록 공유 설정
|
||||
- 회의 통계 생성
|
||||
|
||||
**데이터**:
|
||||
- 회의 정보 (meeting_db)
|
||||
- 회의 템플릿 정보
|
||||
- 회의록 메타데이터
|
||||
- 회의 참석자 정보
|
||||
|
||||
**주요 이벤트**:
|
||||
- **발행**: MeetingCreated, MeetingStarted, MeetingEnded, MeetingCancelled
|
||||
- **구독**: TranscriptCreated, TodoCompleted
|
||||
|
||||
**통신 전략**:
|
||||
- **동기**: User Service (사용자 정보 조회 - Redis 캐시 우선)
|
||||
- **비동기**: STT Service (회의록 생성 요청 - Queue), Notification Service (알림 발송 - Event)
|
||||
|
||||
---
|
||||
|
||||
#### 2.1.3 STT Service
|
||||
**책임**: 음성 녹음 관리, 음성-텍스트 변환, 화자 식별
|
||||
- 음성 녹음 시작/중지
|
||||
- 음성 파일 Azure Storage 저장
|
||||
- Azure Speech API 연동 STT 처리
|
||||
- 화자 자동 식별
|
||||
- 텍스트 변환 결과 저장
|
||||
|
||||
**데이터**:
|
||||
- 음성 파일 메타데이터 (transcript_db)
|
||||
- 텍스트 변환 결과
|
||||
|
||||
**외부 의존성**:
|
||||
- Azure Speech API (STT 엔진)
|
||||
- Azure Storage (음성 파일 저장)
|
||||
|
||||
**주요 이벤트**:
|
||||
- **구독**: MeetingEnded
|
||||
- **통신**: AI Service (회의록 자동 작성 요청 - Queue)
|
||||
|
||||
---
|
||||
|
||||
#### 2.1.4 AI Service
|
||||
**책임**: LLM 기반 회의록 자동 작성, Todo 자동 추출, 프롬프팅 기반 회의록 개선
|
||||
- 회의록 자동 작성 (구조화, 문장 다듬기, 요약)
|
||||
- Todo 자동 추출 및 담당자 식별
|
||||
- 프롬프팅 기반 회의록 개선 (1Page 요약, 핵심 요약 등)
|
||||
- 관련 회의록 자동 연결 (벡터 유사도 검색)
|
||||
|
||||
**데이터**:
|
||||
- AI 처리 이력 (ai_db)
|
||||
- 비동기 작업 상태 (Redis)
|
||||
|
||||
**외부 의존성**:
|
||||
- LLM API (OpenAI, Azure OpenAI 등)
|
||||
|
||||
**주요 이벤트**:
|
||||
- **구독**: TranscriptCreated
|
||||
- **통신**: Todo Service (Todo 할당 요청 - Queue), RAG Service (관련 문서 검색 - 동기)
|
||||
|
||||
**비동기 작업**:
|
||||
- AI 일정 생성 (Asynchronous Request-Reply 패턴 적용)
|
||||
- AI 회의록 요약 생성
|
||||
|
||||
---
|
||||
|
||||
#### 2.1.5 RAG Service
|
||||
**책임**: 맥락 기반 용어 설명, 관련 문서 검색 및 연결, 업무 이력 통합
|
||||
- 전문용어 자동 감지
|
||||
- 벡터 유사도 검색을 통한 관련 문서 검색
|
||||
- 과거 회의록 및 사내 문서에서 맥락 기반 설명 생성
|
||||
- 용어 사전 관리
|
||||
|
||||
**데이터**:
|
||||
- 벡터 DB (관련 문서 임베딩)
|
||||
- 용어 사전 (rag_db)
|
||||
|
||||
**외부 의존성**:
|
||||
- 사내 문서 저장소 (위키, 매뉴얼 등)
|
||||
|
||||
**통신 전략**:
|
||||
- **동기**: AI Service (관련 문서 검색 요청 시)
|
||||
|
||||
---
|
||||
|
||||
#### 2.1.6 Collaboration Service
|
||||
**책임**: 실시간 동기화, 버전 관리, 충돌 해결
|
||||
- 회의록 실시간 수정 동기화 (WebSocket)
|
||||
- 회의록 버전 관리
|
||||
- 동시 수정 충돌 감지 및 해결
|
||||
- 회의록 섹션 검증 완료 처리
|
||||
|
||||
**데이터**:
|
||||
- 회의록 버전 정보 (collaboration_db)
|
||||
- 수정 이력
|
||||
|
||||
**주요 이벤트**:
|
||||
- **발행**: TranscriptUpdated, SectionVerified
|
||||
|
||||
**통신 전략**:
|
||||
- **WebSocket**: 실시간 동기화 (클라이언트 ↔ Collaboration Service)
|
||||
- **비동기**: Notification Service (검증 완료 알림 - Event)
|
||||
|
||||
---
|
||||
|
||||
#### 2.1.7 Todo Service
|
||||
**책임**: Todo 할당 및 관리, 진행 상황 추적, 회의록 실시간 연동
|
||||
- Todo 생성 및 할당
|
||||
- Todo 진행 상황 추적
|
||||
- Todo 완료 처리
|
||||
- 회의록과 Todo 실시간 양방향 연동
|
||||
- 캘린더 연동
|
||||
|
||||
**데이터**:
|
||||
- Todo 정보 (todo_db)
|
||||
- Todo 진행 상황
|
||||
|
||||
**주요 이벤트**:
|
||||
- **발행**: TodoCreated, TodoStatusChanged, TodoCompleted
|
||||
- **구독**: MeetingEnded (AI Service를 통한 Todo 자동 추출)
|
||||
|
||||
**통신 전략**:
|
||||
- **동기**: Meeting Service (회의록 Todo 섹션 업데이트 - REST API)
|
||||
- **비동기**: Notification Service (Todo 알림 - Event)
|
||||
|
||||
---
|
||||
|
||||
#### 2.1.8 Notification Service
|
||||
**책임**: 알림 발송 및 리마인더 관리
|
||||
- 이메일 알림 발송
|
||||
- SMS 알림 발송 (선택)
|
||||
- 리마인더 관리 (회의 시작 30분 전, Todo 마감일 3일 전 등)
|
||||
- 알림 발송 큐 처리
|
||||
|
||||
**데이터**:
|
||||
- 알림 발송 이력 (notification_db)
|
||||
|
||||
**외부 의존성**:
|
||||
- SMTP 서버 (이메일)
|
||||
- SMS 서비스 (선택)
|
||||
|
||||
**주요 이벤트**:
|
||||
- **구독**: MeetingCreated, MeetingEnded, TranscriptCreated, TodoCreated, TodoCompleted, SectionVerified
|
||||
|
||||
---
|
||||
|
||||
### 2.2 서비스 간 통신 전략
|
||||
|
||||
#### 2.2.1 동기 통신 (REST API)
|
||||
**사용 시나리오**: 즉시 응답이 필요한 조회 작업
|
||||
|
||||
| 요청 서비스 | 대상 서비스 | 목적 | 캐시 전략 |
|
||||
|-----------|-----------|------|---------|
|
||||
| Meeting Service | User Service | 사용자 정보 조회 | Redis 캐시 우선 (TTL: 30분) |
|
||||
| Todo Service | Meeting Service | 회의록 Todo 섹션 업데이트 | 즉시 반영 |
|
||||
| AI Service | RAG Service | 관련 문서 검색 | 캐시 없음 (검색 결과는 매번 변경 가능) |
|
||||
|
||||
**특징**:
|
||||
- Cache-Aside 패턴 적용 (User 정보, Meeting 정보 등)
|
||||
- API Gateway를 통한 라우팅 및 인증
|
||||
|
||||
---
|
||||
|
||||
#### 2.2.2 비동기 통신 (Message Queue)
|
||||
**사용 시나리오**: 장시간 작업 또는 즉시 응답 불필요
|
||||
|
||||
| 발행 서비스 | 큐 이름 | 구독 서비스 | 목적 |
|
||||
|-----------|---------|-----------|------|
|
||||
| Meeting Service | transcript.creation.queue | STT Service | 회의록 생성 요청 |
|
||||
| STT Service | ai.processing.queue | AI Service | 회의록 자동 작성 요청 |
|
||||
| AI Service | todo.extraction.queue | Todo Service | Todo 추출 및 할당 |
|
||||
| 모든 서비스 | notification.queue | Notification Service | 알림 발송 요청 |
|
||||
|
||||
**특징**:
|
||||
- Queue-Based Load Leveling 패턴 적용
|
||||
- Consumer Concurrency 조정으로 부하 분산
|
||||
- Dead Letter Queue를 통한 실패 메시지 관리
|
||||
|
||||
---
|
||||
|
||||
#### 2.2.3 이벤트 기반 통신 (Pub-Sub)
|
||||
**사용 시나리오**: 하나의 이벤트를 여러 서비스가 구독
|
||||
|
||||
| 이벤트 | 발행 서비스 | 구독 서비스 | 목적 |
|
||||
|-------|-----------|-----------|------|
|
||||
| MeetingCreated | Meeting Service | Notification Service, AI Service | 회의 생성 알림, AI 분석 준비 |
|
||||
| MeetingEnded | Meeting Service | STT Service, Notification Service, Todo Service | 회의록 생성, 종료 알림, Todo 추출 |
|
||||
| TranscriptCreated | STT Service | Notification Service, Meeting Service, AI Service | 회의록 생성 완료 알림, 상태 업데이트, AI 분석 |
|
||||
| TodoCreated | Todo Service | Notification Service | Todo 할당 알림 |
|
||||
| TodoCompleted | Todo Service | Notification Service, Meeting Service | Todo 완료 알림, 회의록 업데이트 |
|
||||
| SectionVerified | Collaboration Service | Notification Service | 검증 완료 알림 |
|
||||
|
||||
**특징**:
|
||||
- Publisher-Subscriber 패턴 적용
|
||||
- RabbitMQ Topic Exchange 사용
|
||||
- 서비스 간 느슨한 결합
|
||||
|
||||
---
|
||||
|
||||
#### 2.2.4 비동기 작업 처리 (Asynchronous Request-Reply)
|
||||
**사용 시나리오**: 장시간 실행되는 작업 (1분 이상)
|
||||
|
||||
| 서비스 | 작업 | 예상 시간 | 상태 저장 |
|
||||
|-------|------|----------|---------|
|
||||
| AI Service | AI 일정 생성 | 30초 ~ 2분 | Redis (taskId 기반) |
|
||||
| AI Service | AI 회의록 요약 생성 | 1분 ~ 5분 | Redis (taskId 기반) |
|
||||
| STT Service | 음성 파일 STT 변환 | 1분 ~ 10분 | Redis (taskId 기반) |
|
||||
|
||||
**처리 플로우**:
|
||||
1. 클라이언트 → API Gateway → 서비스: 작업 요청
|
||||
2. 서비스: taskId 생성 → Redis 상태 저장 (PENDING) → Queue 발행
|
||||
3. 서비스 → 클라이언트: 202 Accepted + taskId 즉시 반환
|
||||
4. Worker: Queue 소비 → 상태 업데이트 (PROCESSING) → 작업 처리 → 상태 업데이트 (COMPLETED)
|
||||
5. 클라이언트: GET /tasks/{taskId}로 상태 폴링 또는 WebSocket Push
|
||||
|
||||
**특징**:
|
||||
- Asynchronous Request-Reply 패턴 적용
|
||||
- Redis를 통한 작업 상태 관리 (TTL: 24시간)
|
||||
- 폴링 또는 WebSocket을 통한 결과 조회
|
||||
|
||||
---
|
||||
|
||||
#### 2.2.5 실시간 통신 (WebSocket)
|
||||
**사용 시나리오**: 실시간 협업 및 즉시 알림
|
||||
|
||||
| 사용 케이스 | 서비스 | 클라이언트 |
|
||||
|----------|-------|----------|
|
||||
| 회의록 실시간 동기화 | Collaboration Service | Frontend |
|
||||
| AI 작업 완료 Push (옵션) | AI Service | Frontend |
|
||||
|
||||
**특징**:
|
||||
- WebSocket 기반 양방향 통신
|
||||
- 수정 델타만 전송하여 네트워크 효율 최적화
|
||||
- 충돌 감지 및 해결 (Last Write Wins 또는 수동 병합)
|
||||
|
||||
---
|
||||
|
||||
## 3. 주요 사용자 플로우
|
||||
|
||||
### 3.1 회의 생성 및 예약 플로우
|
||||
|
||||
```
|
||||
1. 사용자 → Frontend: 회의 예약 정보 입력
|
||||
2. Frontend → API Gateway → Meeting Service: POST /api/meetings
|
||||
3. Meeting Service:
|
||||
- 회의 정보 저장 (meeting_db)
|
||||
- MeetingCreated 이벤트 발행
|
||||
4. Notification Service (구독):
|
||||
- 참석자에게 초대 이메일 발송
|
||||
- 캘린더 일정 등록
|
||||
5. AI Service (구독):
|
||||
- 회의 일정 분석 준비 (비동기)
|
||||
6. Frontend ← Meeting Service: 회의 정보 반환
|
||||
```
|
||||
|
||||
**적용 패턴**:
|
||||
- API Gateway: 라우팅 및 인증
|
||||
- Publisher-Subscriber: MeetingCreated 이벤트
|
||||
- Queue-Based Load Leveling: 알림 발송 큐
|
||||
|
||||
---
|
||||
|
||||
### 3.2 회의 진행 및 회의록 생성 플로우
|
||||
|
||||
```
|
||||
1. 사용자 → Frontend: 회의 시작 버튼 클릭
|
||||
2. Frontend → API Gateway → Meeting Service: POST /api/meetings/{id}/start
|
||||
3. Meeting Service:
|
||||
- 회의 상태 '진행중'으로 업데이트
|
||||
- 회의 세션 생성
|
||||
- MeetingStarted 이벤트 발행
|
||||
4. STT Service:
|
||||
- 음성 녹음 시작
|
||||
- 실시간 STT 처리 (Azure Speech API)
|
||||
- 텍스트 변환 결과 저장
|
||||
5. AI Service:
|
||||
- 텍스트 변환 결과 수신
|
||||
- 실시간 회의록 자동 작성 (구조화, 문장 다듬기)
|
||||
6. Collaboration Service:
|
||||
- 회의록 실시간 동기화 (WebSocket)
|
||||
- 참석자 화면에 실시간 반영
|
||||
7. 사용자 → Frontend: 회의 종료 버튼 클릭
|
||||
8. Frontend → API Gateway → Meeting Service: POST /api/meetings/{id}/end
|
||||
9. Meeting Service:
|
||||
- 회의 상태 '종료'로 업데이트
|
||||
- 회의 통계 생성
|
||||
- MeetingEnded 이벤트 발행
|
||||
10. STT Service (구독):
|
||||
- 음성 녹음 중지
|
||||
- 음성 파일 Azure Storage 저장
|
||||
11. Notification Service (구독):
|
||||
- 참석자에게 회의 종료 알림
|
||||
12. Todo Service (구독):
|
||||
- AI Service를 통한 Todo 자동 추출 요청 (비동기)
|
||||
```
|
||||
|
||||
**적용 패턴**:
|
||||
- API Gateway: 라우팅 및 인증
|
||||
- Publisher-Subscriber: MeetingStarted, MeetingEnded 이벤트
|
||||
- Queue-Based Load Leveling: Todo 추출 큐
|
||||
- WebSocket: 실시간 회의록 동기화
|
||||
|
||||
---
|
||||
|
||||
### 3.3 AI 기반 Todo 자동 추출 및 할당 플로우
|
||||
|
||||
```
|
||||
1. Todo Service (MeetingEnded 이벤트 구독):
|
||||
- AI Service에 Todo 추출 요청 (Queue)
|
||||
2. AI Service Worker:
|
||||
- 회의록 텍스트 분석
|
||||
- Todo 항목 추출 (LLM API)
|
||||
- 담당자 자동 식별
|
||||
- Todo 정보 생성
|
||||
3. AI Service → Todo Service:
|
||||
- Todo 정보 전달 (Queue)
|
||||
4. Todo Service:
|
||||
- Todo 생성 및 저장 (todo_db)
|
||||
- TodoCreated 이벤트 발행
|
||||
- 회의록 Todo 섹션 업데이트 (Meeting Service REST API 호출)
|
||||
5. Notification Service (구독):
|
||||
- 담당자에게 Todo 할당 알림 (이메일)
|
||||
- 마감일 3일 전 리마인더 일정 생성
|
||||
6. Meeting Service:
|
||||
- 회의록 Todo 섹션 업데이트
|
||||
- Redis 캐시 무효화
|
||||
```
|
||||
|
||||
**적용 패턴**:
|
||||
- Publisher-Subscriber: MeetingEnded, TodoCreated 이벤트
|
||||
- Queue-Based Load Leveling: AI 처리 큐, Todo 할당 큐
|
||||
- Cache-Aside: 회의록 캐시 무효화
|
||||
|
||||
---
|
||||
|
||||
### 3.4 맥락 기반 용어 설명 플로우
|
||||
|
||||
```
|
||||
1. Frontend: 회의록 작성 중 전문용어 감지 (클라이언트 측)
|
||||
2. Frontend → API Gateway → RAG Service: POST /api/rag/terms/explain
|
||||
3. RAG Service:
|
||||
- 용어 사전 확인
|
||||
- 벡터 유사도 검색 (과거 회의록, 사내 문서)
|
||||
- 관련 문서 추출 (최대 5개)
|
||||
- LLM을 통한 맥락 기반 설명 생성
|
||||
4. RAG Service → Frontend:
|
||||
- 용어 정의
|
||||
- 맥락 기반 상세 설명
|
||||
- 실제 사용 사례
|
||||
- 관련 프로젝트/이슈
|
||||
- 과거 회의록 링크 (최대 3개)
|
||||
5. Frontend:
|
||||
- 툴팁 또는 사이드 패널로 설명 표시
|
||||
```
|
||||
|
||||
**적용 패턴**:
|
||||
- API Gateway: 라우팅 및 인증
|
||||
- Cache-Aside: 용어 사전 캐싱
|
||||
|
||||
---
|
||||
|
||||
### 3.5 AI 일정 생성 (비동기 작업) 플로우
|
||||
|
||||
```
|
||||
1. Frontend → API Gateway → AI Service: POST /api/ai/schedules
|
||||
2. AI Service:
|
||||
- taskId 생성 (UUID)
|
||||
- Redis 상태 저장 (PENDING)
|
||||
- Queue에 작업 메시지 발행
|
||||
- 202 Accepted + taskId 즉시 반환
|
||||
3. AI Worker (비동기):
|
||||
- Queue 소비
|
||||
- Redis 상태 업데이트 (PROCESSING)
|
||||
- LLM API 호출하여 일정 생성 (1분 소요)
|
||||
- Redis 상태 업데이트 (COMPLETED) + 결과 저장
|
||||
4. Frontend (폴링):
|
||||
- GET /api/ai/tasks/{taskId}를 5초마다 호출
|
||||
- status가 COMPLETED일 때 결과 획득
|
||||
```
|
||||
|
||||
**적용 패턴**:
|
||||
- Asynchronous Request-Reply: 비동기 작업 처리
|
||||
- Queue-Based Load Leveling: AI 처리 큐
|
||||
- Redis: 작업 상태 관리
|
||||
|
||||
---
|
||||
|
||||
### 3.6 회의록 실시간 협업 플로우
|
||||
|
||||
```
|
||||
1. 참석자 A → Frontend: 회의록 수정
|
||||
2. Frontend → Collaboration Service (WebSocket): 수정 델타 전송
|
||||
3. Collaboration Service:
|
||||
- 수정 권한 확인
|
||||
- 수정 이력 저장 (collaboration_db)
|
||||
- 버전 관리
|
||||
- 충돌 감지 (동일 위치 동시 수정 시)
|
||||
4. Collaboration Service → 모든 참석자 (WebSocket):
|
||||
- 수정 델타 실시간 브로드캐스트
|
||||
- 수정 영역 하이라이트 (3초간)
|
||||
5. 참석자 B, C Frontend:
|
||||
- 실시간으로 수정 내용 반영
|
||||
6. 충돌 발생 시:
|
||||
- Last Write Wins (기본) 또는 수동 병합 UI 제공
|
||||
```
|
||||
|
||||
**적용 패턴**:
|
||||
- WebSocket: 실시간 양방향 통신
|
||||
- Queue-Based Load Leveling: 알림 발송 큐 (수정 알림)
|
||||
|
||||
---
|
||||
|
||||
### 3.7 회의록 검증 완료 플로우
|
||||
|
||||
```
|
||||
1. 참석자 → Frontend: 섹션 검증 완료 버튼 클릭
|
||||
2. Frontend → API Gateway → Collaboration Service: POST /api/collaboration/sections/{id}/verify
|
||||
3. Collaboration Service:
|
||||
- 검증자 정보 기록
|
||||
- 검증 상태 업데이트 (검증 완료)
|
||||
- 회의 생성자만 섹션 잠금 가능 (선택)
|
||||
- SectionVerified 이벤트 발행
|
||||
4. Notification Service (구독):
|
||||
- 전체 참석자에게 검증 완료 알림 (이메일)
|
||||
5. Collaboration Service → Frontend (WebSocket):
|
||||
- 검증 완료 상태 실시간 동기화
|
||||
- 검증 배지 표시 (체크 아이콘)
|
||||
```
|
||||
|
||||
**적용 패턴**:
|
||||
- Publisher-Subscriber: SectionVerified 이벤트
|
||||
- WebSocket: 실시간 상태 동기화
|
||||
- Queue-Based Load Leveling: 알림 발송 큐
|
||||
|
||||
---
|
||||
|
||||
## 4. 데이터 흐름 및 캐싱 전략
|
||||
|
||||
### 4.1 데이터베이스 구성
|
||||
- **서비스별 독립 데이터베이스**: 각 서비스마다 독립적인 PostgreSQL 데이터베이스
|
||||
- **서비스 간 데이터 공유 최소화**: 캐시 또는 이벤트를 통한 데이터 공유
|
||||
|
||||
| 서비스 | 데이터베이스 | 주요 테이블 |
|
||||
|-------|-----------|----------|
|
||||
| User Service | user_db | users, roles, permissions |
|
||||
| Meeting Service | meeting_db | meetings, templates, participants, transcripts_metadata |
|
||||
| STT Service | transcript_db | audio_files, stt_results, speakers |
|
||||
| AI Service | ai_db | ai_tasks, ai_results, related_transcripts |
|
||||
| RAG Service | rag_db | terms_dictionary, document_embeddings |
|
||||
| Collaboration Service | collaboration_db | transcript_versions, edit_history, conflicts |
|
||||
| Todo Service | todo_db | todos, todo_status_history |
|
||||
| Notification Service | notification_db | notifications, notification_templates |
|
||||
|
||||
---
|
||||
|
||||
### 4.2 캐싱 전략 (Cache-Aside 패턴)
|
||||
|
||||
#### 4.2.1 캐싱 대상 데이터
|
||||
|
||||
| 서비스 | 캐시 데이터 | TTL | 무효화 트리거 |
|
||||
|-------|----------|-----|-------------|
|
||||
| User Service | 사용자 프로필 정보 | 30분 | 사용자 정보 업데이트 |
|
||||
| User Service | 사용자 권한 정보 | 1시간 | 권한 변경 |
|
||||
| Meeting Service | 회의 기본 정보 | 10분 | 회의 정보 수정 |
|
||||
| Meeting Service | 회의 참여자 목록 | 10분 | 참여자 변경 |
|
||||
| Meeting Service | 회의 템플릿 목록 | 1시간 | 템플릿 생성/수정 |
|
||||
| STT Service | 회의록 조회 | 30분 | 회의록 수정 |
|
||||
| Todo Service | 사용자별 Todo 목록 | 5분 | Todo 상태 변경 |
|
||||
| Todo Service | Todo 진행 상태 통계 | 5분 | Todo 완료 |
|
||||
|
||||
#### 4.2.2 캐시 정책
|
||||
|
||||
**읽기 집중 데이터** (Cache-Aside):
|
||||
- 패턴: Lazy Loading
|
||||
- 전략: 캐시 미스 시 DB 조회 → 캐시 저장
|
||||
- 예: 사용자 프로필, 회의 정보 조회
|
||||
|
||||
**쓰기 빈도 높은 데이터** (Write-Through + Cache-Aside):
|
||||
- 패턴: 업데이트 시 캐시 무효화
|
||||
- 전략: DB 업데이트 → 캐시 삭제 → 다음 조회 시 재생성
|
||||
- 예: Todo 상태 변경, 회의 정보 수정
|
||||
|
||||
**캐시 무효화**:
|
||||
- 데이터 변경 시 즉시 무효화 (Cache Eviction)
|
||||
- TTL 기반 자동 만료
|
||||
- 명시적 삭제 API 제공 (관리자용)
|
||||
|
||||
---
|
||||
|
||||
### 4.3 비동기 작업 상태 관리 (Redis)
|
||||
|
||||
**작업 상태 저장**:
|
||||
- Key: `task:{taskId}`
|
||||
- Value: `{ taskId, status, createdAt, startedAt, completedAt, result, errorMessage }`
|
||||
- TTL: 24시간
|
||||
|
||||
**상태 흐름**:
|
||||
1. PENDING: 요청 접수 직후
|
||||
2. PROCESSING: Worker가 작업 시작
|
||||
3. COMPLETED: 작업 성공 완료
|
||||
4. FAILED: 작업 실패
|
||||
|
||||
---
|
||||
|
||||
## 5. 확장성 및 성능 고려사항
|
||||
|
||||
### 5.1 수평 확장 전략
|
||||
|
||||
#### 5.1.1 Stateless 서비스 설계
|
||||
- **모든 백엔드 서비스는 Stateless**: 세션 정보는 Redis에 저장
|
||||
- **수평 확장 가능**: Kubernetes 기반 Pod Auto Scaling
|
||||
- **Load Balancer**: Kubernetes Service (ClusterIP)를 통한 부하 분산
|
||||
|
||||
#### 5.1.2 서비스별 확장 전략
|
||||
|
||||
| 서비스 | 확장 전략 | Auto Scaling 기준 |
|
||||
|-------|---------|-----------------|
|
||||
| API Gateway | 수평 확장 (최소 2개) | CPU > 70% 또는 RPS > 1000 |
|
||||
| User Service | 수평 확장 | CPU > 70% |
|
||||
| Meeting Service | 수평 확장 | CPU > 70% 또는 메모리 > 80% |
|
||||
| STT Service | 수평 확장 + Worker 증설 | Queue 길이 > 100 |
|
||||
| AI Service | 수평 확장 + Worker 증설 | Queue 길이 > 50 |
|
||||
| Notification Service | 수평 확장 + Worker 증설 | Queue 길이 > 200 |
|
||||
| Todo Service | 수평 확장 | CPU > 70% |
|
||||
| Collaboration Service | 수평 확장 (WebSocket) | 동시 연결 > 500 |
|
||||
|
||||
---
|
||||
|
||||
### 5.2 성능 최적화
|
||||
|
||||
#### 5.2.1 캐싱 최적화
|
||||
- **Cache Hit Rate 목표**: 70% 이상
|
||||
- **Hot Key 문제 대응**: 자주 조회되는 데이터는 로컬 캐시 + 분산 캐시 병행
|
||||
- **Cache Stampede 방지**: Singleflight 패턴 적용 (동시 다발적 Cache Miss 방지)
|
||||
|
||||
#### 5.2.2 데이터베이스 최적화
|
||||
- **Connection Pool**: HikariCP 설정 최적화 (maxPoolSize: 10-20)
|
||||
- **인덱스 최적화**: 자주 조회되는 필드에 인덱스 생성
|
||||
- **Read Replica**: 읽기 부하 분산 (필요 시)
|
||||
|
||||
#### 5.2.3 메시지 큐 최적화
|
||||
- **Consumer Concurrency**: 서비스별 동시 처리 워커 수 조정 (3-10)
|
||||
- **Prefetch Count**: RabbitMQ Prefetch 설정 최적화
|
||||
- **Dead Letter Queue**: 실패 메시지 별도 처리
|
||||
|
||||
---
|
||||
|
||||
### 5.3 성능 목표
|
||||
|
||||
| 지표 | 목표 |
|
||||
|------|------|
|
||||
| API 응답 시간 (P95) | < 500ms |
|
||||
| 회의록 생성 시간 | < 2분 |
|
||||
| AI 일정 생성 시간 | < 1분 |
|
||||
| Cache Hit Rate | > 70% |
|
||||
| 시스템 가용성 | > 99.5% |
|
||||
| 동시 사용자 수 | 10,000명 |
|
||||
| 동시 진행 회의 수 | 1,000개 |
|
||||
| 일일 처리 회의 수 | 100,000개 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 보안 고려사항
|
||||
|
||||
### 6.1 인증 및 인가
|
||||
|
||||
#### 6.1.1 인증 전략
|
||||
- **LDAP 연동**: 사내 LDAP 서버와 연동한 사용자 인증
|
||||
- **JWT 토큰**: 인증 후 JWT 토큰 발급 (만료 시간: 1시간)
|
||||
- **Refresh Token**: 장기 세션 유지 (만료 시간: 7일)
|
||||
- **Token 검증**: API Gateway에서 JWT 토큰 검증 (모든 요청)
|
||||
|
||||
#### 6.1.2 인가 전략
|
||||
- **역할 기반 접근 제어 (RBAC)**: 사용자 역할에 따른 권한 관리
|
||||
- **회의 참여자 검증**: 회의 참여자만 회의록 접근 가능
|
||||
- **회의록 작성자 권한**: 수정, 삭제 권한은 작성자에게만 부여
|
||||
|
||||
---
|
||||
|
||||
### 6.2 데이터 보안
|
||||
|
||||
#### 6.2.1 암호화
|
||||
- **전송 중 암호화**: HTTPS/TLS (API Gateway)
|
||||
- **저장 시 암호화**: PostgreSQL Transparent Data Encryption (TDE)
|
||||
- **민감 정보 암호화**: 사용자 비밀번호는 bcrypt 해싱
|
||||
|
||||
#### 6.2.2 데이터 접근 제어
|
||||
- **데이터베이스 접근**: 서비스별 독립 계정, 최소 권한 원칙
|
||||
- **Redis 접근**: Password 인증 + ACL 설정
|
||||
- **RabbitMQ 접근**: 서비스별 독립 계정, 큐별 권한 관리
|
||||
|
||||
---
|
||||
|
||||
### 6.3 보안 모니터링
|
||||
|
||||
#### 6.3.1 로깅
|
||||
- **API Gateway**: 모든 요청/응답 로깅 (사용자 ID, 엔드포인트, 응답 시간)
|
||||
- **인증 실패 로깅**: 반복적인 인증 실패 시 경고
|
||||
- **민감 정보 마스킹**: 로그에서 비밀번호, 토큰 등 마스킹
|
||||
|
||||
#### 6.3.2 보안 이벤트 모니터링
|
||||
- **이상 접근 탐지**: 짧은 시간 내 과도한 요청 (Rate Limiting)
|
||||
- **권한 없는 접근 시도**: 403 Forbidden 응답 모니터링
|
||||
- **보안 패치**: 정기적인 보안 업데이트 및 취약점 점검
|
||||
|
||||
---
|
||||
|
||||
## 7. 논리 아키텍처 다이어그램
|
||||
|
||||
논리 아키텍처 다이어그램은 별도 파일로 작성되었습니다.
|
||||
|
||||
**파일**: [logical-architecture.mmd](logical-architecture.mmd)
|
||||
|
||||
**온라인 확인**: https://mermaid.live/edit
|
||||
|
||||
---
|
||||
|
||||
## 8. 문서 이력
|
||||
|
||||
| 버전 | 작성일 | 작성자 | 변경 내용 |
|
||||
|------|--------|--------|----------|
|
||||
| 1.0 | 2025-01-20 | 준호 | 초안 작성 |
|
||||
119
design/backend/logical/logical-architecture.mmd
Normal file
119
design/backend/logical/logical-architecture.mmd
Normal file
@ -0,0 +1,119 @@
|
||||
graph TB
|
||||
%% 클라이언트 레이어
|
||||
Client[Web/Mobile Application]
|
||||
|
||||
%% API Gateway
|
||||
APIGateway[API Gateway Kong/Spring Cloud Gateway 라우팅, 인증, Rate Limiting]
|
||||
|
||||
%% 백엔드 서비스
|
||||
UserService[User Service 사용자 인증 및 권한 관리]
|
||||
MeetingService[Meeting Service 회의 관리, 회의록 관리]
|
||||
STTService[STT Service 음성 녹음, STT 처리]
|
||||
AIService[AI Service 회의록 자동 작성, Todo 추출]
|
||||
RAGService[RAG Service 맥락 기반 용어 설명]
|
||||
CollabService[Collaboration Service 실시간 동기화, 버전 관리]
|
||||
TodoService[Todo Service Todo 관리, 진행 추적]
|
||||
NotifyService[Notification Service 알림 발송, 리마인더]
|
||||
|
||||
%% 인프라 컴포넌트
|
||||
Redis[(Redis 분산 캐시, 세션, 작업 상태)]
|
||||
RabbitMQ[RabbitMQ 메시지 큐, 이벤트 버스]
|
||||
|
||||
%% 데이터베이스
|
||||
UserDB[(PostgreSQL user_db)]
|
||||
MeetingDB[(PostgreSQL meeting_db)]
|
||||
STTDB[(PostgreSQL transcript_db)]
|
||||
AIDB[(PostgreSQL ai_db)]
|
||||
RAGDB[(PostgreSQL rag_db + Vector DB)]
|
||||
CollabDB[(PostgreSQL collaboration_db)]
|
||||
TodoDB[(PostgreSQL todo_db)]
|
||||
NotifyDB[(PostgreSQL notification_db)]
|
||||
|
||||
%% 외부 시스템
|
||||
LDAP[LDAP Server]
|
||||
AzureStorage[Azure Storage 음성 파일]
|
||||
AzureSpeech[Azure Speech API STT 엔진]
|
||||
LLMAPI[LLM API OpenAI/Azure OpenAI]
|
||||
SMTP[SMTP Server 이메일]
|
||||
|
||||
%% 클라이언트 → API Gateway
|
||||
Client -->|HTTPS| APIGateway
|
||||
|
||||
%% API Gateway → 서비스 (라우팅)
|
||||
APIGateway -->|/api/users/**| UserService
|
||||
APIGateway -->|/api/meetings/**| MeetingService
|
||||
APIGateway -->|/api/transcripts/**| STTService
|
||||
APIGateway -->|/api/ai/**| AIService
|
||||
APIGateway -->|/api/rag/**| RAGService
|
||||
APIGateway -->|/api/collaboration/**| CollabService
|
||||
APIGateway -->|/api/todos/**| TodoService
|
||||
APIGateway -->|/api/notifications/**| NotifyService
|
||||
|
||||
%% 서비스 → Redis (캐시)
|
||||
UserService -.->|Cache: 사용자 프로필| Redis
|
||||
MeetingService -.->|Cache: 회의 정보| Redis
|
||||
TodoService -.->|Cache: Todo 목록| Redis
|
||||
AIService -.->|작업 상태 저장| Redis
|
||||
|
||||
%% 서비스 → 데이터베이스
|
||||
UserService --> UserDB
|
||||
MeetingService --> MeetingDB
|
||||
STTService --> STTDB
|
||||
AIService --> AIDB
|
||||
RAGService --> RAGDB
|
||||
CollabService --> CollabDB
|
||||
TodoService --> TodoDB
|
||||
NotifyService --> NotifyDB
|
||||
|
||||
%% 동기 통신 (REST API)
|
||||
MeetingService -.->|Meeting 사용자 정보 조회 Cache 우선| UserService
|
||||
TodoService -->|Todo 회의록 Todo 섹션 업데이트| MeetingService
|
||||
AIService -->|AI 관련 문서 검색| RAGService
|
||||
|
||||
%% 비동기 통신 (Queue)
|
||||
MeetingService -->|Meeting 회의록 생성 요청| RabbitMQ
|
||||
RabbitMQ -->|transcript.creation.queue| STTService
|
||||
|
||||
STTService -->|STT 회의록 자동 작성 요청| RabbitMQ
|
||||
RabbitMQ -->|ai.processing.queue| AIService
|
||||
|
||||
AIService -->|AI Todo 추출 요청| RabbitMQ
|
||||
RabbitMQ -->|todo.extraction.queue| TodoService
|
||||
|
||||
MeetingService -->|Meeting 알림 발송| RabbitMQ
|
||||
STTService -->|STT 알림 발송| RabbitMQ
|
||||
TodoService -->|Todo 알림 발송| RabbitMQ
|
||||
CollabService -->|Collab 알림 발송| RabbitMQ
|
||||
RabbitMQ -->|notification.queue| NotifyService
|
||||
|
||||
%% 이벤트 기반 통신 (Pub-Sub)
|
||||
MeetingService -->|MeetingCreated MeetingEnded| RabbitMQ
|
||||
STTService -->|TranscriptCreated| RabbitMQ
|
||||
TodoService -->|TodoCreated TodoCompleted| RabbitMQ
|
||||
CollabService -->|SectionVerified| RabbitMQ
|
||||
|
||||
%% WebSocket (실시간 통신)
|
||||
Client <-.->|WebSocket 실시간 회의록 동기화| CollabService
|
||||
|
||||
%% 외부 시스템 연동
|
||||
UserService -->|인증| LDAP
|
||||
STTService -->|음성 파일 저장| AzureStorage
|
||||
STTService -->|STT 처리| AzureSpeech
|
||||
AIService -->|회의록 자동 작성 Todo 추출| LLMAPI
|
||||
RAGService -->|용어 설명 생성| LLMAPI
|
||||
NotifyService -->|이메일 발송| SMTP
|
||||
|
||||
%% 스타일링
|
||||
classDef clientStyle fill:#e1f5ff,stroke:#01579b,stroke-width:2px
|
||||
classDef gatewayStyle fill:#fff3e0,stroke:#e65100,stroke-width:3px
|
||||
classDef serviceStyle fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
|
||||
classDef infraStyle fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px
|
||||
classDef dbStyle fill:#fff9c4,stroke:#f57f17,stroke-width:2px
|
||||
classDef externalStyle fill:#fce4ec,stroke:#880e4f,stroke-width:2px
|
||||
|
||||
class Client clientStyle
|
||||
class APIGateway gatewayStyle
|
||||
class UserService,MeetingService,STTService,AIService,RAGService,CollabService,TodoService,NotifyService serviceStyle
|
||||
class Redis,RabbitMQ infraStyle
|
||||
class UserDB,MeetingDB,STTDB,AIDB,RAGDB,CollabDB,TodoDB,NotifyDB dbStyle
|
||||
class LDAP,AzureStorage,AzureSpeech,LLMAPI,SMTP externalStyle
|
||||
107
tools/check-mermaid.sh
Normal file
107
tools/check-mermaid.sh
Normal file
@ -0,0 +1,107 @@
|
||||
#!/bin/bash
|
||||
# Mermaid Syntax Checker using Docker Container
|
||||
# Similar to PlantUML checker - keeps container running for better performance
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
CYAN='\033[0;36m'
|
||||
GRAY='\033[0;90m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Check if file path is provided
|
||||
if [ -z "$1" ]; then
|
||||
echo -e "${RED}Error: No file path provided${NC}"
|
||||
echo "Usage: $0 <mermaid-file>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE_PATH="$1"
|
||||
|
||||
# Check if file exists
|
||||
if [ ! -f "$FILE_PATH" ]; then
|
||||
echo -e "${RED}Error: File not found: $FILE_PATH${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get absolute path
|
||||
ABSOLUTE_PATH=$(realpath "$FILE_PATH")
|
||||
FILE_NAME=$(basename "$ABSOLUTE_PATH")
|
||||
|
||||
echo -e "\n${CYAN}Checking Mermaid syntax for: $FILE_NAME${NC}"
|
||||
echo -e "${GRAY}$(printf '=%.0s' {1..60})${NC}"
|
||||
|
||||
# Check if mermaid container is running
|
||||
CONTAINER_RUNNING=$(docker ps --filter "name=mermaid-cli" --format "{{.Names}}" 2>/dev/null)
|
||||
|
||||
if [ -z "$CONTAINER_RUNNING" ]; then
|
||||
echo -e "${RED}Error: Mermaid CLI container is not running.${NC}"
|
||||
echo -e "${YELLOW}Please follow the setup instructions in the Mermaid guide to start the container.${NC}"
|
||||
echo -e "\n${CYAN}Quick setup commands:${NC}"
|
||||
echo ""
|
||||
echo -e "${GREEN}# 1. Start container with root privileges (port 48080)${NC}"
|
||||
echo -e "${NC}docker run -d --rm --name mermaid-cli -u root -p 48080:8080 --entrypoint sh minlag/mermaid-cli:latest -c \"while true;do sleep 3600; done\"${NC}"
|
||||
echo ""
|
||||
echo -e "${GREEN}# 2. Install Chromium and dependencies${NC}"
|
||||
echo -e "${NC}docker exec mermaid-cli sh -c \"apk add --no-cache chromium chromium-chromedriver nss freetype harfbuzz ca-certificates ttf-freefont\"${NC}"
|
||||
echo ""
|
||||
echo -e "${GREEN}# 3. Create Puppeteer configuration${NC}"
|
||||
echo -e "${NC}docker exec mermaid-cli sh -c \"echo '{\\\"executablePath\\\": \\\"/usr/bin/chromium-browser\\\", \\\"args\\\": [\\\"--no-sandbox\\\", \\\"--disable-setuid-sandbox\\\", \\\"--disable-dev-shm-usage\\\"]}' > /tmp/puppeteer-config.json\"${NC}"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Set Puppeteer configuration file path
|
||||
PUPPETEER_CONFIG_FILE="/tmp/puppeteer-config.json"
|
||||
|
||||
# Generate unique temp filename
|
||||
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
|
||||
PID=$$
|
||||
TEMP_FILE="/tmp/mermaid_${TIMESTAMP}_${PID}.mmd"
|
||||
OUTPUT_FILE="/tmp/mermaid_${TIMESTAMP}_${PID}.svg"
|
||||
|
||||
# Copy file to container
|
||||
echo -e "${GRAY}Copying file to container...${NC}"
|
||||
docker cp "$ABSOLUTE_PATH" "mermaid-cli:$TEMP_FILE" >/dev/null 2>&1
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}Error: Failed to copy file to container${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run syntax check with Puppeteer configuration
|
||||
echo -e "${GRAY}Running syntax check...${NC}"
|
||||
OUTPUT=$(docker exec mermaid-cli sh -c "cd /home/mermaidcli && node_modules/.bin/mmdc -i '$TEMP_FILE' -o '$OUTPUT_FILE' -p '$PUPPETEER_CONFIG_FILE' -q" 2>&1)
|
||||
EXIT_CODE=$?
|
||||
|
||||
if [ $EXIT_CODE -eq 0 ]; then
|
||||
echo -e "\n${GREEN}Success: Mermaid syntax is valid!${NC}"
|
||||
else
|
||||
echo -e "\n${RED}Error: Mermaid syntax validation failed!${NC}"
|
||||
echo -e "\n${RED}Error details:${NC}"
|
||||
|
||||
# Parse and display error messages
|
||||
while IFS= read -r line; do
|
||||
if [[ $line == *"Error:"* ]] || [[ $line == *"Parse error"* ]] || [[ $line == *"Expecting"* ]] || [[ $line == *"Syntax error"* ]]; then
|
||||
echo -e " ${RED}$line${NC}"
|
||||
elif [[ $line == *"line"* ]] && [[ $line =~ [0-9]+ ]]; then
|
||||
echo -e " ${YELLOW}$line${NC}"
|
||||
elif [[ ! -z "$line" ]]; then
|
||||
echo -e " ${RED}$line${NC}"
|
||||
fi
|
||||
done <<< "$OUTPUT"
|
||||
|
||||
# Clean up and exit with error
|
||||
docker exec mermaid-cli rm -f "$TEMP_FILE" "$OUTPUT_FILE" >/dev/null 2>&1
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Clean up temp files
|
||||
echo -e "\n${GRAY}Cleaning up...${NC}"
|
||||
docker exec mermaid-cli rm -f "$TEMP_FILE" "$OUTPUT_FILE" >/dev/null 2>&1
|
||||
|
||||
echo -e "\n${CYAN}Validation complete!${NC}"
|
||||
|
||||
# Note: Container is kept running for subsequent checks
|
||||
# To stop: docker stop mermaid-cli && docker rm mermaid-cli
|
||||
Loading…
x
Reference in New Issue
Block a user