OnMeet
AI 회의록 자동 생성 B2B 화상회의 SaaS 플랫폼
Role: 프로젝트 팀장 · Frontend 단독 개발 + Backend MSA 설계·구현
Overview
AI 회의록 자동 생성 기능을 갖춘 B2B 화상회의 SaaS 플랫폼입니다. 프론트엔드를 단독 개발(React + Vite + Zustand + TanStack Query)하고, 백엔드 Polyglot MSA 7개 서비스(Gateway/Auth/Video/AI/Notification/File/Email)를 설계·구현했습니다. 화상회의·채팅 영역을 중심으로 주도하며, LiveKit SFU 기반 WebRTC, Kafka 이벤트 드리븐 비동기 통신, Zod 런타임 스키마 검증, SSE 실시간 STT 스트리밍, Defense-in-Depth 보안까지 프론트-백 전 영역을 아우르는 풀스택 프로젝트입니다.
Tech Stack
Key Highlights
프론트엔드 단독 개발
Feature-Based 아키텍처, Zustand + TanStack Query 하이브리드 상태 관리
Zod 런타임 스키마 검증 fetcher 패턴
타입 안전한 API 계층 설계
SSE 기반 실시간 STT 스트리밍
Ref 버퍼링 + 쓰로틀링 + 자동 재연결 커스텀 훅
Polyglot MSA 7개 서비스
서비스 특성별 최적 언어 선택 (Kotlin/Java/Go)
Go File Service 전환 → 메모리 96% 감소, API 응답 ~100x 향상
LiveKit SFU
N:N 대역폭 O(N²) → O(N), DataChannel 채팅으로 추가 인프라 제거
참가자별 개별 트랙 Egress → Whisper STT → Claude 요약 AI 파이프라인
Frontend — 아키텍처 & 상태 관리
Feature-Based 도메인 모듈 구조
auth/meeting/dashboard/schedule/notification/team 각 모듈이 자체 api/hooks/store/components 보유
하이브리드 상태 관리: Zustand(UI 상태) + TanStack Query(서버 상태) + Context(인증/테마) 역할 분리
Zustand Slice 패턴 + useShallow()로 모달 컴포넌트가 자신의 slice만 구독 → 레이아웃 리렌더 차단
Zod 런타임 스키마 검증 + 제네릭 createFetcher 팩토리
스키마와 타입이 하나의 소스에서 파생 (Single Source of Truth)
Query Key Factory 패턴으로 캐시 키 일관성 관리
Frontend — 실시간 화상회의 & STT
LiveKit WebRTC 통합
갤러리/스피커 뷰 전환, PIP 모드, 디바이스 선택 미리보기
회의실 상태 머신: preparing → joining → waiting → connected → disconnected, Phase별 UI 자동 전환
SSE 기반 실시간 STT
useSSEStream 커스텀 훅으로 Ref 버퍼링 → 250ms 쓰로틀 → 문장 경계 flush
스트림 종료 시 TanStack Query 캐시 자동 무효화로 데이터 동기화
AI 녹음 요청/승인 큐 시스템
회의 종료 후 요약 자동 생성
Frontend — 빌드 & 모니터링
Vite 매뉴얼 청크 분리 (vendor/query/livekit/editor/firebase/charts/motion)
초기 로딩 최적화
React.lazy() 라우트 기반 코드 스플리팅
Sentry
Session Replay + 환경별 샘플링 차등 적용, React Router 연동 트레이싱
FCM 푸시 알림 + 실시간 알림 목록, 알림 유형별 세부 설정
Backend — 시스템 아키텍처
Polyglot MSA 7개 서비스: Gateway(Kotlin/WebFlux) · Auth(Kotlin) · Video(Java) · AI(Java) · Notification(Java) · File(Go) · Email(Java)
Kafka 이벤트 드리븐
meeting.ended → AI 회의록 트리거, audio.segment → 실시간 음성 스트림
Database-per-Service 패턴
서비스별 독립 DB, 스키마 변경 시 타 서비스 무영향
Backend — Video Service 핵심 설계
LiveKit SFU 통합
미디어 전송은 LiveKit, 비즈니스 로직은 Video Service가 담당하는 책임 분리
Token 기반 권한 제어 (canPublish/canSubscribe/canPublishData/roomAdmin)
역할별 세분화된 미디어 접근
SSE 대기실
호스트/참가자 별도 스트림으로 관심사 분리, 승인 시 LiveKit 토큰 즉시 발급
참가자별 개별 오디오 트랙 Egress
Late-join 자동 녹화, S3 직접 저장
LiveKit Webhook
참가자 입퇴장, 트랙 발행, Egress 완료 서버사이드 동기화
기술적 의사결정
LiveKit SFU 채택
P2P 대비 N:N 대역폭 O(N) 절감, gRPC 서버사이드 트랙 제어
DataChannel 채팅
WebSocket 대신 LiveKit 중계 활용, 추가 인프라 불필요
Go File Service 전환
빌드 73% 단축, 메모리 96% 감소, Docker 이미지 94% 축소
TrackEgress
전체 믹스 대신 개별 트랙으로 화자 분리 정확도 확보
Zustand + TanStack Query 분리
UI 상태와 서버 상태 경계 명확화로 리렌더링 최소화
Zod fetcher 패턴
런타임 타입 검증으로 백엔드 스키마 변경에도 프론트 안정성 유지
보안 & 인프라
RSA-256 비대칭 JWT + AES-256-GCM 키 암호화 + Gateway Secret 상수 시간 비교
Cookie-based Auth (HttpOnly/Secure), 게스트 토큰 4시간 만료, GDPR 탈퇴 처리
GitHub Actions 선택적 빌드/배포
git diff 변경 감지, 멀티 아키텍처 빌드
AI 파이프라인: Kafka → Redis 버퍼 → VAD → Whisper STT → Claude 요약 → S3
Screenshots
이미지 추가 예정
이미지 추가 예정