2026.01 — 2026.03개인 프로젝트

OnMeet

AI 회의록 자동 생성 B2B 화상회의 SaaS 플랫폼

맡은 일
팀장 · Frontend 단독 개발 + Backend MSA 설계·구현
기간
2026.01 — 2026.03
소속
코리아IT 풀스택 과정
수상
코리아IT 풀스택 과정 수강생 우수상

코리아IT에서 들은 풀스택 보강 수업에서 팀장을 맡아 시작한 프로젝트로, 과정 내 수강생 우수상을 받았습니다. 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 보안까지 프론트와 백엔드를 함께 다룬 풀스택 프로젝트입니다.

  1. i.Problem

    AI 회의록이 붙은 화상회의를 4인 팀이 석 달 안에 만들어야 했습니다. P2P로 연결하면 참가자가 늘수록 대역폭이 O(N²)로 불어났고, 회의 중 자막은 인증 헤더가 필요한 스트림이라 브라우저 기본 EventSource로는 받을 수 없었습니다.

  2. ii.Action

    팀장을 맡아 팀원들과 서비스 경계를 나눠 7개 서비스로 설계하고, 미디어 전송은 LiveKit SFU에 맡겨 Video Service는 권한과 비즈니스 로직만 쥐게 했습니다. 프론트에서는 fetch + ReadableStream으로 SSE 파서를 직접 만들어 STT를 250ms 단위로 흘려 보여 주고, 서비스 4곳의 응답은 Zod fetcher로 런타임에 검증했습니다. 메모리를 많이 쓰던 File Service는 Go로 다시 썼습니다.

  3. iii.Result

    N:N 대역폭을 O(N)으로 낮췄고, File Service는 메모리 96% · Docker 이미지 94%를 줄였습니다. 팀이 함께 기획부터 배포까지 마쳐 과정 내 수강생 우수상을 받았습니다.

Pl. 1AI가 회의를 기록하고 요약하는 B2B 화상회의 플랫폼. MSA 7개 서비스 · 5개 언어 · LiveKit 기반 WebRTC로 만들었습니다.
코리아IT 풀스택 과정 수강생 우수상
코리아IT 풀스택 과정 수강생 우수상

핵심

  1. 01

    코리아IT 풀스택 과정 수강생 우수상

    팀장을 맡아 팀원들과 기획부터 배포까지 함께 진행

  2. 02

    프론트엔드 구현

    Feature-Based 아키텍처, Zustand + TanStack Query 하이브리드 상태 관리

  3. 03

    Zod 런타임 스키마 검증 fetcher 패턴

    타입 안전한 API 계층 설계

  4. 04

    SSE 기반 실시간 STT 스트리밍

    Ref 버퍼링 + 쓰로틀링 + 자동 재연결 커스텀 훅

나머지 4개 더 보기
  1. 05

    Polyglot MSA 7개 서비스

    서비스 특성에 맞춰 언어 선택 (Kotlin/Java/Go)

  2. 06

    Go File Service 전환

    메모리 96% 감소, API 응답 ~100x 향상

  3. 07

    LiveKit SFU

    N:N 대역폭 O(N²) → O(N), DataChannel 채팅으로 추가 인프라 제거

  4. 08

    참가자별 개별 트랙 Egress → Whisper STT → Claude 요약 AI 파이프라인

화면

좌우로 넘겨 보실 수 있습니다

Pl. 2of5

Pl. 2팀 구성 — 팀장을 맡아 프로젝트 진행과 프론트 전반, Video Service(화상회의·채팅·대기실)를 담당했습니다. 백엔드 팀원 3명과 역할을 나눠 함께 만들었습니다.
Pl. 3프론트엔드 아키텍처 — Feature-Sliced 구조, 4개 MSA의 중복 fetch를 묶은 Service Fetch Factory, EventSource 대신 fetch + ReadableStream으로 직접 구현한 SSE 파서, 회의실 Phase 상태 머신.
Pl. 4다층 보안(Defense in Depth) — RSA-2048 키 페어와 JWKS 공개 검증, 게이트웨이의 Cookie→Bearer 변환과 Rate Limiting, 파일 서비스의 MIME 스푸핑·Path Traversal 방어까지 요청 한 번이 지나는 길마다 방어를 두었습니다.
Pl. 5회고 — 상태 관리 전략, SSE 파서를 직접 구현한 이유(EventSource는 헤더를 못 싣습니다), VAC 패턴으로 597줄을 225줄로 줄인 과정, 빌드·성능에서 덜어 낸 것들을 정리했습니다.

제품 화면이 아니라 기술 발표 자료입니다. 무엇을 왜 그렇게 만들었는지를 팀이 직접 정리한 문서라, 결과 화면보다 이쪽이 더 많은 걸 보여 준다고 봤습니다.

자세히

궁금한 항목을 펼치면 그때 무엇이 문제였고 어떻게 판단했는지 나옵니다.

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 패턴으로 캐시 키 일관성 관리

LiveKit WebRTC 통합

갤러리/스피커 뷰 전환, PIP 모드, 디바이스 선택 미리보기

회의실 상태 머신: preparing → joining → waiting → connected → disconnected, Phase별 UI 자동 전환

SSE 기반 실시간 STT

useSSEStream 커스텀 훅으로 Ref 버퍼링 → 250ms 쓰로틀 → 문장 경계 flush

스트림 종료 시 TanStack Query 캐시 자동 무효화로 데이터 동기화

AI 녹음 요청/승인 큐 시스템

회의 종료 후 요약 자동 생성

배운 것

끝난 뒤에 남은 것들을 적었습니다.

보안 개발 8년차 팀원과 함께 일하며 백엔드 안정성을 보는 눈을 얻었습니다. 기능이 도는 것과 서비스가 버티는 것은 다른 문제라는 걸 이때 알았습니다.

AWS 운영도 곁에서 배웠습니다. 올리고 끝이 아니라 올린 뒤에 무엇을 지켜보고 어디를 조여야 하는지를 이 과정에서 익혔습니다.

LiveKit 연동을 맡으면서 WebRTC를 깊게 들여다봤습니다. SFU가 왜 필요한지, 인원이 늘 때 대역폭이 어떻게 달라지는지를 직접 붙여 보며 이해했고, 이 경험이 이후 지하철 폐쇄망 CCTV 작업의 바탕이 됐습니다.

쓴 기술

ReactTypeScriptZustandReact QueryViteTailwind CSSRadix UIFramer MotionZodSentryFirebaseKotlinJavaGoSpring BootLiveKitWebRTCKafkaRedisAmazon S3DockerMySQLPostgreSQLNginxGCPOpenAI