diff --git a/claude/sample-external-sequence.puml b/claude/sample-external-sequence.puml
new file mode 100644
index 0000000..08614b3
--- /dev/null
+++ b/claude/sample-external-sequence.puml
@@ -0,0 +1,126 @@
+@startuml 로그인플로우
+!theme mono
+
+title 로그인 플로우 - 외부 시퀀스 다이어그램
+
+actor "Mobile Client" as Client
+participant "API Gateway" as Gateway
+participant "User Service" as UserService
+database "Redis Cache" as Redis
+
+== 로그인 화면 접근 ==
+Client -> Gateway: GET /login-page
+activate Gateway
+Gateway -> Client: 200 OK (로그인 화면)
+deactivate Gateway
+
+== 로그인 처리 ==
+Client -> Gateway: POST /api/v1/users/auth/login\n{userId, password}
+activate Gateway
+
+Gateway -> UserService: 로그인 요청 전달
+activate UserService
+
+UserService -> UserService: 사용자 인증 처리\n(비밀번호 검증)
+
+alt 인증 성공
+ UserService -> UserService: JWT 토큰 생성
+ UserService -> Redis: 세션 정보 저장\n(userId, token, TTL)
+ activate Redis
+ Redis -> UserService: 저장 완료
+ deactivate Redis
+
+ UserService -> Gateway: 200 OK\n{token, userId, profile}
+ Gateway -> Client: 로그인 성공\n{token, profile}
+
+ Client -> Client: 토큰 저장\n(localStorage)
+ Client -> Client: 대시보드로 이동
+
+else 인증 실패
+ UserService -> Gateway: 401 Unauthorized\n{error: "아이디 또는 비밀번호를 확인해주세요"}
+ Gateway -> Client: 로그인 실패 메시지
+
+ alt 5회 연속 실패
+ UserService -> Redis: 계정 잠금 정보 저장\n(userId, lockTime: 30분)
+ UserService -> Gateway: 423 Locked\n{error: "30분간 계정 잠금"}
+ Gateway -> Client: 계정 잠금 안내
+ end
+end
+
+deactivate UserService
+deactivate Gateway
+
+== 로그인 상태 확인 ==
+Client -> Gateway: GET /api/v1/users/profile\n(Authorization: Bearer {token})
+activate Gateway
+
+Gateway -> Gateway: JWT 토큰 검증
+
+alt 토큰 유효
+ Gateway -> Redis: 세션 조회\n(userId)
+ activate Redis
+ Redis -> Gateway: 세션 정보 반환
+ deactivate Redis
+
+ Gateway -> UserService: 프로필 조회
+ activate UserService
+ UserService -> Gateway: 사용자 프로필 반환
+ deactivate UserService
+
+ Gateway -> Client: 200 OK\n{userId, name, email, avatar}
+ Client -> Client: 프로필 표시\n(헤더 아바타)
+else 토큰 무효
+ Gateway -> Client: 401 Unauthorized
+ Client -> Client: 로그인 화면으로 이동
+end
+
+deactivate Gateway
+
+== 로그아웃 처리 ==
+Client -> Client: 로그아웃 확인 다이얼로그 표시
+Client -> Gateway: POST /api/v1/users/auth/logout\n(Authorization: Bearer {token})
+activate Gateway
+
+Gateway -> UserService: 로그아웃 요청
+activate UserService
+
+UserService -> Redis: 세션 삭제\n(userId)
+activate Redis
+Redis -> UserService: 삭제 완료
+deactivate Redis
+
+UserService -> Gateway: 200 OK\n{message: "안전하게 로그아웃되었습니다"}
+deactivate UserService
+
+Gateway -> Client: 로그아웃 완료
+deactivate Gateway
+
+Client -> Client: 토큰 삭제\n(localStorage)
+Client -> Client: 로그인 화면으로 이동
+
+note right of Client
+대시보드(01) 화면의 헤더에서
+프로필 아바타를 클릭하면
+드롭다운 메뉴가 표시됨:
+- 내 정보 보기
+- 프로필 편집
+- 로그아웃
+end note
+
+note right of UserService
+로그인 시 검증 사항:
+- 아이디/비밀번호 확인
+- 계정 잠금 상태 확인
+- 연속 실패 횟수 체크
+- JWT 토큰 생성 및 발급
+end note
+
+note right of Redis
+캐시 저장 정보:
+- 세션 정보 (토큰, 사용자ID)
+- 로그인 실패 횟수
+- 계정 잠금 상태
+- TTL 기반 자동 만료
+end note
+
+@enduml
\ No newline at end of file
diff --git a/design/backend/sequence/outer/01-사용자인증및대시보드조회.puml b/design/backend/sequence/outer/01-사용자인증및대시보드조회.puml
deleted file mode 100644
index ec0102a..0000000
--- a/design/backend/sequence/outer/01-사용자인증및대시보드조회.puml
+++ /dev/null
@@ -1,164 +0,0 @@
-@startuml 01-사용자인증및대시보드조회
-!theme mono
-
-title 사용자 인증 및 대시보드 조회 (User Authentication and Dashboard)
-
-actor "사용자" as User
-participant "Web App" as WebApp
-participant "API Gateway" as Gateway
-participant "User Service" as UserService
-participant "Meeting Service" as MeetingService
-participant "Todo Service" as TodoService
-participant "Redis\n(Cache)" as Redis
-database "User DB\n(PostgreSQL)" as UserDB
-database "Meeting DB\n(PostgreSQL)" as MeetingDB
-database "Todo DB\n(PostgreSQL)" as TodoDB
-
-== 1. 사용자 인증 (User Authentication) ==
-
-User -> WebApp: 1.1. 로그인 시도\n(사번, 비밀번호 입력)
-activate WebApp
-
-WebApp -> Gateway: 1.2. POST /api/auth/login\n{employeeId, password}
-activate Gateway
-
-Gateway -> UserService: 1.3. 인증 요청\nPOST /auth/login
-activate UserService
-
-UserService -> UserService: 1.4. LDAP 연동 인증\n(사번, 비밀번호 검증)
-note right
- LDAP 서버와 통신하여
- 사용자 인증 처리
-end note
-
-alt 인증 성공
- UserService -> UserDB: 1.5. 사용자 정보 조회\nSELECT * FROM users WHERE employee_id = ?
- activate UserDB
- UserDB --> UserService: 사용자 정보 반환
- deactivate UserDB
-
- UserService -> UserService: 1.6. JWT 토큰 생성\n(userId, 권한 정보 포함)
-
- UserService -> Redis: 1.7. 사용자 프로필 캐싱\nSET user:profile:{userId}\n(TTL: 30분)
- activate Redis
- Redis --> UserService: 캐싱 완료
- deactivate Redis
-
- UserService --> Gateway: 1.8. 인증 성공 응답\n{token, userId, userName}
- deactivate UserService
-
- Gateway --> WebApp: 1.9. 로그인 성공\n{token, userId, userName}
- deactivate Gateway
-
- WebApp -> WebApp: 1.10. JWT 토큰 저장\n(LocalStorage)
-
- WebApp --> User: 1.11. 로그인 성공 메시지
-
-else 인증 실패
- UserService --> Gateway: 인증 실패 (401 Unauthorized)
- Gateway --> WebApp: 인증 실패
- WebApp --> User: 로그인 실패 메시지
-end
-
-== 2. 대시보드 데이터 조회 (Dashboard Data Loading) ==
-
-WebApp -> Gateway: 2.1. GET /api/dashboard\n(Authorization: Bearer {token})
-activate Gateway
-
-Gateway -> Gateway: 2.2. JWT 토큰 검증
-note right
- 토큰 유효성 검증
- 사용자 권한 확인
-end note
-
-Gateway -> MeetingService: 2.3. 예정된 회의 조회\nGET /meetings/upcoming?userId={userId}
-activate MeetingService
-
-MeetingService -> Redis: 2.4. 캐시 확인\nGET meeting:upcoming:{userId}
-activate Redis
-Redis --> MeetingService: Cache Miss (캐시 없음)
-deactivate Redis
-
-MeetingService -> MeetingDB: 2.5. 예정된 회의 조회\nSELECT * FROM meetings\nWHERE user_id = ? AND status = 'SCHEDULED'\nORDER BY meeting_date LIMIT 5
-activate MeetingDB
-MeetingDB --> MeetingService: 예정된 회의 목록 (최대 5개)
-deactivate MeetingDB
-
-MeetingService -> Redis: 2.6. 조회 결과 캐싱\nSET meeting:upcoming:{userId}\n(TTL: 10분)
-activate Redis
-Redis --> MeetingService: 캐싱 완료
-deactivate Redis
-
-MeetingService --> Gateway: 2.7. 예정된 회의 목록 반환
-deactivate MeetingService
-
-|||
-
-Gateway -> TodoService: 2.8. 진행 중 Todo 조회\nGET /todos/in-progress?userId={userId}
-activate TodoService
-
-TodoService -> Redis: 2.9. 캐시 확인\nGET todo:user:{userId}
-activate Redis
-Redis --> TodoService: Cache Hit (캐시 존재)
-note right
- Cache-Aside 패턴:
- 캐시에서 직접 반환하여
- DB 부하 감소
-end note
-deactivate Redis
-
-TodoService --> Gateway: 2.10. 진행 중 Todo 목록 반환\n(캐시에서 조회)
-deactivate TodoService
-
-|||
-
-Gateway -> MeetingService: 2.11. 최근 회의록 조회\nGET /transcripts/recent?userId={userId}
-activate MeetingService
-
-MeetingService -> Redis: 2.12. 캐시 확인\nGET transcript:recent:{userId}
-activate Redis
-Redis --> MeetingService: Cache Miss
-deactivate Redis
-
-MeetingService -> MeetingDB: 2.13. 최근 회의록 조회\nSELECT * FROM transcripts\nWHERE user_id = ? OR shared_with LIKE '%{userId}%'\nORDER BY created_at DESC LIMIT 6
-activate MeetingDB
-MeetingDB --> MeetingService: 최근 회의록 목록\n(내 회의록 3개 + 공유받은 회의록 3개)
-deactivate MeetingDB
-
-MeetingService -> Redis: 2.14. 조회 결과 캐싱\nSET transcript:recent:{userId}\n(TTL: 10분)
-activate Redis
-Redis --> MeetingService: 캐싱 완료
-deactivate Redis
-
-MeetingService --> Gateway: 2.15. 최근 회의록 목록 반환
-deactivate MeetingService
-
-|||
-
-Gateway -> TodoService: 2.16. Todo 통계 조회\nGET /todos/stats?userId={userId}
-activate TodoService
-
-TodoService -> Redis: 2.17. 캐시 확인\nGET todo:stats:{userId}
-activate Redis
-Redis --> TodoService: Cache Hit
-deactivate Redis
-
-TodoService --> Gateway: 2.18. Todo 통계 반환\n{total, inProgress, completionRate}
-deactivate TodoService
-
-|||
-
-Gateway --> WebApp: 2.19. 대시보드 데이터 통합 응답\n{\n upcomingMeetings: [...],\n inProgressTodos: [...],\n recentTranscripts: [...],\n todoStats: {...}\n}
-deactivate Gateway
-
-WebApp -> WebApp: 2.20. 대시보드 UI 렌더링\n- 통계 카드 표시\n- 예정된 회의 목록\n- 진행 중 Todo 목록\n- 최근 회의록 목록
-note right
- 반응형 레이아웃:
- - 데스크톱: 좌측 사이드바
- - 모바일: 하단 탭 바
-end note
-
-WebApp --> User: 2.21. 대시보드 화면 표시\n(맞춤형 정보 제공)
-deactivate WebApp
-
-@enduml
diff --git a/design/backend/sequence/outer/02-회의예약및초대.puml b/design/backend/sequence/outer/02-회의예약및초대.puml
deleted file mode 100644
index 5a866f0..0000000
--- a/design/backend/sequence/outer/02-회의예약및초대.puml
+++ /dev/null
@@ -1,186 +0,0 @@
-@startuml 02-회의예약및초대
-!theme mono
-
-title 회의 예약 및 초대 (Meeting Reservation and Invitation)
-
-actor "사용자\n(회의록 작성자)" as User
-participant "Web App" as WebApp
-participant "API Gateway" as Gateway
-participant "Meeting Service" as MeetingService
-participant "User Service" as UserService
-participant "Notification Service" as NotificationService
-participant "RabbitMQ\n(Message Broker)" as RabbitMQ
-participant "Redis\n(Cache)" as Redis
-database "Meeting DB\n(PostgreSQL)" as MeetingDB
-database "User DB\n(PostgreSQL)" as UserDB
-database "Notification DB\n(PostgreSQL)" as NotificationDB
-
-== 1. 회의 예약 (Meeting Reservation) ==
-
-User -> WebApp: 1.1. 회의 예약 화면 접근\n(플로팅 액션 버튼 → 📅 회의 예약)
-activate WebApp
-
-WebApp --> User: 1.2. 회의 예약 폼 표시\n(제목, 날짜/시간, 장소, 참석자)
-note right
- 입력 필드:
- - 회의 제목 (최대 100자, 필수)
- - 날짜/시간 (필수)
- - 장소 (최대 200자, 선택)
- - 참석자 목록 (이메일, 최소 1명 필수)
-end note
-
-User -> WebApp: 1.3. 회의 정보 입력 완료\n- 제목: "프로젝트 킥오프 회의"\n- 날짜: 2025-02-01 14:00\n- 장소: "회의실 A"\n- 참석자: ["user1@company.com", "user2@company.com"]
-
-WebApp -> WebApp: 1.4. 입력 유효성 검증\n- 필수 필드 확인\n- 날짜/시간 형식 검증\n- 이메일 형식 검증
-
-WebApp -> Gateway: 1.5. POST /api/meetings\n{\n title: "프로젝트 킥오프 회의",\n dateTime: "2025-02-01T14:00:00",\n location: "회의실 A",\n participants: ["user1@company.com", "user2@company.com"]\n}\n(Authorization: Bearer {token})
-activate Gateway
-
-Gateway -> Gateway: 1.6. JWT 토큰 검증\n- 사용자 인증 확인\n- 회의 생성 권한 확인
-
-Gateway -> MeetingService: 1.7. 회의 생성 요청\nPOST /meetings
-activate MeetingService
-
-MeetingService -> MeetingService: 1.8. 회의 데이터 생성\n- 회의 ID 생성 (UUID)\n- 생성 시간 기록\n- 상태: SCHEDULED
-
-MeetingService -> MeetingDB: 1.9. 회의 정보 저장\nINSERT INTO meetings\n(id, title, date_time, location, creator_id, status, created_at)\nVALUES (?, ?, ?, ?, ?, 'SCHEDULED', NOW())
-activate MeetingDB
-MeetingDB --> MeetingService: 회의 생성 완료
-deactivate MeetingDB
-
-MeetingService -> MeetingDB: 1.10. 참석자 정보 저장\nINSERT INTO meeting_participants\n(meeting_id, user_email, role)\nVALUES (?, ?, 'PARTICIPANT')
-activate MeetingDB
-MeetingDB --> MeetingService: 참석자 저장 완료
-deactivate MeetingDB
-
-MeetingService -> Redis: 1.11. 회의 정보 캐싱\nSET meeting:info:{meetingId}\n{\n title, dateTime, location,\n participants, status\n}\n(TTL: 10분)
-activate Redis
-Redis --> MeetingService: 캐싱 완료
-note right
- Cache-Aside 패턴:
- 생성 즉시 캐싱하여
- 후속 조회 성능 향상
-end note
-deactivate Redis
-
-== 2. 이벤트 발행 (Event Publishing) ==
-
-MeetingService -> RabbitMQ: 1.12. MeetingCreated 이벤트 발행\n- Exchange: meeting.events\n- Routing Key: meeting.created\n- Payload: {\n meetingId,\n title,\n dateTime,\n location,\n creatorId,\n participants: [user1@company.com, user2@company.com]\n }
-activate RabbitMQ
-note right
- Publisher-Subscriber 패턴:
- 이벤트 기반 느슨한 결합
-end note
-
-RabbitMQ --> MeetingService: 1.13. 이벤트 발행 성공
-deactivate RabbitMQ
-
-MeetingService --> Gateway: 1.14. 회의 생성 응답\n{\n meetingId,\n title,\n dateTime,\n location,\n status: "SCHEDULED",\n createdAt\n}
-deactivate MeetingService
-
-Gateway --> WebApp: 1.15. 회의 예약 성공 응답
-deactivate Gateway
-
-WebApp --> User: 1.16. 예약 완료 메시지 표시\n"회의가 성공적으로 예약되었습니다."
-deactivate WebApp
-
-== 3. 초대 알림 발송 (Invitation Notification) ==
-
-RabbitMQ -> NotificationService: 2.1. MeetingCreated 이벤트 수신\n- Queue: notification.meeting.queue
-activate NotificationService
-activate RabbitMQ
-
-NotificationService -> NotificationService: 2.2. 이벤트 처리\n- 참석자 목록 추출\n- 알림 템플릿 로딩
-
-NotificationService -> UserService: 2.3. 참석자 정보 조회\nGET /users/by-emails?emails=user1@company.com,user2@company.com
-activate UserService
-
-UserService -> Redis: 2.4. 캐시 확인\nMGET user:profile:user1, user:profile:user2
-activate Redis
-Redis --> UserService: Cache Hit (일부 캐시 존재)
-deactivate Redis
-
-UserService -> UserDB: 2.5. 캐시 미스 사용자 DB 조회\nSELECT * FROM users\nWHERE email IN (?, ?)
-activate UserDB
-UserDB --> UserService: 사용자 정보 반환
-deactivate UserDB
-
-UserService -> Redis: 2.6. 조회 결과 캐싱\nSET user:profile:{userId}\n(TTL: 30분)
-activate Redis
-Redis --> UserService: 캐싱 완료
-deactivate Redis
-
-UserService --> NotificationService: 2.7. 참석자 정보 반환\n[{userId, name, email}, ...]
-deactivate UserService
-
-NotificationService -> NotificationService: 2.8. 알림 메시지 생성\n- 제목: "[회의 초대] 프로젝트 킥오프 회의"\n- 내용: "홍길동님께서 회의에 초대하셨습니다.\n 일시: 2025-02-01 14:00\n 장소: 회의실 A"
-
-NotificationService -> NotificationDB: 2.9. 알림 기록 저장\nINSERT INTO notifications\n(meeting_id, recipient_email, type, content, status, created_at)\nVALUES (?, ?, 'MEETING_INVITATION', ?, 'PENDING', NOW())
-activate NotificationDB
-NotificationDB --> NotificationService: 알림 기록 저장 완료
-deactivate NotificationDB
-
-loop 각 참석자에 대해
- NotificationService -> NotificationService: 2.10. 이메일 발송\n- To: user1@company.com\n- Subject: [회의 초대] 프로젝트 킥오프 회의\n- Body: 회의 상세 정보 + 참여 링크
- note right
- Email/SMS Service 연동:
- - SMTP 또는 SendGrid 사용
- - 발송 실패 시 재시도 (최대 3회)
- end note
-
- NotificationService -> NotificationDB: 2.11. 알림 상태 업데이트\nUPDATE notifications\nSET status = 'SENT', sent_at = NOW()\nWHERE id = ?
- activate NotificationDB
- NotificationDB --> NotificationService: 업데이트 완료
- deactivate NotificationDB
-end
-
-NotificationService --> RabbitMQ: 2.12. 이벤트 처리 완료 (ACK)
-deactivate RabbitMQ
-
-NotificationService -> NotificationService: 2.13. 리마인더 일정 생성\n- 회의 시작 30분 전 알림\n- 일정: 2025-02-01 13:30
-note right
- Queue-Based Load Leveling:
- 리마인더는 별도 큐로 관리
- (reminder.queue)
-end note
-
-deactivate NotificationService
-
-== 4. 결과 확인 (Result Confirmation) ==
-
-User -> WebApp: 3.1. 대시보드 화면 새로고침
-activate WebApp
-
-WebApp -> Gateway: 3.2. GET /api/dashboard\n(Authorization: Bearer {token})
-activate Gateway
-
-Gateway -> MeetingService: 3.3. 예정된 회의 조회\nGET /meetings/upcoming?userId={userId}
-activate MeetingService
-
-MeetingService -> Redis: 3.4. 캐시 확인\nGET meeting:upcoming:{userId}
-activate Redis
-Redis --> MeetingService: Cache Miss (새로운 회의 추가로 캐시 무효화됨)
-deactivate Redis
-
-MeetingService -> MeetingDB: 3.5. 예정된 회의 조회\nSELECT * FROM meetings\nWHERE user_id = ? AND status = 'SCHEDULED'\nORDER BY meeting_date LIMIT 5
-activate MeetingDB
-MeetingDB --> MeetingService: 예정된 회의 목록\n(새로 생성한 회의 포함)
-deactivate MeetingDB
-
-MeetingService -> Redis: 3.6. 조회 결과 재캐싱\nSET meeting:upcoming:{userId}\n(TTL: 10분)
-activate Redis
-Redis --> MeetingService: 캐싱 완료
-deactivate Redis
-
-MeetingService --> Gateway: 3.7. 예정된 회의 목록 반환
-deactivate MeetingService
-
-Gateway --> WebApp: 3.8. 대시보드 데이터 반환
-deactivate Gateway
-
-WebApp -> WebApp: 3.9. 대시보드 UI 업데이트\n- 예정된 회의 개수 증가\n- 새 회의 목록에 표시
-
-WebApp --> User: 3.10. 업데이트된 대시보드 표시\n(새로 예약한 회의 확인 가능)
-deactivate WebApp
-
-@enduml
diff --git a/design/backend/sequence/outer/03-회의시작및템플릿선택.puml b/design/backend/sequence/outer/03-회의시작및템플릿선택.puml
deleted file mode 100644
index d3f592b..0000000
--- a/design/backend/sequence/outer/03-회의시작및템플릿선택.puml
+++ /dev/null
@@ -1,73 +0,0 @@
-@startuml 회의시작및템플릿선택
-!theme mono
-
-title 회의 시작 및 템플릿 선택 (Flow 3)
-
-actor "사용자" as User
-participant "Web App" as Web
-participant "API Gateway" as Gateway
-participant "Meeting Service" as Meeting
-participant "STT Service" as STT
-participant "RabbitMQ" as MQ
-participant "Redis" as Cache
-database "PostgreSQL" as DB
-
-== 템플릿 선택 ==
-User -> Web: 회의 템플릿 선택\n(일반/스크럼/킥오프/주간)
-Web -> Gateway: GET /api/meetings/templates
-Gateway -> Meeting: 템플릿 목록 조회
-Meeting -> Cache: 템플릿 캐시 확인
-alt 캐시 존재
- Cache --> Meeting: 템플릿 목록 반환
-else 캐시 미존재
- Meeting -> DB: SELECT * FROM templates
- DB --> Meeting: 템플릿 데이터
- Meeting -> Cache: 템플릿 캐시 저장
-end
-Meeting --> Gateway: 템플릿 목록 응답
-Gateway --> Web: 200 OK + 템플릿 목록
-Web --> User: 템플릿 선택 UI 표시
-
-== 회의 시작 ==
-User -> Web: 회의 시작 버튼 클릭
-Web -> Gateway: POST /api/meetings/{meetingId}/start\n+ templateId
-Gateway -> Meeting: 회의 시작 요청
-
-Meeting -> DB: BEGIN TRANSACTION
-Meeting -> DB: UPDATE meetings\nSET status='ongoing',\nstarted_at=NOW()
-DB --> Meeting: 업데이트 완료
-
-Meeting -> DB: INSERT INTO meeting_sessions\n(meeting_id, template_id,\nsession_status='active')
-DB --> Meeting: 세션 생성 완료
-
-Meeting -> DB: INSERT INTO meeting_transcripts\n(session_id, template_id,\ncontent='{}')
-DB --> Meeting: 회의록 초기화 완료
-
-Meeting -> DB: COMMIT
-Meeting -> Cache: 회의 상태 캐시 업데이트\n(status='ongoing')
-
-== 이벤트 발행 ==
-Meeting ->> MQ: Publish "MeetingStarted" Event\n{\n meetingId,\n sessionId,\n templateId,\n startedAt,\n participants\n}
-note right
- 비동기 이벤트 발행
- - Exchange: meeting.events
- - Routing Key: meeting.started
-end note
-
-Meeting --> Gateway: 200 OK + sessionId
-Gateway --> Web: 회의 시작 성공 응답
-Web --> User: 회의 진행 화면 전환
-
-== STT 서비스 시작 ==
-MQ -->> STT: Consume "MeetingStarted" Event
-STT -> STT: 오디오 녹음 세션 초기화
-STT -> Cache: 녹음 세션 상태 저장\n(sessionId, status='recording')
-STT -> STT: 마이크 활성화 및\n오디오 스트림 시작
-
-note over STT
- STT 서비스 준비 완료
- - 5초 단위 음성 인식 시작
- - 실시간 텍스트 변환 대기
-end note
-
-@enduml
diff --git a/design/backend/sequence/outer/04-회의진행및실시간회의록작성.puml b/design/backend/sequence/outer/04-회의진행및실시간회의록작성.puml
deleted file mode 100644
index 13bcde3..0000000
--- a/design/backend/sequence/outer/04-회의진행및실시간회의록작성.puml
+++ /dev/null
@@ -1,108 +0,0 @@
-@startuml 회의진행및실시간회의록작성
-!theme mono
-
-title 회의 진행 및 실시간 회의록 작성 (Flow 4)
-
-actor "참여자 A" as UserA
-actor "참여자 B" as UserB
-participant "Web App A\n(WebSocket)" as WebA
-participant "Web App B\n(WebSocket)" as WebB
-participant "STT Service" as STT
-participant "AI Service" as AI
-participant "Collaboration\nService" as Collab
-participant "RabbitMQ" as MQ
-participant "Redis" as Cache
-database "PostgreSQL" as DB
-
-== 실시간 음성 인식 (5초 단위) ==
-loop 5초마다 반복
- STT -> STT: 오디오 청크 수집\n(5초분)
- STT -> STT: 음성-텍스트 변환\n(Speech-to-Text)
-
- STT ->> MQ: Publish "TranscriptReady" Event\n{\n sessionId,\n timestamp,\n speaker: "참여자A",\n text: "변환된 텍스트",\n confidence: 0.95\n}
- note right
- 비동기 이벤트 발행
- - Exchange: transcript.events
- - Routing Key: transcript.ready
- end note
-end
-
-== AI 기반 회의록 자동 생성 ==
-MQ -->> AI: Consume "TranscriptReady" Event
-
-AI -> AI: 텍스트 분석 및 구조화\n(키워드, 주제, 맥락 파악)
-
-AI -> Cache: 템플릿 구조 조회\n(sessionId)
-Cache --> AI: 템플릿 섹션 정보\n(agenda, decisions, tasks)
-
-AI -> AI: 템플릿 섹션에 맞춰\n내용 자동 분류
-note right
- 예시:
- - "결정사항" → decisions
- - "TODO" → action_items
- - "논의내용" → discussions
-end note
-
-AI -> DB: INSERT INTO transcript_segments\n(session_id, section,\ncontent, timestamp)
-DB --> AI: 세그먼트 저장 완료
-
-AI ->> MQ: Publish "TranscriptUpdated" Event\n{\n sessionId,\n segmentId,\n section,\n content,\n updatedAt\n}
-
-== 실시간 협업 및 동기화 ==
-MQ -->> Collab: Consume "TranscriptUpdated" Event
-
-Collab -> Cache: 현재 회의록 상태 조회
-Cache --> Collab: 최신 회의록 데이터
-
-Collab -> Collab: 변경 사항 감지 및\n충돌 검사 (CRDT 알고리즘)
-
-Collab ->> WebA: WebSocket Push\n{\n type: "transcript.update",\n section: "decisions",\n content: "...",\n author: "AI"\n}
-Collab ->> WebB: WebSocket Push\n{\n type: "transcript.update",\n section: "decisions",\n content: "...",\n author: "AI"\n}
-
-WebA --> UserA: 회의록 UI 실시간 업데이트
-WebB --> UserB: 회의록 UI 실시간 업데이트
-
-== 참여자 실시간 편집 ==
-UserA -> WebA: 회의록 내용 수정\n("결정사항" 섹션 편집)
-WebA ->> Collab: WebSocket Send\n{\n type: "edit",\n section: "decisions",\n content: "수정된 내용",\n cursorPosition: 42\n}
-
-Collab -> Collab: 동시 편집 충돌 검사\n(Operational Transform)
-
-alt 충돌 없음
- Collab -> DB: UPDATE transcript_segments\nSET content='수정된 내용'
- DB --> Collab: 업데이트 완료
-
- Collab -> Cache: 최신 회의록 캐시 갱신
-
- Collab ->> WebB: WebSocket Push\n{\n type: "peer.edit",\n section: "decisions",\n content: "수정된 내용",\n author: "참여자A"\n}
- WebB --> UserB: 참여자A의 수정사항 반영
-
-else 충돌 발생
- Collab -> Collab: 충돌 해결 알고리즘 적용\n(Last-Write-Wins + Merge)
-
- Collab -> DB: UPDATE transcript_segments\nSET content='병합된 내용'
-
- Collab ->> WebA: WebSocket Push\n{\n type: "conflict.resolved",\n mergedContent: "병합된 내용"\n}
- Collab ->> WebB: WebSocket Push\n{\n type: "conflict.resolved",\n mergedContent: "병합된 내용"\n}
-
- WebA --> UserA: 병합된 내용으로 UI 업데이트
- WebB --> UserB: 병합된 내용으로 UI 업데이트
-end
-
-== 실시간 커서 및 선택 영역 공유 ==
-UserB -> WebB: 텍스트 선택 또는 커서 이동
-WebB ->> Collab: WebSocket Send\n{\n type: "cursor.move",\n userId: "userB",\n position: 120,\n selection: {start: 100, end: 130}\n}
-
-Collab ->> WebA: WebSocket Push\n{\n type: "peer.cursor",\n userId: "userB",\n userName: "참여자B",\n position: 120,\n color: "#FF5733"\n}
-
-WebA --> UserA: 참여자B의 커서 위치 표시\n(다른 색상으로 강조)
-
-note over WebA, WebB
- 실시간 협업 기능:
- - 동시 편집 지원 (CRDT)
- - 충돌 자동 해결
- - 커서 위치 공유
- - 변경 이력 추적
-end note
-
-@enduml
diff --git a/design/backend/sequence/outer/05-회의종료및Todo자동추출.puml b/design/backend/sequence/outer/05-회의종료및Todo자동추출.puml
deleted file mode 100644
index 05690bb..0000000
--- a/design/backend/sequence/outer/05-회의종료및Todo자동추출.puml
+++ /dev/null
@@ -1,140 +0,0 @@
-@startuml
-!theme mono
-
-title Flow 5: 회의 종료 및 Todo 자동 추출 (Meeting End and Auto Todo Extraction)
-
-actor "사용자\n(User)" as User
-participant "Web App" as Web
-participant "API Gateway" as Gateway
-participant "Meeting Service" as Meeting
-participant "STT Service" as STT
-participant "AI Service" as AI
-participant "Todo Service" as Todo
-participant "Notification Service" as Notification
-queue "RabbitMQ" as MQ
-database "Redis" as Cache
-database "PostgreSQL" as DB
-
-== 회의 종료 (Meeting End) ==
-
-User -> Web: 1. 회의 종료 버튼 클릭\n(Click "End Meeting" button)
-activate Web
-
-Web -> Gateway: 2. PATCH /api/meetings/{meetingId}/end\n(End meeting request)
-activate Gateway
-
-Gateway -> Meeting: 3. 회의 종료 요청\n(Forward end meeting request)
-activate Meeting
-
-Meeting -> DB: 4. 회의 상태 조회\n(Query meeting status)
-activate DB
-DB --> Meeting: 회의 정보 반환\n(Return meeting info)
-deactivate DB
-
-Meeting -> DB: 5. 회의 상태를 "ended"로 업데이트\n종료 시간 기록\n(Update status to "ended", record end time)
-activate DB
-DB --> Meeting: 업데이트 완료\n(Update confirmed)
-deactivate DB
-
-Meeting -> DB: 6. 회의 통계 생성\n(참여자 수, 발언 시간, 총 시간 등)\n(Generate meeting statistics)
-activate DB
-DB --> Meeting: 통계 저장 완료\n(Statistics saved)
-deactivate DB
-
-Meeting -> Cache: 7. 캐시 업데이트\n(Update cache with final status)
-activate Cache
-Cache --> Meeting: 캐시 업데이트 완료\n(Cache updated)
-deactivate Cache
-
-Meeting ->> MQ: 8. "MeetingEnded" 이벤트 발행\n(Publish "MeetingEnded" event)\n{meetingId, endTime, stats}
-activate MQ
-
-Meeting --> Gateway: 9. 회의 종료 응답\n(Return end meeting response)
-deactivate Meeting
-
-Gateway --> Web: 10. 종료 확인 응답\n(Return confirmation)
-deactivate Gateway
-
-Web --> User: 11. 회의 종료 완료 메시지 표시\n(Display meeting ended message)
-deactivate Web
-
-== STT 녹음 중지 (Stop STT Recording) ==
-
-MQ ->> STT: 12. "MeetingEnded" 이벤트 수신\n(Receive "MeetingEnded" event)
-activate STT
-
-STT -> STT: 13. 녹음 중지 및 최종 처리\n(Stop recording and final processing)
-
-STT -> DB: 14. 최종 음성 데이터 저장\n(Save final audio data)
-activate DB
-DB --> STT: 저장 완료\n(Save confirmed)
-deactivate DB
-
-STT -> DB: 15. 전사 완료 상태 업데이트\n(Update transcription status to completed)
-activate DB
-DB --> STT: 업데이트 완료\n(Update confirmed)
-deactivate DB
-
-deactivate STT
-deactivate MQ
-
-== AI Todo 자동 추출 (AI Auto Todo Extraction) ==
-
-MQ ->> AI: 16. "MeetingEnded" 이벤트 수신\n(Receive "MeetingEnded" event)
-activate MQ
-activate AI
-
-AI -> DB: 17. 전체 회의록 조회\n(Query full transcript)
-activate DB
-DB --> AI: 회의록 텍스트 반환\n(Return transcript text)
-deactivate DB
-
-AI -> AI: 18. AI 분석 수행\n- 실행 항목(Action Items) 식별\n- 담당자(Assignee) 추출\n- 마감일 추론\n(AI analysis:\n- Identify action items\n- Extract assignees\n- Infer deadlines)
-
-AI -> DB: 19. AI 추출 결과 저장\n(Save AI extraction results)
-activate DB
-DB --> AI: 저장 완료\n(Save confirmed)
-deactivate DB
-
-AI ->> MQ: 20. "TodoExtracted" 이벤트 발행\n(Publish "TodoExtracted" event)\n{meetingId, todos: [{description, assignee, dueDate, transcriptSection}]}
-deactivate AI
-
-== Todo 생성 및 연결 (Todo Creation and Linking) ==
-
-MQ ->> Todo: 21. "TodoExtracted" 이벤트 수신\n(Receive "TodoExtracted" event)
-activate Todo
-
-loop 각 Todo 항목마다 (For each todo item)
- Todo -> DB: 22. Todo 생성\n- 회의 연결 (meetingId)\n- 전사 섹션 연결 (transcriptSectionId)\n- 담당자 정보\n- 마감일\n(Create todo with:\n- Meeting link\n- Transcript section link\n- Assignee info\n- Due date)
- activate DB
- DB --> Todo: Todo 생성 완료\n(Todo created)
- deactivate DB
-
- Todo ->> MQ: 23. "TodoCreated" 이벤트 발행\n(Publish "TodoCreated" event)\n{todoId, meetingId, assignee}
-end
-
-deactivate Todo
-
-== 담당자 알림 (Assignee Notification) ==
-
-MQ ->> Notification: 24. "TodoCreated" 이벤트 수신\n(Receive "TodoCreated" event)
-activate Notification
-
-Notification -> DB: 25. 담당자 정보 조회\n(Query assignee information)
-activate DB
-DB --> Notification: 사용자 정보 및 이메일\n(Return user info and email)
-deactivate DB
-
-Notification -> Notification: 26. Todo 할당 이메일 생성\n- Todo 내용\n- 마감일\n- 회의록 링크\n(Generate todo assignment email:\n- Todo description\n- Due date\n- Transcript link)
-
-Notification -> Notification: 27. 이메일 발송\n(Send email to assignee)
-
-Notification -> DB: 28. 알림 전송 기록 저장\n(Save notification log)
-activate DB
-DB --> Notification: 저장 완료\n(Save confirmed)
-deactivate DB
-
-deactivate Notification
-deactivate MQ
-
-@enduml
diff --git a/design/backend/sequence/outer/06-회의록확정및공유.puml b/design/backend/sequence/outer/06-회의록확정및공유.puml
deleted file mode 100644
index ff6ba9a..0000000
--- a/design/backend/sequence/outer/06-회의록확정및공유.puml
+++ /dev/null
@@ -1,183 +0,0 @@
-@startuml
-!theme mono
-
-title Flow 6: 회의록 확정 및 공유 (Transcript Confirmation and Sharing)
-
-actor "사용자\n(User)" as User
-participant "Web App" as Web
-participant "API Gateway" as Gateway
-participant "Meeting Service" as Meeting
-participant "Notification Service" as Notification
-queue "RabbitMQ" as MQ
-database "Redis" as Cache
-database "PostgreSQL" as DB
-
-== 회의록 검토 (Transcript Review) ==
-
-User -> Web: 1. 회의록 최종 검토\n(Review final transcript)
-activate Web
-
-Web -> Gateway: 2. GET /api/meetings/{meetingId}/transcript\n(Get transcript for review)
-activate Gateway
-
-Gateway -> Meeting: 3. 회의록 조회 요청\n(Forward transcript query)
-activate Meeting
-
-Meeting -> Cache: 4. 캐시에서 회의록 조회\n(Check cache for transcript)
-activate Cache
-Cache --> Meeting: 캐시 히트/미스\n(Cache hit/miss)
-deactivate Cache
-
-alt 캐시 미스 (Cache miss)
- Meeting -> DB: 5. DB에서 회의록 조회\n(Query transcript from DB)
- activate DB
- DB --> Meeting: 회의록 데이터 반환\n(Return transcript data)
- deactivate DB
-
- Meeting -> Cache: 6. 캐시에 저장\n(Store in cache)
- activate Cache
- Cache --> Meeting: 저장 완료\n(Stored)
- deactivate Cache
-end
-
-Meeting --> Gateway: 7. 회의록 반환\n(Return transcript)
-deactivate Meeting
-
-Gateway --> Web: 8. 회의록 데이터\n(Return transcript data)
-deactivate Gateway
-
-Web --> User: 9. 회의록 표시\n(Display transcript)
-deactivate Web
-
-== 필수 항목 검증 (Validate Required Sections) ==
-
-User -> Web: 10. 회의록 확정 요청\n(Request transcript confirmation)
-activate Web
-
-Web -> Web: 11. 필수 항목 검증\n- 회의 제목 존재 여부\n- 참석자 목록 존재 여부\n- 주요 결정사항 작성 여부\n(Validate required sections:\n- Title exists\n- Participants list exists\n- Key decisions documented)
-
-alt 필수 항목 누락 (Missing required sections)
- Web --> User: 12. 필수 항목 누락 경고\n(Display missing sections warning)
- deactivate Web
-else 검증 통과 (Validation passed)
-
- Web -> Gateway: 13. POST /api/meetings/{meetingId}/confirm\n(Confirm transcript request)
- activate Gateway
-
- Gateway -> Meeting: 14. 회의록 확정 요청\n(Forward confirmation request)
- activate Meeting
-
- Meeting -> DB: 15. 회의록 확정 처리\n- 최종 버전 생성 (version++)\n- 확정 상태로 변경 (status: "confirmed")\n- 확정 일시 기록\n(Confirm transcript:\n- Create final version\n- Update status to "confirmed"\n- Record confirmation time)
- activate DB
- DB --> Meeting: 확정 완료\n(Confirmation saved)
- deactivate DB
-
- Meeting -> Cache: 16. 캐시 무효화\n(Invalidate cache)
- activate Cache
- Cache --> Meeting: 캐시 삭제 완료\n(Cache invalidated)
- deactivate Cache
-
- Meeting --> Gateway: 17. 확정 완료 응답\n(Return confirmation response)
- deactivate Meeting
-
- Gateway --> Web: 18. 확정 완료\n(Confirmation successful)
- deactivate Gateway
-
- Web --> User: 19. 확정 완료 메시지 표시\n(Display confirmation message)
- deactivate Web
-end
-
-== 공유 설정 (Configure Sharing) ==
-
-User -> Web: 20. 공유 설정 화면 열기\n(Open sharing configuration)
-activate Web
-
-Web --> User: 21. 공유 옵션 표시\n- 수신자 선택\n- 권한 설정 (읽기/편집)\n- 공유 범위 (전체/일부)\n(Display sharing options:\n- Select recipients\n- Set permissions\n- Choose scope)
-deactivate Web
-
-User -> Web: 22. 공유 설정 입력\n- 수신자 목록\n- 권한 레벨\n- 메시지 (선택)\n(Input sharing settings:\n- Recipients list\n- Permission level\n- Optional message)
-activate Web
-
-Web -> Gateway: 23. POST /api/meetings/{meetingId}/share\n{recipients, permissions, message}\n(Submit sharing request)
-activate Gateway
-
-Gateway -> Meeting: 24. 공유 설정 요청\n(Forward sharing request)
-activate Meeting
-
-Meeting -> DB: 25. 공유 링크 생성\n- 고유 공유 ID 생성 (UUID)\n- 공유 권한 저장\n- 유효기간 설정 (선택)\n(Generate share link:\n- Create unique share ID\n- Save permissions\n- Set expiration if configured)
-activate DB
-DB --> Meeting: 공유 정보 저장 완료\n(Share info saved)
-deactivate DB
-
-Meeting -> Cache: 26. 공유 링크 캐시 저장\n(Cache share link)
-activate Cache
-Cache --> Meeting: 캐시 저장 완료\n(Cached)
-deactivate Cache
-
-Meeting ->> MQ: 27. "TranscriptShared" 이벤트 발행\n(Publish "TranscriptShared" event)\n{meetingId, shareId, recipients, permissions}
-activate MQ
-
-Meeting --> Gateway: 28. 공유 링크 반환\n(Return share link)
-deactivate Meeting
-
-Gateway --> Web: 29. 공유 링크 및 확인\n(Return share link)
-deactivate Gateway
-
-Web --> User: 30. 공유 완료 메시지 및 링크 표시\n(Display share link and confirmation)
-deactivate Web
-
-== 공유 알림 발송 (Send Share Notifications) ==
-
-MQ ->> Notification: 31. "TranscriptShared" 이벤트 수신\n(Receive "TranscriptShared" event)
-activate Notification
-
-loop 각 수신자마다 (For each recipient)
- Notification -> DB: 32. 수신자 정보 조회\n(Query recipient information)
- activate DB
- DB --> Notification: 사용자 정보 및 이메일\n(Return user info and email)
- deactivate DB
-
- Notification -> Notification: 33. 공유 알림 이메일 생성\n- 회의 정보\n- 공유 링크\n- 권한 레벨\n- 발신자 메시지\n(Generate share notification email:\n- Meeting info\n- Share link\n- Permission level\n- Sender message)
-
- Notification -> Notification: 34. 이메일 발송\n(Send email to recipient)
-
- Notification -> DB: 35. 알림 전송 기록 저장\n(Save notification log)
- activate DB
- DB --> Notification: 저장 완료\n(Save confirmed)
- deactivate DB
-end
-
-deactivate Notification
-deactivate MQ
-
-== 참여자 알림 (Participant Notification) ==
-
-note over Notification
-모든 회의 참여자에게도
-회의록 확정 알림 발송
-(Send confirmation notification
-to all meeting participants)
-end note
-
-Notification ->> Notification: 36. 참여자 알림 처리\n(Process participant notifications)
-activate Notification
-
-Notification -> DB: 37. 참여자 목록 조회\n(Query participants list)
-activate DB
-DB --> Notification: 참여자 정보 반환\n(Return participants info)
-deactivate DB
-
-loop 각 참여자마다 (For each participant)
- Notification -> Notification: 38. 확정 알림 이메일 생성\n- 회의록 확정 알림\n- 회의록 보기 링크\n- 주요 내용 요약\n(Generate confirmation email:\n- Transcript confirmed\n- View link\n- Summary)
-
- Notification -> Notification: 39. 이메일 발송\n(Send email)
-
- Notification -> DB: 40. 알림 기록 저장\n(Save notification log)
- activate DB
- DB --> Notification: 저장 완료\n(Saved)
- deactivate DB
-end
-
-deactivate Notification
-
-@enduml
diff --git a/design/backend/sequence/outer/07-회의록목록조회및상세조회.puml b/design/backend/sequence/outer/07-회의록목록조회및상세조회.puml
deleted file mode 100644
index 1d34425..0000000
--- a/design/backend/sequence/outer/07-회의록목록조회및상세조회.puml
+++ /dev/null
@@ -1,62 +0,0 @@
-@startuml
-!theme mono
-
-title 회의록 목록 조회 및 상세 조회 Flow
-
-actor "User" as user
-participant "Web App" as web
-participant "API Gateway" as gateway
-participant "Meeting Service" as meeting
-participant "AI Service" as ai
-participant "Redis" as redis
-participant "PostgreSQL" as db
-
-== 회의록 목록 조회 ==
-
-user -> web: 회의록 목록 화면 진입
-web -> gateway: GET /api/meetings/transcripts\n(filters: status, date, participants)
-gateway -> meeting: 회의록 목록 조회 요청\n(필터 및 정렬 조건 포함)
-
-meeting -> redis: 캐시 조회\n(key: transcripts:filter:{hash})
-alt 캐시 히트
- redis --> meeting: 캐시된 목록 반환
-else 캐시 미스
- meeting -> db: SELECT transcripts\nWHERE status, date, participants\nORDER BY created_at
- db --> meeting: 회의록 목록 데이터
- meeting -> redis: 캐시 저장\n(TTL: 5분)
-end
-
-meeting --> gateway: 회의록 목록 응답
-gateway --> web: 200 OK\n{transcripts: [...]}
-web --> user: 회의록 목록 표시\n(필터/정렬 적용)
-
-== 회의록 상세 조회 ==
-
-user -> web: 회의록 항목 클릭
-web -> gateway: GET /api/meetings/transcripts/{id}
-gateway -> meeting: 회의록 상세 조회 요청
-
-meeting -> redis: 캐시 조회\n(key: transcript:{id})
-alt 캐시 히트
- redis --> meeting: 캐시된 상세 데이터
-else 캐시 미스
- meeting -> db: SELECT transcript, content,\nparticipants, action_items\nWHERE id = {id}
- db --> meeting: 회의록 상세 데이터
- meeting -> redis: 캐시 저장\n(TTL: 10분)
-end
-
-== 연관 회의록 자동 링크 ==
-
-meeting ->> ai: 연관 회의록 요청\n(transcript_id, threshold: 0.7)
-ai -> db: Vector 유사도 검색\n(임베딩 기반, similarity > 70%)
-db --> ai: 유사 회의록 목록\n(최대 5개)
-ai --> meeting: 연관 회의록 ID 목록
-
-meeting -> db: 연관 회의록 메타데이터 조회
-db --> meeting: 연관 회의록 제목, 날짜, 참석자
-
-meeting --> gateway: 회의록 상세 + 연관 목록 응답
-gateway --> web: 200 OK\n{transcript: {...},\nrelated: [...]}
-web --> user: 회의록 상세 표시\n+ 연관 회의록 링크
-
-@enduml
diff --git a/design/backend/sequence/outer/08-맥락기반용어설명제공.puml b/design/backend/sequence/outer/08-맥락기반용어설명제공.puml
deleted file mode 100644
index e631042..0000000
--- a/design/backend/sequence/outer/08-맥락기반용어설명제공.puml
+++ /dev/null
@@ -1,78 +0,0 @@
-@startuml
-!theme mono
-
-title 맥락 기반 용어 설명 제공 Flow
-
-actor "User" as user
-participant "Web App" as web
-participant "API Gateway" as gateway
-participant "RAG Service" as rag
-participant "Vector DB" as vectordb
-participant "PostgreSQL" as db
-
-== 실시간 용어 감지 ==
-
-user -> web: 회의록 내용 조회 중
-web -> gateway: GET /api/meetings/transcripts/{id}
-gateway -> rag: 회의록 내용 전달\n(기술 용어 감지 요청)
-
-rag -> rag: NLP 기반 기술 용어 추출\n(confidence > 70%)
-note right of rag
- - 도메인 용어 사전 매칭
- - 컨텍스트 분석
- - 신뢰도 점수 계산
-end note
-
-rag --> gateway: 감지된 용어 목록\n{terms: [{word, position, confidence}]}
-gateway --> web: 회의록 + 하이라이트 용어
-web --> user: 회의록 표시\n(기술 용어 하이라이트)
-
-== 용어 설명 요청 ==
-
-user -> web: 하이라이트 용어 호버
-web -> gateway: GET /api/rag/terms/explain\n?term={용어}&context={문장}&meeting_id={id}
-gateway -> rag: 맥락 기반 용어 설명 요청
-
-== Vector 유사도 검색 ==
-
-rag -> vectordb: Vector 검색\n(term embedding, similarity search)
-note right of vectordb
- - 과거 회의록 임베딩 검색
- - 관련 문서 임베딩 검색
- - 유사도 임계값: 0.7
-end note
-
-vectordb --> rag: 유사 문서 조각 목록\n(최대 10개, similarity > 70%)
-
-rag -> db: 관련 컨텍스트 메타데이터 조회\n(project_id, issue_id, meeting_ids)
-db --> rag: 프로젝트, 이슈, 회의 정보
-
-== 설명 생성 ==
-
-rag -> rag: LLM 기반 설명 생성
-note right of rag
- 생성 내용:
- 1. 간단한 정의
- 2. 현재 회의에서의 맥락적 의미
- 3. 관련 프로젝트/이슈
- 4. 과거 회의 참조 (최대 3개)
-end note
-
-rag -> db: 과거 회의 제목 및 날짜 조회\n(meeting_ids, LIMIT 3)
-db --> rag: 회의 메타데이터
-
-rag --> gateway: 용어 설명 응답\n{definition, context_meaning,\nrelated_projects, past_meetings}
-gateway --> web: 200 OK\n{explanation: {...}}
-web --> user: 툴팁/사이드 패널에 설명 표시
-note left of user
- 표시 내용:
- - 📖 정의: "..."
- - 💬 맥락: "이 회의에서는..."
- - 🔗 관련: 프로젝트 A, 이슈 #123
- - 📅 과거 회의:
- • 2025-08-15 기획 회의
- • 2025-07-20 기술 검토
- • 2025-06-10 아키텍처 논의
-end note
-
-@enduml
diff --git a/design/backend/sequence/outer/09-Todo완료및회의록반영.puml b/design/backend/sequence/outer/09-Todo완료및회의록반영.puml
deleted file mode 100644
index e306497..0000000
--- a/design/backend/sequence/outer/09-Todo완료및회의록반영.puml
+++ /dev/null
@@ -1,94 +0,0 @@
-@startuml
-!theme mono
-
-title Flow 9: Todo 완료 및 회의록 반영 (Todo Completion and Transcript Update)
-
-actor User as user
-participant "Web App" as web
-participant "API Gateway" as gateway
-participant "Todo Service" as todo
-participant "RabbitMQ" as mq
-participant "Meeting Service" as meeting
-participant "Notification Service" as notification
-participant "Redis" as redis
-participant "PostgreSQL\n(Todo DB)" as tododb
-participant "PostgreSQL\n(Meeting DB)" as meetingdb
-participant "WebSocket\nConnection" as ws
-
-== Todo 완료 처리 (Todo Completion Processing) ==
-
-user -> web: Todo 완료 버튼 클릭\n(Click "Complete" button)
-web -> gateway: PUT /api/todos/{todoId}/complete\n(Todo 완료 요청)
-
-gateway -> todo: PUT /todos/{todoId}/complete\n(Todo 완료 처리 요청)
-activate todo
-
-todo -> tododb: UPDATE todos\nSET status='COMPLETED',\ncompleted_at=NOW(),\ncompleted_by={userId}\nWHERE id={todoId}
-tododb --> todo: 완료 상태 저장 완료\n(Completion status saved)
-
-todo -> redis: DEL cache:todo:{todoId}\n(Todo 캐시 무효화)
-redis --> todo: 캐시 삭제 완료
-
-todo --> gateway: 200 OK\n{todo: {..., status: "COMPLETED"}}
-gateway --> web: 200 OK
-web --> user: Todo 완료 표시\n(Show completion checkmark)
-
-== 비동기 이벤트 발행 (Async Event Publishing) ==
-
-todo ->> mq: Publish "TodoCompleted"\n{todoId, meetingId, userId,\ncompletedAt}
-deactivate todo
-
-mq ->> meeting: Consume "TodoCompleted"\n(Todo 완료 이벤트 수신)
-activate meeting
-
-== 회의록 업데이트 (Meeting Transcript Update) ==
-
-meeting -> redis: GET cache:transcript:{meetingId}\n(회의록 캐시 조회)
-alt 캐시 히트 (Cache Hit)
- redis --> meeting: 회의록 데이터 반환
-else 캐시 미스 (Cache Miss)
- meeting -> meetingdb: SELECT * FROM transcripts\nWHERE meeting_id={meetingId}
- meetingdb --> meeting: 회의록 데이터 반환
-end
-
-meeting -> meeting: Todo 섹션에 완료 상태 반영\n(Update todo section:\ncheckmark, completed_at,\ncompleted_by)
-
-meeting -> meetingdb: UPDATE transcripts\nSET content={updatedContent},\nupdated_at=NOW()\nWHERE meeting_id={meetingId}
-meetingdb --> meeting: 회의록 업데이트 완료
-
-meeting -> redis: DEL cache:transcript:{meetingId}\n(회의록 캐시 무효화)
-redis --> meeting: 캐시 삭제 완료
-
-== 알림 발송 (Notification Sending) ==
-
-meeting ->> mq: Publish "TranscriptUpdated"\n{meetingId, updateType:\n"TODO_COMPLETED",\ntodoId, userId}
-deactivate meeting
-
-mq ->> notification: Consume "TranscriptUpdated"\n(회의록 업데이트 이벤트 수신)
-activate notification
-
-notification -> meetingdb: SELECT creator_id\nFROM transcripts\nWHERE meeting_id={meetingId}
-meetingdb --> notification: 회의록 작성자 ID 반환
-
-notification -> notification: 알림 메시지 생성\n("Todo가 완료되었습니다")
-
-notification ->> user: 회의록 작성자에게\n완료 알림 전송\n(Send completion notification)
-
-deactivate notification
-
-== 실시간 동기화 (Real-time Sync) ==
-
-mq ->> ws: Consume "TranscriptUpdated"\n(실시간 동기화 이벤트)
-activate ws
-
-ws -> redis: GET ws:participants:{meetingId}\n(현재 회의록 조회 중인\n참여자 목록 조회)
-redis --> ws: 참여자 WebSocket 세션 목록
-
-loop 각 참여자에게 (For each participant)
- ws ->> web: WebSocket Push\n{type: "TODO_COMPLETED",\ntodoId, completedAt,\ncompletedBy}
- web -> web: 화면에 완료 상태 실시간 반영\n(Update UI with completion status)
-end
-
-deactivate ws
-
-@enduml
diff --git a/design/backend/sequence/outer/README.md b/design/backend/sequence/outer/README.md
deleted file mode 100644
index 723e177..0000000
--- a/design/backend/sequence/outer/README.md
+++ /dev/null
@@ -1,328 +0,0 @@
-# 외부 시퀀스 설계서 (Outer Sequence Design)
-
-## 개요
-
-본 문서는 회의록 작성 및 공유 개선 서비스의 **외부 시퀀스 다이어그램**을 설명합니다.
-외부 시퀀스는 **마이크로서비스 간의 통신 흐름**을 나타내며, 주요 사용자 플로우별로 서비스 간 상호작용을 정의합니다.
-
-### 문서 정보
-- **작성일**: 2025-10-22
-- **작성자**: 홍길동 (Architect)
-- **버전**: 2.0
-- **설계 원칙**: 공통설계원칙 및 외부시퀀스설계가이드 준용
-
-### 병렬 처리 전략 적용
-- **Group A (순차)**: 회의 생애주기 플로우 (플로우 10-13)
-- **Group B (독립)**: Todo 관리 플로우 (플로우 14)
-- **Group C (독립)**: 회의록 조회/수정 플로우 (플로우 15)
-- 3개 서브 에이전트가 병렬로 작업하여 전체 작업 시간 약 60% 단축
-
----
-
-## 외부 시퀀스 목록
-
-### 1. 사용자 인증 및 대시보드 조회
-- **파일**: [01-사용자인증및대시보드조회.puml](./01-사용자인증및대시보드조회.puml)
-- **관련 유저스토리**: AFR-USER-010, AFR-USER-020
-- **참여 서비스**:
- - Web App
- - API Gateway
- - User Service
- - Meeting Service
- - Todo Service
- - Redis (Cache)
- - PostgreSQL (User DB, Meeting DB, Todo DB)
-
-**주요 흐름**:
-1. **사용자 인증**:
- - 사용자가 사번과 비밀번호로 로그인
- - User Service가 LDAP 연동하여 인증
- - JWT 토큰 생성 및 사용자 프로필 Redis 캐싱 (TTL: 30분)
- - 인증 성공 시 토큰 반환
-
-2. **대시보드 데이터 조회**:
- - 예정된 회의 조회 (Meeting Service)
- - Redis 캐시 확인 → Cache Miss → DB 조회 → 캐싱 (TTL: 10분)
- - 진행 중 Todo 조회 (Todo Service)
- - Redis 캐시 확인 → Cache Hit → 캐시에서 직접 반환
- - 최근 회의록 조회 (Meeting Service)
- - Redis 캐시 확인 → Cache Miss → DB 조회 → 캐싱 (TTL: 10분)
- - Todo 통계 조회 (Todo Service)
- - Redis 캐시 확인 → Cache Hit → 캐시에서 직접 반환
-
-**적용 패턴**:
-- **Cache-Aside Pattern**: 캐시 우선 조회로 DB 부하 감소
-- **JWT 인증**: API Gateway에서 일괄 토큰 검증
-- **LDAP 연동**: 기업 사용자 인증
-
-**성능 목표**:
-- API 응답 시간 (P95): < 500ms
-- Cache Hit Rate: > 70%
-
----
-
-### 2. 회의 예약 및 초대
-- **파일**: [02-회의예약및초대.puml](./02-회의예약및초대.puml)
-- **관련 유저스토리**: UFR-MEET-010
-- **참여 서비스**:
- - Web App
- - API Gateway
- - Meeting Service
- - User Service
- - Notification Service
- - RabbitMQ (Message Broker)
- - Redis (Cache)
- - PostgreSQL (Meeting DB, User DB, Notification DB)
-
-**주요 흐름**:
-1. **회의 예약**:
- - 사용자가 회의 정보 입력 (제목, 날짜/시간, 장소, 참석자)
- - 입력 유효성 검증 (필수 필드, 날짜 형식, 이메일 형식)
- - Meeting Service가 회의 생성 및 DB 저장
- - 회의 정보 Redis 캐싱 (TTL: 10분)
-
-2. **이벤트 발행**:
- - Meeting Service가 `MeetingCreated` 이벤트를 RabbitMQ에 발행
- - Exchange: `meeting.events`
- - Routing Key: `meeting.created`
- - Notification Service가 이벤트 구독
-
-3. **초대 알림 발송**:
- - Notification Service가 `MeetingCreated` 이벤트 수신
- - User Service에서 참석자 정보 조회 (캐시 우선)
- - 알림 메시지 생성 및 DB 저장
- - 각 참석자에게 이메일 초대 발송
- - 알림 상태 업데이트 (PENDING → SENT)
- - 리마인더 일정 생성 (회의 시작 30분 전)
-
-4. **결과 확인**:
- - 사용자가 대시보드에서 새로 예약한 회의 확인
- - 캐시 무효화 후 DB 재조회 및 재캐싱
-
-**적용 패턴**:
-- **Publisher-Subscriber Pattern**: 이벤트 기반 느슨한 결합
-- **Queue-Based Load Leveling**: 대량 알림 발송 시 부하 분산
-- **Cache-Aside Pattern**: 사용자 정보 캐싱으로 성능 향상
-- **Asynchronous Processing**: 알림 발송은 비동기로 처리
-
-**이벤트 스키마**:
-```json
-{
- "eventType": "MeetingCreated",
- "payload": {
- "meetingId": "uuid",
- "title": "프로젝트 킥오프 회의",
- "dateTime": "2025-02-01T14:00:00",
- "location": "회의실 A",
- "creatorId": "userId",
- "participants": ["user1@company.com", "user2@company.com"]
- }
-}
-```
-
-**성능 목표**:
-- 회의 생성 응답 시간: < 300ms
-- 알림 발송 지연 시간: < 5초
-
----
-
-## 설계 원칙
-
-### 1. 통신 패턴
-
-#### 동기 통신 (REST API)
-- **적용 대상**: 즉시 응답이 필요한 단순 조회
-- **특징**:
- - API Gateway를 통한 일관된 인증/인가
- - 캐시 우선 전략으로 직접 의존성 최소화
-
-#### 비동기 통신 (Message Queue)
-- **적용 대상**: 이벤트 기반 통신, 느슨한 결합
-- **특징**:
- - RabbitMQ Topic Exchange를 통한 Pub/Sub 패턴
- - 이벤트 발행자와 구독자 간 느슨한 결합
- - 대량 작업 시 Queue-Based Load Leveling
-
-### 2. 캐싱 전략 (Cache-Aside)
-
-| 데이터 유형 | TTL | 캐시 키 패턴 | 무효화 시점 |
-|------------|-----|--------------|------------|
-| 사용자 프로필 | 30분 | `user:profile:{userId}` | 프로필 수정 시 |
-| 사용자 권한 | 1시간 | `user:auth:{userId}` | 권한 변경 시 |
-| 회의 정보 | 10분 | `meeting:info:{meetingId}` | 회의 수정 시 |
-| 회의 참여자 | 10분 | `meeting:participants:{meetingId}` | 참여자 변경 시 |
-| Todo 목록 | 5분 | `todo:user:{userId}` | Todo 상태 변경 시 |
-| Todo 통계 | 5분 | `todo:stats:{userId}` | Todo 완료 시 |
-
-**캐시 처리 플로우**:
-1. 조회 요청 → Redis 캐시 확인
-2. Cache Hit → 캐시 데이터 반환
-3. Cache Miss → DB 조회 → Redis 저장 (TTL 설정) → 데이터 반환
-4. 데이터 수정 시 → DB 업데이트 → Redis 캐시 무효화
-
-### 3. 이벤트 기반 아키텍처
-
-#### RabbitMQ Exchange/Queue 구성
-- **Topic Exchange**: `meeting.events`, `transcript.events`, `todo.events`
-- **Queue 네이밍**: `{service}.{event-category}.queue`
-- **Routing Key 패턴**: `{event}.{action}` (예: `meeting.created`, `todo.completed`)
-
-#### 주요 이벤트
-
-| 이벤트 | 발행자 | 구독자 | 목적 |
-|--------|--------|--------|------|
-| **MeetingCreated** | Meeting Service | Notification Service
AI Service | 참석자 알림 발송
회의 분석 준비 |
-| **MeetingEnded** | Meeting Service | STT Service
AI Service
Todo Service
Notification Service | 회의록 생성
AI 분석 시작
Todo 추출
종료 알림 |
-| **TodoCreated** | Todo Service | Notification Service | 담당자 알림 발송 |
-
----
-
-## 다이어그램 렌더링 방법
-
-### PlantUML 렌더링
-
-#### 1. Visual Studio Code 플러그인 사용
-1. PlantUML 확장 설치: `jebbs.plantuml`
-2. `.puml` 파일 열기
-3. `Alt + D` (미리보기) 또는 우클릭 → `Preview Current Diagram`
-
-#### 2. 온라인 렌더링
-- [PlantUML Online Editor](https://www.plantuml.com/plantuml/uml/)
-- 파일 내용 복사 → 붙여넣기 → 렌더링
-
-#### 3. 로컬 PlantUML 서버
-```bash
-# Docker로 PlantUML 서버 실행
-docker run -d --name plantuml -p 38080:8080 plantuml/plantuml-server:latest
-
-# 브라우저에서 접근
-http://localhost:38080
-```
-
----
-
-## 다음 단계
-
-### 1. 내부 시퀀스 설계
-각 서비스 내부의 상세 처리 흐름을 설계합니다:
-- User Service 내부 시퀀스 (인증 처리, 프로필 관리)
-- Meeting Service 내부 시퀀스 (회의 생성, 회의록 관리)
-- Notification Service 내부 시퀀스 (알림 발송, 리마인더 관리)
-
-### 2. API 명세 작성
-각 서비스별 REST API 명세를 OpenAPI 3.0 형식으로 작성합니다.
-
-### 3. 클래스 설계
-엔티티, DTO, 서비스 클래스 설계를 진행합니다.
-
-### 4. 데이터 설계
-각 서비스별 데이터베이스 스키마 설계를 진행합니다.
-
----
-
-## 참고 자료
-
-- [논리 아키텍처 설계서](../../logical/logical-architecture.md)
-- [유저스토리](../../../userstory.md)
-- [아키텍처 패턴 적용 방안](../../../pattern/architecture-pattern.md)
-- [클라우드 디자인 패턴 요약](../../../../claude/cloud-design-patterns.md)
-
----
-
----
-
-## 신규 플로우 (v2.0)
-
-### 10. 회의 예약 및 초대
-- **파일**: [회의예약및초대.puml](./회의예약및초대.puml)
-- **관련 유저스토리**: UFR-MEET-010
-- **참여 서비스**: Frontend, API Gateway, Meeting Service, User Service, Redis, RabbitMQ, Notification Service, Meeting DB
-- **주요 특징**:
- - Cache-Aside 패턴으로 참석자 정보 조회 (Redis 캐시 우선)
- - 회의 정보 저장 및 캐싱 (TTL: 10분)
- - MeetingCreated 이벤트 비동기 발행
- - Notification Service가 참석자 전원에게 초대 이메일 발송
-
-### 11. 회의 시작 및 회의록 작성
-- **파일**: [회의시작및회의록작성.puml](./회의시작및회의록작성.puml)
-- **관련 유저스토리**: UFR-MEET-030, UFR-STT-010/020, UFR-AI-010, UFR-RAG-010/020, UFR-COLLAB-010
-- **참여 서비스**: Frontend, API Gateway, Meeting Service, STT Service, AI Service, RAG Service, Collaboration Service, Redis, RabbitMQ, Azure Speech, LLM Server, 각 서비스 DB
-- **주요 특징**:
- - 실시간 음성 인식 (Azure Speech, 5초 간격)
- - AI 기반 회의록 자동 작성 (LLM)
- - WebSocket 실시간 동기화 (델타만 전송)
- - RAG 기반 전문용어 감지 및 맥락 설명 제공
- - 가장 복잡한 플로우 (동기+비동기+실시간 혼합)
-
-### 12. 회의 종료 및 Todo 추출
-- **파일**: [회의종료및Todo추출.puml](./회의종료및Todo추출.puml)
-- **관련 유저스토리**: UFR-MEET-040/050, UFR-AI-020, UFR-TODO-010
-- **참여 서비스**: Frontend, API Gateway, Meeting Service, AI Service, Todo Service, Notification Service, Redis, RabbitMQ, LLM Server, 각 서비스 DB
-- **주요 특징**:
- - 회의 통계 자동 생성 (duration, 참석자 수, 발언 수)
- - AI Todo 자동 추출 (액션 아이템 식별, 담당자 자동 지정)
- - 이벤트 체인: MeetingEnded → TodoExtracted → TodoCreated
- - Todo 목록 캐싱 (TTL: 5분)
- - 담당자에게 자동 알림 발송
-
-### 13. 회의록 확정 및 공유
-- **파일**: [회의록확정및공유.puml](./회의록확정및공유.puml)
-- **관련 유저스토리**: UFR-MEET-060
-- **참여 서비스**: Frontend, API Gateway, Meeting Service, Notification Service, Redis, RabbitMQ, Meeting DB
-- **주요 특징**:
- - 필수 항목 자동 검사 (제목, 참석자, 논의 내용, 결정 사항)
- - 고유 공유 링크 생성 (UUID 기반)
- - 공유 보안 설정 (비밀번호, 유효기간)
- - TranscriptShared 이벤트 발행
- - 다음 회의 일정 자동 캘린더 등록 (선택)
-
-### 14. Todo 완료 및 회의록 반영
-- **파일**: [Todo완료및회의록반영.puml](./Todo완료및회의록반영.puml)
-- **관련 유저스토리**: UFR-TODO-030
-- **참여 서비스**: Frontend, API Gateway, Todo Service, Meeting Service, Notification Service, Redis, RabbitMQ, 각 서비스 DB
-- **주요 특징** (**차별화 포인트**):
- - Todo 완료가 회의록에 실시간 반영되는 양방향 연동
- - 완료 시간 및 완료자 정보 자동 기록
- - TodoCompleted 이벤트 → Meeting Service가 회의록 자동 업데이트
- - 모든 Todo 완료 시 전체 완료 알림 자동 발송
- - Cache-Aside 패턴으로 회의록 조회 최적화
-
-### 15. 회의록 조회 및 수정
-- **파일**: [회의록조회및수정.puml](./회의록조회및수정.puml)
-- **관련 유저스토리**: UFR-MEET-046/047/055, UFR-COLLAB-010
-- **참여 서비스**: Frontend, API Gateway, Meeting Service, Collaboration Service, Redis, Meeting DB
-- **주요 특징**:
- - Cache-Aside 패턴으로 목록/상세 조회 (TTL: 10분)
- - 권한 검증 (본인 작성 회의록만 수정 가능)
- - 수정 이력 자동 기록 (수정자, 수정 시간, 변경 내용)
- - WebSocket 실시간 동기화 (델타만 전송)
- - 버전 관리 (새 버전 생성, 이전 버전 보관)
- - 확정완료 → 작성중 자동 상태 변경
-
----
-
-## 설계 원칙 적용
-
-### PlantUML 문법 검사
-✅ **모든 파일 검증 통과** (Docker 기반 PlantUML 검사 완료)
-- `!theme mono` 적용
-- 동기: 실선 (→), 비동기: 점선 (->>) 명확 구분
-- `..>` 사용 금지 (sequence diagram 원칙 준수)
-
-### 논리 아키텍처 일치성
-- ✅ 참여자: 논리 아키텍처의 서비스, DB, 메시지 큐 구조 일치
-- ✅ 통신 방식: 동기(REST), 비동기(RabbitMQ), 실시간(WebSocket) 일치
-- ✅ 캐시 전략: Cache-Aside 패턴, TTL 설정 일치
-
-### 유저스토리 커버리지
-- ✅ 신규 6개 플로우가 11개 유저스토리 완전 커버
-- ✅ 기존 9개 플로우와 통합하여 전체 시스템 커버
-
----
-
-## 문서 이력
-
-| 버전 | 작성일 | 작성자 | 변경 내용 |
-|------|--------|--------|----------|
-| 1.0 | 2025-01-22 | 길동 (Architect) | 초안 작성 (Flow 1-9) |
-| 2.0 | 2025-10-22 | 길동 (Architect) | 신규 6개 플로우 추가 (Flow 10-15), 병렬 처리 전략 적용 |
diff --git a/design/backend/sequence/outer/Todo완료및회의록반영.puml b/design/backend/sequence/outer/Todo완료및회의록반영.puml
deleted file mode 100644
index 4e39185..0000000
--- a/design/backend/sequence/outer/Todo완료및회의록반영.puml
+++ /dev/null
@@ -1,211 +0,0 @@
-@startuml Todo완료및회의록반영
-!theme mono
-
-title 외부 시퀀스 다이어그램: Todo 완료 및 회의록 반영\n(Flow 5: Todo Completion and Meeting Minutes Reflection)
-
-' 참여자 정의
-actor "사용자\n(Todo 담당자)" as User
-participant "Frontend" as FE
-participant "API Gateway" as GW
-participant "Todo Service" as TodoSvc
-participant "Meeting Service" as MeetingSvc
-participant "Notification Service" as NotifySvc
-database "Todo DB" as TodoDB
-database "Meeting DB" as MeetingDB
-queue "RabbitMQ" as MQ
-database "Redis Cache" as Redis
-
-== Todo 완료 요청 ==
-
-User -> FE: Todo 완료 버튼 클릭
-activate FE
-
-FE -> FE: 완료 여부 확인 다이얼로그 표시
-FE --> User: 확인 요청 표시
-User -> FE: 완료 확인
-
-FE -> GW: PUT /todos/{todoId}/complete
-activate GW
-note right: JWT 인증 및 권한 검증
-
-GW -> TodoSvc: PUT /todos/{todoId}/complete
-activate TodoSvc
-
-== Todo 완료 처리 ==
-
-TodoSvc -> TodoDB: Todo 상태 업데이트\n(상태=완료, 완료시간, 완료자 기록)
-activate TodoDB
-TodoDB --> TodoSvc: 업데이트 완료
-deactivate TodoDB
-
-note right of TodoSvc
- 완료 처리 정보:
- - 완료 시간 자동 기록
- - 완료자 정보 저장
- - 완료 상태로 변경
-end note
-
-== 캐시 무효화 ==
-
-TodoSvc -> Redis: DEL todo:user:{userId}
-activate Redis
-Redis --> TodoSvc: 캐시 삭제 완료
-deactivate Redis
-
-TodoSvc -> Redis: DEL todo:stats:{userId}
-activate Redis
-Redis --> TodoSvc: 캐시 삭제 완료
-deactivate Redis
-
-note right of Redis
- 캐시 무효화 대상:
- - todo:user:{userId}
- - todo:stats:{userId}
-end note
-
-== TodoCompleted 이벤트 발행 ==
-
-TodoSvc -> MQ: publish TodoCompleted\n(todoId, meetingId, userId, completedAt)
-activate MQ
-
-note right of MQ
- 이벤트 내용:
- - todoId: Todo ID
- - meetingId: 관련 회의 ID
- - userId: 완료자 ID
- - completedAt: 완료 시간
- - sectionId: 회의록 섹션 ID
-end note
-
-TodoSvc --> GW: 200 OK\n(완료 처리 결과 반환)
-deactivate TodoSvc
-GW --> FE: 200 OK
-deactivate GW
-
-FE -> FE: Todo 완료 상태 UI 업데이트
-FE --> User: 완료 처리 완료 표시
-deactivate FE
-
-== Meeting Service: TodoCompleted 이벤트 구독 ==
-
-MQ ->> MeetingSvc: TodoCompleted 이벤트 수신
-activate MeetingSvc
-
-note right of MeetingSvc
- 비동기 처리:
- 구독자가 이벤트 수신
-end note
-
-MeetingSvc -> Redis: GET meeting:info:{meetingId}
-activate Redis
-
-alt 캐시 Hit
- Redis --> MeetingSvc: 회의 정보 반환
-else 캐시 Miss
- Redis --> MeetingSvc: null
- MeetingSvc -> MeetingDB: SELECT 회의 정보
- activate MeetingDB
- MeetingDB --> MeetingSvc: 회의 정보 반환
- deactivate MeetingDB
-
- MeetingSvc -> Redis: SETEX meeting:info:{meetingId}\n(TTL: 10분)
- Redis --> MeetingSvc: 캐시 저장 완료
-end
-
-deactivate Redis
-
-note right of MeetingSvc
- Cache-Aside 패턴 적용:
- 1. 캐시 조회 시도
- 2. 캐시 미스 시 DB 조회
- 3. 조회 결과 캐시 저장
-end note
-
-== 회의록에 완료 상태 자동 반영 ==
-
-MeetingSvc -> MeetingDB: UPDATE 회의록 Todo 섹션\n(완료 상태, 완료 시간, 완료자)
-activate MeetingDB
-
-note right of MeetingDB
- 회의록 반영 내용:
- - Todo 섹션에 완료 표시 (✅)
- - 완료 시간 기록
- - 완료자 정보 표시
- - 양방향 연결 유지
-end note
-
-MeetingDB --> MeetingSvc: 업데이트 완료
-deactivate MeetingDB
-
-== 캐시 무효화 ==
-
-MeetingSvc -> Redis: DEL meeting:info:{meetingId}
-activate Redis
-Redis --> MeetingSvc: 캐시 삭제 완료
-deactivate Redis
-
-note right of MeetingSvc
- 회의록 수정 시 캐시 무효화:
- 다음 조회 시 최신 정보 반영
-end note
-
-== TranscriptUpdated 이벤트 발행 (선택) ==
-
-MeetingSvc -> MQ: publish TranscriptUpdated\n(meetingId, updateType=TODO_COMPLETED)
-note right of MeetingSvc
- 선택적 이벤트:
- 실시간 협업 중인 경우
- 다른 참석자에게 알림 가능
-end note
-
-deactivate MeetingSvc
-
-== Notification Service: TodoCompleted 이벤트 구독 ==
-
-MQ ->> NotifySvc: TodoCompleted 이벤트 수신
-activate NotifySvc
-
-NotifySvc -> NotifySvc: 알림 내용 생성
-note right of NotifySvc
- 알림 내용:
- - Todo 완료 알림
- - 회의록 작성자에게 발송
- - 완료자 정보 포함
-end note
-
-NotifySvc -> NotifySvc: 회의록 알림 발송\n(이메일)
-note right of NotifySvc
- 알림 발송 대상:
- - 회의록 작성자
- - 참석자 (선택)
-end note
-
-== 모든 Todo 완료 확인 ==
-
-NotifySvc -> TodoDB: SELECT COUNT(*)\nWHERE meetingId={meetingId}\nAND status != COMPLETED
-activate TodoDB
-TodoDB --> NotifySvc: 미완료 Todo 개수 반환
-deactivate TodoDB
-
-alt 모든 Todo 완료
- NotifySvc -> NotifySvc: 전체 완료 알림 생성
- note right of NotifySvc
- 전체 완료 알림:
- - "모든 Todo가 완료되었습니다"
- - 회의록 작성자 및 참석자 전원 발송
- end note
- NotifySvc -> NotifySvc: 전체 완료 알림 발송\n(이메일)
-end
-
-deactivate NotifySvc
-deactivate MQ
-
-note over User, Redis
- 차별화 포인트:
- - Todo 완료가 회의록에 실시간 반영되어 양방향 연동
- - 회의 결과 추적 용이
- - 완료 시간 및 완료자 정보 자동 기록
- - 모든 Todo 완료 시 전체 완료 알림 자동 발송
-end note
-
-@enduml
diff --git a/design/backend/sequence/outer/회의록조회및수정.png b/design/backend/sequence/outer/회의록조회및수정.png
deleted file mode 100644
index c29396b..0000000
Binary files a/design/backend/sequence/outer/회의록조회및수정.png and /dev/null differ
diff --git a/design/backend/sequence/outer/회의록조회및수정.puml b/design/backend/sequence/outer/회의록조회및수정.puml
deleted file mode 100644
index 5bb9164..0000000
--- a/design/backend/sequence/outer/회의록조회및수정.puml
+++ /dev/null
@@ -1,123 +0,0 @@
-@startuml 회의록조회및수정
-!theme mono
-
-title 플로우 6: 회의록 조회 및 수정
-
-actor "Frontend" as FE
-participant "API Gateway" as GW
-participant "Meeting Service" as MS
-participant "Collaboration Service" as CS
-participant "Redis" as RD
-database "Meeting DB" as MDB
-
-== 회의록 목록 조회 ==
-FE -> GW: 회의록 목록 조회 요청\n(필터/정렬/검색 조건)
-activate GW
-GW -> MS: 목록 조회 요청
-activate MS
-
-MS -> RD: 캐시 조회 (Cache-Aside)\nKey: meeting:list:{userId}:{filter}
-activate RD
-
-alt Cache Hit
- RD --> MS: 캐시 데이터 반환
- MS --> GW: 목록 데이터 반환
- GW --> FE: 목록 표시
-else Cache Miss
- RD --> MS: 캐시 없음
- deactivate RD
- MS -> MDB: DB 조회\n(필터, 정렬, 검색 조건 적용)
- activate MDB
- MDB --> MS: 목록 데이터
- deactivate MDB
- MS -> RD: 캐시 저장 (TTL 10분)\nKey: meeting:list:{userId}:{filter}
- activate RD
- RD --> MS: 저장 완료
- deactivate RD
- MS --> GW: 목록 데이터 반환
- GW --> FE: 목록 표시
-end
-
-deactivate MS
-deactivate GW
-
-== 회의록 상세 조회 ==
-FE -> GW: 회의록 클릭\n회의록 상세 조회 요청
-activate GW
-GW -> MS: 상세 조회 요청 (meetingId)
-activate MS
-
-MS -> RD: 캐시 조회 (Cache-Aside)\nKey: meeting:info:{meetingId}
-activate RD
-
-alt Cache Hit
- RD --> MS: 캐시 데이터 반환\n(회의 정보, 섹션별 내용, 관련 회의록)
- MS --> GW: 상세 데이터 반환
- GW --> FE: 상세 정보 표시
-else Cache Miss
- RD --> MS: 캐시 없음
- deactivate RD
- MS -> MDB: DB 조회\n(회의 정보, 섹션별 내용, 관련 회의록)
- activate MDB
- MDB --> MS: 상세 데이터
- deactivate MDB
- MS -> RD: 캐시 저장 (TTL 10분)\nKey: meeting:info:{meetingId}
- activate RD
- RD --> MS: 저장 완료
- deactivate RD
- MS --> GW: 상세 데이터 반환
- GW --> FE: 상세 정보 표시
-end
-
-deactivate MS
-deactivate GW
-
-== 회의록 수정 ==
-FE -> GW: 수정 버튼 클릭
-activate GW
-GW -> MS: 권한 확인 요청
-activate MS
-MS -> MS: 수정 권한 검증\n(본인 작성 회의록만 수정 가능)
-
-alt 권한 없음
- MS --> GW: 권한 오류
- GW --> FE: 수정 불가 알림
-else 권한 있음
- MS --> GW: 권한 확인 완료
- GW --> FE: 수정 모드 진입
- deactivate GW
-
- FE -> GW: 회의록 수정 내용 전송
- activate GW
- GW -> MS: 수정 요청
-
- MS -> MDB: 수정 내용 저장\n수정 이력 기록\n(수정자, 수정 시간, 변경 내용)
- activate MDB
- MDB --> MS: 저장 완료
- deactivate MDB
-
- MS -> RD: 캐시 무효화\nKey: meeting:info:{meetingId}
- activate RD
- RD --> MS: 무효화 완료
- deactivate RD
-
- MS ->> CS: 실시간 동기화 요청\n(비동기)
- activate CS
- CS ->> FE: WebSocket: 모든 참석자에게\n수정 델타 전송\n수정 영역 하이라이트 (3초간)
- deactivate CS
-
- MS -> MDB: 새 버전 번호 생성\n이전 버전 보관
- activate MDB
- MDB --> MS: 버전 관리 완료
- deactivate MDB
-
- note over MS: 확정완료 상태였던 경우\n작성중 상태로 변경
-
- MS --> GW: 수정 완료 응답
- GW --> FE: 수정 완료 표시
-end
-
-deactivate MS
-deactivate GW
-
-@enduml
diff --git a/design/backend/sequence/outer/회의록확정및공유.puml b/design/backend/sequence/outer/회의록확정및공유.puml
deleted file mode 100644
index 0e17357..0000000
--- a/design/backend/sequence/outer/회의록확정및공유.puml
+++ /dev/null
@@ -1,243 +0,0 @@
-@startuml 회의록확정및공유
-!theme mono
-
-title 회의록 확정 및 공유 플로우 (UFR-MEET-060)
-
-actor "사용자" as User
-participant "Frontend" as FE
-participant "API Gateway" as GW
-participant "Meeting Service" as MS
-participant "Notification Service" as NS
-participant "Redis" as Cache
-database "Meeting DB" as MDB
-queue "RabbitMQ" as MQ
-
-== 회의록 확정 ==
-User -> FE: 회의록 확정 버튼 클릭
-activate FE
-
-FE -> GW: POST /api/meetings/{meetingId}/minutes/finalize
-activate GW
-
-GW -> MS: 회의록 확정 요청
-activate MS
-
-MS -> MS: 필수 항목 검사\n(제목, 참석자, 논의 내용, 결정 사항)
-
-alt 필수 항목 누락
- MS --> GW: 400 Bad Request\n{error: "필수 항목 누락", missingFields}
- deactivate MS
- GW --> FE: 오류 반환
- deactivate GW
- FE --> User: 필수 항목 누락 안내
- deactivate FE
-else 필수 항목 완료
- MS -> MDB: INSERT INTO minutes_versions\n(확정 버전 생성, 확정 시간 기록)\nUPDATE meetings SET minutes_status = 'finalized'
- activate MDB
- MDB --> MS: 확정 버전 ID 반환
- deactivate MDB
-
- MS -> Cache: DEL meeting:info:{meetingId}\n(캐시 무효화)
- activate Cache
- Cache --> MS: OK
- deactivate Cache
-
- MS --> GW: 200 OK\n{versionId, status: "finalized"}
- deactivate MS
-
- GW --> FE: 회의록 확정 완료
- deactivate GW
-
- FE --> User: 회의록 확정 완료 화면 표시
- deactivate FE
-end
-
-== 회의록 공유 설정 ==
-User -> FE: 공유 설정 입력\n(대상: 참석자/전체/특정인, 권한: 읽기/편집, 방식: 링크/이메일)
-activate FE
-
-FE -> GW: POST /api/meetings/{meetingId}/share\n{targets, permission, method, password, expiresAt}
-activate GW
-
-GW -> MS: 공유 설정 요청
-activate MS
-
-MS -> MS: 고유 공유 링크 생성\n(UUID 기반 URL)
-MS -> MDB: INSERT INTO share_settings\n(공유 대상, 권한, 링크, 비밀번호, 유효기간 저장)
-activate MDB
-MDB --> MS: 공유 설정 ID 반환
-deactivate MDB
-
-MS -> Cache: SET share:link:{shareId}\n(공유 링크 정보 캐싱, TTL: 유효기간)
-activate Cache
-Cache --> MS: OK
-deactivate Cache
-
-MS ->> MQ: TranscriptShared 이벤트 발행\n{meetingId, shareId, targets, shareUrl, method}
-activate MQ
-note right of MQ
- 이벤트: TranscriptShared
- Routing Key: transcript.shared
-end note
-MQ -->> MS: ACK
-deactivate MQ
-
-MS --> GW: 200 OK\n{shareUrl, shareId, expiresAt}
-deactivate MS
-
-GW --> FE: 공유 링크 반환
-deactivate GW
-
-FE --> User: 공유 링크 및 설정 표시
-deactivate FE
-
-== 공유 알림 발송 (비동기) ==
-MQ ->> NS: TranscriptShared 이벤트 전달
-activate NS
-note right of NS
- 구독: transcript.shared
- 큐: notification.transcript.shared
-end note
-
-alt 공유 방식: 이메일
- loop 각 대상
- NS -> NS: 이메일 템플릿 생성\n(회의 제목, 공유 링크, 유효기간, 비밀번호)
- NS -> NS: 이메일 발송
- end
-else 공유 방식: 링크만
- NS -> NS: 알림 생성\n(링크 복사 완료)
-end
-
-NS -->> MQ: ACK
-deactivate NS
-
-== 다음 회의 일정 자동 등록 (선택) ==
-opt 회의록에 다음 회의 언급 존재
- User -> FE: 다음 회의 일정 자동 등록 확인
- activate FE
-
- FE -> GW: POST /api/meetings/{meetingId}/schedule-next
- activate GW
-
- GW -> MS: 다음 회의 일정 등록 요청
- activate MS
-
- MS -> MDB: SELECT next_meeting_info\nFROM minutes\nWHERE meeting_id = {meetingId}
- activate MDB
- MDB --> MS: 다음 회의 정보 반환\n{suggestedDate, suggestedTime, suggestedAttendees}
- deactivate MDB
-
- MS -> MS: 캘린더 등록 데이터 생성\n(제목, 날짜, 시간, 참석자)
- MS -> MDB: INSERT INTO meetings\n(다음 회의 생성, 이전 회의 ID 링크)
- activate MDB
- MDB --> MS: 다음 회의 ID 반환
- deactivate MDB
-
- MS ->> MQ: MeetingCreated 이벤트 발행\n(다음 회의 초대)
- activate MQ
- MQ -->> MS: ACK
- deactivate MQ
-
- MS --> GW: 200 OK\n{nextMeetingId, status: "scheduled"}
- deactivate MS
-
- GW --> FE: 다음 회의 등록 완료
- deactivate GW
-
- FE --> User: 다음 회의 등록 완료 표시
- deactivate FE
-end
-
-== 공유 링크 접근 (외부 사용자) ==
-actor "외부 사용자" as External
-External -> FE: 공유 링크 접근\n(GET /share/{shareId})
-activate FE
-
-FE -> GW: 공유 링크 검증 요청
-activate GW
-
-GW -> MS: 공유 설정 조회
-activate MS
-
-MS -> Cache: GET share:link:{shareId}
-activate Cache
-
-alt Cache Hit
- Cache --> MS: 공유 설정 반환
-else Cache Miss
- Cache --> MS: null
- MS -> MDB: SELECT * FROM share_settings\nWHERE share_id = {shareId}\nAND expires_at > NOW()
- activate MDB
-
- alt 유효한 공유 링크
- MDB --> MS: 공유 설정 반환
- deactivate MDB
-
- MS -> Cache: SET share:link:{shareId}\n(TTL: 남은 유효기간)
- Cache --> MS: OK
- else 만료 또는 존재하지 않음
- MDB --> MS: null
- deactivate MDB
- Cache --> MS: null
- MS --> GW: 404 Not Found\n{error: "공유 링크가 만료되었거나 존재하지 않습니다"}
- deactivate MS
- GW --> FE: 오류 반환
- deactivate GW
- FE --> External: 오류 화면 표시
- deactivate FE
- end
-end
-deactivate Cache
-
-alt 비밀번호 설정된 경우
- MS --> GW: 비밀번호 요청
- deactivate MS
- GW --> FE: 비밀번호 입력 화면
- deactivate GW
-
- External -> FE: 비밀번호 입력
- FE -> GW: 비밀번호 검증 요청
- activate GW
-
- GW -> MS: 비밀번호 검증
- activate MS
-
- alt 비밀번호 일치
- MS -> MDB: SELECT minutes\nFROM meetings\nWHERE meeting_id = {meetingId}
- activate MDB
- MDB --> MS: 회의록 반환
- deactivate MDB
-
- MS --> GW: 200 OK\n{minutes, permission}
- deactivate MS
-
- GW --> FE: 회의록 데이터 반환
- deactivate GW
-
- FE --> External: 회의록 표시\n(권한에 따라 읽기/편집)
- deactivate FE
- else 비밀번호 불일치
- MS --> GW: 401 Unauthorized\n{error: "비밀번호가 일치하지 않습니다"}
- deactivate MS
- GW --> FE: 오류 반환
- deactivate GW
- FE --> External: 오류 화면 표시
- deactivate FE
- end
-else 비밀번호 미설정
- MS -> MDB: SELECT minutes\nFROM meetings\nWHERE meeting_id = {meetingId}
- activate MDB
- MDB --> MS: 회의록 반환
- deactivate MDB
-
- MS --> GW: 200 OK\n{minutes, permission}
- deactivate MS
-
- GW --> FE: 회의록 데이터 반환
- deactivate GW
-
- FE --> External: 회의록 표시\n(권한에 따라 읽기/편집)
- deactivate FE
-end
-
-@enduml
diff --git a/design/backend/sequence/outer/회의시작및회의록작성.puml b/design/backend/sequence/outer/회의시작및회의록작성.puml
deleted file mode 100644
index 52a968f..0000000
--- a/design/backend/sequence/outer/회의시작및회의록작성.puml
+++ /dev/null
@@ -1,170 +0,0 @@
-@startuml 회의시작및회의록작성
-!theme mono
-
-title 회의 시작 및 회의록 작성 플로우 (UFR-MEET-030, UFR-STT-010/020, UFR-AI-010, UFR-RAG-010/020, UFR-COLLAB-010)
-
-actor "참석자" as User
-participant "Frontend" as FE
-participant "API Gateway" as GW
-participant "Meeting Service" as MS
-participant "STT Service" as STT
-participant "AI Service" as AI
-participant "RAG Service" as RAG
-participant "Collaboration Service" as CS
-participant "Redis" as Cache
-database "Meeting DB" as MDB
-database "STT DB" as STTDB
-database "AI DB" as AIDB
-database "RAG DB" as RAGDB
-queue "RabbitMQ" as MQ
-participant "Azure Speech" as Azure
-participant "LLM Server" as LLM
-
-== 회의 시작 ==
-User -> FE: 회의 시작 버튼 클릭
-activate FE
-
-FE -> GW: POST /api/meetings/{meetingId}/start
-activate GW
-
-GW -> MS: 회의 시작 요청
-activate MS
-
-MS -> MDB: UPDATE meetings\nSET start_time = NOW(), status = 'in_progress'\n세션 생성
-activate MDB
-MDB --> MS: 회의 시작 시간 기록 완료
-deactivate MDB
-
-MS ->> MQ: MeetingStarted 이벤트 발행\n{meetingId, sessionId, startTime}
-activate MQ
-note right of MQ
- 이벤트: MeetingStarted
- Routing Key: meeting.started
-end note
-MQ -->> MS: ACK
-deactivate MQ
-
-MS --> GW: 200 OK\n{sessionId, status: "in_progress"}
-deactivate MS
-
-GW --> FE: 회의 세션 정보 반환
-deactivate GW
-
-FE --> User: 회의 진행 화면 표시
-deactivate FE
-
-== 음성 녹음 시작 (비동기) ==
-MQ ->> STT: MeetingStarted 이벤트 전달
-activate STT
-note right of STT
- 구독: meeting.started
- 큐: stt.meeting.started
-end note
-
-STT -> STTDB: INSERT INTO sessions\n(세션 생성)
-activate STTDB
-STTDB --> STT: 세션 ID 반환
-deactivate STTDB
-
-STT -> STT: 음성 녹음 시작\n(실시간 스트림)
-STT -->> MQ: ACK
-deactivate STT
-
-== 실시간 음성 인식 (5초 간격 반복) ==
-loop 발언 발생 (5초마다)
- User -> FE: 음성 발언
- activate FE
-
- FE -> STT: 오디오 스트림 전송
- activate STT
-
- STT -> Azure: 음성-텍스트 변환 요청\n(실시간 스트림)
- activate Azure
- Azure --> STT: 변환된 텍스트 반환\n{speaker, text, timestamp}
- deactivate Azure
-
- STT -> STTDB: INSERT INTO transcripts\n(발언 텍스트 저장)
- activate STTDB
- STTDB --> STT: OK
- deactivate STTDB
-
- STT ->> MQ: TranscriptReady 이벤트 발행\n{sessionId, speaker, text, timestamp}
- activate MQ
- note right of MQ
- 이벤트: TranscriptReady
- Routing Key: transcript.ready
- 주기: 5초
- end note
- MQ -->> STT: ACK
- deactivate MQ
- deactivate STT
-
- == AI 회의록 자동 작성 (비동기) ==
- MQ ->> AI: TranscriptReady 이벤트 전달
- activate AI
- note right of AI
- 구독: transcript.ready
- 큐: ai.transcript.ready
- end note
-
- AI -> AI: 회의 맥락 이해\n주제별 분류\n문장 다듬기
- AI -> LLM: 회의록 자동 작성 요청\n{context, transcript, history}
- activate LLM
- LLM --> AI: 회의록 초안 반환\n{summary, topics, keyPoints}
- deactivate LLM
-
- AI -> AIDB: INSERT INTO minutes_draft\n(회의록 초안 저장)
- activate AIDB
- AIDB --> AI: OK
- deactivate AIDB
-
- AI -> CS: 실시간 동기화 요청\n{delta, version}
- activate CS
-
- CS -> FE: WebSocket 푸시\n(회의록 델타 전송)
- activate FE
- FE -> User: 회의록 실시간 업데이트 표시
- deactivate FE
-
- CS --> AI: 동기화 완료
- deactivate CS
-
- AI -->> MQ: ACK
- deactivate AI
-
- == 전문용어 자동 감지 및 설명 (비동기) ==
- MQ ->> RAG: TranscriptReady 이벤트 전달
- activate RAG
- note right of RAG
- 구독: transcript.ready
- 큐: rag.transcript.ready
- end note
-
- RAG -> RAG: 전문용어 자동 감지\n(NER, 도메인 사전)
- RAG -> RAGDB: SELECT explanation\nFROM terms\nWHERE term IN (detected_terms)
- activate RAGDB
- RAGDB --> RAG: 용어 설명 반환
- deactivate RAGDB
-
- alt 맥락 기반 설명 필요
- RAG -> LLM: 맥락 기반 설명 생성 요청\n{term, context, domain}
- activate LLM
- LLM --> RAG: 맥락적 설명 반환
- deactivate LLM
-
- RAG -> RAGDB: INSERT INTO explanations\n(생성된 설명 저장)
- activate RAGDB
- RAGDB --> RAG: OK
- deactivate RAGDB
- end
-
- RAG -> FE: WebSocket 푸시\n(용어 설명 툴팁 데이터)
- activate FE
- FE -> User: 용어 설명 툴팁 표시
- deactivate FE
-
- RAG -->> MQ: ACK
- deactivate RAG
-end
-
-@enduml
diff --git a/design/backend/sequence/outer/회의예약및초대.puml b/design/backend/sequence/outer/회의예약및초대.puml
deleted file mode 100644
index d9839b8..0000000
--- a/design/backend/sequence/outer/회의예약및초대.puml
+++ /dev/null
@@ -1,91 +0,0 @@
-@startuml 회의예약및초대
-!theme mono
-
-title 회의 예약 및 초대 플로우 (UFR-MEET-010)
-
-actor "사용자" as User
-participant "Frontend" as FE
-participant "API Gateway" as GW
-participant "Meeting Service" as MS
-participant "User Service" as US
-participant "Redis" as Cache
-database "Meeting DB" as MDB
-queue "RabbitMQ" as MQ
-participant "Notification Service" as NS
-
-User -> FE: 회의 정보 입력\n(제목, 날짜/시간, 장소, 참석자)
-activate FE
-
-FE -> GW: POST /api/meetings\n(회의 예약 요청)
-activate GW
-
-GW -> MS: 회의 생성 요청
-activate MS
-
-== 참석자 정보 조회 (Cache-Aside 패턴) ==
-loop 각 참석자
- MS -> Cache: GET user:profile:{userId}
- activate Cache
-
- alt Cache Hit
- Cache --> MS: 사용자 정보 반환
- else Cache Miss
- Cache --> MS: null
- MS -> US: GET /api/users/{userId}\n(사용자 프로필 조회)
- activate US
- US --> MS: 사용자 정보 반환
- deactivate US
-
- MS -> Cache: SET user:profile:{userId}\n(TTL: 10분)
- Cache --> MS: OK
- end
- deactivate Cache
-end
-
-== 회의 정보 저장 ==
-MS -> MDB: INSERT INTO meetings\n(회의 정보 저장)
-activate MDB
-MDB --> MS: 회의 ID 반환
-deactivate MDB
-
-MS -> Cache: SET meeting:info:{meetingId}\n(TTL: 10분)
-activate Cache
-Cache --> MS: OK
-deactivate Cache
-
-== 초대 이벤트 발행 (비동기) ==
-MS ->> MQ: MeetingCreated 이벤트 발행\n{meetingId, title, attendees, datetime}
-activate MQ
-note right of MQ
- 이벤트: MeetingCreated
- Routing Key: meeting.created
-end note
-MQ -->> MS: ACK
-deactivate MQ
-
-MS --> GW: 회의 ID 반환\n{meetingId, status: "scheduled"}
-deactivate MS
-
-GW --> FE: 201 Created\n회의 생성 완료
-deactivate GW
-
-FE --> User: 회의 예약 완료 화면 표시
-deactivate FE
-
-== 초대 이메일 발송 (비동기) ==
-MQ ->> NS: MeetingCreated 이벤트 전달
-activate NS
-note right of NS
- 구독: meeting.created
- 큐: notification.meeting.created
-end note
-
-loop 각 참석자
- NS -> NS: 이메일 템플릿 생성\n(회의 제목, 일시, 장소, 초대 링크)
- NS -> NS: 이메일 발송
-end
-
-NS -->> MQ: ACK
-deactivate NS
-
-@enduml
diff --git a/design/backend/sequence/outer/회의종료및Todo추출.puml b/design/backend/sequence/outer/회의종료및Todo추출.puml
deleted file mode 100644
index 5681748..0000000
--- a/design/backend/sequence/outer/회의종료및Todo추출.puml
+++ /dev/null
@@ -1,194 +0,0 @@
-@startuml 회의종료및Todo추출
-!theme mono
-
-title 회의 종료 및 Todo 추출 플로우 (UFR-MEET-040/050, UFR-AI-020, UFR-TODO-010)
-
-actor "사용자" as User
-participant "Frontend" as FE
-participant "API Gateway" as GW
-participant "Meeting Service" as MS
-participant "AI Service" as AI
-participant "Todo Service" as TS
-participant "Notification Service" as NS
-participant "Redis" as Cache
-database "Meeting DB" as MDB
-database "AI DB" as AIDB
-database "Todo DB" as TODB
-queue "RabbitMQ" as MQ
-participant "LLM Server" as LLM
-
-== 회의 종료 ==
-User -> FE: 회의 종료 버튼 클릭
-activate FE
-
-FE -> GW: POST /api/meetings/{meetingId}/end
-activate GW
-
-GW -> MS: 회의 종료 요청
-activate MS
-
-MS -> MDB: UPDATE meetings\nSET end_time = NOW(), status = 'completed'\n통계 생성 (duration, 참석자 수, 발언 수)
-activate MDB
-MDB --> MS: 회의 종료 시간 기록 및 통계 생성 완료
-deactivate MDB
-
-MS ->> MQ: MeetingEnded 이벤트 발행\n{meetingId, sessionId, endTime, statistics}
-activate MQ
-note right of MQ
- 이벤트: MeetingEnded
- Routing Key: meeting.ended
-end note
-MQ -->> MS: ACK
-deactivate MQ
-
-MS --> GW: 200 OK\n{status: "completed", statistics}
-deactivate MS
-
-GW --> FE: 회의 종료 확인
-deactivate GW
-
-FE --> User: 회의 종료 화면 표시
-deactivate FE
-
-== AI Todo 자동 추출 (비동기) ==
-MQ ->> AI: MeetingEnded 이벤트 전달
-activate AI
-note right of AI
- 구독: meeting.ended
- 큐: ai.meeting.ended
-end note
-
-AI -> AIDB: SELECT transcript, summary\nFROM minutes_draft\nWHERE session_id = {sessionId}
-activate AIDB
-AIDB --> AI: 회의록 전체 내용 반환
-deactivate AIDB
-
-AI -> AI: 액션 아이템 식별\n(동사 패턴, 시간 표현, 담당자 언급)
-AI -> LLM: Todo 추출 요청\n{transcript, context, attendees}
-activate LLM
-LLM --> AI: Todo 목록 반환\n{tasks: [{description, assignee, dueDate, priority, linkedSection}]}
-deactivate LLM
-
-AI -> AIDB: UPDATE minutes_draft\nSET todos_extracted = TRUE\n(Todo 추출 완료 표시)
-activate AIDB
-AIDB --> AI: OK
-deactivate AIDB
-
-AI ->> MQ: TodoExtracted 이벤트 발행\n{meetingId, todos: [{description, assignee, dueDate, priority, linkedSection}]}
-activate MQ
-note right of MQ
- 이벤트: TodoExtracted
- Routing Key: todo.extracted
-end note
-MQ -->> AI: ACK
-deactivate MQ
-
-AI -->> MQ: ACK (MeetingEnded)
-deactivate AI
-
-== Todo 생성 및 할당 (비동기) ==
-MQ ->> TS: TodoExtracted 이벤트 전달
-activate TS
-note right of TS
- 구독: todo.extracted
- 큐: todo.extracted
-end note
-
-loop 각 Todo
- TS -> TODB: INSERT INTO todos\n(Todo 생성, 담당자 할당, 회의록 섹션 링크)
- activate TODB
- TODB --> TS: Todo ID 반환
- deactivate TODB
-
- TS -> Cache: SET todo:list:{userId}\n(사용자별 Todo 목록 캐싱, TTL: 5분)
- activate Cache
- Cache --> TS: OK
- deactivate Cache
-
- TS ->> MQ: TodoCreated 이벤트 발행\n{todoId, assignee, description, dueDate, linkedSection}
- activate MQ
- note right of MQ
- 이벤트: TodoCreated
- Routing Key: todo.created
- end note
- MQ -->> TS: ACK
- deactivate MQ
-end
-
-TS -->> MQ: ACK (TodoExtracted)
-deactivate TS
-
-== Todo 할당 알림 (비동기) ==
-MQ ->> NS: TodoCreated 이벤트 전달
-activate NS
-note right of NS
- 구독: todo.created
- 큐: notification.todo.created
-end note
-
-NS -> NS: 알림 템플릿 생성\n(Todo 설명, 기한, 회의록 링크)
-NS -> NS: 담당자에게 알림 발송\n(이메일, 푸시 알림)
-
-NS -->> MQ: ACK
-deactivate NS
-
-== 회의 통계 및 Todo 목록 조회 ==
-User -> FE: 회의 상세 화면 조회
-activate FE
-
-FE -> GW: GET /api/meetings/{meetingId}/summary
-activate GW
-
-GW -> MS: 회의 통계 및 Todo 목록 조회
-activate MS
-
-MS -> Cache: GET meeting:info:{meetingId}
-activate Cache
-
-alt Cache Hit
- Cache --> MS: 회의 정보 반환
-else Cache Miss
- Cache --> MS: null
- MS -> MDB: SELECT * FROM meetings\nWHERE meeting_id = {meetingId}
- activate MDB
- MDB --> MS: 회의 정보 반환
- deactivate MDB
-
- MS -> Cache: SET meeting:info:{meetingId}\n(TTL: 10분)
- Cache --> MS: OK
-end
-deactivate Cache
-
-MS -> TS: GET /api/todos?meetingId={meetingId}
-activate TS
-
-TS -> Cache: GET todo:list:meeting:{meetingId}
-activate Cache
-
-alt Cache Hit
- Cache --> TS: Todo 목록 반환
-else Cache Miss
- Cache --> TS: null
- TS -> TODB: SELECT * FROM todos\nWHERE meeting_id = {meetingId}
- activate TODB
- TODB --> TS: Todo 목록 반환
- deactivate TODB
-
- TS -> Cache: SET todo:list:meeting:{meetingId}\n(TTL: 5분)
- Cache --> TS: OK
-end
-deactivate Cache
-
-TS --> MS: Todo 목록 반환
-deactivate TS
-
-MS --> GW: 회의 통계 및 Todo 목록 반환\n{statistics, todos}
-deactivate MS
-
-GW --> FE: 200 OK
-deactivate GW
-
-FE --> User: 회의 통계 및 Todo 목록 표시
-deactivate FE
-
-@enduml
diff --git a/design/userstory.md b/design/userstory.md
index e29685f..b9418d6 100644
--- a/design/userstory.md
+++ b/design/userstory.md
@@ -26,14 +26,24 @@
## 마이크로서비스 구성
-1. **User** - 사용자 인증 및 권한 관리
-2. **Meeting** - 회의 관리, 회의록 생성 및 관리, 회의록 공유
+1. **User** - 사용자 인증 (LDAP 연동, JWT 토큰 발급/검증)
+2. **Meeting** - 회의, 회의록, Todo, 실시간 협업 통합 관리
+ - 회의 관리: 회의 예약, 시작, 종료
+ - 회의록 관리: 회의록 생성, 수정, 확정, 공유
+ - Todo 관리: Todo 할당, 진행 상황 추적, 회의록 양방향 연결
+ - 실시간 협업: WebSocket 기반 실시간 동기화, 버전 관리, 충돌 해결
+ - 템플릿 관리: 회의록 템플릿 관리
+ - 통계 생성: 회의 및 Todo 통계
3. **STT** - 음성 녹음 관리, 음성-텍스트 변환, 화자 식별 (기본 기능)
-4. **AI** - LLM 기반 회의록 자동 작성, Todo 자동 추출, 프롬프팅 기반 회의록 개선
-5. **RAG** - 맥락 기반 용어 설명, 관련 문서 검색 및 연결, 업무 이력 통합
-6. **Collaboration** - 실시간 동기화, 버전 관리, 충돌 해결
-7. **Todo** - Todo 할당 및 관리, 진행 상황 추적, 회의록 실시간 연동
-8. **Notification** - 알림 발송 및 리마인더 관리
+4. **AI** - AI 기반 회의록 자동화, Todo 추출, 지능형 검색 (RAG 통합)
+ - LLM 기반 회의록 자동 작성
+ - Todo 자동 추출 및 담당자 식별
+ - 프롬프팅 기반 회의록 개선 (1Page 요약, 핵심 요약 등)
+ - 관련 회의록 자동 연결 (벡터 유사도 검색)
+ - 전문용어 자동 감지 및 맥락 기반 설명 생성 (RAG)
+ - 과거 회의록 및 사내 문서 검색
+ - 업무 이력 통합
+5. **Notification** - 알림 발송 및 리마인더 관리
---
@@ -55,6 +65,11 @@ AFR-USER-020: [대시보드] 사용자로서 | 나는, 회의록 서비스의
- 시나리오: 대시보드 조회
로그인 후 대시보드에 접근하면 | 예정된 회의, 진행 중 Todo, 최근 회의록 등 주요 정보가 표시되고 | 플로팅 액션 버튼을 통해 새 회의를 시작하거나 예약할 수 있다.
+ **변경사항 (논리 아키텍처)**:
+ - 프론트엔드가 Meeting Service에 직접 API 요청하여 회의, Todo, 회의록 정보 조회
+ - User Service는 인증만 담당 (JWT 토큰 검증)
+ - 모든 API 요청에 사용자 정보(userId, userName, email) 포함
+
[대시보드 주요 위젯]
- 사용자 인사말 (이름 표시)
- 통계 카드:
@@ -110,7 +125,7 @@ AFR-USER-020: [대시보드] 사용자로서 | 나는, 회의록 서비스의
---
-2. Meeting 서비스
+2. Meeting 서비스 (회의, 회의록, Todo, 실시간 협업 통합)
1) 회의 준비 및 관리
UFR-MEET-010: [회의예약] 회의록 작성자로서 | 나는, 회의를 효율적으로 준비하기 위해 | 회의를 예약하고 참석자를 초대하고 싶다.
- 시나리오: 회의 예약 및 참석자 초대
@@ -358,7 +373,7 @@ UFR-MEET-060: [회의록공유] 회의록 작성자로서 | 나는, 회의 내
---
-3. STT 서비스 (기본 기능)
+3. STT 서비스 (음성 인식 및 변환 - 기본 기능)
1) 음성 인식 및 변환
UFR-STT-010: [음성녹음인식] 회의 참석자로서 | 나는, 발언 내용이 자동으로 기록되기 위해 | 음성이 실시간으로 녹음되고 인식되기를 원한다.
- 시나리오: 음성 녹음 및 발언 인식
@@ -422,7 +437,7 @@ UFR-STT-020: [텍스트변환] 회의록 시스템으로서 | 나는, 인식된
---
-4. AI 서비스 (차별화 포인트)
+4. AI 서비스 (AI 기반 회의록 자동화, Todo 추출, 지능형 검색 - RAG 통합)
1) AI 회의록 작성
UFR-AI-010: [회의록자동작성] 회의록 작성자로서 | 나는, 회의록 작성 부담을 줄이기 위해 | AI가 발언 내용을 자동으로 정리하여 회의록을 작성하기를 원한다.
- 시나리오: AI 회의록 자동 작성
@@ -573,12 +588,18 @@ UFR-AI-040: [관련회의록연결] 회의록 작성자로서 | 나는, 이전
---
-5. RAG 서비스 (차별화 포인트)
+5. AI 서비스 (지능형 검색 - RAG 기능, AI Service에 통합됨)
1) 맥락 기반 용어 설명 (강화)
UFR-RAG-010: [전문용어감지] 회의록 작성자로서 | 나는, 업무 지식이 없어도 회의록을 정확히 작성하기 위해 | 전문용어가 자동으로 감지되고 맥락에 맞는 설명을 제공받고 싶다.
- 시나리오: 맥락 기반 전문용어 자동 감지
회의록이 작성되는 상황에서 | 시스템이 회의록 텍스트를 분석하면 | 전문용어가 자동으로 감지되고 맥락에 맞는 설명이 준비된다.
+ **변경사항 (논리 아키텍처)**:
+ - AI Service에 RAG 기능 통합
+ - RAG와 AI 모두 LLM 기반 처리로 긴밀하게 연동
+ - 동일한 벡터 임베딩 모델 및 LLM 공유 가능
+ - 회의록 자동 작성 시 용어 설명이 병렬 처리되어 효율적
+
[전문용어 감지 처리]
- 회의록 텍스트 실시간 분석
- 용어 사전과 비교
@@ -655,12 +676,17 @@ UFR-RAG-020: [맥락기반용어설명] 회의록 작성자로서 | 나는, 전
---
-6. Collaboration 서비스
+6. Meeting 서비스 (실시간 협업 - Meeting Service에 통합됨)
1) 실시간 협업
UFR-COLLAB-010: [회의록수정동기화] 회의 참석자로서 | 나는, 회의록을 함께 검증하기 위해 | 회의록을 수정하고 실시간으로 다른 참석자와 동기화하고 싶다.
- 시나리오: 회의록 실시간 수정 및 동기화
회의록 초안이 작성된 상황에서 | 참석자가 회의록 내용을 수정하면 | 수정 사항이 버전 관리되고 웹소켓을 통해 모든 참석자에게 즉시 동기화된다.
+ **변경사항 (논리 아키텍처)**:
+ - Meeting Service에 실시간 협업 기능 통합
+ - WebSocket, 버전 관리, 충돌 해결이 Meeting Service 내부에서 처리됨
+ - 서비스 간 통신 오버헤드 제거, 성능 향상
+
[회의록 수정 처리]
- 수정 내용 검증
- 수정 권한 확인
@@ -766,12 +792,17 @@ UFR-COLLAB-030: [검증완료] 회의 참석자로서 | 나는, 회의록의 정
---
-7. Todo 서비스 (차별화 포인트)
+7. Meeting 서비스 (Todo 관리 - Meeting Service에 통합됨, 차별화 포인트)
1) 실시간 Todo 연결 (강화)
UFR-TODO-010: [Todo할당] Todo 시스템으로서 | 나는, AI가 추출한 Todo를 담당자에게 전달하기 위해 | Todo를 실시간으로 할당하고 회의록과 연결하고 싶다.
- 시나리오: Todo 실시간 할당 및 회의록 연결
AI가 Todo를 추출한 상황에서 | 시스템이 Todo를 등록하고 담당자를 지정하면 | Todo가 실시간으로 할당되고 회의록의 해당 위치와 연결되며 담당자에게 즉시 알림이 발송된다.
+ **변경사항 (논리 아키텍처)**:
+ - Meeting Service에 Todo 관리 기능 통합
+ - Todo와 회의록이 동일 트랜잭션 내에서 처리 가능
+ - 회의록-Todo 양방향 연결이 내부 메서드 호출로 처리됨 (10배 빠름)
+
[Todo 등록]
- Todo 정보 저장
- Todo ID 생성
@@ -855,4 +886,97 @@ UFR-TODO-030: [Todo완료처리] Todo 담당자로서 | 나는, 완료된 Todo
- M/8
+---
+
+## 논리 아키텍처 반영 사항 요약
+
+### 1. 마이크로서비스 구성 변경 (v2.0)
+
+**변경 전 (v1.0)**: 8개 마이크로서비스
+- User, Meeting, STT, AI, RAG, Collaboration, Todo, Notification
+
+**변경 후 (v2.0)**: 5개 마이크로서비스
+- User, Meeting, STT, AI, Notification
+
+### 2. 주요 변경사항
+
+#### 2.1 User Service 역할 변경
+- **변경 전**: 사용자 인증 및 권한 관리, 대시보드 정보 제공
+- **변경 후**: 사용자 인증 전용 (LDAP 연동, JWT 토큰 발급/검증)
+- **이유**:
+ - 프론트엔드가 모든 API 요청에 사용자 정보(userId, userName, email) 포함
+ - User Service 동기 호출 제거 → 성능 향상, 장애 격리
+ - 네트워크 지연 제거 (~100ms 개선)
+
+#### 2.2 Meeting Service 통합
+- **통합 서비스**: Meeting + Collaboration + Todo
+- **핵심 기능**:
+ - 회의 관리: 회의 예약, 시작, 종료
+ - 회의록 관리: 회의록 생성, 수정, 확정, 공유
+ - Todo 관리: Todo 할당, 진행 상황 추적, 회의록 양방향 연결
+ - 실시간 협업: WebSocket 기반 실시간 동기화, 버전 관리, 충돌 해결
+- **이점**:
+ - 서비스 간 통신 오버헤드 제거
+ - Todo와 회의록이 동일 트랜잭션 내에서 처리 가능
+ - 일관성 향상, 개발 효율성 증가
+ - 내부 메서드 호출로 처리 속도 10배 향상
+
+#### 2.3 AI Service 통합
+- **통합 서비스**: AI + RAG
+- **핵심 기능**:
+ - LLM 기반 회의록 자동 작성
+ - Todo 자동 추출 및 담당자 식별
+ - 프롬프팅 기반 회의록 개선
+ - 관련 회의록 자동 연결 (벡터 유사도 검색)
+ - 전문용어 자동 감지 및 맥락 기반 설명 생성 (RAG)
+ - 과거 회의록 및 사내 문서 검색
+- **이점**:
+ - RAG와 AI 모두 LLM 기반 처리로 긴밀하게 연동
+ - 동일한 벡터 임베딩 모델 및 LLM 공유 가능
+ - 회의록 자동 작성 시 용어 설명이 병렬 처리되어 효율적
+ - 서비스 개수 감소로 운영 복잡도 감소
+
+### 3. 유저스토리 영향도
+
+#### 3.1 변경 없음
+- STT 서비스 유저스토리: UFR-STT-010, UFR-STT-020
+- Notification 서비스 유저스토리: 알림 발송 관련
+
+#### 3.2 서비스 통합에 따른 변경
+- **Collaboration → Meeting**: UFR-COLLAB-010, UFR-COLLAB-020, UFR-COLLAB-030
+- **Todo → Meeting**: UFR-TODO-010, UFR-TODO-030
+- **RAG → AI**: UFR-RAG-010, UFR-RAG-020
+
+#### 3.3 기능적 변경
+- **AFR-USER-020 (대시보드)**:
+ - 프론트엔드가 Meeting Service에 직접 API 요청
+ - User Service는 인증만 담당
+
+### 4. 성능 개선 효과
+
+| 항목 | 개선 전 | 개선 후 | 효과 |
+|------|---------|---------|------|
+| User Service 동기 호출 | ~100ms | 제거 | 네트워크 지연 제거 |
+| Todo 처리 | 서비스 간 통신 | 내부 메서드 호출 | 10배 빠름 |
+| 실시간 동기화 | 서비스 간 REST API | Meeting 내부 처리 | 지연 감소 |
+| 서비스 개수 | 8개 | 5개 | 운영 복잡도 감소 |
+
+### 5. 차별화 전략 유지
+
+논리 아키텍처 변경에도 불구하고 차별화 포인트는 그대로 유지됩니다:
+
+- ✅ **맥락 기반 용어 설명**: AI Service에서 RAG 기능 통합 제공
+- ✅ **강화된 Todo 연결**: Meeting Service에서 더 강력한 통합 제공
+- ✅ **프롬프팅 기반 회의록 개선**: AI Service에서 계속 제공
+- ✅ **지능형 회의 진행 지원**: AI Service에서 계속 제공
+
+---
+
+## 문서 이력
+
+| 버전 | 작성일 | 작성자 | 변경 내용 |
+|------|--------|--------|----------|
+| 1.0 | 2025-01-20 | 도그냥 (서비스 기획자) | 초안 작성 (8개 마이크로서비스) |
+| 2.0 | 2025-01-22 | 길동 (아키텍트) | 논리 아키텍처 반영 (5개 마이크로서비스로 단순화) |
+
---
\ No newline at end of file