내외부 시퀀스 - 회의록 공유 제거

This commit is contained in:
cyjadela 2025-10-23 10:15:11 +09:00
parent 6e2baa2386
commit 4282d45ee8
6 changed files with 8 additions and 258 deletions

View File

@ -6,14 +6,14 @@
각 마이크로서비스의 내부 처리 흐름을 상세히 정의하여 개발 구현의 기준을 제공합니다. 각 마이크로서비스의 내부 처리 흐름을 상세히 정의하여 개발 구현의 기준을 제공합니다.
### 범위 ### 범위
본 문서는 5개 마이크로서비스의 총 25개 내부 시퀀스 다이어그램을 다룹니다. 본 문서는 5개 마이크로서비스의 총 24개 내부 시퀀스 다이어그램을 다룹니다.
## 설계 완료 요약 ## 설계 완료 요약
✅ **전체 25개 내부 시퀀스 다이어그램 설계 완료** ✅ **전체 24개 내부 시퀀스 다이어그램 설계 완료**
- Meeting Service: 14개 시나리오 - Meeting Service: 13개 시나리오
- AI Service: 6개 시나리오 - AI Service: 6개 시나리오
- STT Service: 2개 시나리오 - STT Service: 2개 시나리오
- User Service: 2개 시나리오 - User Service: 2개 시나리오
- Notification Service: 1개 시나리오 - Notification Service: 1개 시나리오

View File

@ -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<<E>>" as DB
database "Redis Cache<<E>>" as Cache
queue "Azure Event Hubs<<E>>" 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

View File

@ -131,7 +131,6 @@ else 확정 가능
note over Service note over Service
비동기 처리: 비동기 처리:
- 회의록 공유 가능 상태로 전환
- 참석자에게 확정 알림 - 참석자에게 확정 알림
end note end note

View File

@ -44,7 +44,7 @@ deactivate Cache
alt Cache Hit alt Cache Hit
UserService -> UserService: 캐시 데이터 반환 UserService -> UserService: 캐시 데이터 반환
else Cache Miss else Cache Miss
UserService -> UserDB: 대시보드 데이터 조회\n- 예정된 회의 목록\n- 진행 중 Todo 목록\n- 최근 회의록 목록\n- 공유받은 회의록 목록\n- 통계 정보 UserService -> UserDB: 대시보드 데이터 조회\n- 예정된 회의 목록\n- 진행 중 Todo 목록\n- 최근 회의록 목록\n- 통계 정보
activate UserDB activate UserDB
UserDB --> UserService: 조회 결과 UserDB --> UserService: 조회 결과
deactivate UserDB deactivate UserDB
@ -55,13 +55,13 @@ else Cache Miss
deactivate Cache deactivate Cache
end 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 deactivate UserService
Gateway --> Frontend: 200 OK\n대시보드 데이터 + 페이지네이션 정보 Gateway --> Frontend: 200 OK\n대시보드 데이터 + 페이지네이션 정보
deactivate Gateway deactivate Gateway
Frontend -> Frontend: 대시보드 화면 렌더링\n- 예정된 회의 표시\n- Todo 목록 표시\n- 최근/공유 회의록 표시\n- 통계 차트 표시 Frontend -> Frontend: 대시보드 화면 렌더링\n- 예정된 회의 표시\n- Todo 목록 표시\n- 최근 회의록 표시\n- 통계 차트 표시
Frontend --> User: 대시보드 화면 표시 Frontend --> User: 대시보드 화면 표시
deactivate Frontend deactivate Frontend

View File

@ -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

View File

@ -91,7 +91,7 @@ alt 필수 항목 미작성
Gateway -> WebApp: 검증 실패 응답 Gateway -> WebApp: 검증 실패 응답
WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동) WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동)
else 필수 항목 작성 완료 else 필수 항목 작성 완료
Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록\n- 공유 가능 상태로 전환 Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록
Meeting -> Meeting: DB 저장 (MinutesVersion) Meeting -> Meeting: DB 저장 (MinutesVersion)
Meeting -> Meeting: Redis 캐시 무효화 Meeting -> Meeting: Redis 캐시 무효화