mirror of
https://github.com/hwanny1128/HGZero.git
synced 2026-06-13 16:29:11 +00:00
외부/내부 시퀀스 설계 일관성 개선 및 표준화
주요 변경사항:
[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:
@@ -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
|
||||
회의록 완성도 표시:
|
||||
|
||||
Reference in New Issue
Block a user