PlantUML 문법 오류 수정 (외부 시퀀스 설계)

- 7개 외부 시퀀스 설계서 PlantUML 문법 오류 수정 완료

**주요 수정 사항**:
1. 비동기 화살표 수정
   - `->>` → `->` (동기 메시지)
   - `-->>` → `-->` (응답 메시지)

2. 캐시 호출 화살표 수정
   - `-.->` → `-->` (응답 화살표)

3. note 블록 수정
   - 단일 라인 `note right:` → 블록 형태로 변경

4. activate/deactivate 최적화
   - 비동기 이벤트 처리에서 불필요한 activate/deactivate 제거

**수정된 파일**:
- Todo완료및회의록반영.puml
- 대시보드조회.puml
- 회의록공유.puml
- 회의록상세조회및수정.puml
- 회의시작및실시간회의록작성.puml
- 회의예약및참석자초대.puml
- 회의종료및최종확정.puml

**검증 결과**:
 모든 화살표가 PlantUML 표준 문법 준수 (`->`, `-->`)
 잘못된 화살표 문법 모두 제거 (`->>`, `-->>`, `-.->`)
 activate/deactivate 쌍 정상 매칭
 PlantUML 렌더링 오류 해결

🤖 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 15:09:18 +09:00
parent a43b0c63cb
commit abb2f8c280
7 changed files with 49 additions and 51 deletions

View File

@ -25,14 +25,21 @@ Meeting -> Meeting: 관련 회의록에 완료 상태 반영\n- 회의록 섹션
Meeting -> Meeting: DB에 저장 Meeting -> Meeting: DB에 저장
== 캐시 무효화 == == 캐시 무효화 ==
Meeting -.-> Redis: DELETE meeting:info:{meetingId} Meeting --> Redis: DELETE meeting:info:{meetingId}
note right: 회의 정보 캐시 무효화 note right
Meeting -.-> Redis: DELETE todo:user:{userId} 회의 정보 캐시 무효화
note right: Todo 목록 캐시 무효화 end note
Meeting --> Redis: DELETE todo:user:{userId}
note right
Todo 목록 캐시 무효화
end note
== 이벤트 발행 == == 이벤트 발행 ==
Meeting ->> Notification: TodoCompleted 이벤트 발행\n(todoId, meetingId, completedBy,\ncompletedAt, meetingCreatorId) Meeting -> Notification: TodoCompleted 이벤트 발행\n(todoId, meetingId, completedBy,\ncompletedAt, meetingCreatorId)
note right: Azure Event Hubs를 통한\n비동기 이벤트 발행 note right
Azure Event Hubs를 통한
비동기 이벤트 발행
end note
Meeting --> Gateway: 200 OK\n{todoId, status: COMPLETED,\ncompletedAt, completedBy} Meeting --> Gateway: 200 OK\n{todoId, status: COMPLETED,\ncompletedAt, completedBy}
deactivate Meeting deactivate Meeting
@ -45,8 +52,10 @@ deactivate Web
activate Notification activate Notification
Notification -> Notification: TodoCompleted 이벤트 구독 Notification -> Notification: TodoCompleted 이벤트 구독
Notification -> Notification: 알림 메시지 생성\n- 수신자: 회의록 작성자\n- 내용: "Todo 완료됨" Notification -> Notification: 알림 메시지 생성\n- 수신자: 회의록 작성자\n- 내용: "Todo 완료됨"
Notification -.-> Notification: 이메일 발송\n(회의록 작성자에게) Notification --> Notification: 이메일 발송\n(회의록 작성자에게)
note right: 외부 Email Service 연동 note right
외부 Email Service 연동
end note
deactivate Notification deactivate Notification
@enduml @enduml

View File

@ -20,9 +20,9 @@ Gateway -> Meeting: GET /dashboard
activate Meeting activate Meeting
' 캐시 조회 ' 캐시 조회
Meeting -.-> Cache: GET dashboard:{userId} Meeting -> Cache: GET dashboard:{userId}
activate Cache activate Cache
Cache -.-> Meeting: 캐시 조회 결과 Cache --> Meeting: 캐시 조회 결과
deactivate Cache deactivate Cache
alt Cache Hit alt Cache Hit
@ -33,9 +33,9 @@ else Cache Miss
MeetingDB --> Meeting: 조회 결과 MeetingDB --> Meeting: 조회 결과
deactivate MeetingDB deactivate MeetingDB
Meeting -.-> Cache: SET dashboard:{userId}\n(TTL: 5분) Meeting -> Cache: SET dashboard:{userId}\n(TTL: 5분)
activate Cache activate Cache
Cache -.-> Meeting: 캐시 저장 완료 Cache --> Meeting: 캐시 저장 완료
deactivate Cache deactivate Cache
end end

View File

@ -45,7 +45,7 @@ Web --> User: 공유 링크 표시
deactivate Web deactivate Web
== 알림 발송 == == 알림 발송 ==
EventHub ->> Notification: TranscriptShared 이벤트 구독 EventHub -> Notification: TranscriptShared 이벤트 구독
activate Notification activate Notification
Notification -> Notification: 이메일 템플릿 생성\n(회의 제목, 공유 URL, 권한 정보) Notification -> Notification: 이메일 템플릿 생성\n(회의 제목, 공유 URL, 권한 정보)
Notification -> Notification: 참석자 전원에게\n이메일 발송 Notification -> Notification: 참석자 전원에게\n이메일 발송

View File

@ -24,9 +24,9 @@ Gateway -> Meeting: GET /minutes/{minutesId}
activate Meeting activate Meeting
' 캐시 조회 (회의록 기본 정보) ' 캐시 조회 (회의록 기본 정보)
Meeting -.-> Cache: GET minutes:{minutesId} Meeting --> Cache: GET minutes:{minutesId}
activate Cache activate Cache
Cache -.-> Meeting: 캐시 조회 결과 Cache --> Meeting: 캐시 조회 결과
deactivate Cache deactivate Cache
alt Cache Hit alt Cache Hit
@ -37,18 +37,18 @@ else Cache Miss
MeetingDB --> Meeting: 회의록 데이터 MeetingDB --> Meeting: 회의록 데이터
deactivate MeetingDB deactivate MeetingDB
Meeting -.-> Cache: SET minutes:{minutesId}\n(TTL: 10분) Meeting --> Cache: SET minutes:{minutesId}\n(TTL: 10분)
activate Cache activate Cache
Cache -.-> Meeting: 캐시 저장 완료 Cache --> Meeting: 캐시 저장 완료
deactivate Cache deactivate Cache
end end
' 관련 회의록 검색 (비동기, 선택적) ' 관련 회의록 검색 (비동기, 선택적)
Meeting ->> AI: POST /ai/related-minutes\n{\n "minutesId": "{minutesId}",\n "threshold": 0.7\n} Meeting -> AI: POST /ai/related-minutes\n{\n "minutesId": "{minutesId}",\n "threshold": 0.7\n}
activate AI activate AI
AI -> AI: 벡터 유사도 검색\n- 회의 주제 임베딩\n- 과거 회의록 비교\n- 유사도 70%+ 필터링 AI -> AI: 벡터 유사도 검색\n- 회의 주제 임베딩\n- 과거 회의록 비교\n- 유사도 70%+ 필터링
AI -->> Meeting: 관련 회의록 목록\n(최대 3개, 관련도순) AI --> Meeting: 관련 회의록 목록\n(최대 3개, 관련도순)
deactivate AI deactivate AI
Meeting --> Gateway: 회의록 상세 데이터 응답\n{\n "minutesId": "...",\n "title": "...",\n "meetingInfo": {...},\n "sections": [...],\n "relatedMinutes": [...],\n "participants": [...],\n "todos": [...],\n "verificationStatus": {...}\n} Meeting --> Gateway: 회의록 상세 데이터 응답\n{\n "minutesId": "...",\n "title": "...",\n "meetingInfo": {...},\n "sections": [...],\n "relatedMinutes": [...],\n "participants": [...],\n "todos": [...],\n "verificationStatus": {...}\n}
@ -107,15 +107,15 @@ else 권한 있음
deactivate MeetingDB deactivate MeetingDB
' 캐시 무효화 ' 캐시 무효화
Meeting -.-> Cache: DEL minutes:{minutesId} Meeting --> Cache: DEL minutes:{minutesId}
activate Cache activate Cache
Cache -.-> Meeting: 캐시 삭제 완료 Cache --> Meeting: 캐시 삭제 완료
deactivate Cache deactivate Cache
' 실시간 동기화 (WebSocket) ' 실시간 동기화 (WebSocket)
Meeting ->> WS: 수정 델타 전송\n{\n "minutesId": "...",\n "modifiedBy": "...",\n "delta": {...},\n "timestamp": "..."\n} Meeting -> WS: 수정 델타 전송\n{\n "minutesId": "...",\n "modifiedBy": "...",\n "delta": {...},\n "timestamp": "..."\n}
activate WS activate WS
WS ->> Frontend: 실시간 수정 반영\n(다른 참석자들에게) WS -> Frontend: 실시간 수정 반영\n(다른 참석자들에게)
deactivate WS deactivate WS
Meeting --> Gateway: 수정 완료 응답\n{\n "version": "...",\n "modifiedAt": "...",\n "status": "작성중"\n} Meeting --> Gateway: 수정 완료 응답\n{\n "version": "...",\n "modifiedAt": "...",\n "status": "작성중"\n}

View File

@ -27,7 +27,7 @@ activate Meeting
Meeting -> Meeting: 회의 세션 생성\n- 회의 상태 업데이트 (시작중)\n- 시작 시간 기록\n- 회의 통계 초기화 Meeting -> Meeting: 회의 세션 생성\n- 회의 상태 업데이트 (시작중)\n- 시작 시간 기록\n- 회의 통계 초기화
' MeetingStarted 이벤트 발행 ' MeetingStarted 이벤트 발행
Meeting ->> EventHub: MeetingStarted 이벤트 발행\n{\n "meetingId": "...",\n "title": "...",\n "startTime": "...",\n "participants": [...]\n} Meeting -> EventHub: MeetingStarted 이벤트 발행\n{\n "meetingId": "...",\n "title": "...",\n "startTime": "...",\n "participants": [...]\n}
activate EventHub activate EventHub
Meeting --> Gateway: 201 Created\n{\n "meetingId": "...",\n "sessionId": "...",\n "status": "IN_PROGRESS"\n} Meeting --> Gateway: 201 Created\n{\n "meetingId": "...",\n "sessionId": "...",\n "status": "IN_PROGRESS"\n}
@ -43,7 +43,7 @@ deactivate Frontend
== 음성 녹음 시작 == == 음성 녹음 시작 ==
EventHub ->> STT: MeetingStarted 이벤트 구독 EventHub -> STT: MeetingStarted 이벤트 구독
activate STT activate STT
STT -> STT: 음성 녹음 준비\n- 녹음 세션 생성\n- 오디오 스트림 초기화\n- Azure Speech 연동 준비 STT -> STT: 음성 녹음 준비\n- 녹음 세션 생성\n- 오디오 스트림 초기화\n- Azure Speech 연동 준비
@ -66,7 +66,7 @@ activate STT
STT -> STT: 음성 인식 처리\n- 화자 식별\n- Azure Speech API 호출\n- 텍스트 변환\n- 타임스탬프 기록 STT -> STT: 음성 인식 처리\n- 화자 식별\n- Azure Speech API 호출\n- 텍스트 변환\n- 타임스탬프 기록
' TranscriptReady 이벤트 발행 (5초 배치) ' TranscriptReady 이벤트 발행 (5초 배치)
STT ->> EventHub: TranscriptReady 이벤트 발행\n{\n "meetingId": "...",\n "segments": [\n {\n "speaker": "홍길동",\n "text": "...",\n "timestamp": "...",\n "confidence": 0.95\n }\n ]\n} STT -> EventHub: TranscriptReady 이벤트 발행\n{\n "meetingId": "...",\n "segments": [\n {\n "speaker": "홍길동",\n "text": "...",\n "timestamp": "...",\n "confidence": 0.95\n }\n ]\n}
activate EventHub activate EventHub
STT --> Frontend: 음성 처리 중 표시 STT --> Frontend: 음성 처리 중 표시
@ -75,7 +75,7 @@ deactivate Frontend
== AI 병렬 처리 == == AI 병렬 처리 ==
EventHub ->> AI: TranscriptReady 이벤트 구독 EventHub -> AI: TranscriptReady 이벤트 구독
activate AI activate AI
par AI 병렬 처리 par AI 병렬 처리
@ -90,7 +90,7 @@ end
AI -> AI: AI 분석 결과 저장\n- TranscriptSummary 생성\n- TermExplanation 저장\n- 관련 문서 링크 저장 AI -> AI: AI 분석 결과 저장\n- TranscriptSummary 생성\n- TermExplanation 저장\n- 관련 문서 링크 저장
' TranscriptSummaryCreated 이벤트 발행 ' TranscriptSummaryCreated 이벤트 발행
AI ->> EventHub: TranscriptSummaryCreated 이벤트 발행\n{\n "meetingId": "...",\n "summary": "...",\n "terms": [...],\n "relatedDocs": [...],\n "timestamp": "..."\n} AI -> EventHub: TranscriptSummaryCreated 이벤트 발행\n{\n "meetingId": "...",\n "summary": "...",\n "terms": [...],\n "relatedDocs": [...],\n "timestamp": "..."\n}
AI --> EventHub: AI 분석 완료 AI --> EventHub: AI 분석 완료
deactivate AI deactivate AI
@ -98,7 +98,7 @@ deactivate EventHub
== 회의록 저장 및 실시간 동기화 == == 회의록 저장 및 실시간 동기화 ==
EventHub ->> Meeting: TranscriptSummaryCreated 이벤트 구독 EventHub -> Meeting: TranscriptSummaryCreated 이벤트 구독
activate EventHub activate EventHub
activate Meeting activate Meeting
@ -106,13 +106,13 @@ activate Meeting
Meeting -> Meeting: 회의록 데이터 저장\n- Transcript 엔티티 업데이트\n- 버전 증가\n- 수정 이력 기록 Meeting -> Meeting: 회의록 데이터 저장\n- Transcript 엔티티 업데이트\n- 버전 증가\n- 수정 이력 기록
' 캐시 무효화 ' 캐시 무효화
Meeting -->> Cache: DEL meeting:info:{meetingId} Meeting --> Cache: DEL meeting:info:{meetingId}
activate Cache activate Cache
Cache -->> Meeting: 캐시 삭제 완료 Cache --> Meeting: 캐시 삭제 완료
deactivate Cache deactivate Cache
' 실시간 동기화 (WebSocket) ' 실시간 동기화 (WebSocket)
Meeting ->> Frontend: WebSocket 메시지 전송\n{\n "type": "TRANSCRIPT_UPDATE",\n "summary": "...",\n "terms": [...],\n "relatedDocs": [...],\n "delta": { "changes": [...] }\n} Meeting -> Frontend: WebSocket 메시지 전송\n{\n "type": "TRANSCRIPT_UPDATE",\n "summary": "...",\n "terms": [...],\n "relatedDocs": [...],\n "delta": { "changes": [...] }\n}
activate Frontend activate Frontend
Meeting --> EventHub: 동기화 완료 Meeting --> EventHub: 동기화 완료

View File

@ -54,19 +54,12 @@ deactivate WebApp
== 참석자 초대 알림 (비동기) == == 참석자 초대 알림 (비동기) ==
EventHub -> Notification: MeetingCreated 이벤트 수신\n(Consumer Group: notification-service-group) EventHub -> Notification: MeetingCreated 이벤트 수신\n(Consumer Group: notification-service-group)
activate Notification
Notification -> Email: 참석자 전원에게 초대 이메일 발송\n(회의 제목, 일시, 장소, 참여 링크) Notification -> Email: 참석자 전원에게 초대 이메일 발송\n(회의 제목, 일시, 장소, 참여 링크)
activate Email
Email --> Notification: 발송 완료 Email --> Notification: 발송 완료
deactivate Email
Notification -> MeetingDB: 알림 발송 기록 저장 Notification -> MeetingDB: 알림 발송 기록 저장
activate MeetingDB
MeetingDB --> Notification: 저장 완료 MeetingDB --> Notification: 저장 완료
deactivate MeetingDB
deactivate Notification
== 회의 시작 30분 전 리마인더 (스케줄링) == == 회의 시작 30분 전 리마인더 (스케줄링) ==
note over Notification note over Notification
@ -75,10 +68,6 @@ note over Notification
end note end note
Notification -> Email: 참석자 전원에게 리마인더 이메일 발송\n(회의 시작 30분 전) Notification -> Email: 참석자 전원에게 리마인더 이메일 발송\n(회의 시작 30분 전)
activate Notification
activate Email
Email --> Notification: 발송 완료 Email --> Notification: 발송 완료
deactivate Email
deactivate Notification
@enduml @enduml

View File

@ -26,7 +26,7 @@ Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의 통
Meeting -> Meeting: DB 저장 Meeting -> Meeting: DB 저장
Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId}) Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId})
Meeting ->> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime) Meeting -> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime)
note right note right
Partition Key: {meetingId} Partition Key: {meetingId}
Consumer Group: Consumer Group:
@ -40,12 +40,12 @@ Gateway -> WebApp: 회의 종료 완료 응답
WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등) WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등)
== 비동기 처리 - STT 종료 == == 비동기 처리 - STT 종료 ==
EventHub -->> STT: MeetingEnded 이벤트 수신 EventHub --> STT: MeetingEnded 이벤트 수신
STT -> STT: 음성 녹음 중지 STT -> STT: 음성 녹음 중지
STT -> STT: 최종 STT 변환 완료 확인 STT -> STT: 최종 STT 변환 완료 확인
== 비동기 처리 - AI Todo 추출 == == 비동기 처리 - AI Todo 추출 ==
EventHub -->> AI: MeetingEnded 이벤트 수신 EventHub --> AI: MeetingEnded 이벤트 수신
AI -> AI: 최종 회의록 분석 AI -> AI: 최종 회의록 분석
AI -> AI: Todo 자동 추출\n- 액션 아이템 식별\n- 담당자 자동 식별\n- 마감일 추출 AI -> AI: Todo 자동 추출\n- 액션 아이템 식별\n- 담당자 자동 식별\n- 마감일 추출
AI -> AI: DB 저장 (AiTaskStatus) AI -> AI: DB 저장 (AiTaskStatus)
@ -65,7 +65,7 @@ Meeting -> Meeting: 회의록 섹션 링크 연결
Meeting -> Meeting: DB 저장 (Todo 테이블) Meeting -> Meeting: DB 저장 (Todo 테이블)
Meeting -> Meeting: Redis 캐시 무효화\n(todo:user:{userId}) Meeting -> Meeting: Redis 캐시 무효화\n(todo:user:{userId})
Meeting ->> EventHub: TodoCreated 이벤트 발행\n(todoId, assignee, dueDate) Meeting -> EventHub: TodoCreated 이벤트 발행\n(todoId, assignee, dueDate)
note right note right
Partition Key: {userId} Partition Key: {userId}
Consumer Group: Consumer Group:
@ -75,7 +75,7 @@ end note
Meeting -> AI: 200 OK (Todo 생성 완료) Meeting -> AI: 200 OK (Todo 생성 완료)
== 비동기 처리 - 회의 종료 알림 == == 비동기 처리 - 회의 종료 알림 ==
EventHub -->> Notification: MeetingEnded 이벤트 수신 EventHub --> Notification: MeetingEnded 이벤트 수신
Notification -> Notification: 회의 종료 알림 준비\n(참석자 전원) Notification -> Notification: 회의 종료 알림 준비\n(참석자 전원)
Notification -> Notification: 이메일 발송 Notification -> Notification: 이메일 발송
note right note right
@ -87,7 +87,7 @@ note right
end note end note
== 비동기 처리 - Todo 할당 알림 == == 비동기 처리 - Todo 할당 알림 ==
EventHub -->> Notification: TodoCreated 이벤트 수신 EventHub --> Notification: TodoCreated 이벤트 수신
Notification -> Notification: Todo 할당 알림 준비 Notification -> Notification: Todo 할당 알림 준비
Notification -> Notification: 담당자에게 이메일 발송 Notification -> Notification: 담당자에게 이메일 발송
note right note right
@ -118,7 +118,7 @@ else 필수 항목 작성 완료
Meeting -> Meeting: DB 저장 (TranscriptVersion) Meeting -> Meeting: DB 저장 (TranscriptVersion)
Meeting -> Meeting: Redis 캐시 무효화 Meeting -> Meeting: Redis 캐시 무효화
Meeting ->> EventHub: TranscriptFinalized 이벤트 발행\n(meetingId, version, finalizedAt) Meeting -> EventHub: TranscriptFinalized 이벤트 발행\n(meetingId, version, finalizedAt)
note right note right
Partition Key: {meetingId} Partition Key: {meetingId}
Consumer Group: Consumer Group:
@ -129,7 +129,7 @@ else 필수 항목 작성 완료
Gateway -> WebApp: 회의록 확정 완료 Gateway -> WebApp: 회의록 확정 완료
WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간) WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간)
EventHub -->> Notification: TranscriptFinalized 이벤트 수신 EventHub --> Notification: TranscriptFinalized 이벤트 수신
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원) Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원)
end end