@startuml meeting-회의록확정 !theme mono title Meeting Service - 회의록확정 내부 시퀀스 participant "MinutesController" as Controller participant "MinutesService" as Service participant "ValidationService" as ValidationService participant "MinutesRepository" as MinutesRepo participant "TodoService" as TodoService database "Meeting DB<>" as DB database "Redis Cache<>" as Cache queue "Azure Event Hubs<>" as EventHub [-> Controller: POST /minutes/{minutesId}/finalize activate Controller note over Controller 경로 변수: minutesId 사용자 정보: userId, userName, email end note Controller -> Controller: minutesId 유효성 검증 Controller -> Service: finalizeMinutes(minutesId, userId) activate Service ' 회의록 정보 조회 Service -> MinutesRepo: findById(minutesId) activate MinutesRepo MinutesRepo -> DB: SELECT * FROM minutes WHERE id = ? activate DB DB --> MinutesRepo: 회의록 정보 deactivate DB MinutesRepo --> Service: Minutes deactivate MinutesRepo note over Service 비즈니스 규칙 검증: - 회의록이 존재하는지 확인 - 확정 권한 확인 (생성자만) - 회의록 상태 확인 (DRAFT만 확정 가능) - 필수 항목 검증 end note Service -> Service: 권한 검증\n(생성자만 확정 가능) Service -> Service: 회의록 상태 확인 alt 회의록이 이미 확정됨 Service --> Controller: 409 Conflict\n이미 확정된 회의록 return 409 Conflict else 확정 가능 note over Service 필수 항목 검증: - 회의 제목 - 참석자 목록 - 주요 논의 내용 - 결정 사항 end note ' 필수 항목 검증 Service -> ValidationService: validateRequiredFields(minutes) activate ValidationService ValidationService -> ValidationService: 제목 존재 확인 ValidationService -> ValidationService: 참석자 목록 확인 ValidationService -> ValidationService: 논의 내용 확인 ValidationService -> ValidationService: 결정 사항 확인 alt 필수 항목 누락 ValidationService --> Service: ValidationException\n누락된 항목 목록 Service --> Controller: 400 Bad Request\n필수 항목 누락 return 400 Bad Request else 검증 통과 ValidationService --> Service: 검증 성공 deactivate ValidationService ' 버전 생성 Service -> Service: 확정 버전 번호 생성\n(v1.0) ' 회의록 상태 업데이트 Service -> MinutesRepo: finalize(minutesId, version) activate MinutesRepo MinutesRepo -> DB: UPDATE minutes\nSET status = 'FINALIZED',\n version = ?,\n finalizedAt = NOW(),\n finalizedBy = ?\nWHERE id = ? activate DB DB --> MinutesRepo: 업데이트 완료 deactivate DB MinutesRepo --> Service: 업데이트 성공 deactivate MinutesRepo ' 회의록 스냅샷 저장 (버전 관리) Service -> MinutesRepo: saveSnapshot(minutesId, version, content) activate MinutesRepo MinutesRepo -> DB: INSERT INTO minutes_snapshots\n(minutesId, version, content, createdAt) activate DB DB --> MinutesRepo: 스냅샷 저장 완료 deactivate DB MinutesRepo --> Service: 저장 성공 deactivate MinutesRepo ' 캐시 무효화 Service -> Cache: DELETE minutes:info:{minutesId} activate Cache Cache --> Service: 삭제 완료 deactivate Cache note over Service 비동기 처리: - AI가 Todo 항목 자동 추출 - 회의록 공유 가능 상태로 전환 - 참석자에게 확정 알림 end note ' AI Todo 추출 이벤트 발행 Service -> EventHub: publish(MinutesFinalized)\n{\n minutesId, meetingId,\n finalizedAt, content,\n participants\n} activate EventHub EventHub --> Service: 발행 완료 deactivate EventHub ' Todo 자동 추출 (비동기 응답 대기 없음) note over Service AI 서비스가 MinutesFinalized 이벤트를 구독하여 Todo 자동 추출 및 할당 수행 추출된 Todo는 별도 이벤트로 전달됨 end note Service --> Controller: MinutesFinalizeResponse deactivate Service note over Controller 응답 데이터: { "minutesId": "uuid", "status": "FINALIZED", "version": "v1.0", "finalizedAt": "2025-01-23T15:30:00", "finalizedBy": "userId" } end note return 200 OK\nMinutesFinalizeResponse end end deactivate Controller @enduml