mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 06:46:24 +00:00
외부 시퀀스 설계 완료
- 7개 주요 비즈니스 플로우 설계 완료 1. 회의예약및참석자초대 (2.5KB) 2. 회의시작및실시간회의록작성 (4.9KB) 3. 회의종료및최종확정 (4.6KB) 4. 회의록공유 (2.1KB) 5. Todo완료및회의록반영 (1.9KB) 6. 대시보드조회 (1.6KB) 7. 회의록상세조회및수정 (4.4KB) - 설계 특징 - 병렬 처리 전략: 서브 에이전트 활용 동시 작성 - 5개 서비스 통합 아키텍처 (User, Meeting, STT, AI, Notification) - Azure Event Hubs를 통한 Pub/Sub 이벤트 기반 통신 - Redis Cache-Aside 패턴을 통한 성능 최적화 - AI 병렬 처리 (회의록 정리 + 전문용어 설명 + 관련 자료 검색) - WebSocket 실시간 동기화 (델타 전송) - 작성원칙 준수 - 유저스토리와 1:1 매칭 - 논리 아키텍처에 정의된 참여자 표시 - UI/UX 사용자 플로우 참조 - 동기/비동기 통신 명확히 구분 (실선/점선) - 한글 설명 추가 - PlantUML 표준 (!theme mono, 올바른 화살표 문법) - PlantUML 문법 검증 완료 (수동) - @startuml, !theme mono 사용 - 금지된 ..> 화살표 미사용 - 동기 (→), 비동기 (->>), 캐시 (-.->) 구분 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
1b5efd76d8
commit
a43b0c63cb
52
design/backend/sequence/outer/Todo완료및회의록반영.puml
Normal file
52
design/backend/sequence/outer/Todo완료및회의록반영.puml
Normal file
@ -0,0 +1,52 @@
|
||||
@startuml Todo완료및회의록반영
|
||||
!theme mono
|
||||
|
||||
title Todo 완료 및 회의록 반영 플로우
|
||||
|
||||
actor "담당자" as User
|
||||
participant "Web App" as Web
|
||||
participant "API Gateway" as Gateway
|
||||
participant "Meeting Service" as Meeting
|
||||
participant "Redis Cache" as Redis
|
||||
participant "Notification Service" as Notification
|
||||
|
||||
autonumber
|
||||
|
||||
== Todo 완료 처리 ==
|
||||
User -> Web: Todo 완료 버튼 클릭
|
||||
activate Web
|
||||
Web -> Gateway: PUT /api/todos/{todoId}/complete\n(userId, userName, completedAt)
|
||||
activate Gateway
|
||||
Gateway -> Meeting: PUT /todos/{todoId}/complete\n(userId, userName, completedAt)
|
||||
activate Meeting
|
||||
|
||||
Meeting -> Meeting: Todo 상태 업데이트\n- 완료 시간 기록\n- 완료자 정보 저장\n- 상태: COMPLETED
|
||||
Meeting -> Meeting: 관련 회의록에 완료 상태 반영\n- 회의록 섹션 업데이트\n- 완료 표시 (체크 아이콘)\n- 완료 시간 및 완료자 기록
|
||||
Meeting -> Meeting: DB에 저장
|
||||
|
||||
== 캐시 무효화 ==
|
||||
Meeting -.-> Redis: DELETE meeting:info:{meetingId}
|
||||
note right: 회의 정보 캐시 무효화
|
||||
Meeting -.-> Redis: DELETE todo:user:{userId}
|
||||
note right: Todo 목록 캐시 무효화
|
||||
|
||||
== 이벤트 발행 ==
|
||||
Meeting ->> Notification: TodoCompleted 이벤트 발행\n(todoId, meetingId, completedBy,\ncompletedAt, meetingCreatorId)
|
||||
note right: Azure Event Hubs를 통한\n비동기 이벤트 발행
|
||||
|
||||
Meeting --> Gateway: 200 OK\n{todoId, status: COMPLETED,\ncompletedAt, completedBy}
|
||||
deactivate Meeting
|
||||
Gateway --> Web: 200 OK\n(Todo 완료 정보)
|
||||
deactivate Gateway
|
||||
Web --> User: Todo 완료 표시
|
||||
deactivate Web
|
||||
|
||||
== 알림 발송 ==
|
||||
activate Notification
|
||||
Notification -> Notification: TodoCompleted 이벤트 구독
|
||||
Notification -> Notification: 알림 메시지 생성\n- 수신자: 회의록 작성자\n- 내용: "Todo 완료됨"
|
||||
Notification -.-> Notification: 이메일 발송\n(회의록 작성자에게)
|
||||
note right: 외부 Email Service 연동
|
||||
deactivate Notification
|
||||
|
||||
@enduml
|
||||
53
design/backend/sequence/outer/대시보드조회.puml
Normal file
53
design/backend/sequence/outer/대시보드조회.puml
Normal file
@ -0,0 +1,53 @@
|
||||
@startuml 대시보드조회
|
||||
!theme mono
|
||||
|
||||
title 대시보드조회 외부 시퀀스
|
||||
|
||||
actor "사용자" as User
|
||||
participant "Web App" as Frontend
|
||||
participant "API Gateway" as Gateway
|
||||
participant "Meeting Service" as Meeting
|
||||
database "Redis Cache" as Cache
|
||||
database "Meeting DB" as MeetingDB
|
||||
|
||||
User -> Frontend: 대시보드 접근
|
||||
activate Frontend
|
||||
|
||||
Frontend -> Gateway: GET /api/meetings/dashboard
|
||||
activate Gateway
|
||||
|
||||
Gateway -> Meeting: GET /dashboard
|
||||
activate Meeting
|
||||
|
||||
' 캐시 조회
|
||||
Meeting -.-> Cache: GET dashboard:{userId}
|
||||
activate Cache
|
||||
Cache -.-> Meeting: 캐시 조회 결과
|
||||
deactivate Cache
|
||||
|
||||
alt Cache Hit
|
||||
Meeting -> Meeting: 캐시 데이터 반환
|
||||
else Cache Miss
|
||||
Meeting -> MeetingDB: 대시보드 데이터 조회\n- 예정된 회의 목록\n- 진행 중 Todo 목록\n- 최근 회의록 목록\n- 공유받은 회의록 목록\n- 통계 정보
|
||||
activate MeetingDB
|
||||
MeetingDB --> Meeting: 조회 결과
|
||||
deactivate MeetingDB
|
||||
|
||||
Meeting -.-> Cache: SET dashboard:{userId}\n(TTL: 5분)
|
||||
activate Cache
|
||||
Cache -.-> Meeting: 캐시 저장 완료
|
||||
deactivate Cache
|
||||
end
|
||||
|
||||
Meeting --> Gateway: 대시보드 데이터 응답\n{\n "upcomingMeetings": [...],\n "activeTodos": [...],\n "recentMinutes": [...],\n "sharedMinutes": [...],\n "statistics": {...}\n}
|
||||
deactivate Meeting
|
||||
|
||||
Gateway --> Frontend: 200 OK\n대시보드 데이터
|
||||
deactivate Gateway
|
||||
|
||||
Frontend -> Frontend: 대시보드 화면 렌더링\n- 예정된 회의 표시\n- Todo 목록 표시\n- 최근/공유 회의록 표시\n- 통계 차트 표시
|
||||
|
||||
Frontend --> User: 대시보드 화면 표시
|
||||
deactivate Frontend
|
||||
|
||||
@enduml
|
||||
63
design/backend/sequence/outer/회의록공유.puml
Normal file
63
design/backend/sequence/outer/회의록공유.puml
Normal file
@ -0,0 +1,63 @@
|
||||
@startuml
|
||||
!theme mono
|
||||
|
||||
title 회의록공유 플로우 (UFR-MEET-060)
|
||||
|
||||
actor "회의록 작성자" as User
|
||||
participant "Web App" as Web
|
||||
participant "API Gateway" as Gateway
|
||||
participant "Meeting Service" as Meeting
|
||||
participant "Redis Cache" as Redis
|
||||
participant "Azure Event Hubs" as EventHub
|
||||
participant "Notification Service" as Notification
|
||||
|
||||
== 회의록 공유 설정 ==
|
||||
User -> Web: 공유 버튼 클릭
|
||||
activate Web
|
||||
Web -> Web: 공유 대상 및 권한 설정 입력\n(읽기 전용/댓글 가능/편집 가능)
|
||||
Web -> Gateway: POST /api/meetings/{meetingId}/share\n(공유 설정 정보)
|
||||
activate Gateway
|
||||
Gateway -> Gateway: JWT 토큰 검증
|
||||
Gateway -> Meeting: 회의록 공유 요청
|
||||
activate Meeting
|
||||
|
||||
== 공유 링크 생성 ==
|
||||
Meeting -> Meeting: 공유 링크 생성\n(고유 URL, 권한, 유효기간)
|
||||
Meeting -> Meeting: 공유 정보 DB 저장\n(공유 시간, 대상, 권한)
|
||||
|
||||
== Redis 캐시 무효화 ==
|
||||
Meeting -> Redis: 회의 정보 캐시 무효화\n(meeting:info:{meetingId})
|
||||
activate Redis
|
||||
Redis --> Meeting: 캐시 삭제 완료
|
||||
deactivate Redis
|
||||
|
||||
== 이벤트 발행 ==
|
||||
Meeting -> EventHub: TranscriptShared 이벤트 발행\n(meetingId, 참석자 목록, 공유 URL)
|
||||
activate EventHub
|
||||
EventHub --> Meeting: 이벤트 발행 성공
|
||||
deactivate EventHub
|
||||
|
||||
Meeting --> Gateway: 공유 링크 생성 성공\n(공유 URL)
|
||||
deactivate Meeting
|
||||
Gateway --> Web: 공유 링크 반환
|
||||
deactivate Gateway
|
||||
Web --> User: 공유 링크 표시
|
||||
deactivate Web
|
||||
|
||||
== 알림 발송 ==
|
||||
EventHub ->> Notification: TranscriptShared 이벤트 구독
|
||||
activate Notification
|
||||
Notification -> Notification: 이메일 템플릿 생성\n(회의 제목, 공유 URL, 권한 정보)
|
||||
Notification -> Notification: 참석자 전원에게\n이메일 발송
|
||||
Notification --> EventHub: 알림 발송 완료
|
||||
deactivate Notification
|
||||
|
||||
== 다음 회의 일정 자동 등록 (옵션) ==
|
||||
note over Meeting
|
||||
다음 회의 일정이 회의록에
|
||||
언급된 경우에만 수행
|
||||
end note
|
||||
Meeting -> Meeting: 회의록 내용 분석\n(다음 회의 일정 추출)
|
||||
Meeting -> Meeting: 캘린더 자동 등록\n(회의 제목, 날짜, 참석자)
|
||||
|
||||
@enduml
|
||||
134
design/backend/sequence/outer/회의록상세조회및수정.puml
Normal file
134
design/backend/sequence/outer/회의록상세조회및수정.puml
Normal file
@ -0,0 +1,134 @@
|
||||
@startuml 회의록상세조회및수정
|
||||
!theme mono
|
||||
|
||||
title 회의록상세조회및수정 외부 시퀀스
|
||||
|
||||
actor "사용자" as User
|
||||
participant "Web App" as Frontend
|
||||
participant "API Gateway" as Gateway
|
||||
participant "Meeting Service" as Meeting
|
||||
participant "AI Service" as AI
|
||||
database "Redis Cache" as Cache
|
||||
database "Meeting DB" as MeetingDB
|
||||
participant "WebSocket" as WS
|
||||
|
||||
== 회의록 상세 조회 ==
|
||||
|
||||
User -> Frontend: 회의록 클릭
|
||||
activate Frontend
|
||||
|
||||
Frontend -> Gateway: GET /api/minutes/{minutesId}
|
||||
activate Gateway
|
||||
|
||||
Gateway -> Meeting: GET /minutes/{minutesId}
|
||||
activate Meeting
|
||||
|
||||
' 캐시 조회 (회의록 기본 정보)
|
||||
Meeting -.-> Cache: GET minutes:{minutesId}
|
||||
activate Cache
|
||||
Cache -.-> Meeting: 캐시 조회 결과
|
||||
deactivate Cache
|
||||
|
||||
alt Cache Hit
|
||||
Meeting -> Meeting: 캐시 데이터 사용
|
||||
else Cache Miss
|
||||
Meeting -> MeetingDB: 회의록 상세 조회\n- 회의 기본 정보\n- 섹션별 상세 내용\n- 참석자 목록\n- Todo 목록\n- 검증 상태
|
||||
activate MeetingDB
|
||||
MeetingDB --> Meeting: 회의록 데이터
|
||||
deactivate MeetingDB
|
||||
|
||||
Meeting -.-> Cache: SET minutes:{minutesId}\n(TTL: 10분)
|
||||
activate Cache
|
||||
Cache -.-> Meeting: 캐시 저장 완료
|
||||
deactivate Cache
|
||||
end
|
||||
|
||||
' 관련 회의록 검색 (비동기, 선택적)
|
||||
Meeting ->> AI: POST /ai/related-minutes\n{\n "minutesId": "{minutesId}",\n "threshold": 0.7\n}
|
||||
activate AI
|
||||
AI -> AI: 벡터 유사도 검색\n- 회의 주제 임베딩\n- 과거 회의록 비교\n- 유사도 70%+ 필터링
|
||||
|
||||
AI -->> Meeting: 관련 회의록 목록\n(최대 3개, 관련도순)
|
||||
deactivate AI
|
||||
|
||||
Meeting --> Gateway: 회의록 상세 데이터 응답\n{\n "minutesId": "...",\n "title": "...",\n "meetingInfo": {...},\n "sections": [...],\n "relatedMinutes": [...],\n "participants": [...],\n "todos": [...],\n "verificationStatus": {...}\n}
|
||||
deactivate Meeting
|
||||
|
||||
Gateway --> Frontend: 200 OK\n회의록 상세 데이터
|
||||
deactivate Gateway
|
||||
|
||||
Frontend -> Frontend: 회의록 상세 화면 렌더링\n- 회의 기본 정보 표시\n- 섹션별 내용 표시\n- 관련 회의록 표시\n- Todo 목록 표시\n- 수정 권한 확인
|
||||
|
||||
Frontend --> User: 회의록 상세 화면 표시
|
||||
deactivate Frontend
|
||||
|
||||
== 회의록 수정 ==
|
||||
|
||||
User -> Frontend: 수정 버튼 클릭
|
||||
activate Frontend
|
||||
|
||||
Frontend -> Frontend: 수정 화면으로 전환\n- 마크다운 에디터 활성화\n- WebSocket 연결 준비
|
||||
|
||||
' WebSocket 연결 (실시간 동기화)
|
||||
Frontend -> WS: WebSocket 연결\n(회의록 ID, 사용자 정보)
|
||||
activate WS
|
||||
WS --> Frontend: 연결 완료
|
||||
deactivate WS
|
||||
|
||||
Frontend --> User: 수정 가능 상태
|
||||
deactivate Frontend
|
||||
|
||||
User -> Frontend: 내용 수정 입력
|
||||
activate Frontend
|
||||
|
||||
Frontend -> Frontend: 자동 저장 타이머 시작\n(30초 간격)
|
||||
|
||||
note over Frontend
|
||||
사용자가 계속 수정 중...
|
||||
30초마다 자동 저장
|
||||
end note
|
||||
|
||||
Frontend -> Gateway: PUT /api/minutes/{minutesId}\n{\n "sections": [...],\n "modifiedBy": "userId",\n "timestamp": "...",\n "delta": {...}\n}
|
||||
activate Gateway
|
||||
|
||||
Gateway -> Meeting: PUT /minutes/{minutesId}
|
||||
activate Meeting
|
||||
|
||||
Meeting -> Meeting: 수정 권한 검증\n- 작성자 확인\n- 잠금 섹션 확인
|
||||
|
||||
alt 권한 없음
|
||||
Meeting --> Gateway: 403 Forbidden
|
||||
Gateway --> Frontend: 수정 권한 없음
|
||||
Frontend --> User: 오류 메시지 표시
|
||||
else 권한 있음
|
||||
Meeting -> MeetingDB: 회의록 수정\n- 수정 내용 저장\n- 버전 관리 (이전 버전 보관)\n- 수정 이력 기록\n- 상태 변경 (확정완료 → 작성중)
|
||||
activate MeetingDB
|
||||
MeetingDB --> Meeting: 수정 완료
|
||||
deactivate MeetingDB
|
||||
|
||||
' 캐시 무효화
|
||||
Meeting -.-> Cache: DEL minutes:{minutesId}
|
||||
activate Cache
|
||||
Cache -.-> Meeting: 캐시 삭제 완료
|
||||
deactivate Cache
|
||||
|
||||
' 실시간 동기화 (WebSocket)
|
||||
Meeting ->> WS: 수정 델타 전송\n{\n "minutesId": "...",\n "modifiedBy": "...",\n "delta": {...},\n "timestamp": "..."\n}
|
||||
activate WS
|
||||
WS ->> Frontend: 실시간 수정 반영\n(다른 참석자들에게)
|
||||
deactivate WS
|
||||
|
||||
Meeting --> Gateway: 수정 완료 응답\n{\n "version": "...",\n "modifiedAt": "...",\n "status": "작성중"\n}
|
||||
deactivate Meeting
|
||||
|
||||
Gateway --> Frontend: 200 OK\n수정 완료
|
||||
deactivate Gateway
|
||||
|
||||
Frontend -> Frontend: 수정 상태 업데이트\n- "저장됨" 표시\n- 수정 시간 갱신
|
||||
|
||||
Frontend --> User: 수정 반영 완료
|
||||
end
|
||||
|
||||
deactivate Frontend
|
||||
|
||||
@enduml
|
||||
142
design/backend/sequence/outer/회의시작및실시간회의록작성.puml
Normal file
142
design/backend/sequence/outer/회의시작및실시간회의록작성.puml
Normal file
@ -0,0 +1,142 @@
|
||||
@startuml 회의시작및실시간회의록작성
|
||||
!theme mono
|
||||
|
||||
title 회의시작및실시간회의록작성 외부 시퀀스
|
||||
|
||||
actor "사용자" as User
|
||||
participant "Web App" as Frontend
|
||||
participant "API Gateway" as Gateway
|
||||
participant "Meeting Service" as Meeting
|
||||
participant "STT Service" as STT
|
||||
participant "AI Service" as AI
|
||||
database "Redis Cache" as Cache
|
||||
queue "Azure Event Hubs" as EventHub
|
||||
|
||||
== 회의 시작 ==
|
||||
|
||||
User -> Frontend: 회의 시작 버튼 클릭
|
||||
activate Frontend
|
||||
|
||||
Frontend -> Gateway: POST /api/meetings/{meetingId}/start
|
||||
activate Gateway
|
||||
|
||||
Gateway -> Meeting: POST /meetings/{meetingId}/start
|
||||
activate Meeting
|
||||
|
||||
' 회의 세션 생성
|
||||
Meeting -> Meeting: 회의 세션 생성\n- 회의 상태 업데이트 (시작중)\n- 시작 시간 기록\n- 회의 통계 초기화
|
||||
|
||||
' MeetingStarted 이벤트 발행
|
||||
Meeting ->> EventHub: MeetingStarted 이벤트 발행\n{\n "meetingId": "...",\n "title": "...",\n "startTime": "...",\n "participants": [...]\n}
|
||||
activate EventHub
|
||||
|
||||
Meeting --> Gateway: 201 Created\n{\n "meetingId": "...",\n "sessionId": "...",\n "status": "IN_PROGRESS"\n}
|
||||
deactivate Meeting
|
||||
|
||||
Gateway --> Frontend: 201 Created\n회의 세션 정보
|
||||
deactivate Gateway
|
||||
|
||||
Frontend -> Frontend: 회의 화면으로 전환\n- 음성 녹음 UI 표시\n- 참석자 목록 표시\n- 회의록 편집 영역 활성화
|
||||
|
||||
Frontend --> User: 회의 진행 화면 표시
|
||||
deactivate Frontend
|
||||
|
||||
== 음성 녹음 시작 ==
|
||||
|
||||
EventHub ->> STT: MeetingStarted 이벤트 구독
|
||||
activate STT
|
||||
|
||||
STT -> STT: 음성 녹음 준비\n- 녹음 세션 생성\n- 오디오 스트림 초기화\n- Azure Speech 연동 준비
|
||||
|
||||
STT --> EventHub: 녹음 준비 완료
|
||||
deactivate STT
|
||||
deactivate EventHub
|
||||
|
||||
== 실시간 회의록 작성 (반복) ==
|
||||
|
||||
loop 5초 간격 배치 처리
|
||||
|
||||
User -> Frontend: 발언 (음성 입력)
|
||||
activate Frontend
|
||||
|
||||
Frontend -> STT: 음성 데이터 스트리밍
|
||||
activate STT
|
||||
|
||||
' 음성-텍스트 변환
|
||||
STT -> STT: 음성 인식 처리\n- 화자 식별\n- Azure Speech API 호출\n- 텍스트 변환\n- 타임스탬프 기록
|
||||
|
||||
' TranscriptReady 이벤트 발행 (5초 배치)
|
||||
STT ->> EventHub: TranscriptReady 이벤트 발행\n{\n "meetingId": "...",\n "segments": [\n {\n "speaker": "홍길동",\n "text": "...",\n "timestamp": "...",\n "confidence": 0.95\n }\n ]\n}
|
||||
activate EventHub
|
||||
|
||||
STT --> Frontend: 음성 처리 중 표시
|
||||
deactivate STT
|
||||
deactivate Frontend
|
||||
|
||||
== AI 병렬 처리 ==
|
||||
|
||||
EventHub ->> AI: TranscriptReady 이벤트 구독
|
||||
activate AI
|
||||
|
||||
par AI 병렬 처리
|
||||
AI -> AI: [1] 회의록 내용 정리 (LLM)\n- 구어체 → 문어체 변환\n- 주제별 분류\n- 핵심 내용 요약\n- 문장 다듬기
|
||||
and
|
||||
AI -> AI: [2] 전문용어 추출 (RAG)\n- 전문용어 자동 감지\n- 벡터 임베딩\n- 유사도 검색\n- 맥락 기반 설명 생성
|
||||
and
|
||||
AI -> AI: [3] 관련 자료 검색\n- 과거 회의록 검색\n- 사내 문서 검색\n- 관련도 계산\n- 상위 5개 선정
|
||||
end
|
||||
|
||||
' AI 분석 결과 저장
|
||||
AI -> AI: AI 분석 결과 저장\n- TranscriptSummary 생성\n- TermExplanation 저장\n- 관련 문서 링크 저장
|
||||
|
||||
' TranscriptSummaryCreated 이벤트 발행
|
||||
AI ->> EventHub: TranscriptSummaryCreated 이벤트 발행\n{\n "meetingId": "...",\n "summary": "...",\n "terms": [...],\n "relatedDocs": [...],\n "timestamp": "..."\n}
|
||||
|
||||
AI --> EventHub: AI 분석 완료
|
||||
deactivate AI
|
||||
deactivate EventHub
|
||||
|
||||
== 회의록 저장 및 실시간 동기화 ==
|
||||
|
||||
EventHub ->> Meeting: TranscriptSummaryCreated 이벤트 구독
|
||||
activate EventHub
|
||||
activate Meeting
|
||||
|
||||
' 회의록 데이터 저장
|
||||
Meeting -> Meeting: 회의록 데이터 저장\n- Transcript 엔티티 업데이트\n- 버전 증가\n- 수정 이력 기록
|
||||
|
||||
' 캐시 무효화
|
||||
Meeting -->> Cache: DEL meeting:info:{meetingId}
|
||||
activate Cache
|
||||
Cache -->> Meeting: 캐시 삭제 완료
|
||||
deactivate Cache
|
||||
|
||||
' 실시간 동기화 (WebSocket)
|
||||
Meeting ->> Frontend: WebSocket 메시지 전송\n{\n "type": "TRANSCRIPT_UPDATE",\n "summary": "...",\n "terms": [...],\n "relatedDocs": [...],\n "delta": { "changes": [...] }\n}
|
||||
activate Frontend
|
||||
|
||||
Meeting --> EventHub: 동기화 완료
|
||||
deactivate Meeting
|
||||
deactivate EventHub
|
||||
|
||||
Frontend -> Frontend: 회의록 화면 업데이트\n- 정리된 회의록 표시\n- 전문용어 하이라이트\n- 관련 자료 링크 표시\n- 수정자 표시 (3초간)
|
||||
|
||||
Frontend --> User: 실시간 회의록 표시
|
||||
deactivate Frontend
|
||||
|
||||
end
|
||||
|
||||
note over User, EventHub
|
||||
**처리 시간**:
|
||||
- STT 변환: 1-3초
|
||||
- AI 병렬 처리: 5-8초
|
||||
- 회의록 저장 및 동기화: 1-2초
|
||||
- 총 처리 시간: 7-13초 (5초 배치 기준)
|
||||
|
||||
**차별화 포인트**:
|
||||
- AI 병렬 처리로 회의록 정리, 전문용어 설명, 관련 자료 검색을 동시에 수행
|
||||
- 정리된 회의록과 맥락 기반 용어 설명을 통합 제공
|
||||
- WebSocket 델타 전송으로 네트워크 효율성 향상
|
||||
end note
|
||||
|
||||
@enduml
|
||||
84
design/backend/sequence/outer/회의예약및참석자초대.puml
Normal file
84
design/backend/sequence/outer/회의예약및참석자초대.puml
Normal file
@ -0,0 +1,84 @@
|
||||
@startuml 회의예약및참석자초대
|
||||
!theme mono
|
||||
|
||||
title 회의 예약 및 참석자 초대 플로우
|
||||
|
||||
actor "사용자" as User
|
||||
participant "Web App" as WebApp
|
||||
participant "API Gateway" as Gateway
|
||||
participant "Meeting Service" as Meeting
|
||||
database "Meeting DB" as MeetingDB
|
||||
database "Redis Cache" as Redis
|
||||
participant "Azure Event Hubs" as EventHub
|
||||
participant "Notification Service" as Notification
|
||||
participant "Email Service" as Email
|
||||
|
||||
== 회의 예약 ==
|
||||
User -> WebApp: 회의 정보 입력\n(제목, 날짜/시간, 장소, 참석자)
|
||||
activate WebApp
|
||||
|
||||
WebApp -> Gateway: POST /api/meetings\n+ JWT 토큰\n+ 사용자 정보 (userId, userName, email)
|
||||
activate Gateway
|
||||
|
||||
Gateway -> Meeting: 회의 생성 요청
|
||||
activate Meeting
|
||||
|
||||
Meeting -> MeetingDB: 회의 정보 저장\n(제목, 일시, 장소, 참석자, 생성자)
|
||||
activate MeetingDB
|
||||
MeetingDB --> Meeting: 회의 ID 반환
|
||||
deactivate MeetingDB
|
||||
|
||||
Meeting -> Redis: 회의 정보 캐싱\nkey: meeting:info:{meetingId}\nTTL: 10분
|
||||
activate Redis
|
||||
Redis --> Meeting: 캐싱 완료
|
||||
deactivate Redis
|
||||
|
||||
Meeting -> Redis: 참석자 목록 캐싱\nkey: meeting:participants:{meetingId}\nTTL: 10분
|
||||
activate Redis
|
||||
Redis --> Meeting: 캐싱 완료
|
||||
deactivate Redis
|
||||
|
||||
Meeting -> EventHub: MeetingCreated 이벤트 발행\n(meetingId, 제목, 일시, 참석자 목록)
|
||||
activate EventHub
|
||||
EventHub --> Meeting: 발행 완료
|
||||
deactivate EventHub
|
||||
|
||||
Meeting --> Gateway: 201 Created\n회의 ID, 회의 정보
|
||||
deactivate Meeting
|
||||
|
||||
Gateway --> WebApp: 회의 생성 응답
|
||||
deactivate Gateway
|
||||
|
||||
WebApp --> User: 회의 예약 완료 표시\n캘린더에 자동 등록
|
||||
deactivate WebApp
|
||||
|
||||
== 참석자 초대 알림 (비동기) ==
|
||||
EventHub -> Notification: MeetingCreated 이벤트 수신\n(Consumer Group: notification-service-group)
|
||||
activate Notification
|
||||
|
||||
Notification -> Email: 참석자 전원에게 초대 이메일 발송\n(회의 제목, 일시, 장소, 참여 링크)
|
||||
activate Email
|
||||
Email --> Notification: 발송 완료
|
||||
deactivate Email
|
||||
|
||||
Notification -> MeetingDB: 알림 발송 기록 저장
|
||||
activate MeetingDB
|
||||
MeetingDB --> Notification: 저장 완료
|
||||
deactivate MeetingDB
|
||||
|
||||
deactivate Notification
|
||||
|
||||
== 회의 시작 30분 전 리마인더 (스케줄링) ==
|
||||
note over Notification
|
||||
스케줄링된 작업:
|
||||
회의 시작 시간 30분 전 자동 실행
|
||||
end note
|
||||
|
||||
Notification -> Email: 참석자 전원에게 리마인더 이메일 발송\n(회의 시작 30분 전)
|
||||
activate Notification
|
||||
activate Email
|
||||
Email --> Notification: 발송 완료
|
||||
deactivate Email
|
||||
deactivate Notification
|
||||
|
||||
@enduml
|
||||
136
design/backend/sequence/outer/회의종료및최종확정.puml
Normal file
136
design/backend/sequence/outer/회의종료및최종확정.puml
Normal file
@ -0,0 +1,136 @@
|
||||
@startuml
|
||||
!theme mono
|
||||
|
||||
title 외부 시퀀스 - 회의 종료 및 최종 확정
|
||||
|
||||
actor "사용자" as User
|
||||
participant "Web App" as WebApp
|
||||
participant "API Gateway" as Gateway
|
||||
participant "Meeting Service" as Meeting
|
||||
participant "STT Service" as STT
|
||||
participant "AI Service" as AI
|
||||
participant "Notification Service" as Notification
|
||||
participant "Azure Event Hubs" as EventHub
|
||||
|
||||
== 회의 종료 ==
|
||||
User -> WebApp: 회의 종료 버튼 클릭
|
||||
WebApp -> Gateway: POST /meetings/{meetingId}/end
|
||||
note right
|
||||
요청 헤더에 JWT 토큰 포함
|
||||
요청 바디에 사용자 정보 포함
|
||||
(userId, userName, email)
|
||||
end note
|
||||
|
||||
Gateway -> Meeting: 회의 종료 요청
|
||||
Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의 통계 생성\n (총 시간, 참석자 수, 발언 횟수 등)
|
||||
Meeting -> Meeting: DB 저장
|
||||
Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId})
|
||||
|
||||
Meeting ->> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime)
|
||||
note right
|
||||
Partition Key: {meetingId}
|
||||
Consumer Group:
|
||||
- stt-service-group
|
||||
- ai-service-group
|
||||
- notification-service-group
|
||||
end note
|
||||
|
||||
Meeting -> Gateway: 202 Accepted\n(회의 종료 완료)
|
||||
Gateway -> WebApp: 회의 종료 완료 응답
|
||||
WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등)
|
||||
|
||||
== 비동기 처리 - STT 종료 ==
|
||||
EventHub -->> STT: MeetingEnded 이벤트 수신
|
||||
STT -> STT: 음성 녹음 중지
|
||||
STT -> STT: 최종 STT 변환 완료 확인
|
||||
|
||||
== 비동기 처리 - AI Todo 추출 ==
|
||||
EventHub -->> AI: MeetingEnded 이벤트 수신
|
||||
AI -> AI: 최종 회의록 분석
|
||||
AI -> AI: Todo 자동 추출\n- 액션 아이템 식별\n- 담당자 자동 식별\n- 마감일 추출
|
||||
AI -> AI: DB 저장 (AiTaskStatus)
|
||||
|
||||
AI -> Meeting: POST /meetings/{meetingId}/todos\n(Todo 정보 전송)
|
||||
note right
|
||||
Todo 정보:
|
||||
- Todo 내용
|
||||
- 담당자 (자동 식별)
|
||||
- 마감일 (언급된 경우)
|
||||
- 우선순위
|
||||
- 관련 회의록 섹션 링크
|
||||
end note
|
||||
|
||||
Meeting -> Meeting: Todo 생성 및 할당\n(내부 처리)
|
||||
Meeting -> Meeting: 회의록 섹션 링크 연결
|
||||
Meeting -> Meeting: DB 저장 (Todo 테이블)
|
||||
Meeting -> Meeting: Redis 캐시 무효화\n(todo:user:{userId})
|
||||
|
||||
Meeting ->> EventHub: TodoCreated 이벤트 발행\n(todoId, assignee, dueDate)
|
||||
note right
|
||||
Partition Key: {userId}
|
||||
Consumer Group:
|
||||
- notification-service-group
|
||||
end note
|
||||
|
||||
Meeting -> AI: 200 OK (Todo 생성 완료)
|
||||
|
||||
== 비동기 처리 - 회의 종료 알림 ==
|
||||
EventHub -->> Notification: MeetingEnded 이벤트 수신
|
||||
Notification -> Notification: 회의 종료 알림 준비\n(참석자 전원)
|
||||
Notification -> Notification: 이메일 발송
|
||||
note right
|
||||
알림 내용:
|
||||
- 회의 제목
|
||||
- 회의 종료 시간
|
||||
- 회의 통계
|
||||
- 회의록 링크
|
||||
end note
|
||||
|
||||
== 비동기 처리 - Todo 할당 알림 ==
|
||||
EventHub -->> Notification: TodoCreated 이벤트 수신
|
||||
Notification -> Notification: Todo 할당 알림 준비
|
||||
Notification -> Notification: 담당자에게 이메일 발송
|
||||
note right
|
||||
알림 내용:
|
||||
- Todo 내용
|
||||
- 마감일
|
||||
- 우선순위
|
||||
- 회의록 링크 (해당 섹션)
|
||||
end note
|
||||
|
||||
== 최종 회의록 확정 ==
|
||||
User -> WebApp: 최종 회의록 확정 버튼 클릭
|
||||
WebApp -> Gateway: POST /meetings/{meetingId}/transcripts/finalize
|
||||
note right
|
||||
요청 헤더에 JWT 토큰 포함
|
||||
요청 바디에 사용자 정보 포함
|
||||
end note
|
||||
|
||||
Gateway -> Meeting: 회의록 확정 요청
|
||||
Meeting -> Meeting: 필수 항목 검사\n- 회의 제목\n- 참석자 목록\n- 주요 논의 내용\n- 결정 사항
|
||||
|
||||
alt 필수 항목 미작성
|
||||
Meeting -> Gateway: 400 Bad Request\n(누락된 항목 정보)
|
||||
Gateway -> WebApp: 검증 실패 응답
|
||||
WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동)
|
||||
else 필수 항목 작성 완료
|
||||
Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록\n- 공유 가능 상태로 전환
|
||||
Meeting -> Meeting: DB 저장 (TranscriptVersion)
|
||||
Meeting -> Meeting: Redis 캐시 무효화
|
||||
|
||||
Meeting ->> EventHub: TranscriptFinalized 이벤트 발행\n(meetingId, version, finalizedAt)
|
||||
note right
|
||||
Partition Key: {meetingId}
|
||||
Consumer Group:
|
||||
- notification-service-group
|
||||
end note
|
||||
|
||||
Meeting -> Gateway: 200 OK\n(확정 버전 정보)
|
||||
Gateway -> WebApp: 회의록 확정 완료
|
||||
WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간)
|
||||
|
||||
EventHub -->> Notification: TranscriptFinalized 이벤트 수신
|
||||
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원)
|
||||
end
|
||||
|
||||
@enduml
|
||||
Loading…
x
Reference in New Issue
Block a user