외부/내부 시퀀스 설계 일관성 개선 및 표준화

주요 변경사항:

[Critical]
- API 엔드포인트 통일: POST /api/minutes/{minutesId}/finalize
- 이벤트 이름 표준화: MinutesFinalized

[Warning]
- API Gateway 라우팅 규칙 문서화 (외부 시퀀스 7개 파일)
- 대시보드 API 경로 통일: GET /api/dashboard
- AI 제안 병합 프로세스 상세 문서화
- 회의록 확정 검증 로직 5단계 상세화

[Minor]
- Redis 캐시 TTL 명시 (7개 파일, TTL 정책 표준화)
- 대시보드 페이지네이션 파라미터 추가
- 에러 응답 포맷 표준화 (14개 에러 응답)

총 31개 파일 수정, 34건의 개선 사항 적용

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
ondal
2025-10-23 09:48:06 +09:00
parent f86973c93b
commit 715add4dbc
43 changed files with 505 additions and 156 deletions
@@ -33,7 +33,7 @@ activate Service
' 회의 정보 조회
Service -> MeetingRepo: findById(meetingId)
activate MeetingRepo
MeetingRepo -> DB: SELECT * FROM meetings WHERE id = ?
MeetingRepo -> DB: 회의 정보 조회\n(회의ID 기준)
activate DB
DB --> MeetingRepo: 회의 정보
deactivate DB
@@ -53,12 +53,24 @@ Service -> Service: 회의 상태 확인
alt 회의가 진행 중이 아님
Service --> Controller: 409 Conflict\n진행 중인 회의가 아님
note right
에러 응답 형식:
{
"error": {
"code": "MEETING_NOT_IN_PROGRESS",
"message": "진행 중인 회의가 아닙니다",
"details": "회의 종료는 진행 중 상태에서만 가능합니다",
"timestamp": "2025-10-23T12:00:00Z",
"path": "/api/meetings/{meetingId}/end"
}
}
end note
return 409 Conflict
else 종료 가능
' 세션 정보 조회
Service -> SessionRepo: findActiveSession(meetingId)
activate SessionRepo
SessionRepo -> DB: SELECT * FROM meeting_sessions\nWHERE meetingId = ?\nAND status = 'ACTIVE'
SessionRepo -> DB: 활성 세션 조회\n(회의ID, 상태='진행중')
activate DB
DB --> SessionRepo: 세션 정보
deactivate DB
@@ -68,7 +80,7 @@ else 종료 가능
' 세션 종료
Service -> SessionRepo: endSession(sessionId)
activate SessionRepo
SessionRepo -> DB: UPDATE meeting_sessions\nSET status = 'ENDED',\n endedAt = NOW()\nWHERE id = ?
SessionRepo -> DB: 세션 종료 처리\n(상태='종료', 종료일시)
activate DB
DB --> SessionRepo: 업데이트 완료
deactivate DB
@@ -78,7 +90,7 @@ else 종료 가능
' 회의 상태 업데이트
Service -> MeetingRepo: updateStatus(meetingId, "ENDED")
activate MeetingRepo
MeetingRepo -> DB: UPDATE meetings\nSET status = 'ENDED',\n actualEndTime = NOW()\nWHERE id = ?
MeetingRepo -> DB: 회의 상태 업데이트\n(상태='종료', 실제종료시각)
activate DB
DB --> MeetingRepo: 업데이트 완료
deactivate DB
@@ -97,12 +109,12 @@ else 종료 가능
Service -> StatService: generateMeetingStatistics(sessionId)
activate StatService
StatService -> DB: SELECT\n COUNT(DISTINCT speakerId) as speakerCount,\n COUNT(*) as utteranceCount,\n TIMESTAMPDIFF(MINUTE, startedAt, endedAt) as duration\nFROM transcripts WHERE sessionId = ?
StatService -> DB: 회의 통계 데이터 조회\n(화자수, 발언횟수, 진행시간)
activate DB
DB --> StatService: 통계 데이터
deactivate DB
StatService -> DB: INSERT INTO meeting_statistics\n(meetingId, sessionId, duration,\nparticipantCount, utteranceCount, createdAt)
StatService -> DB: 회의 통계 저장\n(회의ID, 세션ID, 진행시간, 참석자수, 발언횟수)
activate DB
DB --> StatService: 통계 저장 완료
deactivate DB
@@ -124,7 +136,7 @@ else 종료 가능
AISuggestion -> SuggestionRepo: findAppliedSuggestions(meetingId)
activate SuggestionRepo
SuggestionRepo -> DB: SELECT *\nFROM ai_suggestions\nWHERE meeting_id = ?\nAND status = 'APPLIED'\nORDER BY suggestion_type, applied_at
SuggestionRepo -> DB: 적용된 AI 제안 조회\n(회의ID, 상태='적용됨', 유형별 정렬)
activate DB
note right
조회 대상:
@@ -144,7 +156,7 @@ else 종료 가능
' 2. 회의록 조회
Service -> MinutesRepo: findByMeetingId(meetingId)
activate MinutesRepo
MinutesRepo -> DB: SELECT * FROM minutes\nWHERE meeting_id = ?
MinutesRepo -> DB: 회의록 정보 조회\n(회의ID 기준)
activate DB
DB --> MinutesRepo: 회의록 정보
deactivate DB
@@ -172,7 +184,7 @@ else 종료 가능
MinutesService -> MinutesRepo: getSectionContent(minutesId, sectionType)
activate MinutesRepo
MinutesRepo -> DB: SELECT section_content\nFROM minutes_sections\nWHERE minutes_id = ?\nAND section_type = ?
MinutesRepo -> DB: 회의록 섹션 내용 조회\n(회의록ID, 섹션유형)
activate DB
DB --> MinutesRepo: 기존 섹션 내용
deactivate DB
@@ -191,7 +203,7 @@ else 종료 가능
MinutesService -> MinutesRepo: updateSectionContent(minutesId, sectionType, mergedContent)
activate MinutesRepo
MinutesRepo -> DB: UPDATE minutes_sections\nSET section_content = ?,\n updated_at = NOW(),\n ai_enhanced = true\nWHERE minutes_id = ?\nAND section_type = ?
MinutesRepo -> DB: 회의록 섹션 내용 업데이트\n(병합된 내용, AI보강 플래그, 갱신일시)
activate DB
note right
저장 내용:
@@ -212,7 +224,7 @@ else 종료 가능
' 4. AI 제안 상태 업데이트 (APPLIED → MERGED)
Service -> SuggestionRepo: updateSuggestionsStatus(appliedSuggestions, "MERGED")
activate SuggestionRepo
SuggestionRepo -> DB: UPDATE ai_suggestions\nSET status = 'MERGED',\n merged_at = NOW()\nWHERE id IN (...)
SuggestionRepo -> DB: AI 제안 상태 업데이트\n(상태='병합완료', 병합일시)
activate DB
note right
상태 변경:
@@ -228,7 +240,7 @@ else 종료 가능
' 회의록 상태 업데이트
Service -> MinutesRepo: updateMinutesStatus(meetingId, "DRAFT")
activate MinutesRepo
MinutesRepo -> DB: UPDATE minutes\nSET status = 'DRAFT',\n endedAt = NOW(),\n ai_suggestions_merged = true,\n merged_count = ?\nWHERE meetingId = ?\nAND status = 'IN_PROGRESS'
MinutesRepo -> DB: 회의록 상태 업데이트\n(상태='초안', 종료일시, AI제안병합 플래그, 병합건수)
activate DB
note right
회의록 완성도 표시: