Skip to content

boostcampwm2025/web12-plum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

188 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

banner

image         image

PLUM

강의실은 놀이터처럼, 결과는 전문가처럼!

Node.js Mediasoup pnpm Turborepo


image

"카메라 너머 수강생들은 지금 제 수업을 잘 따라오고 있을까요?"

1. 비대면 교육의 확산과 도구의 한계

실시간 비대면 교육은 급격히 증가하고 있지만, 정작 교육 현장에서는 교육 특화 도구가 부족하여 일반 회의용 솔루션(Zoom, Google Meet 등)에 의존하고 있습니다. 이러한 범용 도구들은 화상회의 기능에는 충실하지만, 교육에 필수적인 상호작용 레이어는 부족한 실정입니다.


2. 소통의 단절: "듣고 있나요?"라는 질문의 반복

image

한국교육학술정보원(KERIS)의 조사에 따르면, 온라인 교육 환경에서 강의자와 학습자 간의 가장 큰 장벽은 상호작용의 부재입니다.

  • 학습자의 수동화: 채팅이나 음성 답변에 대한 심리적 부담감으로 인해 참여율이 저하됩니다.

  • 강의자의 피드백 부재: 청중의 반응을 파악할 시각적·비언어적 채널이 없어, 강의자는 벽을 보고 이야기하는 듯한 단방향 강의를 지속하게 됩니다.


image

PLUM은 WebRTC 기술과 AI 제스처 인식을 결합하여 강의자와 수강생을 실시간으로 연결합니다.

Group 29

Interactivity (상호작용)

  • 단방향 강의를 벗어나 청중이 능동적으로 참여하는 수업 경험을 제공합니다.

  • 제스처 인식, 실시간 투표, 인터랙티브 질문 시스템을 통해 모든 수강생은 관객이 아닌 주인공이 됩니다.


Visibility (가시성)

  • 강의자는 수강생의 제스처와 참여도 데이터를 대시보드를 통해 실시간으로 확인할 수 있습니다.

  • 보이지 않던 비언어적 반응을 시각화하여, 흐름에 맞는 즉각적인 대응과 공감 기반의 강의 진행을 돕습니다.


Insight (통찰)

  • 강의 종료 후 LLM 기반 자동 요약과 참여 분석 리포트를 제공합니다.

  • 수업 중 발생한 유의미한 데이터를 분석하여 강의의 질을 개선하고 더 나은 학습 커리큘럼을 설계할 수 있는 기반을 마련합니다.


image

image

강의 시작 전에 투표와 Q&A를 미리 구성하고 발표 자료를 업로드하여 체계적인 강의 준비가 가능합니다.


image


image

카메라를 통해 손가락 제스처를 인식하여 말 없이도 의견을 표현할 수 있으며, 투표 참여도 손가락으로 간편하게 가능합니다.


image


image

강의 중 즉석에서 투표를 생성하고 청중의 의견을 실시간으로 수집할 수 있으며, 제스처로도 참여할 수 있습니다.


image
▲ 발표자 기준

image
▲ 청중 기준


image

강의 중 질문을 던지고 청중의 답변을 실시간으로 받아볼 수 있습니다. 익명 답변 수집 기능을 통해 답변에 대한 심리적 부담감을 덜어줍니다.


image
▲ 발표자 기준

image
▲ 청중 기준


image

강의 중 텍스트 기반 채팅으로 자유롭게 소통하고 질문을 주고받을 수 있습니다.


스크린샷 2026-02-04 오후 12 27 13


image

제스처, 투표, Q&A 참여 등을 기반으로 실시간 참여도 점수와 순위를 확인할 수 있어 수강생의 능동적 참여를 유도합니다.


스크린샷 2026-02-04 오후 12 27 21

image

⚙️ Installation & Run

프로젝트를 클론한 후, 다음 명령어를 순서대로 실행하여 개발 환경을 설정하고 애플리케이션을 실행합니다.

# 의존성 설치
pnpm install

# 환경 변수 파일 생성
cp apps/backend/.env.local.example apps/backend/.env
cp apps/frontend/.env.local.example apps/frontend/.env

# 로컬 인프라 (Redis, Prometheus 등) 실행
docker-compose -f docker-compose.local.yml up -d

# 공통 패키지 빌드 (백엔드/프론트엔드에서 사용)
pnpm --filter @plum/shared-interfaces build

# ffmpeg 설치
## macOS
brew install ffmpeg
## Windows (PowerShell 관리자 권한)
winget install Gyan.FFmpeg
## Linux (Debian/Ubuntu)
sudo apt update && sudo apt install ffmpeg

# 백엔드 및 프론트엔드 애플리케이션 실행
pnpm dev
  • 서비스 접속하기: http://localhost:5173
  • Grafana 대시보드 접속: http://localhost:3001 (ID / PW: admin / admin)

🖥️ System Requirements

  • Runtime
    • Node.js 18.0.0+
    • Python 3.9+ (for AI Worker)
    • pnpm 9.15.0+
  • Media Processing
    • FFmpeg: segment 뮤서 및 concat 필터 지원 버전 (시스템 PATH 등록 필수)
  • Infrastructure
    • Docker & Docker Compose (for local infrastructure)
  • Build Tools
    • Windows: Visual Studio Build Tools (C++ Desktop development)
    • macOS: Xcode Command Line Tools (xcode-select --install)
    • Linux: build-essential, make, g++

image

Infrastructure Architecture

PLUM Infrastructure Diagram

Monitoring & Observability

PLUM Monitoring Diagram

Project Structure

├── apps/
│   ├── ai-worker/
│   │   └── main.py           # STT 용 FastApi Application
│   ├── backend/
│   │   └── src/
│   │       ├── chat/         # 채팅 관리 모듈
│   │       ├── common/       # 공통 모듈 (Filter, Interceptor 등)
│   │       ├── interaction/  # 인터랙션 (제스처, 질문, 투표) 관리 모듈
│   │       ├── mediasoup/    # MediaSoup SFU 설정 및 로직
│   │       ├── redis/        # Redis 상태 관리 (Adapter)
│   │       ├── records/      # 강의실 음성 녹음 관리 및 STT 요청
│   │       ├── room/         # 강의실 관리
│   │       └── summarize/    # AI 요약 관리
│   ├── frontend/
│   │   └── src/
│   │       ├── app/          # 앱 설정 (라우팅, 스타일)
│   │       ├── assets/       # 이미지, 폰트 등 정적 자산
│   │       ├── feature/      # 기능 단위 모듈 (components, hooks, stores, services)
│   │       ├── pages/        # 라우트 페이지
│   │       ├── shared/       # 공용 모듈 (components, hooks, lib, api, socket, mediasoup, stores)
│   │       ├── types/        # TypeScript 타입 정의
│   │       ├── App.tsx       # 루트 컴포넌트
│   │       └── main.tsx      # 앱 진입점
│   └── load-test/            # 성능 테스트 (K6, Artillery)
├── packages/
│   └── shared-interfaces/    # 공용 타입 및 DTO 정의
├── .github/                  # CI/CD Workflows
└── docker-compose.yml        # 인프라 설정

Technology Stack

Category Technology
Frontend React TypeScript Vite Zustand Tailwind CSS
Backend NestJS TypeScript Socket.io Mediasoup Redis FFmpeg Gemini
Ai Worker FastAPI Python Faster_Whisper
Infra & DevOps NCP Cloud Vercel Docker GitHub Actions AWS S3
Monitoring Prometheus Grafana Loki Sentry
Testing Vitest Playwright k6 Artillery
Monorepo Turborepo pnpm

image

TIKI는 탁구의 리듬감 있는 대화인 '티키타카(Tiki-taka)'에서 영감을 얻었습니다..

즐거운 협업을 가장 큰 가치로 두고, 사용자와 개발자 모두가 만족하는 완성도 높은 개발을 지향합니다.

Dogi Rocky Dani Max
Dogi Rocky Dani Max
곽윤철 김동균 박다미 윤재현

✨ PLUM 프로젝트를 확인해주셔서 감사합니다!

저희의 고민과 노력이 담긴 프로젝트입니다. 질문이나 피드백은 언제나 환영합니다.


📖 프로젝트 위키 바로가기   |   🚀 라이브 데모 체험하기


Copyright © 2026 PLUM Team (TIKI). All rights reserved.

About

강의실을 놀이터처럼, 결과는 전문가처럼 ✨

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages