mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 04:26:23 +00:00
설계서 업데이트: 실제 구현 반영 및 불필요한 다이어그램 정리
- 외부 시퀀스 다이어그램 업데이트 * 회의예약: 템플릿 선택 플로우 추가, API 경로 수정 (/api/meetings/reserve) * 회의시작: SessionResponse 구조 반영 (sessionId, minutesId, websocketUrl 등) * 회의종료: AI 분석 동기 처리 및 MeetingEndResponse 구조 반영, RAG용 이벤트 추가 - 불필요한 다이어그램 삭제 * 외부: 대시보드조회.puml (Meeting Service로 이동), Todo완료및회의록반영.puml (통합됨) * 내부: meeting-대시보드조회.puml, meeting-최종회의록확정.puml (중복) - 실제 API Controller 구현과 일치하도록 API 경로 및 응답 구조 정확히 반영 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
bca8d6e729
commit
ed9fa6f934
2
.gitignore
vendored
2
.gitignore
vendored
@ -57,4 +57,4 @@ claudedocs/*back*
|
||||
logs/
|
||||
**/logs/
|
||||
*.log
|
||||
**/*.log
|
||||
**/*.log
|
||||
File diff suppressed because one or more lines are too long
@ -1,129 +0,0 @@
|
||||
@startuml meeting-대시보드조회
|
||||
!theme mono
|
||||
|
||||
title Meeting Service - 대시보드조회 내부 시퀀스
|
||||
|
||||
participant "DashboardController" as Controller
|
||||
participant "DashboardService" as Service
|
||||
participant "MeetingRepository" as MeetingRepo
|
||||
participant "TodoRepository" as TodoRepo
|
||||
participant "MinutesRepository" as MinutesRepo
|
||||
database "Redis Cache<<E>>" as Cache
|
||||
database "Meeting DB<<E>>" as DB
|
||||
|
||||
[-> Controller: GET /dashboard
|
||||
activate Controller
|
||||
|
||||
note over Controller
|
||||
사용자 정보는 헤더에서 추출
|
||||
(userId, userName, email)
|
||||
end note
|
||||
|
||||
Controller -> Service: getDashboardData(userId)
|
||||
activate Service
|
||||
|
||||
' 캐시 조회
|
||||
Service -> Cache: GET dashboard:{userId}
|
||||
activate Cache
|
||||
Cache --> Service: 캐시 조회 결과
|
||||
deactivate Cache
|
||||
|
||||
alt Cache Hit
|
||||
Service --> Service: 캐시 데이터 반환
|
||||
else Cache Miss
|
||||
' 예정된 회의 조회
|
||||
Service -> MeetingRepo: findUpcomingMeetings(userId)
|
||||
activate MeetingRepo
|
||||
MeetingRepo -> DB: 예정된 회의 조회
|
||||
activate DB
|
||||
DB --> MeetingRepo: 예정된 회의 목록
|
||||
deactivate DB
|
||||
MeetingRepo --> Service: List<Meeting>
|
||||
deactivate MeetingRepo
|
||||
|
||||
' 진행 중 Todo 조회
|
||||
Service -> TodoRepo: findActiveTodos(userId)
|
||||
activate TodoRepo
|
||||
TodoRepo -> DB: 진행 중 Todo 조회
|
||||
activate DB
|
||||
DB --> TodoRepo: 진행 중 Todo 목록
|
||||
deactivate DB
|
||||
TodoRepo --> Service: List<Todo>
|
||||
deactivate TodoRepo
|
||||
|
||||
' 최근 회의록 조회
|
||||
Service -> MinutesRepo: findRecentMinutes(userId)
|
||||
activate MinutesRepo
|
||||
MinutesRepo -> DB: 최근 회의록 조회
|
||||
activate DB
|
||||
DB --> MinutesRepo: 최근 회의록 목록
|
||||
deactivate DB
|
||||
MinutesRepo --> Service: List<Minutes>
|
||||
deactivate MinutesRepo
|
||||
|
||||
' 통계 정보 조회
|
||||
Service -> MeetingRepo: countUpcomingMeetings(userId)
|
||||
activate MeetingRepo
|
||||
MeetingRepo -> DB: 예정된 회의 개수 조회
|
||||
activate DB
|
||||
DB --> MeetingRepo: 예정된 회의 개수
|
||||
deactivate DB
|
||||
MeetingRepo --> Service: int count
|
||||
deactivate MeetingRepo
|
||||
|
||||
Service -> TodoRepo: countActiveTodos(userId)
|
||||
activate TodoRepo
|
||||
TodoRepo -> DB: 진행 중 Todo 개수 조회
|
||||
activate DB
|
||||
DB --> TodoRepo: 진행 중 Todo 개수
|
||||
deactivate DB
|
||||
TodoRepo --> Service: int count
|
||||
deactivate TodoRepo
|
||||
|
||||
Service -> TodoRepo: calculateTodoCompletionRate(userId)
|
||||
activate TodoRepo
|
||||
TodoRepo -> DB: Todo 완료율 조회
|
||||
activate DB
|
||||
DB --> TodoRepo: Todo 완료율
|
||||
deactivate DB
|
||||
TodoRepo --> Service: double rate
|
||||
deactivate TodoRepo
|
||||
|
||||
note over Service
|
||||
비즈니스 로직:
|
||||
- 데이터 조합 및 정제
|
||||
- DTO 변환
|
||||
- 통계 계산
|
||||
end note
|
||||
|
||||
Service -> Service: 대시보드 데이터 조합
|
||||
|
||||
' 캐시 저장
|
||||
Service -> Cache: SET dashboard:{userId}\n(TTL: 5분)
|
||||
activate Cache
|
||||
Cache --> Service: 캐시 저장 완료
|
||||
deactivate Cache
|
||||
end
|
||||
|
||||
Service --> Controller: DashboardResponse
|
||||
deactivate Service
|
||||
|
||||
note over Controller
|
||||
응답 데이터 구조:
|
||||
{
|
||||
"upcomingMeetings": [...],
|
||||
"activeTodos": [...],
|
||||
"recentMinutes": [...],
|
||||
"statistics": {
|
||||
"upcomingMeetingsCount": n,
|
||||
"activeTodosCount": n,
|
||||
"todoCompletionRate": n
|
||||
}
|
||||
}
|
||||
end note
|
||||
|
||||
return 200 OK\nDashboardResponse
|
||||
|
||||
deactivate Controller
|
||||
|
||||
@enduml
|
||||
@ -1,118 +0,0 @@
|
||||
@startuml
|
||||
!theme mono
|
||||
|
||||
title 최종 회의록 확정 내부 시퀀스
|
||||
|
||||
participant "API Gateway<<E>>" as Gateway
|
||||
participant "MinutesController" as Controller
|
||||
participant "MeetingService" as Service
|
||||
participant "Meeting" as Domain
|
||||
participant "TranscriptService" as TranscriptService
|
||||
participant "MeetingRepository" as Repository
|
||||
database "PostgreSQL<<E>>" as DB
|
||||
database "Redis Cache<<E>>" as Cache
|
||||
queue "Event Hub<<E>>" as EventHub
|
||||
|
||||
Gateway -> Controller: POST /api/minutes/{minutesId}/finalize
|
||||
activate Controller
|
||||
|
||||
Controller -> Service: confirmTranscript(meetingId)
|
||||
activate Service
|
||||
|
||||
Service -> Repository: findById(meetingId)
|
||||
activate Repository
|
||||
Repository -> DB: 회의 정보 조회\n(회의ID 기준)
|
||||
activate DB
|
||||
DB --> Repository: meeting_row
|
||||
deactivate DB
|
||||
Repository --> Service: Meeting entity
|
||||
deactivate Repository
|
||||
|
||||
Service -> Domain: confirmTranscript()
|
||||
activate Domain
|
||||
|
||||
Domain -> Domain: validateCanConfirm()
|
||||
note right of Domain
|
||||
회의록 확정 검증 규칙:
|
||||
|
||||
1. 상태 검증:
|
||||
- 회의 상태 = COMPLETED (종료됨)
|
||||
- 회의록 상태 = DRAFT (작성중)
|
||||
✗ IN_PROGRESS → 400 Bad Request
|
||||
|
||||
2. 권한 검증:
|
||||
- 확정 요청자 = 회의 생성자 OR
|
||||
- 확정 요청자 ∈ 참석자 목록
|
||||
✗ 권한 없음 → 403 Forbidden
|
||||
|
||||
3. 필수 항목 검증:
|
||||
- 회의록 제목: NOT NULL, 길이 >= 5
|
||||
- 참석자 목록: 최소 1명 이상
|
||||
- 주요 논의 내용: NOT NULL, 길이 >= 20
|
||||
- 결정 사항: 최소 1개 이상 OR
|
||||
"결정사항 없음" 명시적 표시
|
||||
✗ 누락 → 400 Bad Request
|
||||
(누락 항목 목록 반환)
|
||||
|
||||
4. 데이터 무결성:
|
||||
- 섹션별 내용 완결성 확인
|
||||
- 참조 링크 유효성 확인
|
||||
- 첨부 파일 접근 가능 여부
|
||||
✗ 무결성 위반 → 400 Bad Request
|
||||
|
||||
5. 이력 검증:
|
||||
- 마지막 수정 후 24시간 경과 경고
|
||||
- 미승인 AI 제안 존재 시 알림
|
||||
⚠️ 경고만 표시, 진행 가능
|
||||
end note
|
||||
|
||||
Domain -> Domain: changeStatus(CONFIRMED)
|
||||
|
||||
Domain --> Service: updated Meeting
|
||||
deactivate Domain
|
||||
|
||||
Service -> TranscriptService: lockTranscript(meetingId)
|
||||
activate TranscriptService
|
||||
note right of TranscriptService
|
||||
회의록 잠금:
|
||||
- 더 이상 수정 불가
|
||||
- 버전 고정
|
||||
end note
|
||||
TranscriptService --> Service: lockedTranscript
|
||||
deactivate TranscriptService
|
||||
|
||||
Service -> Repository: save(meeting)
|
||||
activate Repository
|
||||
Repository -> DB: 회의 상태 업데이트\n(상태='확정', 확정일시)
|
||||
activate DB
|
||||
DB --> Repository: affected_rows
|
||||
deactivate DB
|
||||
Repository --> Service: savedMeeting
|
||||
deactivate Repository
|
||||
|
||||
Service -> Cache: SET meeting:{id}\n(TTL: 10분)
|
||||
activate Cache
|
||||
note right of Cache
|
||||
회의 정보 캐싱:
|
||||
- TTL: 10분
|
||||
- 자동 만료
|
||||
end note
|
||||
Cache --> Service: OK
|
||||
deactivate Cache
|
||||
|
||||
Service ->> EventHub: publish(MinutesFinalized)
|
||||
activate EventHub
|
||||
note right of EventHub
|
||||
비동기 이벤트:
|
||||
- 참석자에게 최종본 알림
|
||||
- 공유 서비스로 전송
|
||||
end note
|
||||
deactivate EventHub
|
||||
|
||||
Service --> Controller: MeetingResponse
|
||||
deactivate Service
|
||||
|
||||
Controller --> Gateway: 200 OK
|
||||
deactivate Controller
|
||||
|
||||
@enduml
|
||||
@ -1,74 +0,0 @@
|
||||
@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
|
||||
|
||||
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
|
||||
|
||||
autonumber
|
||||
|
||||
== Todo 완료 처리 ==
|
||||
User -> Web: Todo 완료 버튼 클릭
|
||||
activate Web
|
||||
Web -> Gateway: PATCH /api/todos/{todoId}/complete\n(userId, userName, completedAt)
|
||||
activate Gateway
|
||||
Gateway -> Meeting: PATCH /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 dashboard:{assigneeId}
|
||||
note right
|
||||
대시보드 캐시 무효화
|
||||
end note
|
||||
Meeting --> Redis: DELETE minutes:detail:{minutesId}
|
||||
note right
|
||||
회의록 상세 캐시 무효화
|
||||
end note
|
||||
|
||||
== 이벤트 발행 ==
|
||||
Meeting -> Notification: NotificationRequest 이벤트 발행
|
||||
activate Notification
|
||||
note right
|
||||
이벤트 데이터:
|
||||
- 발송수단: EMAIL
|
||||
- 대상자: 회의록 작성자
|
||||
- 메시지: Todo 완료 안내
|
||||
- 메타데이터: todoId, 완료자, 완료 시간
|
||||
end note
|
||||
|
||||
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
|
||||
|
||||
== 알림 발송 ==
|
||||
Notification -> Notification: NotificationRequest 이벤트 구독
|
||||
Notification -> Notification: 알림 메시지 생성\n- 수신자: 회의록 작성자\n- 내용: "Todo 완료됨"
|
||||
Notification --> Notification: 이메일 발송\n(회의록 작성자에게)
|
||||
note right
|
||||
외부 Email Service 연동
|
||||
end note
|
||||
deactivate Notification
|
||||
|
||||
@enduml
|
||||
@ -1,113 +0,0 @@
|
||||
@startuml 대시보드조회
|
||||
!theme mono
|
||||
|
||||
title 대시보드조회 외부 시퀀스
|
||||
|
||||
actor "사용자" as User
|
||||
participant "Web App" as Frontend
|
||||
participant "API Gateway" as Gateway
|
||||
participant "User Service" as UserService
|
||||
participant "Meeting Service" as MeetingService
|
||||
database "Redis Cache" as Cache
|
||||
database "User DB" as UserDB
|
||||
database "Meeting DB" as MeetingDB
|
||||
|
||||
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 -> Frontend: 대시보드 접근
|
||||
activate Frontend
|
||||
|
||||
Frontend -> Gateway: GET /api/dashboard?\npage=1&size=10&sort=createdAt,desc
|
||||
note right
|
||||
페이지네이션 파라미터:
|
||||
- page: 페이지 번호 (기본값: 1)
|
||||
- size: 페이지 크기 (기본값: 10)
|
||||
- sort: 정렬 기준 (기본값: createdAt,desc)
|
||||
end note
|
||||
activate Gateway
|
||||
|
||||
Gateway -> UserService: GET /dashboard?\npage=1&size=10&sort=createdAt,desc
|
||||
activate UserService
|
||||
|
||||
' 캐시 조회
|
||||
UserService -> Cache: GET dashboard:{userId}
|
||||
activate Cache
|
||||
Cache --> UserService: 캐시 조회 결과
|
||||
deactivate Cache
|
||||
|
||||
alt Cache Hit
|
||||
UserService -> UserService: 캐시 데이터 반환
|
||||
else Cache Miss
|
||||
par 병렬 데이터 조회
|
||||
' Meeting Service 호출
|
||||
UserService -> MeetingService: GET /api/v1/dashboard
|
||||
note right
|
||||
Meeting Service에서 조회:
|
||||
- 예정된 회의 목록
|
||||
- 진행 중 Todo 목록
|
||||
- 최근 회의록 목록
|
||||
- 공유받은 회의록
|
||||
- 통계 정보
|
||||
end note
|
||||
activate MeetingService
|
||||
MeetingService -> Cache: GET dashboard:{userId}
|
||||
activate Cache
|
||||
Cache --> MeetingService: 캐시 조회 결과
|
||||
deactivate Cache
|
||||
|
||||
alt Meeting Service 캐시 미존재
|
||||
MeetingService -> MeetingDB: 회의/Todo/회의록 데이터 조회
|
||||
activate MeetingDB
|
||||
MeetingDB --> MeetingService: 조회 결과
|
||||
deactivate MeetingDB
|
||||
|
||||
MeetingService -> Cache: SET dashboard:{userId}\n(TTL: 5분)
|
||||
activate Cache
|
||||
Cache --> MeetingService: 캐시 저장
|
||||
deactivate Cache
|
||||
end
|
||||
|
||||
MeetingService --> UserService: 회의 관련 데이터 응답\n{\n "upcomingMeetings": [...],\n "activeTodos": [...],\n "recentMinutes": [...],\n "sharedMinutes": [...],\n "statistics": {...}\n}
|
||||
deactivate MeetingService
|
||||
else
|
||||
' User Service 자체 데이터 조회
|
||||
UserService -> UserDB: 최근 활동 내역 조회
|
||||
activate UserDB
|
||||
UserDB --> UserService: 활동 내역
|
||||
deactivate UserDB
|
||||
end
|
||||
|
||||
UserService -> UserService: 데이터 통합 및 조합
|
||||
note right
|
||||
대시보드 데이터 구성:
|
||||
- Meeting Service 데이터
|
||||
- User Service 활동 내역
|
||||
- 통합 통계 정보
|
||||
end note
|
||||
|
||||
UserService -> Cache: SET dashboard:{userId}\n(TTL: 5분)
|
||||
activate Cache
|
||||
Cache --> UserService: 캐시 저장 완료
|
||||
deactivate Cache
|
||||
end
|
||||
|
||||
UserService --> Gateway: 대시보드 데이터 응답\n{\n "upcomingMeetings": [...],\n "activeTodos": [...],\n "recentMinutes": [...],\n "recentActivities": [...],\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 --> User: 대시보드 화면 표시
|
||||
deactivate Frontend
|
||||
|
||||
@enduml
|
||||
@ -33,7 +33,7 @@ activate Gateway
|
||||
Gateway -> Meeting: POST /meetings/{meetingId}/start
|
||||
activate Meeting
|
||||
|
||||
Meeting -> Meeting: 회의 세션 생성
|
||||
Meeting -> Meeting: 회의 세션 생성\n- Session 객체 생성\n- Minutes 초기화 (DRAFT)\n- WebSocket URL 생성
|
||||
|
||||
Meeting -> STT: POST /stt/recording/start\n(meetingId, participantIds)
|
||||
activate STT
|
||||
@ -47,7 +47,7 @@ STT -> STT: 음성 녹음 준비 및 시작
|
||||
STT --> Meeting: 200 OK (recordingId)
|
||||
deactivate STT
|
||||
|
||||
Meeting --> Gateway: 201 Created
|
||||
Meeting --> Gateway: 201 Created\n- sessionId\n- meetingId\n- minutesId\n- status (IN_PROGRESS)\n- websocketUrl\n- sessionToken\n- startedAt\n- expiresAt
|
||||
deactivate Meeting
|
||||
|
||||
Gateway --> Frontend: 201 Created
|
||||
|
||||
@ -27,7 +27,7 @@ end note
|
||||
User -> WebApp: 회의 정보 입력\n(제목, 날짜/시간, 장소, 참석자)
|
||||
activate WebApp
|
||||
|
||||
WebApp -> Gateway: POST /api/meetings\n+ JWT 토큰\n+ 사용자 정보 (userId, userName, email)
|
||||
WebApp -> Gateway: POST /api/meetings/reserve\n+ JWT 토큰\n+ 사용자 정보 (userId, userName, email)
|
||||
activate Gateway
|
||||
|
||||
Gateway -> Meeting: 회의 생성 요청
|
||||
@ -69,6 +69,30 @@ deactivate Gateway
|
||||
WebApp --> User: 회의 예약 완료 표시\n캘린더에 자동 등록
|
||||
deactivate WebApp
|
||||
|
||||
== 템플릿 선택 (선택 사항) ==
|
||||
User -> WebApp: 템플릿 선택\n(일반, 스크럼, 킥오프, 주간)
|
||||
activate WebApp
|
||||
|
||||
WebApp -> Gateway: PUT /api/meetings/{meetingId}/template\n+ JWT 토큰\n+ templateId
|
||||
activate Gateway
|
||||
|
||||
Gateway -> Meeting: 템플릿 적용 요청
|
||||
activate Meeting
|
||||
|
||||
Meeting -> MeetingDB: 템플릿 정보 저장
|
||||
activate MeetingDB
|
||||
MeetingDB --> Meeting: 저장 완료
|
||||
deactivate MeetingDB
|
||||
|
||||
Meeting --> Gateway: 200 OK\n템플릿 적용 완료
|
||||
deactivate Meeting
|
||||
|
||||
Gateway --> WebApp: 템플릿 적용 응답
|
||||
deactivate Gateway
|
||||
|
||||
WebApp --> User: 템플릿 적용 완료
|
||||
deactivate WebApp
|
||||
|
||||
== 참석자 초대 알림 (비동기) ==
|
||||
EventHub -> Notification: NotificationRequest 이벤트 수신\n(Consumer Group: notification-service-group)
|
||||
|
||||
|
||||
@ -32,8 +32,15 @@ note right
|
||||
end note
|
||||
|
||||
Gateway -> Meeting: 회의 종료 요청
|
||||
Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의 통계 생성\n (총 시간, 참석자 수, 발언 횟수 등)
|
||||
Meeting -> Meeting: DB 저장
|
||||
Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의록 생성 (DRAFT 상태)\n- 회의 통계 생성\n (총 시간, 참석자 수 등)
|
||||
|
||||
Meeting -> AI: AI 분석 요청\n- 키워드 추출\n- 안건별 요약 생성\n- Todo 항목 추출
|
||||
activate AI
|
||||
AI -> AI: AI 분석 수행
|
||||
AI --> Meeting: AI 분석 결과\n(keywords, agendaSummaries, todos)
|
||||
deactivate AI
|
||||
|
||||
Meeting -> Meeting: DB 저장\n- Meeting 종료 상태\n- Minutes 생성 (DRAFT)\n- AgendaSection 저장\n- Todo 저장
|
||||
Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId})
|
||||
|
||||
Meeting -> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime)
|
||||
@ -55,9 +62,9 @@ end note
|
||||
EventHub --> Meeting: 발행 완료
|
||||
deactivate EventHub
|
||||
|
||||
Meeting -> Gateway: 202 Accepted\n(회의 종료 완료)
|
||||
Gateway -> WebApp: 회의 종료 완료 응답
|
||||
WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등)
|
||||
Meeting -> Gateway: 200 OK\n- minutesId\n- 회의 통계 (참석자 수, 시간, 안건 수, Todo 수)\n- 키워드 목록\n- 안건별 AI 요약 (한줄 요약, 상세 요약)\n- Todo 목록
|
||||
Gateway -> WebApp: 회의 종료 완료 응답\n(MeetingEndResponse)
|
||||
WebApp -> User: 회의 종료 화면 표시\n- 통계 카드\n- 키워드 태그\n- 안건 아코디언 (AI 요약 + Todo)
|
||||
|
||||
== 비동기 처리 - STT 종료 ==
|
||||
EventHub --> STT: MeetingEnded 이벤트 수신
|
||||
@ -76,43 +83,62 @@ note right
|
||||
end note
|
||||
|
||||
== 최종 회의록 확정 ==
|
||||
User -> WebApp: 최종 회의록 확정 버튼 클릭
|
||||
WebApp -> Gateway: POST /api/minutes/{minutesId}/finalize
|
||||
User -> WebApp: 최종 회의록 확정 버튼 클릭\n(회의록 수정 화면 또는 회의 종료 화면)
|
||||
WebApp -> Gateway: POST /api/meetings/minutes/{minutesId}/finalize
|
||||
note right
|
||||
요청 헤더에 JWT 토큰 포함
|
||||
요청 바디에 사용자 정보 포함
|
||||
X-User-Id, X-User-Name, X-User-Email
|
||||
end note
|
||||
|
||||
Gateway -> Meeting: 회의록 확정 요청
|
||||
Meeting -> Meeting: 필수 항목 검사\n- 회의 제목\n- 참석자 목록\n- 주요 논의 내용\n- 결정 사항
|
||||
Meeting -> Meeting: 회의록 상태 변경\n- DRAFT → FINALIZED\n- finalizedAt 기록\n- finalizedBy 기록
|
||||
|
||||
alt 필수 항목 미작성
|
||||
Meeting -> Gateway: 400 Bad Request\n(누락된 항목 정보)
|
||||
Gateway -> WebApp: 검증 실패 응답
|
||||
WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동)
|
||||
else 필수 항목 작성 완료
|
||||
Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록
|
||||
Meeting -> Meeting: DB 저장 (MinutesVersion)
|
||||
Meeting -> Meeting: Redis 캐시 무효화
|
||||
Meeting -> Meeting: DB 저장\n- Minutes 상태 업데이트
|
||||
Meeting -> Meeting: Redis 캐시 저장\n(확정된 회의록, TTL: 10분)
|
||||
Meeting -> Meeting: Redis 목록 캐시 무효화\n(사용자별 회의록 목록)
|
||||
|
||||
Meeting -> EventHub: NotificationRequest 이벤트 발행\n(회의록 확정 알림)
|
||||
activate EventHub
|
||||
note right
|
||||
이벤트 데이터:
|
||||
- 발송수단: EMAIL
|
||||
- 대상자: 참석자 전원
|
||||
- 메시지: 회의록 확정 안내
|
||||
- 메타데이터: 버전 번호, 확정 시간
|
||||
end note
|
||||
EventHub --> Meeting: 발행 완료
|
||||
deactivate EventHub
|
||||
Meeting -> EventHub: MinutesFinalizedEvent 발행\n(알림용 - 기존)
|
||||
activate EventHub
|
||||
note right
|
||||
간단한 이벤트 데이터:
|
||||
- minutesId
|
||||
- title
|
||||
- userId
|
||||
- userName
|
||||
end note
|
||||
EventHub --> Meeting: 발행 완료
|
||||
deactivate EventHub
|
||||
|
||||
Meeting -> Gateway: 200 OK\n(확정 버전 정보)
|
||||
Gateway -> WebApp: 회의록 확정 완료
|
||||
WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간)
|
||||
Meeting -> EventHub: MinutesFinalizedEvent 발행\n(RAG용 - 완전한 데이터)
|
||||
activate EventHub
|
||||
note right
|
||||
완전한 이벤트 데이터:
|
||||
- Meeting 정보 (meetingId, title, purpose, scheduledAt 등)
|
||||
- Minutes 정보 (minutesId, status, version 등)
|
||||
- Sections 정보 (모든 안건 섹션)
|
||||
- 참석자 정보
|
||||
end note
|
||||
EventHub --> Meeting: 발행 완료
|
||||
deactivate EventHub
|
||||
|
||||
EventHub --> Notification: NotificationRequest 이벤트 수신
|
||||
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원)
|
||||
end
|
||||
Meeting -> Gateway: 200 OK\n(확정된 회의록 상세 정보)
|
||||
Gateway -> WebApp: 회의록 확정 완료
|
||||
WebApp -> User: 확정 완료 토스트 표시\n회의록 상세 조회 화면으로 이동
|
||||
|
||||
== 비동기 처리 - 알림 발송 ==
|
||||
EventHub --> Notification: MinutesFinalizedEvent 수신\n(알림용)
|
||||
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원)
|
||||
note right
|
||||
알림 내용:
|
||||
- 회의 제목
|
||||
- 확정 시간
|
||||
- 회의록 링크
|
||||
end note
|
||||
|
||||
== 비동기 처리 - RAG 저장 ==
|
||||
EventHub --> AI: MinutesFinalizedEvent 수신\n(RAG용)
|
||||
activate AI
|
||||
AI -> AI: RAG 서비스 연동\n- 벡터 DB 저장\n- 관련 회의록 검색 준비
|
||||
deactivate AI
|
||||
|
||||
@enduml
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user