@startuml 회의시작및템플릿선택 !theme mono title 회의 시작 및 템플릿 선택 (Flow 3) actor "사용자" as User participant "Web App" as Web participant "API Gateway" as Gateway participant "Meeting Service" as Meeting participant "STT Service" as STT participant "RabbitMQ" as MQ participant "Redis" as Cache database "PostgreSQL" as DB == 템플릿 선택 == User -> Web: 회의 템플릿 선택\n(일반/스크럼/킥오프/주간) Web -> Gateway: GET /api/meetings/templates Gateway -> Meeting: 템플릿 목록 조회 Meeting -> Cache: 템플릿 캐시 확인 alt 캐시 존재 Cache --> Meeting: 템플릿 목록 반환 else 캐시 미존재 Meeting -> DB: SELECT * FROM templates DB --> Meeting: 템플릿 데이터 Meeting -> Cache: 템플릿 캐시 저장 end Meeting --> Gateway: 템플릿 목록 응답 Gateway --> Web: 200 OK + 템플릿 목록 Web --> User: 템플릿 선택 UI 표시 == 회의 시작 == User -> Web: 회의 시작 버튼 클릭 Web -> Gateway: POST /api/meetings/{meetingId}/start\n+ templateId Gateway -> Meeting: 회의 시작 요청 Meeting -> DB: BEGIN TRANSACTION Meeting -> DB: UPDATE meetings\nSET status='ongoing',\nstarted_at=NOW() DB --> Meeting: 업데이트 완료 Meeting -> DB: INSERT INTO meeting_sessions\n(meeting_id, template_id,\nsession_status='active') DB --> Meeting: 세션 생성 완료 Meeting -> DB: INSERT INTO meeting_transcripts\n(session_id, template_id,\ncontent='{}') DB --> Meeting: 회의록 초기화 완료 Meeting -> DB: COMMIT Meeting -> Cache: 회의 상태 캐시 업데이트\n(status='ongoing') == 이벤트 발행 == Meeting ->> MQ: Publish "MeetingStarted" Event\n{\n meetingId,\n sessionId,\n templateId,\n startedAt,\n participants\n} note right 비동기 이벤트 발행 - Exchange: meeting.events - Routing Key: meeting.started end note Meeting --> Gateway: 200 OK + sessionId Gateway --> Web: 회의 시작 성공 응답 Web --> User: 회의 진행 화면 전환 == STT 서비스 시작 == MQ -->> STT: Consume "MeetingStarted" Event STT -> STT: 오디오 녹음 세션 초기화 STT -> Cache: 녹음 세션 상태 저장\n(sessionId, status='recording') STT -> STT: 마이크 활성화 및\n오디오 스트림 시작 note over STT STT 서비스 준비 완료 - 5초 단위 음성 인식 시작 - 실시간 텍스트 변환 대기 end note @enduml