From 6e2baa23864745ddff5aec15606372bb0027f9b6 Mon Sep 17 00:00:00 2001 From: cyjadela Date: Thu, 23 Oct 2025 10:03:35 +0900 Subject: [PATCH] =?UTF-8?q?=EB=82=B4=EC=99=B8=EB=B6=80=20=EC=8B=9C?= =?UTF-8?q?=ED=80=80=EC=8A=A4=20-=20=EB=B6=88=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sequence/inner/meeting-회의록공유.puml | 10 ++- .../sequence/inner/meeting-회의록확정.puml | 17 ++--- .../sequence/inner/meeting-회의예약.puml | 9 ++- .../sequence/inner/meeting-회의종료.puml | 21 ++++- .../sequence/inner/notification-알림발송.puml | 15 ++-- .../sequence/outer/Todo완료및회의록반영.puml | 13 ++-- design/backend/sequence/outer/회의록공유.puml | 11 ++- .../outer/회의시작및실시간회의록작성.puml | 24 +++--- .../sequence/outer/회의예약및참석자초대.puml | 11 ++- .../sequence/outer/회의종료및최종확정.puml | 76 ++++++------------- 10 files changed, 110 insertions(+), 97 deletions(-) diff --git a/design/backend/sequence/inner/meeting-회의록공유.puml b/design/backend/sequence/inner/meeting-회의록공유.puml index a9603ff..9063d3c 100644 --- a/design/backend/sequence/inner/meeting-회의록공유.puml +++ b/design/backend/sequence/inner/meeting-회의록공유.puml @@ -127,13 +127,17 @@ else 공유 가능 note over Service 비동기 이벤트 발행: - 공유 대상자에게 이메일 발송 - - 공유 알림 발송 - 캘린더 초대 발송 (일정 있는 경우) end note - ' 이벤트 발행 - Service -> EventHub: publish(MinutesShared)\n{\n minutesId, shareLink,\n sharedWith, permission,\n sharedBy, nextMeetingEvent\n} + ' NotificationRequest 이벤트 발행 + Service -> EventHub: publish(NotificationRequest)\n{\n channel: EMAIL,\n recipients: sharedWith,\n message: "회의록 공유 안내",\n metadata: {\n minutesId, shareLink,\n permission, sharedBy,\n nextMeetingEvent\n }\n} activate EventHub + note right + Notification Service가 구독: + - Consumer Group: notification-service-group + - 공유 대상자에게 이메일 발송 + end note EventHub --> Service: 발행 완료 deactivate EventHub diff --git a/design/backend/sequence/inner/meeting-회의록확정.puml b/design/backend/sequence/inner/meeting-회의록확정.puml index 34f9591..6587d6b 100644 --- a/design/backend/sequence/inner/meeting-회의록확정.puml +++ b/design/backend/sequence/inner/meeting-회의록확정.puml @@ -131,24 +131,21 @@ else 확정 가능 note over Service 비동기 처리: - - AI가 Todo 항목 자동 추출 - 회의록 공유 가능 상태로 전환 - 참석자에게 확정 알림 end note - ' AI Todo 추출 이벤트 발행 - Service -> EventHub: publish(MinutesFinalized)\n{\n minutesId, meetingId,\n finalizedAt, content,\n participants\n} + ' NotificationRequest 이벤트 발행 + Service -> EventHub: publish(NotificationRequest)\n{\n channel: EMAIL,\n recipients: participants,\n message: "회의록 확정 안내",\n metadata: {\n minutesId, meetingId,\n finalizedAt, version\n }\n} activate EventHub + note right + Notification Service가 구독: + - Consumer Group: notification-service-group + - 참석자 전원에게 확정 알림 발송 + end note EventHub --> Service: 발행 완료 deactivate EventHub - ' Todo 자동 추출 (비동기 응답 대기 없음) - note over Service - AI 서비스가 MinutesFinalized 이벤트를 구독하여 - Todo 자동 추출 및 할당 수행 - 추출된 Todo는 별도 이벤트로 전달됨 - end note - Service --> Controller: MinutesFinalizeResponse deactivate Service diff --git a/design/backend/sequence/inner/meeting-회의예약.puml b/design/backend/sequence/inner/meeting-회의예약.puml index f297424..4504af1 100644 --- a/design/backend/sequence/inner/meeting-회의예약.puml +++ b/design/backend/sequence/inner/meeting-회의예약.puml @@ -100,14 +100,19 @@ else 중복 없음 note over Service 비동기 이벤트 발행: - - 초대 이메일 발송 + - 참석자에게 초대 알림 발송 - 캘린더 등록 - 리마인더 스케줄링 end note ' 이벤트 발행 - Service -> EventHub: publish(MeetingCreated)\n{\n meetingId, title, startTime,\n participants, creatorInfo\n} + Service -> EventHub: publish(NotificationRequest)\n{\n channel: EMAIL,\n recipients: participants,\n message: "회의 초대",\n metadata: {\n meetingId, title, startTime,\n location\n }\n} activate EventHub + note right + Notification Service가 구독: + - Consumer Group: notification-service-group + - 참석자 전원에게 초대 이메일 발송 + end note EventHub --> Service: 발행 완료 deactivate EventHub diff --git a/design/backend/sequence/inner/meeting-회의종료.puml b/design/backend/sequence/inner/meeting-회의종료.puml index a28c022..80e9319 100644 --- a/design/backend/sequence/inner/meeting-회의종료.puml +++ b/design/backend/sequence/inner/meeting-회의종료.puml @@ -267,13 +267,28 @@ else 종료 가능 note over Service 비동기 이벤트 발행: - STT 서비스에 녹음 중지 요청 - - AI 서비스에 최종 회의록 생성 요청 - 참석자에게 회의 종료 알림 end note - ' 이벤트 발행 - Service -> EventHub: publish(MeetingEnded)\n{\n meetingId, sessionId,\n endedAt, statistics,\n minutesId,\n aiSuggestionsMerged: true,\n mergedCount: N\n} + ' MeetingEnded 이벤트 발행 (STT Service 구독) + Service -> EventHub: publish(MeetingEnded)\n{\n meetingId, sessionId,\n endedAt, statistics\n} activate EventHub + note right + STT Service가 구독: + - Consumer Group: stt-service-group + - 음성 녹음 중지 처리 + end note + EventHub --> Service: 발행 완료 + deactivate EventHub + + ' NotificationRequest 이벤트 발행 (Notification Service 구독) + Service -> EventHub: publish(NotificationRequest)\n{\n channel: EMAIL,\n recipients: participants,\n message: "회의 종료 안내",\n metadata: {\n meetingId, statistics,\n minutesId,\n aiEnhancement: {\n merged: true,\n count: N\n }\n }\n} + activate EventHub + note right + Notification Service가 구독: + - Consumer Group: notification-service-group + - 참석자 전원에게 종료 알림 발송 + end note EventHub --> Service: 발행 완료 deactivate EventHub diff --git a/design/backend/sequence/inner/notification-알림발송.puml b/design/backend/sequence/inner/notification-알림발송.puml index fa71196..bf6da7e 100644 --- a/design/backend/sequence/inner/notification-알림발송.puml +++ b/design/backend/sequence/inner/notification-알림발송.puml @@ -12,14 +12,17 @@ participant "Email Service<>" as Email participant "NotificationRepository" as Repository database "PostgreSQL<>" as DB -EventHub -> Listener: consume(NotificationEvent) +EventHub -> Listener: consume(NotificationRequest) activate Listener note right - Event 종류: - - MeetingCreatedEvent - - TodoAssignedEvent - - MeetingReminderEvent - - SummaryCompletedEvent + NotificationRequest 이벤트: + - channel: 발송수단 (EMAIL, SMS) + - recipients: 대상자 목록 + - message: 메시지 내용 + - metadata: 추가 정보 (회의정보 등) + + Consumer Group: + - notification-service-group end note Listener -> Service: processNotification(event) diff --git a/design/backend/sequence/outer/Todo완료및회의록반영.puml b/design/backend/sequence/outer/Todo완료및회의록반영.puml index a9f4e80..790e4a3 100644 --- a/design/backend/sequence/outer/Todo완료및회의록반영.puml +++ b/design/backend/sequence/outer/Todo완료및회의록반영.puml @@ -45,10 +45,14 @@ note right end note == 이벤트 발행 == -Meeting -> Notification: TodoCompleted 이벤트 발행\n(todoId, meetingId, completedBy,\ncompletedAt, meetingCreatorId) +Meeting -> Notification: NotificationRequest 이벤트 발행 +activate Notification note right -Azure Event Hubs를 통한 -비동기 이벤트 발행 + 이벤트 데이터: + - 발송수단: EMAIL + - 대상자: 회의록 작성자 + - 메시지: Todo 완료 안내 + - 메타데이터: todoId, 완료자, 완료 시간 end note Meeting --> Gateway: 200 OK\n{todoId, status: COMPLETED,\ncompletedAt, completedBy} @@ -59,8 +63,7 @@ Web --> User: Todo 완료 표시 deactivate Web == 알림 발송 == -activate Notification -Notification -> Notification: TodoCompleted 이벤트 구독 +Notification -> Notification: NotificationRequest 이벤트 구독 Notification -> Notification: 알림 메시지 생성\n- 수신자: 회의록 작성자\n- 내용: "Todo 완료됨" Notification --> Notification: 이메일 발송\n(회의록 작성자에게) note right diff --git a/design/backend/sequence/outer/회의록공유.puml b/design/backend/sequence/outer/회의록공유.puml index 9ee8d15..5da858c 100644 --- a/design/backend/sequence/outer/회의록공유.puml +++ b/design/backend/sequence/outer/회의록공유.puml @@ -42,8 +42,15 @@ Redis --> Meeting: 캐시 삭제 완료 deactivate Redis == 이벤트 발행 == -Meeting -> EventHub: MinutesShared 이벤트 발행\n(minutesId, 참석자 목록, 공유 URL) +Meeting -> EventHub: NotificationRequest 이벤트 발행\n(회의록 공유 알림) activate EventHub +note right + 이벤트 데이터: + - 발송수단: EMAIL + - 대상자: 참석자 전원 + - 메시지: 회의록 공유 안내 + - 메타데이터: 공유 URL, 권한 정보 +end note EventHub --> Meeting: 이벤트 발행 성공 deactivate EventHub @@ -55,7 +62,7 @@ Web --> User: 공유 링크 표시 deactivate Web == 알림 발송 == -EventHub -> Notification: MinutesShared 이벤트 구독 +EventHub -> Notification: NotificationRequest 이벤트 구독 activate Notification Notification -> Notification: 이메일 템플릿 생성\n(회의 제목, 공유 URL, 권한 정보) Notification -> Notification: 참석자 전원에게\n이메일 발송 diff --git a/design/backend/sequence/outer/회의시작및실시간회의록작성.puml b/design/backend/sequence/outer/회의시작및실시간회의록작성.puml index 374225e..e519cd8 100644 --- a/design/backend/sequence/outer/회의시작및실시간회의록작성.puml +++ b/design/backend/sequence/outer/회의시작및실시간회의록작성.puml @@ -35,8 +35,17 @@ activate Meeting Meeting -> Meeting: 회의 세션 생성 -Meeting -> EventHub: MeetingStarted 이벤트 발행 -activate EventHub +Meeting -> STT: POST /stt/recording/start\n(meetingId, participantIds) +activate STT +note right + 동기 호출로 즉시 녹음 시작 + 회의 시작과 음성 녹음이 원자적으로 처리 +end note + +STT -> STT: 음성 녹음 준비 및 시작 + +STT --> Meeting: 200 OK (recordingId) +deactivate STT Meeting --> Gateway: 201 Created deactivate Meeting @@ -49,16 +58,7 @@ Frontend -> Frontend: 회의 화면으로 전환 Frontend --> User: 회의 진행 화면 표시 deactivate Frontend -== 음성 녹음 시작 == - -EventHub -> STT: MeetingStarted 이벤트 구독 -activate STT - -STT -> STT: 음성 녹음 준비 - -STT --> EventHub: 녹음 준비 완료 -deactivate STT -deactivate EventHub +== 음성 녹음 진행 == == 실시간 회의록 작성 (반복) == diff --git a/design/backend/sequence/outer/회의예약및참석자초대.puml b/design/backend/sequence/outer/회의예약및참석자초대.puml index 58eebe2..96c96e4 100644 --- a/design/backend/sequence/outer/회의예약및참석자초대.puml +++ b/design/backend/sequence/outer/회의예약및참석자초대.puml @@ -48,8 +48,15 @@ activate Redis Redis --> Meeting: 캐싱 완료 deactivate Redis -Meeting -> EventHub: MeetingCreated 이벤트 발행\n(meetingId, 제목, 일시, 참석자 목록) +Meeting -> EventHub: NotificationRequest 이벤트 발행 activate EventHub +note right + 이벤트 데이터: + - 발송수단: EMAIL + - 대상자: 참석자 목록 + - 메시지: 회의 초대 내용 + - 메타데이터: 회의 제목, 일시, 장소 +end note EventHub --> Meeting: 발행 완료 deactivate EventHub @@ -63,7 +70,7 @@ WebApp --> User: 회의 예약 완료 표시\n캘린더에 자동 등록 deactivate WebApp == 참석자 초대 알림 (비동기) == -EventHub -> Notification: MeetingCreated 이벤트 수신\n(Consumer Group: notification-service-group) +EventHub -> Notification: NotificationRequest 이벤트 수신\n(Consumer Group: notification-service-group) Notification -> Email: 참석자 전원에게 초대 이메일 발송\n(회의 제목, 일시, 장소, 참여 링크) Email --> Notification: 발송 완료 diff --git a/design/backend/sequence/outer/회의종료및최종확정.puml b/design/backend/sequence/outer/회의종료및최종확정.puml index 49656df..2cf696b 100644 --- a/design/backend/sequence/outer/회의종료및최종확정.puml +++ b/design/backend/sequence/outer/회의종료및최종확정.puml @@ -41,10 +41,20 @@ note right Partition Key: {meetingId} Consumer Group: - stt-service-group - - ai-service-group - - notification-service-group end note +Meeting -> EventHub: NotificationRequest 이벤트 발행\n(회의 종료 알림) +activate EventHub +note right + 이벤트 데이터: + - 발송수단: EMAIL + - 대상자: 참석자 전원 + - 메시지: 회의 종료 안내 + - 메타데이터: 회의 통계, 회의록 링크 +end note +EventHub --> Meeting: 발행 완료 +deactivate EventHub + Meeting -> Gateway: 202 Accepted\n(회의 종료 완료) Gateway -> WebApp: 회의 종료 완료 응답 WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등) @@ -54,40 +64,9 @@ 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: 이메일 발송 +EventHub --> Notification: NotificationRequest 이벤트 수신 +Notification -> Notification: 회의 종료 알림 발송\n(참석자 전원) note right 알림 내용: - 회의 제목 @@ -96,18 +75,6 @@ note right - 회의록 링크 end note -== 비동기 처리 - Todo 할당 알림 == -EventHub --> Notification: TodoCreated 이벤트 수신 -Notification -> Notification: Todo 할당 알림 준비 -Notification -> Notification: 담당자에게 이메일 발송 -note right - 알림 내용: - - Todo 내용 - - 마감일 - - 우선순위 - - 회의록 링크 (해당 섹션) -end note - == 최종 회의록 확정 == User -> WebApp: 최종 회의록 확정 버튼 클릭 WebApp -> Gateway: POST /api/minutes/{minutesId}/finalize @@ -128,18 +95,23 @@ else 필수 항목 작성 완료 Meeting -> Meeting: DB 저장 (MinutesVersion) Meeting -> Meeting: Redis 캐시 무효화 - Meeting -> EventHub: MinutesFinalized 이벤트 발행\n(meetingId, version, finalizedAt) + Meeting -> EventHub: NotificationRequest 이벤트 발행\n(회의록 확정 알림) + activate EventHub note right - Partition Key: {meetingId} - Consumer Group: - - notification-service-group + 이벤트 데이터: + - 발송수단: EMAIL + - 대상자: 참석자 전원 + - 메시지: 회의록 확정 안내 + - 메타데이터: 버전 번호, 확정 시간 end note + EventHub --> Meeting: 발행 완료 + deactivate EventHub Meeting -> Gateway: 200 OK\n(확정 버전 정보) Gateway -> WebApp: 회의록 확정 완료 WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간) - EventHub --> Notification: MinutesFinalized 이벤트 수신 + EventHub --> Notification: NotificationRequest 이벤트 수신 Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원) end