@startuml 회의예약및참석자초대 !theme mono title 회의 예약 및 참석자 초대 플로우 actor "사용자" as User participant "Web App" as WebApp participant "API Gateway" as Gateway participant "Meeting Service" as Meeting database "Meeting DB" as MeetingDB database "Redis Cache" as Redis participant "Azure Event Hubs" as EventHub participant "Notification Service" as Notification participant "Email Service" as Email == 회의 예약 == User -> WebApp: 회의 정보 입력\n(제목, 날짜/시간, 장소, 참석자) activate WebApp WebApp -> Gateway: POST /api/meetings\n+ JWT 토큰\n+ 사용자 정보 (userId, userName, email) activate Gateway Gateway -> Meeting: 회의 생성 요청 activate Meeting Meeting -> MeetingDB: 회의 정보 저장\n(제목, 일시, 장소, 참석자, 생성자) activate MeetingDB MeetingDB --> Meeting: 회의 ID 반환 deactivate MeetingDB Meeting -> Redis: 회의 정보 캐싱\nkey: meeting:info:{meetingId}\nTTL: 10분 activate Redis Redis --> Meeting: 캐싱 완료 deactivate Redis Meeting -> Redis: 참석자 목록 캐싱\nkey: meeting:participants:{meetingId}\nTTL: 10분 activate Redis Redis --> Meeting: 캐싱 완료 deactivate Redis Meeting -> EventHub: MeetingCreated 이벤트 발행\n(meetingId, 제목, 일시, 참석자 목록) activate EventHub EventHub --> Meeting: 발행 완료 deactivate EventHub Meeting --> Gateway: 201 Created\n회의 ID, 회의 정보 deactivate Meeting Gateway --> WebApp: 회의 생성 응답 deactivate Gateway WebApp --> User: 회의 예약 완료 표시\n캘린더에 자동 등록 deactivate WebApp == 참석자 초대 알림 (비동기) == EventHub -> Notification: MeetingCreated 이벤트 수신\n(Consumer Group: notification-service-group) Notification -> Email: 참석자 전원에게 초대 이메일 발송\n(회의 제목, 일시, 장소, 참여 링크) Email --> Notification: 발송 완료 Notification -> MeetingDB: 알림 발송 기록 저장 MeetingDB --> Notification: 저장 완료 == 회의 시작 30분 전 리마인더 (스케줄링) == note over Notification 스케줄링된 작업: 회의 시작 시간 30분 전 자동 실행 end note Notification -> Email: 참석자 전원에게 리마인더 이메일 발송\n(회의 시작 30분 전) Email --> Notification: 발송 완료 @enduml