From 4282d45ee83f019576b991f45d44dfe80dd63ce0 Mon Sep 17 00:00:00 2001 From: cyjadela Date: Thu, 23 Oct 2025 10:15:11 +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=ED=9A=8C=EC=9D=98=EB=A1=9D=20?= =?UTF-8?q?=EA=B3=B5=EC=9C=A0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/backend/sequence/inner/README.md | 8 +- .../sequence/inner/meeting-회의록공유.puml | 169 ------------------ .../sequence/inner/meeting-회의록확정.puml | 1 - .../backend/sequence/outer/대시보드조회.puml | 6 +- design/backend/sequence/outer/회의록공유.puml | 80 --------- .../sequence/outer/회의종료및최종확정.puml | 2 +- 6 files changed, 8 insertions(+), 258 deletions(-) delete mode 100644 design/backend/sequence/inner/meeting-회의록공유.puml delete mode 100644 design/backend/sequence/outer/회의록공유.puml diff --git a/design/backend/sequence/inner/README.md b/design/backend/sequence/inner/README.md index b77235c..0468624 100644 --- a/design/backend/sequence/inner/README.md +++ b/design/backend/sequence/inner/README.md @@ -6,14 +6,14 @@ 각 마이크로서비스의 내부 처리 흐름을 상세히 정의하여 개발 구현의 기준을 제공합니다. ### 범위 -본 문서는 5개 마이크로서비스의 총 25개 내부 시퀀스 다이어그램을 다룹니다. +본 문서는 5개 마이크로서비스의 총 24개 내부 시퀀스 다이어그램을 다룹니다. ## 설계 완료 요약 -✅ **전체 25개 내부 시퀀스 다이어그램 설계 완료** +✅ **전체 24개 내부 시퀀스 다이어그램 설계 완료** -- Meeting Service: 14개 시나리오 -- AI Service: 6개 시나리오 +- Meeting Service: 13개 시나리오 +- AI Service: 6개 시나리오 - STT Service: 2개 시나리오 - User Service: 2개 시나리오 - Notification Service: 1개 시나리오 diff --git a/design/backend/sequence/inner/meeting-회의록공유.puml b/design/backend/sequence/inner/meeting-회의록공유.puml deleted file mode 100644 index 9063d3c..0000000 --- a/design/backend/sequence/inner/meeting-회의록공유.puml +++ /dev/null @@ -1,169 +0,0 @@ -@startuml meeting-회의록공유 -!theme mono - -title Meeting Service - 회의록공유 내부 시퀀스 - -participant "ShareController" as Controller -participant "ShareService" as Service -participant "MinutesRepository" as MinutesRepo -participant "ShareRepository" as ShareRepo -participant "CalendarService" as CalendarService -database "Meeting DB<>" as DB -database "Redis Cache<>" as Cache -queue "Azure Event Hubs<>" as EventHub - -[-> Controller: POST /minutes/{minutesId}/share -activate Controller - -note over Controller -경로 변수: minutesId -요청 데이터: -{ - "sharedWith": ["user1@example.com", "user2@example.com"], - "permission": "READ_ONLY" | "COMMENT" | "EDIT", - "shareMethod": "EMAIL" | "LINK", - "linkOptions": { - "expiresIn": 7, // days - "requirePassword": true, - "password": "..." - } -} -사용자 정보: userId, userName, email -end note - -Controller -> Controller: 입력 검증\n- sharedWith 최소 1명\n- permission 유효성 - -Controller -> Service: shareMinutes(minutesId, request, userId) -activate Service - -' 회의록 정보 조회 -Service -> MinutesRepo: findById(minutesId) -activate MinutesRepo -MinutesRepo -> DB: 회의록 정보 조회 -activate DB -DB --> MinutesRepo: 회의록 정보 -deactivate DB -MinutesRepo --> Service: Minutes -deactivate MinutesRepo - -note over Service -비즈니스 규칙 검증: -- 회의록 존재 확인 -- 공유 권한 확인 (생성자만) -- 회의록 상태 확인 (FINALIZED만 공유 가능) -end note - -Service -> Service: 회의록 존재 확인 - -Service -> Service: 공유 권한 검증\n(생성자만 가능) - -Service -> Service: 회의록 상태 확인 - -alt 회의록이 확정되지 않음 - Service --> Controller: 400 Bad Request\n확정된 회의록만 공유 가능 - note right - 에러 응답 형식: - { - "error": { - "code": "MINUTES_NOT_FINALIZED", - "message": "확정된 회의록만 공유 가능합니다", - "details": "회의록을 먼저 확정해 주세요", - "timestamp": "2025-10-23T12:00:00Z", - "path": "/api/minutes/{minutesId}/share" - } - } - end note - return 400 Bad Request -else 공유 가능 - ' 공유 링크 생성 - Service -> Service: 고유 공유 링크 생성\n(UUID 기반 토큰) - - Service -> ShareRepo: createShareLink(minutesId, token, options) - activate ShareRepo - ShareRepo -> DB: 공유 링크 정보 저장 - activate DB - DB --> ShareRepo: 링크 생성 완료 - deactivate DB - ShareRepo --> Service: ShareLink - deactivate ShareRepo - - ' 공유 대상 저장 - loop 각 공유 대상마다 - Service -> ShareRepo: addSharedUser(minutesId, userEmail, permission) - activate ShareRepo - ShareRepo -> DB: 공유 대상 정보 저장 - activate DB - DB --> ShareRepo: 공유 정보 저장 완료 - deactivate DB - ShareRepo --> Service: 저장 성공 - deactivate ShareRepo - end - - ' 회의록에서 다음 회의 일정 언급 확인 - Service -> Service: 다음 회의 일정 추출\n(회의록 내용 분석) - - alt 다음 회의 일정 언급됨 - Service -> CalendarService: createCalendarEvent(meetingInfo) - activate CalendarService - - note over CalendarService - 캘린더 이벤트 생성: - - 제목: 다음 회의 제목 - - 일시: 추출된 일시 - - 참석자: 공유 대상자 - end note - - CalendarService -> CalendarService: 캘린더 이벤트 생성 - CalendarService --> Service: 이벤트 ID - deactivate CalendarService - end - - ' 캐시 무효화 - Service -> Cache: DELETE minutes:detail:{minutesId} - activate Cache - Cache --> Service: 삭제 완료 - deactivate Cache - - note over Service - 비동기 이벤트 발행: - - 공유 대상자에게 이메일 발송 - - 캘린더 초대 발송 (일정 있는 경우) - end note - - ' 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 - - Service --> Controller: ShareResponse - deactivate Service - - note over Controller - 응답 데이터: - { - "minutesId": "uuid", - "shareLink": "https://.../share/{token}", - "sharedWith": [...], - "permission": "READ_ONLY", - "expiresAt": "2025-01-30T00:00:00", - "sharedAt": "2025-01-23T16:30:00", - "nextMeetingEvent": { - "eventId": "...", - "title": "...", - "startTime": "..." - } - } - end note - - return 200 OK\nShareResponse -end - -deactivate Controller - -@enduml diff --git a/design/backend/sequence/inner/meeting-회의록확정.puml b/design/backend/sequence/inner/meeting-회의록확정.puml index 6587d6b..d0741bd 100644 --- a/design/backend/sequence/inner/meeting-회의록확정.puml +++ b/design/backend/sequence/inner/meeting-회의록확정.puml @@ -131,7 +131,6 @@ else 확정 가능 note over Service 비동기 처리: - - 회의록 공유 가능 상태로 전환 - 참석자에게 확정 알림 end note diff --git a/design/backend/sequence/outer/대시보드조회.puml b/design/backend/sequence/outer/대시보드조회.puml index 7ccfd37..fa9fc18 100644 --- a/design/backend/sequence/outer/대시보드조회.puml +++ b/design/backend/sequence/outer/대시보드조회.puml @@ -44,7 +44,7 @@ deactivate Cache alt Cache Hit UserService -> UserService: 캐시 데이터 반환 else Cache Miss - UserService -> UserDB: 대시보드 데이터 조회\n- 예정된 회의 목록\n- 진행 중 Todo 목록\n- 최근 회의록 목록\n- 공유받은 회의록 목록\n- 통계 정보 + UserService -> UserDB: 대시보드 데이터 조회\n- 예정된 회의 목록\n- 진행 중 Todo 목록\n- 최근 회의록 목록\n- 통계 정보 activate UserDB UserDB --> UserService: 조회 결과 deactivate UserDB @@ -55,13 +55,13 @@ else Cache Miss deactivate Cache end -UserService --> Gateway: 대시보드 데이터 응답\n{\n "upcomingMeetings": [...],\n "activeTodos": [...],\n "recentMinutes": [...],\n "sharedMinutes": [...],\n "statistics": {...},\n "pagination": {\n "page": 1,\n "size": 10,\n "totalElements": 45,\n "totalPages": 5,\n "hasNext": true\n }\n} +UserService --> Gateway: 대시보드 데이터 응답\n{\n "upcomingMeetings": [...],\n "activeTodos": [...],\n "recentMinutes": [...],\n "statistics": {...},\n "pagination": {\n "page": 1,\n "size": 10,\n "totalElements": 45,\n "totalPages": 5,\n "hasNext": true\n }\n} deactivate UserService Gateway --> Frontend: 200 OK\n대시보드 데이터 + 페이지네이션 정보 deactivate Gateway -Frontend -> Frontend: 대시보드 화면 렌더링\n- 예정된 회의 표시\n- Todo 목록 표시\n- 최근/공유 회의록 표시\n- 통계 차트 표시 +Frontend -> Frontend: 대시보드 화면 렌더링\n- 예정된 회의 표시\n- Todo 목록 표시\n- 최근 회의록 표시\n- 통계 차트 표시 Frontend --> User: 대시보드 화면 표시 deactivate Frontend diff --git a/design/backend/sequence/outer/회의록공유.puml b/design/backend/sequence/outer/회의록공유.puml deleted file mode 100644 index 5da858c..0000000 --- a/design/backend/sequence/outer/회의록공유.puml +++ /dev/null @@ -1,80 +0,0 @@ -@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 - -note over Gateway - 라우팅 규칙: - /api/meetings/** → Meeting Service - /api/minutes/** → Meeting Service - /api/dashboard → User Service - /api/notifications/** → Notification Service - /api/auth/** → User Service - /api/todos/** → Meeting Service -end note - -== 회의록 공유 설정 == -User -> Web: 공유 버튼 클릭 -activate Web -Web -> Web: 공유 대상 및 권한 설정 입력\n(읽기 전용/댓글 가능/편집 가능) -Web -> Gateway: POST /api/minutes/{minutesId}/share\n(공유 설정 정보) -activate Gateway -Gateway -> Gateway: JWT 토큰 검증 -Gateway -> Meeting: 회의록 공유 요청 -activate Meeting - -== 공유 링크 생성 == -Meeting -> Meeting: 공유 링크 생성\n(고유 URL, 권한, 유효기간) -Meeting -> Meeting: 공유 정보 DB 저장\n(공유 시간, 대상, 권한) - -== Redis 캐시 무효화 == -Meeting -> Redis: 회의록 정보 캐시 무효화\n(minutes:info:{minutesId}) -activate Redis -Redis --> Meeting: 캐시 삭제 완료 -deactivate Redis - -== 이벤트 발행 == -Meeting -> EventHub: NotificationRequest 이벤트 발행\n(회의록 공유 알림) -activate EventHub -note right - 이벤트 데이터: - - 발송수단: EMAIL - - 대상자: 참석자 전원 - - 메시지: 회의록 공유 안내 - - 메타데이터: 공유 URL, 권한 정보 -end note -EventHub --> Meeting: 이벤트 발행 성공 -deactivate EventHub - -Meeting --> Gateway: 공유 링크 생성 성공\n(공유 URL) -deactivate Meeting -Gateway --> Web: 공유 링크 반환 -deactivate Gateway -Web --> User: 공유 링크 표시 -deactivate Web - -== 알림 발송 == -EventHub -> Notification: NotificationRequest 이벤트 구독 -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 diff --git a/design/backend/sequence/outer/회의종료및최종확정.puml b/design/backend/sequence/outer/회의종료및최종확정.puml index 2cf696b..1ac957e 100644 --- a/design/backend/sequence/outer/회의종료및최종확정.puml +++ b/design/backend/sequence/outer/회의종료및최종확정.puml @@ -91,7 +91,7 @@ alt 필수 항목 미작성 Gateway -> WebApp: 검증 실패 응답 WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동) else 필수 항목 작성 완료 - Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록\n- 공유 가능 상태로 전환 + Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록 Meeting -> Meeting: DB 저장 (MinutesVersion) Meeting -> Meeting: Redis 캐시 무효화