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

- 외부 시퀀스 다이어그램 업데이트
  * 회의예약: 템플릿 선택 플로우 추가, 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
@@ -1,129 +0,0 @@
@startuml meeting-대시보드조회
!theme mono
title Meeting Service - 대시보드조회 내부 시퀀스
participant "DashboardController" as Controller
participant "DashboardService" as Service
participant "MeetingRepository" as MeetingRepo
participant "TodoRepository" as TodoRepo
participant "MinutesRepository" as MinutesRepo
database "Redis Cache<<E>>" as Cache
database "Meeting DB<<E>>" as DB
[-> Controller: GET /dashboard
activate Controller
note over Controller
사용자 정보는 헤더에서 추출
(userId, userName, email)
end note
Controller -> Service: getDashboardData(userId)
activate Service
' 캐시 조회
Service -> Cache: GET dashboard:{userId}
activate Cache
Cache --> Service: 캐시 조회 결과
deactivate Cache
alt Cache Hit
Service --> Service: 캐시 데이터 반환
else Cache Miss
' 예정된 회의 조회
Service -> MeetingRepo: findUpcomingMeetings(userId)
activate MeetingRepo
MeetingRepo -> DB: 예정된 회의 조회
activate DB
DB --> MeetingRepo: 예정된 회의 목록
deactivate DB
MeetingRepo --> Service: List<Meeting>
deactivate MeetingRepo
' 진행 중 Todo 조회
Service -> TodoRepo: findActiveTodos(userId)
activate TodoRepo
TodoRepo -> DB: 진행 중 Todo 조회
activate DB
DB --> TodoRepo: 진행 중 Todo 목록
deactivate DB
TodoRepo --> Service: List<Todo>
deactivate TodoRepo
' 최근 회의록 조회
Service -> MinutesRepo: findRecentMinutes(userId)
activate MinutesRepo
MinutesRepo -> DB: 최근 회의록 조회
activate DB
DB --> MinutesRepo: 최근 회의록 목록
deactivate DB
MinutesRepo --> Service: List<Minutes>
deactivate MinutesRepo
' 통계 정보 조회
Service -> MeetingRepo: countUpcomingMeetings(userId)
activate MeetingRepo
MeetingRepo -> DB: 예정된 회의 개수 조회
activate DB
DB --> MeetingRepo: 예정된 회의 개수
deactivate DB
MeetingRepo --> Service: int count
deactivate MeetingRepo
Service -> TodoRepo: countActiveTodos(userId)
activate TodoRepo
TodoRepo -> DB: 진행 중 Todo 개수 조회
activate DB
DB --> TodoRepo: 진행 중 Todo 개수
deactivate DB
TodoRepo --> Service: int count
deactivate TodoRepo
Service -> TodoRepo: calculateTodoCompletionRate(userId)
activate TodoRepo
TodoRepo -> DB: Todo 완료율 조회
activate DB
DB --> TodoRepo: Todo 완료율
deactivate DB
TodoRepo --> Service: double rate
deactivate TodoRepo
note over Service
비즈니스 로직:
- 데이터 조합 및 정제
- DTO 변환
- 통계 계산
end note
Service -> Service: 대시보드 데이터 조합
' 캐시 저장
Service -> Cache: SET dashboard:{userId}\n(TTL: 5분)
activate Cache
Cache --> Service: 캐시 저장 완료
deactivate Cache
end
Service --> Controller: DashboardResponse
deactivate Service
note over Controller
응답 데이터 구조:
{
"upcomingMeetings": [...],
"activeTodos": [...],
"recentMinutes": [...],
"statistics": {
"upcomingMeetingsCount": n,
"activeTodosCount": n,
"todoCompletionRate": n
}
}
end note
return 200 OK\nDashboardResponse
deactivate Controller
@enduml
@@ -1,118 +0,0 @@
@startuml
!theme mono
title 최종 회의록 확정 내부 시퀀스
participant "API Gateway<<E>>" as Gateway
participant "MinutesController" as Controller
participant "MeetingService" as Service
participant "Meeting" as Domain
participant "TranscriptService" as TranscriptService
participant "MeetingRepository" as Repository
database "PostgreSQL<<E>>" as DB
database "Redis Cache<<E>>" as Cache
queue "Event Hub<<E>>" as EventHub
Gateway -> Controller: POST /api/minutes/{minutesId}/finalize
activate Controller
Controller -> Service: confirmTranscript(meetingId)
activate Service
Service -> Repository: findById(meetingId)
activate Repository
Repository -> DB: 회의 정보 조회\n(회의ID 기준)
activate DB
DB --> Repository: meeting_row
deactivate DB
Repository --> Service: Meeting entity
deactivate Repository
Service -> Domain: confirmTranscript()
activate Domain
Domain -> Domain: validateCanConfirm()
note right of Domain
회의록 확정 검증 규칙:
1. 상태 검증:
- 회의 상태 = COMPLETED (종료됨)
- 회의록 상태 = DRAFT (작성중)
✗ IN_PROGRESS → 400 Bad Request
2. 권한 검증:
- 확정 요청자 = 회의 생성자 OR
- 확정 요청자 ∈ 참석자 목록
✗ 권한 없음 → 403 Forbidden
3. 필수 항목 검증:
- 회의록 제목: NOT NULL, 길이 >= 5
- 참석자 목록: 최소 1명 이상
- 주요 논의 내용: NOT NULL, 길이 >= 20
- 결정 사항: 최소 1개 이상 OR
"결정사항 없음" 명시적 표시
✗ 누락 → 400 Bad Request
(누락 항목 목록 반환)
4. 데이터 무결성:
- 섹션별 내용 완결성 확인
- 참조 링크 유효성 확인
- 첨부 파일 접근 가능 여부
✗ 무결성 위반 → 400 Bad Request
5. 이력 검증:
- 마지막 수정 후 24시간 경과 경고
- 미승인 AI 제안 존재 시 알림
⚠️ 경고만 표시, 진행 가능
end note
Domain -> Domain: changeStatus(CONFIRMED)
Domain --> Service: updated Meeting
deactivate Domain
Service -> TranscriptService: lockTranscript(meetingId)
activate TranscriptService
note right of TranscriptService
회의록 잠금:
- 더 이상 수정 불가
- 버전 고정
end note
TranscriptService --> Service: lockedTranscript
deactivate TranscriptService
Service -> Repository: save(meeting)
activate Repository
Repository -> DB: 회의 상태 업데이트\n(상태='확정', 확정일시)
activate DB
DB --> Repository: affected_rows
deactivate DB
Repository --> Service: savedMeeting
deactivate Repository
Service -> Cache: SET meeting:{id}\n(TTL: 10분)
activate Cache
note right of Cache
회의 정보 캐싱:
- TTL: 10분
- 자동 만료
end note
Cache --> Service: OK
deactivate Cache
Service ->> EventHub: publish(MinutesFinalized)
activate EventHub
note right of EventHub
비동기 이벤트:
- 참석자에게 최종본 알림
- 공유 서비스로 전송
end note
deactivate EventHub
Service --> Controller: MeetingResponse
deactivate Service
Controller --> Gateway: 200 OK
deactivate Controller
@enduml