From abb2f8c2801b8d600738f51b1fa0f54997b3e4f6 Mon Sep 17 00:00:00 2001 From: kimjh Date: Wed, 22 Oct 2025 15:09:18 +0900 Subject: [PATCH] =?UTF-8?q?PlantUML=20=EB=AC=B8=EB=B2=95=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95=20(=EC=99=B8=EB=B6=80=20?= =?UTF-8?q?=EC=8B=9C=ED=80=80=EC=8A=A4=20=EC=84=A4=EA=B3=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .../sequence/outer/Todo완료및회의록반영.puml | 25 +++++++++++++------ .../backend/sequence/outer/대시보드조회.puml | 8 +++--- design/backend/sequence/outer/회의록공유.puml | 2 +- .../sequence/outer/회의록상세조회및수정.puml | 20 +++++++-------- .../outer/회의시작및실시간회의록작성.puml | 18 ++++++------- .../sequence/outer/회의예약및참석자초대.puml | 11 -------- .../sequence/outer/회의종료및최종확정.puml | 16 ++++++------ 7 files changed, 49 insertions(+), 51 deletions(-) diff --git a/design/backend/sequence/outer/Todo완료및회의록반영.puml b/design/backend/sequence/outer/Todo완료및회의록반영.puml index f5187b5..9a329cc 100644 --- a/design/backend/sequence/outer/Todo완료및회의록반영.puml +++ b/design/backend/sequence/outer/Todo완료및회의록반영.puml @@ -25,14 +25,21 @@ Meeting -> Meeting: 관련 회의록에 완료 상태 반영\n- 회의록 섹션 Meeting -> Meeting: DB에 저장 == 캐시 무효화 == -Meeting -.-> Redis: DELETE meeting:info:{meetingId} -note right: 회의 정보 캐시 무효화 -Meeting -.-> Redis: DELETE todo:user:{userId} -note right: Todo 목록 캐시 무효화 +Meeting --> Redis: DELETE meeting:info:{meetingId} +note right +회의 정보 캐시 무효화 +end note +Meeting --> Redis: DELETE todo:user:{userId} +note right +Todo 목록 캐시 무효화 +end note == 이벤트 발행 == -Meeting ->> Notification: TodoCompleted 이벤트 발행\n(todoId, meetingId, completedBy,\ncompletedAt, meetingCreatorId) -note right: Azure Event Hubs를 통한\n비동기 이벤트 발행 +Meeting -> Notification: TodoCompleted 이벤트 발행\n(todoId, meetingId, completedBy,\ncompletedAt, meetingCreatorId) +note right +Azure Event Hubs를 통한 +비동기 이벤트 발행 +end note Meeting --> Gateway: 200 OK\n{todoId, status: COMPLETED,\ncompletedAt, completedBy} deactivate Meeting @@ -45,8 +52,10 @@ deactivate Web activate Notification Notification -> Notification: TodoCompleted 이벤트 구독 Notification -> Notification: 알림 메시지 생성\n- 수신자: 회의록 작성자\n- 내용: "Todo 완료됨" -Notification -.-> Notification: 이메일 발송\n(회의록 작성자에게) -note right: 외부 Email Service 연동 +Notification --> Notification: 이메일 발송\n(회의록 작성자에게) +note right +외부 Email Service 연동 +end note deactivate Notification @enduml diff --git a/design/backend/sequence/outer/대시보드조회.puml b/design/backend/sequence/outer/대시보드조회.puml index 0041e43..2f28e9c 100644 --- a/design/backend/sequence/outer/대시보드조회.puml +++ b/design/backend/sequence/outer/대시보드조회.puml @@ -20,9 +20,9 @@ Gateway -> Meeting: GET /dashboard activate Meeting ' 캐시 조회 -Meeting -.-> Cache: GET dashboard:{userId} +Meeting -> Cache: GET dashboard:{userId} activate Cache -Cache -.-> Meeting: 캐시 조회 결과 +Cache --> Meeting: 캐시 조회 결과 deactivate Cache alt Cache Hit @@ -33,9 +33,9 @@ else Cache Miss MeetingDB --> Meeting: 조회 결과 deactivate MeetingDB - Meeting -.-> Cache: SET dashboard:{userId}\n(TTL: 5분) + Meeting -> Cache: SET dashboard:{userId}\n(TTL: 5분) activate Cache - Cache -.-> Meeting: 캐시 저장 완료 + Cache --> Meeting: 캐시 저장 완료 deactivate Cache end diff --git a/design/backend/sequence/outer/회의록공유.puml b/design/backend/sequence/outer/회의록공유.puml index 2e0ac0a..c3ae874 100644 --- a/design/backend/sequence/outer/회의록공유.puml +++ b/design/backend/sequence/outer/회의록공유.puml @@ -45,7 +45,7 @@ Web --> User: 공유 링크 표시 deactivate Web == 알림 발송 == -EventHub ->> Notification: TranscriptShared 이벤트 구독 +EventHub -> Notification: TranscriptShared 이벤트 구독 activate Notification Notification -> Notification: 이메일 템플릿 생성\n(회의 제목, 공유 URL, 권한 정보) Notification -> Notification: 참석자 전원에게\n이메일 발송 diff --git a/design/backend/sequence/outer/회의록상세조회및수정.puml b/design/backend/sequence/outer/회의록상세조회및수정.puml index f180710..aeea28e 100644 --- a/design/backend/sequence/outer/회의록상세조회및수정.puml +++ b/design/backend/sequence/outer/회의록상세조회및수정.puml @@ -24,9 +24,9 @@ Gateway -> Meeting: GET /minutes/{minutesId} activate Meeting ' 캐시 조회 (회의록 기본 정보) -Meeting -.-> Cache: GET minutes:{minutesId} +Meeting --> Cache: GET minutes:{minutesId} activate Cache -Cache -.-> Meeting: 캐시 조회 결과 +Cache --> Meeting: 캐시 조회 결과 deactivate Cache alt Cache Hit @@ -37,18 +37,18 @@ else Cache Miss MeetingDB --> Meeting: 회의록 데이터 deactivate MeetingDB - Meeting -.-> Cache: SET minutes:{minutesId}\n(TTL: 10분) + Meeting --> Cache: SET minutes:{minutesId}\n(TTL: 10분) activate Cache - Cache -.-> Meeting: 캐시 저장 완료 + Cache --> Meeting: 캐시 저장 완료 deactivate Cache 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 AI -> AI: 벡터 유사도 검색\n- 회의 주제 임베딩\n- 과거 회의록 비교\n- 유사도 70%+ 필터링 -AI -->> Meeting: 관련 회의록 목록\n(최대 3개, 관련도순) +AI --> Meeting: 관련 회의록 목록\n(최대 3개, 관련도순) deactivate AI 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 ' 캐시 무효화 - Meeting -.-> Cache: DEL minutes:{minutesId} + Meeting --> Cache: DEL minutes:{minutesId} activate Cache - Cache -.-> Meeting: 캐시 삭제 완료 + Cache --> Meeting: 캐시 삭제 완료 deactivate Cache ' 실시간 동기화 (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 - WS ->> Frontend: 실시간 수정 반영\n(다른 참석자들에게) + WS -> Frontend: 실시간 수정 반영\n(다른 참석자들에게) deactivate WS Meeting --> Gateway: 수정 완료 응답\n{\n "version": "...",\n "modifiedAt": "...",\n "status": "작성중"\n} diff --git a/design/backend/sequence/outer/회의시작및실시간회의록작성.puml b/design/backend/sequence/outer/회의시작및실시간회의록작성.puml index cd2acd8..81f0ffa 100644 --- a/design/backend/sequence/outer/회의시작및실시간회의록작성.puml +++ b/design/backend/sequence/outer/회의시작및실시간회의록작성.puml @@ -27,7 +27,7 @@ activate Meeting Meeting -> Meeting: 회의 세션 생성\n- 회의 상태 업데이트 (시작중)\n- 시작 시간 기록\n- 회의 통계 초기화 ' 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 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 STT -> STT: 음성 녹음 준비\n- 녹음 세션 생성\n- 오디오 스트림 초기화\n- Azure Speech 연동 준비 @@ -66,7 +66,7 @@ activate STT STT -> STT: 음성 인식 처리\n- 화자 식별\n- Azure Speech API 호출\n- 텍스트 변환\n- 타임스탬프 기록 ' 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 STT --> Frontend: 음성 처리 중 표시 @@ -75,7 +75,7 @@ deactivate Frontend == AI 병렬 처리 == -EventHub ->> AI: TranscriptReady 이벤트 구독 +EventHub -> AI: TranscriptReady 이벤트 구독 activate AI par AI 병렬 처리 @@ -90,7 +90,7 @@ end AI -> AI: AI 분석 결과 저장\n- TranscriptSummary 생성\n- TermExplanation 저장\n- 관련 문서 링크 저장 ' 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 분석 완료 deactivate AI @@ -98,7 +98,7 @@ deactivate EventHub == 회의록 저장 및 실시간 동기화 == -EventHub ->> Meeting: TranscriptSummaryCreated 이벤트 구독 +EventHub -> Meeting: TranscriptSummaryCreated 이벤트 구독 activate EventHub activate Meeting @@ -106,13 +106,13 @@ activate Meeting Meeting -> Meeting: 회의록 데이터 저장\n- Transcript 엔티티 업데이트\n- 버전 증가\n- 수정 이력 기록 ' 캐시 무효화 -Meeting -->> Cache: DEL meeting:info:{meetingId} +Meeting --> Cache: DEL meeting:info:{meetingId} activate Cache -Cache -->> Meeting: 캐시 삭제 완료 +Cache --> Meeting: 캐시 삭제 완료 deactivate Cache ' 실시간 동기화 (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 Meeting --> EventHub: 동기화 완료 diff --git a/design/backend/sequence/outer/회의예약및참석자초대.puml b/design/backend/sequence/outer/회의예약및참석자초대.puml index 7d700e0..4a1a463 100644 --- a/design/backend/sequence/outer/회의예약및참석자초대.puml +++ b/design/backend/sequence/outer/회의예약및참석자초대.puml @@ -54,19 +54,12 @@ deactivate WebApp == 참석자 초대 알림 (비동기) == EventHub -> Notification: MeetingCreated 이벤트 수신\n(Consumer Group: notification-service-group) -activate Notification Notification -> Email: 참석자 전원에게 초대 이메일 발송\n(회의 제목, 일시, 장소, 참여 링크) -activate Email Email --> Notification: 발송 완료 -deactivate Email Notification -> MeetingDB: 알림 발송 기록 저장 -activate MeetingDB MeetingDB --> Notification: 저장 완료 -deactivate MeetingDB - -deactivate Notification == 회의 시작 30분 전 리마인더 (스케줄링) == note over Notification @@ -75,10 +68,6 @@ note over Notification end note Notification -> Email: 참석자 전원에게 리마인더 이메일 발송\n(회의 시작 30분 전) -activate Notification -activate Email Email --> Notification: 발송 완료 -deactivate Email -deactivate Notification @enduml diff --git a/design/backend/sequence/outer/회의종료및최종확정.puml b/design/backend/sequence/outer/회의종료및최종확정.puml index 318fbe8..01d5e1c 100644 --- a/design/backend/sequence/outer/회의종료및최종확정.puml +++ b/design/backend/sequence/outer/회의종료및최종확정.puml @@ -26,7 +26,7 @@ Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의 통 Meeting -> Meeting: DB 저장 Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId}) -Meeting ->> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime) +Meeting -> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime) note right Partition Key: {meetingId} Consumer Group: @@ -40,12 +40,12 @@ Gateway -> WebApp: 회의 종료 완료 응답 WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등) == 비동기 처리 - STT 종료 == -EventHub -->> STT: MeetingEnded 이벤트 수신 +EventHub --> STT: MeetingEnded 이벤트 수신 STT -> STT: 음성 녹음 중지 STT -> STT: 최종 STT 변환 완료 확인 == 비동기 처리 - AI Todo 추출 == -EventHub -->> AI: MeetingEnded 이벤트 수신 +EventHub --> AI: MeetingEnded 이벤트 수신 AI -> AI: 최종 회의록 분석 AI -> AI: Todo 자동 추출\n- 액션 아이템 식별\n- 담당자 자동 식별\n- 마감일 추출 AI -> AI: DB 저장 (AiTaskStatus) @@ -65,7 +65,7 @@ Meeting -> Meeting: 회의록 섹션 링크 연결 Meeting -> Meeting: DB 저장 (Todo 테이블) Meeting -> Meeting: Redis 캐시 무효화\n(todo:user:{userId}) -Meeting ->> EventHub: TodoCreated 이벤트 발행\n(todoId, assignee, dueDate) +Meeting -> EventHub: TodoCreated 이벤트 발행\n(todoId, assignee, dueDate) note right Partition Key: {userId} Consumer Group: @@ -75,7 +75,7 @@ end note Meeting -> AI: 200 OK (Todo 생성 완료) == 비동기 처리 - 회의 종료 알림 == -EventHub -->> Notification: MeetingEnded 이벤트 수신 +EventHub --> Notification: MeetingEnded 이벤트 수신 Notification -> Notification: 회의 종료 알림 준비\n(참석자 전원) Notification -> Notification: 이메일 발송 note right @@ -87,7 +87,7 @@ note right end note == 비동기 처리 - Todo 할당 알림 == -EventHub -->> Notification: TodoCreated 이벤트 수신 +EventHub --> Notification: TodoCreated 이벤트 수신 Notification -> Notification: Todo 할당 알림 준비 Notification -> Notification: 담당자에게 이메일 발송 note right @@ -118,7 +118,7 @@ else 필수 항목 작성 완료 Meeting -> Meeting: DB 저장 (TranscriptVersion) Meeting -> Meeting: Redis 캐시 무효화 - Meeting ->> EventHub: TranscriptFinalized 이벤트 발행\n(meetingId, version, finalizedAt) + Meeting -> EventHub: TranscriptFinalized 이벤트 발행\n(meetingId, version, finalizedAt) note right Partition Key: {meetingId} Consumer Group: @@ -129,7 +129,7 @@ else 필수 항목 작성 완료 Gateway -> WebApp: 회의록 확정 완료 WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간) - EventHub -->> Notification: TranscriptFinalized 이벤트 수신 + EventHub --> Notification: TranscriptFinalized 이벤트 수신 Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원) end