설계서 업데이트: 실제 구현 반영 및 불필요한 다이어그램 정리

- 외부 시퀀스 다이어그램 업데이트
  * 회의예약: 템플릿 선택 플로우 추가, API 경로 수정 (/api/meetings/reserve)
  * 회의시작: SessionResponse 구조 반영 (sessionId, minutesId, websocketUrl 등)
  * 회의종료: AI 분석 동기 처리 및 MeetingEndResponse 구조 반영, RAG용 이벤트 추가

- 불필요한 다이어그램 삭제
  * 외부: 대시보드조회.puml (Meeting Service로 이동), Todo완료및회의록반영.puml (통합됨)
  * 내부: meeting-대시보드조회.puml, meeting-최종회의록확정.puml (중복)

- 실제 API Controller 구현과 일치하도록 API 경로 및 응답 구조 정확히 반영

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
yabo0812 2025-10-29 18:20:15 +09:00
parent bca8d6e729
commit ed9fa6f934
9 changed files with 89 additions and 473 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,129 +0,0 @@
@startuml meeting-대시보드조회
!theme mono
title Meeting Service - 대시보드조회 내부 시퀀스
participant "DashboardController" as Controller
participant "DashboardService" as Service
participant "MeetingRepository" as MeetingRepo
participant "TodoRepository" as TodoRepo
participant "MinutesRepository" as MinutesRepo
database "Redis Cache<<E>>" as Cache
database "Meeting DB<<E>>" as DB
[-> Controller: GET /dashboard
activate Controller
note over Controller
사용자 정보는 헤더에서 추출
(userId, userName, email)
end note
Controller -> Service: getDashboardData(userId)
activate Service
' 캐시 조회
Service -> Cache: GET dashboard:{userId}
activate Cache
Cache --> Service: 캐시 조회 결과
deactivate Cache
alt Cache Hit
Service --> Service: 캐시 데이터 반환
else Cache Miss
' 예정된 회의 조회
Service -> MeetingRepo: findUpcomingMeetings(userId)
activate MeetingRepo
MeetingRepo -> DB: 예정된 회의 조회
activate DB
DB --> MeetingRepo: 예정된 회의 목록
deactivate DB
MeetingRepo --> Service: List<Meeting>
deactivate MeetingRepo
' 진행 중 Todo 조회
Service -> TodoRepo: findActiveTodos(userId)
activate TodoRepo
TodoRepo -> DB: 진행 중 Todo 조회
activate DB
DB --> TodoRepo: 진행 중 Todo 목록
deactivate DB
TodoRepo --> Service: List<Todo>
deactivate TodoRepo
' 최근 회의록 조회
Service -> MinutesRepo: findRecentMinutes(userId)
activate MinutesRepo
MinutesRepo -> DB: 최근 회의록 조회
activate DB
DB --> MinutesRepo: 최근 회의록 목록
deactivate DB
MinutesRepo --> Service: List<Minutes>
deactivate MinutesRepo
' 통계 정보 조회
Service -> MeetingRepo: countUpcomingMeetings(userId)
activate MeetingRepo
MeetingRepo -> DB: 예정된 회의 개수 조회
activate DB
DB --> MeetingRepo: 예정된 회의 개수
deactivate DB
MeetingRepo --> Service: int count
deactivate MeetingRepo
Service -> TodoRepo: countActiveTodos(userId)
activate TodoRepo
TodoRepo -> DB: 진행 중 Todo 개수 조회
activate DB
DB --> TodoRepo: 진행 중 Todo 개수
deactivate DB
TodoRepo --> Service: int count
deactivate TodoRepo
Service -> TodoRepo: calculateTodoCompletionRate(userId)
activate TodoRepo
TodoRepo -> DB: Todo 완료율 조회
activate DB
DB --> TodoRepo: Todo 완료율
deactivate DB
TodoRepo --> Service: double rate
deactivate TodoRepo
note over Service
비즈니스 로직:
- 데이터 조합 및 정제
- DTO 변환
- 통계 계산
end note
Service -> Service: 대시보드 데이터 조합
' 캐시 저장
Service -> Cache: SET dashboard:{userId}\n(TTL: 5분)
activate Cache
Cache --> Service: 캐시 저장 완료
deactivate Cache
end
Service --> Controller: DashboardResponse
deactivate Service
note over Controller
응답 데이터 구조:
{
"upcomingMeetings": [...],
"activeTodos": [...],
"recentMinutes": [...],
"statistics": {
"upcomingMeetingsCount": n,
"activeTodosCount": n,
"todoCompletionRate": n
}
}
end note
return 200 OK\nDashboardResponse
deactivate Controller
@enduml

View File

@ -1,118 +0,0 @@
@startuml
!theme mono
title 최종 회의록 확정 내부 시퀀스
participant "API Gateway<<E>>" as Gateway
participant "MinutesController" as Controller
participant "MeetingService" as Service
participant "Meeting" as Domain
participant "TranscriptService" as TranscriptService
participant "MeetingRepository" as Repository
database "PostgreSQL<<E>>" as DB
database "Redis Cache<<E>>" as Cache
queue "Event Hub<<E>>" as EventHub
Gateway -> Controller: POST /api/minutes/{minutesId}/finalize
activate Controller
Controller -> Service: confirmTranscript(meetingId)
activate Service
Service -> Repository: findById(meetingId)
activate Repository
Repository -> DB: 회의 정보 조회\n(회의ID 기준)
activate DB
DB --> Repository: meeting_row
deactivate DB
Repository --> Service: Meeting entity
deactivate Repository
Service -> Domain: confirmTranscript()
activate Domain
Domain -> Domain: validateCanConfirm()
note right of Domain
회의록 확정 검증 규칙:
1. 상태 검증:
- 회의 상태 = COMPLETED (종료됨)
- 회의록 상태 = DRAFT (작성중)
✗ IN_PROGRESS → 400 Bad Request
2. 권한 검증:
- 확정 요청자 = 회의 생성자 OR
- 확정 요청자 ∈ 참석자 목록
✗ 권한 없음 → 403 Forbidden
3. 필수 항목 검증:
- 회의록 제목: NOT NULL, 길이 >= 5
- 참석자 목록: 최소 1명 이상
- 주요 논의 내용: NOT NULL, 길이 >= 20
- 결정 사항: 최소 1개 이상 OR
"결정사항 없음" 명시적 표시
✗ 누락 → 400 Bad Request
(누락 항목 목록 반환)
4. 데이터 무결성:
- 섹션별 내용 완결성 확인
- 참조 링크 유효성 확인
- 첨부 파일 접근 가능 여부
✗ 무결성 위반 → 400 Bad Request
5. 이력 검증:
- 마지막 수정 후 24시간 경과 경고
- 미승인 AI 제안 존재 시 알림
⚠️ 경고만 표시, 진행 가능
end note
Domain -> Domain: changeStatus(CONFIRMED)
Domain --> Service: updated Meeting
deactivate Domain
Service -> TranscriptService: lockTranscript(meetingId)
activate TranscriptService
note right of TranscriptService
회의록 잠금:
- 더 이상 수정 불가
- 버전 고정
end note
TranscriptService --> Service: lockedTranscript
deactivate TranscriptService
Service -> Repository: save(meeting)
activate Repository
Repository -> DB: 회의 상태 업데이트\n(상태='확정', 확정일시)
activate DB
DB --> Repository: affected_rows
deactivate DB
Repository --> Service: savedMeeting
deactivate Repository
Service -> Cache: SET meeting:{id}\n(TTL: 10분)
activate Cache
note right of Cache
회의 정보 캐싱:
- TTL: 10분
- 자동 만료
end note
Cache --> Service: OK
deactivate Cache
Service ->> EventHub: publish(MinutesFinalized)
activate EventHub
note right of EventHub
비동기 이벤트:
- 참석자에게 최종본 알림
- 공유 서비스로 전송
end note
deactivate EventHub
Service --> Controller: MeetingResponse
deactivate Service
Controller --> Gateway: 200 OK
deactivate Controller
@enduml

View File

@ -1,74 +0,0 @@
@startuml Todo완료및회의록반영
!theme mono
title Todo 완료 및 회의록 반영 플로우
actor "담당자" as User
participant "Web App" as Web
participant "API Gateway" as Gateway
participant "Meeting Service" as Meeting
participant "Redis Cache" as Redis
participant "Notification Service" as Notification
note over Gateway
라우팅 규칙:
/api/meetings/** → Meeting Service
/api/minutes/** → Meeting Service
/api/dashboard → User Service
/api/notifications/** → Notification Service
/api/auth/** → User Service
/api/todos/** → Meeting Service
end note
autonumber
== Todo 완료 처리 ==
User -> Web: Todo 완료 버튼 클릭
activate Web
Web -> Gateway: PATCH /api/todos/{todoId}/complete\n(userId, userName, completedAt)
activate Gateway
Gateway -> Meeting: PATCH /todos/{todoId}/complete\n(userId, userName, completedAt)
activate Meeting
Meeting -> Meeting: Todo 상태 업데이트\n- 완료 시간 기록\n- 완료자 정보 저장\n- 상태: COMPLETED
Meeting -> Meeting: 관련 회의록에 완료 상태 반영\n- 회의록 섹션 업데이트\n- 완료 표시 (체크 아이콘)\n- 완료 시간 및 완료자 기록
Meeting -> Meeting: DB에 저장
== 캐시 무효화 ==
Meeting --> Redis: DELETE dashboard:{assigneeId}
note right
대시보드 캐시 무효화
end note
Meeting --> Redis: DELETE minutes:detail:{minutesId}
note right
회의록 상세 캐시 무효화
end note
== 이벤트 발행 ==
Meeting -> Notification: NotificationRequest 이벤트 발행
activate Notification
note right
이벤트 데이터:
- 발송수단: EMAIL
- 대상자: 회의록 작성자
- 메시지: Todo 완료 안내
- 메타데이터: todoId, 완료자, 완료 시간
end note
Meeting --> Gateway: 200 OK\n{todoId, status: COMPLETED,\ncompletedAt, completedBy}
deactivate Meeting
Gateway --> Web: 200 OK\n(Todo 완료 정보)
deactivate Gateway
Web --> User: Todo 완료 표시
deactivate Web
== 알림 발송 ==
Notification -> Notification: NotificationRequest 이벤트 구독
Notification -> Notification: 알림 메시지 생성\n- 수신자: 회의록 작성자\n- 내용: "Todo 완료됨"
Notification --> Notification: 이메일 발송\n(회의록 작성자에게)
note right
외부 Email Service 연동
end note
deactivate Notification
@enduml

View File

@ -1,113 +0,0 @@
@startuml 대시보드조회
!theme mono
title 대시보드조회 외부 시퀀스
actor "사용자" as User
participant "Web App" as Frontend
participant "API Gateway" as Gateway
participant "User Service" as UserService
participant "Meeting Service" as MeetingService
database "Redis Cache" as Cache
database "User DB" as UserDB
database "Meeting DB" as MeetingDB
note over Gateway
라우팅 규칙:
/api/meetings/** → Meeting Service
/api/minutes/** → Meeting Service
/api/dashboard → User Service
/api/notifications/** → Notification Service
/api/auth/** → User Service
/api/todos/** → Meeting Service
end note
User -> Frontend: 대시보드 접근
activate Frontend
Frontend -> Gateway: GET /api/dashboard?\npage=1&size=10&sort=createdAt,desc
note right
페이지네이션 파라미터:
- page: 페이지 번호 (기본값: 1)
- size: 페이지 크기 (기본값: 10)
- sort: 정렬 기준 (기본값: createdAt,desc)
end note
activate Gateway
Gateway -> UserService: GET /dashboard?\npage=1&size=10&sort=createdAt,desc
activate UserService
' 캐시 조회
UserService -> Cache: GET dashboard:{userId}
activate Cache
Cache --> UserService: 캐시 조회 결과
deactivate Cache
alt Cache Hit
UserService -> UserService: 캐시 데이터 반환
else Cache Miss
par 병렬 데이터 조회
' Meeting Service 호출
UserService -> MeetingService: GET /api/v1/dashboard
note right
Meeting Service에서 조회:
- 예정된 회의 목록
- 진행 중 Todo 목록
- 최근 회의록 목록
- 공유받은 회의록
- 통계 정보
end note
activate MeetingService
MeetingService -> Cache: GET dashboard:{userId}
activate Cache
Cache --> MeetingService: 캐시 조회 결과
deactivate Cache
alt Meeting Service 캐시 미존재
MeetingService -> MeetingDB: 회의/Todo/회의록 데이터 조회
activate MeetingDB
MeetingDB --> MeetingService: 조회 결과
deactivate MeetingDB
MeetingService -> Cache: SET dashboard:{userId}\n(TTL: 5분)
activate Cache
Cache --> MeetingService: 캐시 저장
deactivate Cache
end
MeetingService --> UserService: 회의 관련 데이터 응답\n{\n "upcomingMeetings": [...],\n "activeTodos": [...],\n "recentMinutes": [...],\n "sharedMinutes": [...],\n "statistics": {...}\n}
deactivate MeetingService
else
' User Service 자체 데이터 조회
UserService -> UserDB: 최근 활동 내역 조회
activate UserDB
UserDB --> UserService: 활동 내역
deactivate UserDB
end
UserService -> UserService: 데이터 통합 및 조합
note right
대시보드 데이터 구성:
- Meeting Service 데이터
- User Service 활동 내역
- 통합 통계 정보
end note
UserService -> Cache: SET dashboard:{userId}\n(TTL: 5분)
activate Cache
Cache --> UserService: 캐시 저장 완료
deactivate Cache
end
UserService --> Gateway: 대시보드 데이터 응답\n{\n "upcomingMeetings": [...],\n "activeTodos": [...],\n "recentMinutes": [...],\n "recentActivities": [...],\n "statistics": {...},\n "pagination": {\n "page": 1,\n "size": 10,\n "totalElements": 45,\n "totalPages": 5,\n "hasNext": true\n }\n}
deactivate UserService
Gateway --> Frontend: 200 OK\n대시보드 데이터 + 페이지네이션 정보
deactivate Gateway
Frontend -> Frontend: 대시보드 화면 렌더링\n- 예정된 회의 표시\n- Todo 목록 표시\n- 최근 회의록 표시\n- 통계 차트 표시
Frontend --> User: 대시보드 화면 표시
deactivate Frontend
@enduml

View File

@ -33,7 +33,7 @@ activate Gateway
Gateway -> Meeting: POST /meetings/{meetingId}/start Gateway -> Meeting: POST /meetings/{meetingId}/start
activate Meeting activate Meeting
Meeting -> Meeting: 회의 세션 생성 Meeting -> Meeting: 회의 세션 생성\n- Session 객체 생성\n- Minutes 초기화 (DRAFT)\n- WebSocket URL 생성
Meeting -> STT: POST /stt/recording/start\n(meetingId, participantIds) Meeting -> STT: POST /stt/recording/start\n(meetingId, participantIds)
activate STT activate STT
@ -47,7 +47,7 @@ STT -> STT: 음성 녹음 준비 및 시작
STT --> Meeting: 200 OK (recordingId) STT --> Meeting: 200 OK (recordingId)
deactivate STT deactivate STT
Meeting --> Gateway: 201 Created Meeting --> Gateway: 201 Created\n- sessionId\n- meetingId\n- minutesId\n- status (IN_PROGRESS)\n- websocketUrl\n- sessionToken\n- startedAt\n- expiresAt
deactivate Meeting deactivate Meeting
Gateway --> Frontend: 201 Created Gateway --> Frontend: 201 Created

View File

@ -27,7 +27,7 @@ end note
User -> WebApp: 회의 정보 입력\n(제목, 날짜/시간, 장소, 참석자) User -> WebApp: 회의 정보 입력\n(제목, 날짜/시간, 장소, 참석자)
activate WebApp activate WebApp
WebApp -> Gateway: POST /api/meetings\n+ JWT 토큰\n+ 사용자 정보 (userId, userName, email) WebApp -> Gateway: POST /api/meetings/reserve\n+ JWT 토큰\n+ 사용자 정보 (userId, userName, email)
activate Gateway activate Gateway
Gateway -> Meeting: 회의 생성 요청 Gateway -> Meeting: 회의 생성 요청
@ -69,6 +69,30 @@ deactivate Gateway
WebApp --> User: 회의 예약 완료 표시\n캘린더에 자동 등록 WebApp --> User: 회의 예약 완료 표시\n캘린더에 자동 등록
deactivate WebApp deactivate WebApp
== 템플릿 선택 (선택 사항) ==
User -> WebApp: 템플릿 선택\n(일반, 스크럼, 킥오프, 주간)
activate WebApp
WebApp -> Gateway: PUT /api/meetings/{meetingId}/template\n+ JWT 토큰\n+ templateId
activate Gateway
Gateway -> Meeting: 템플릿 적용 요청
activate Meeting
Meeting -> MeetingDB: 템플릿 정보 저장
activate MeetingDB
MeetingDB --> Meeting: 저장 완료
deactivate MeetingDB
Meeting --> Gateway: 200 OK\n템플릿 적용 완료
deactivate Meeting
Gateway --> WebApp: 템플릿 적용 응답
deactivate Gateway
WebApp --> User: 템플릿 적용 완료
deactivate WebApp
== 참석자 초대 알림 (비동기) == == 참석자 초대 알림 (비동기) ==
EventHub -> Notification: NotificationRequest 이벤트 수신\n(Consumer Group: notification-service-group) EventHub -> Notification: NotificationRequest 이벤트 수신\n(Consumer Group: notification-service-group)

View File

@ -32,8 +32,15 @@ note right
end note end note
Gateway -> Meeting: 회의 종료 요청 Gateway -> Meeting: 회의 종료 요청
Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의 통계 생성\n (총 시간, 참석자 수, 발언 횟수 등) Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의록 생성 (DRAFT 상태)\n- 회의 통계 생성\n (총 시간, 참석자 수 등)
Meeting -> Meeting: DB 저장
Meeting -> AI: AI 분석 요청\n- 키워드 추출\n- 안건별 요약 생성\n- Todo 항목 추출
activate AI
AI -> AI: AI 분석 수행
AI --> Meeting: AI 분석 결과\n(keywords, agendaSummaries, todos)
deactivate AI
Meeting -> Meeting: DB 저장\n- Meeting 종료 상태\n- Minutes 생성 (DRAFT)\n- AgendaSection 저장\n- Todo 저장
Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId}) Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId})
Meeting -> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime) Meeting -> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime)
@ -55,9 +62,9 @@ end note
EventHub --> Meeting: 발행 완료 EventHub --> Meeting: 발행 완료
deactivate EventHub deactivate EventHub
Meeting -> Gateway: 202 Accepted\n(회의 종료 완료) Meeting -> Gateway: 200 OK\n- minutesId\n- 회의 통계 (참석자 수, 시간, 안건 수, Todo 수)\n- 키워드 목록\n- 안건별 AI 요약 (한줄 요약, 상세 요약)\n- Todo 목록
Gateway -> WebApp: 회의 종료 완료 응답 Gateway -> WebApp: 회의 종료 완료 응답\n(MeetingEndResponse)
WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등) WebApp -> User: 회의 종료 화면 표시\n- 통계 카드\n- 키워드 태그\n- 안건 아코디언 (AI 요약 + Todo)
== 비동기 처리 - STT 종료 == == 비동기 처리 - STT 종료 ==
EventHub --> STT: MeetingEnded 이벤트 수신 EventHub --> STT: MeetingEnded 이벤트 수신
@ -76,43 +83,62 @@ note right
end note end note
== 최종 회의록 확정 == == 최종 회의록 확정 ==
User -> WebApp: 최종 회의록 확정 버튼 클릭 User -> WebApp: 최종 회의록 확정 버튼 클릭\n(회의록 수정 화면 또는 회의 종료 화면)
WebApp -> Gateway: POST /api/minutes/{minutesId}/finalize WebApp -> Gateway: POST /api/meetings/minutes/{minutesId}/finalize
note right note right
요청 헤더에 JWT 토큰 포함 요청 헤더에 JWT 토큰 포함
요청 바디에 사용자 정보 포함 X-User-Id, X-User-Name, X-User-Email
end note end note
Gateway -> Meeting: 회의록 확정 요청 Gateway -> Meeting: 회의록 확정 요청
Meeting -> Meeting: 필수 항목 검사\n- 회의 제목\n- 참석자 목록\n- 주요 논의 내용\n- 결정 사항 Meeting -> Meeting: 회의록 상태 변경\n- DRAFT → FINALIZED\n- finalizedAt 기록\n- finalizedBy 기록
alt 필수 항목 미작성 Meeting -> Meeting: DB 저장\n- Minutes 상태 업데이트
Meeting -> Gateway: 400 Bad Request\n(누락된 항목 정보) Meeting -> Meeting: Redis 캐시 저장\n(확정된 회의록, TTL: 10분)
Gateway -> WebApp: 검증 실패 응답 Meeting -> Meeting: Redis 목록 캐시 무효화\n(사용자별 회의록 목록)
WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동)
else 필수 항목 작성 완료
Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록
Meeting -> Meeting: DB 저장 (MinutesVersion)
Meeting -> Meeting: Redis 캐시 무효화
Meeting -> EventHub: NotificationRequest 이벤트 발행\n(회의록 확정 알림) Meeting -> EventHub: MinutesFinalizedEvent 발행\n(알림용 - 기존)
activate EventHub activate EventHub
note right note right
이벤트 데이터: 간단한 이벤트 데이터:
- 발송수단: EMAIL - minutesId
- 대상자: 참석자 전원 - title
- 메시지: 회의록 확정 안내 - userId
- 메타데이터: 버전 번호, 확정 시간 - userName
end note end note
EventHub --> Meeting: 발행 완료 EventHub --> Meeting: 발행 완료
deactivate EventHub deactivate EventHub
Meeting -> Gateway: 200 OK\n(확정 버전 정보) Meeting -> EventHub: MinutesFinalizedEvent 발행\n(RAG용 - 완전한 데이터)
Gateway -> WebApp: 회의록 확정 완료 activate EventHub
WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간) note right
완전한 이벤트 데이터:
- Meeting 정보 (meetingId, title, purpose, scheduledAt 등)
- Minutes 정보 (minutesId, status, version 등)
- Sections 정보 (모든 안건 섹션)
- 참석자 정보
end note
EventHub --> Meeting: 발행 완료
deactivate EventHub
EventHub --> Notification: NotificationRequest 이벤트 수신 Meeting -> Gateway: 200 OK\n(확정된 회의록 상세 정보)
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원) Gateway -> WebApp: 회의록 확정 완료
end WebApp -> User: 확정 완료 토스트 표시\n회의록 상세 조회 화면으로 이동
== 비동기 처리 - 알림 발송 ==
EventHub --> Notification: MinutesFinalizedEvent 수신\n(알림용)
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원)
note right
알림 내용:
- 회의 제목
- 확정 시간
- 회의록 링크
end note
== 비동기 처리 - RAG 저장 ==
EventHub --> AI: MinutesFinalizedEvent 수신\n(RAG용)
activate AI
AI -> AI: RAG 서비스 연동\n- 벡터 DB 저장\n- 관련 회의록 검색 준비
deactivate AI
@enduml @enduml