외부 시퀀스 설계 완료

- 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:
kimjh 2025-10-22 14:58:20 +09:00
parent 1b5efd76d8
commit a43b0c63cb
7 changed files with 664 additions and 0 deletions

View 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

View 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

View 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

View 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

View 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

View 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

View 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