TRENDSHIFT #10 딥다이브 · 2026-03-25 분석

JKVideo 딥다이브
— React Native로 만든 서드파티 Bilibili 클라이언트

React Native 0.83 + Expo SDK 55 + React 19 최신 스택으로 DASH 적응형 스트리밍, 실시간 탄막(弾幕), WBI 서명, 라이브 스트리밍을 구현한 크로스플랫폼 앱. 97.3% TypeScript로 작성된 모바일 아키텍처 레퍼런스. (저장소: tiajinsha/JKVideo · ⭐4,987 · TypeScript · MIT)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

JKVideo가 정확히 무엇을 하는 물건인가

JKVideoReact Native + Expo로 개발된 서드파티 Bilibili(중국 최대 동영상 플랫폼) 클라이언트로, DASH 적응형 스트리밍, 실시간 탄막(danmaku), WBI 서명, 라이브 스트리밍을 지원하며 Android/iOS/Web 크로스플랫폼으로 동작합니다. 97.3% TypeScript로 작성된 타입 안전 모바일 아키텍처의 실전 레퍼런스입니다.

한 컷 비유

"유튜브 공식 앱 대신 내가 직접 만든 유튜브 앱"

Bilibili는 중국의 유튜브입니다. 공식 앱은 광고가 많고 무겁습니다. JKVideo는 공식 앱이 하는 일을 오픈소스로 다시 만든 것인데, 단순 클론이 아니라 DASH 스트리밍, 탄막, 오프라인 다운로드, LAN 공유까지 갖춘 기능 완성형 앱입니다.

특히 WBI 서명이라는 Bilibili의 API 보안 메커니즘을 외부 라이브러리 없이 순수 TypeScript로 역공학한 부분이 가장 큰 학습 가치를 가집니다.

2왜 주목받는가

트렌딩 이유와 경쟁 대비 강점
기존 방식의 문제
React Native 최신 스택 실전 예제 부재

React Native 0.83 + Expo SDK 55 + React 19 조합으로 실제 동작하는 앱을 구현한 오픈소스 레퍼런스가 극히 드뭅니다. DASH MPD, WBI 서명 같은 복잡한 기술을 다루는 예제도 없었습니다.

JKVideo의 가치
최신 스택 + 리버스 엔지니어링 실전 코드

97.3% TypeScript, React 19 최신 훅, expo-router v4 파일 기반 라우팅, Zustand 8개 분리 스토어 —실전 앱이면서 학습 자료로도 훌륭합니다.

경쟁 클라이언트 대비 JKVideo 장점

비교 대상JKVideo 장점
Bilibili 공식 앱광고 없음, 오픈소스, 경량화
기존 RN 비디오 앱DASH MPD 직접 생성, ExoPlayer 네이티브 디코딩
WebView 기반 래퍼네이티브 비디오 플레이어로 고품질(4K HDR/Dolby) 지원
Flutter 비디오 앱Expo 생태계 활용, 웹 플랫폼 동시 지원

3기술 스택 전체 지도

프레임워크 · 상태관리 · 미디어 · 네트워킹

① 프레임워크 & 빌드

기술버전역할
React Native0.83.2크로스플랫폼 모바일 UI
React19.2.0UI 라이브러리 (최신 훅 포함)
Expo SDK55빌드/배포/네이티브 모듈 관리
TypeScript5.9.2정적 타입 시스템 (97.3%)

② 라우팅 & 상태관리

기술역할
expo-router v4파일 시스템 기반 라우팅 (Next.js App Router 스타일)
Zustand 5.x경량 전역 상태관리 (8개 분리 스토어: auth·download·live·settings·video·playProgress·playUrlCache·visibleBigKey)
AsyncStorage로컬 데이터 영속화

③ 미디어 & UI

기술역할
react-native-video 6.x네이티브 비디오 플레이어 (ExoPlayer/AVPlayer)
react-native-webview웹 폴백 플레이어
react-native-pager-view스와이프 탭 네비게이션
react-native-qrcode-svgQR 코드 생성 (LAN 공유)

④ 네트워킹 & 데이터

기술역할
AxiosHTTP 클라이언트 (인터셉터로 쿠키/WBI 자동 주입)
pakozlib 압축 해제 (탄막 XML 디코딩)
@sentry/react-native에러 모니터링
react-native-static-serverLAN 파일 서빙 (내장 HTTP 서버)

4아키텍처 심화 분석

시스템 구조도 + 5가지 핵심 설계 패턴

전체 시스템 구조도

┌─────────────────────────────────────────────────────────┐ │ JKVideo App │ ├─────────────┬───────────────┬───────────────────────────┤ │ app/ │ components/ │ hooks/ │ │ (Screens) │ (UI 위젯) │ (데이터 페칭 로직) │ │ │ │ │ │ index.tsx │ VideoPlayer │ useVideoDetail │ │ video/[id] │ DanmakuLayer │ useVideoList │ │ live/[id] │ CommentCard │ useLiveDanmaku │ │ search │ DownloadSheet│ useComments │ │ downloads │ MiniPlayer │ useSearch / useDownload │ ├─────────────┴───────────────┴───────────────────────────┤ │ store/ (Zustand) │ │ authStore | downloadStore | liveStore | settingsStore | videoStore│ │ playProgressStore | playUrlCache | visibleBigKeyStore (8개)│ ├─────────────────────────────────────────────────────────┤ │ services/bilibili.ts │ │ Axios Instance + Cookie Interceptor │ │ 추천피드(WBI) | 비디오상세/스트림(DASH) | 라이브(HLS) │ │ 댓글/탄막(XML+pako) | QR인증(passport API) │ ├─────────────────────────────────────────────────────────┤ │ utils/ (핵심 알고리즘) │ │ wbi.ts(MD5+서명) | buildMpd.ts(MPD XML) | danmaku.ts │ ├─────────────────────────────────────────────────────────┤ │ Bilibili API Servers (외부) │ │ api.bilibili.com | passport.bilibili.com │ └─────────────────────────────────────────────────────────┘

핵심 설계 패턴 5가지

1) 서비스 레이어 패턴

모든 API 호출이 services/bilibili.ts 단일 파일에 집중됩니다. Axios 인터셉터로 모든 요청에 인증 정보를 자동 주입합니다.

// 요청 인터셉터 — 모든 API 호출에 쿠키 자동 주입
api.interceptors.request.use(async (config) => {
  const sessdata = await getSecure('SESSDATA'); // 네이티브: expo-secure-store, 웹: AsyncStorage 폴백
  if (Platform.OS === 'web') {
    config.headers['X-Sessdata'] = sessdata;
  } else {
    config.headers['Cookie'] = `SESSDATA=${sessdata};`;
  }
  return config;
});

2) WBI 서명 알고리즘 (API 보안 역공학)

Bilibili 웹 API 보안 메커니즘을 외부 crypto 의존성 없이 순수 TypeScript MD5로 구현합니다.

1. /x/web-interface/nav에서 img_key, sub_key 추출 2. 64개 원소 순열 테이블로 두 키를 섞어 32자 mixin_key 생성 3. 요청 파라미터 + 타임스탬프(wts) 정렬 후 mixin_key와 결합 4. 순수 TypeScript MD5 해시 → w_rid 서명값 생성 5. 12시간 캐시 + 네트워크 실패 시 stale 캐시 폴백

3) DASH 적응형 스트리밍 + MPD 직접 생성

Bilibili API가 반환하는 비디오/오디오 분리 스트림을 로컬에서 MPD XML로 조합하여 ExoPlayer에 제공합니다. 스트리밍 프로토콜을 직접 구현하는 드문 사례입니다.

4) 플랫폼 분기 전략

기능네이티브 (Android/iOS)
인증Cookie 헤더 직접 삽입커스텀 X-Sessdata 헤더 + 프록시
비디오react-native-video (DASH)WebView HTML5 video (MP4 폴백)
탄막 압축pako.inflate → inflateRaw프록시가 서버에서 해제
이미지직접 로드localhost:3001 프록시 (안티핫링크 우회)

5) Zustand 상태 분리 전략

고빈도 업데이트(progress)는 AsyncStorage 쓰기를 하지 않고, 상태 변화(status/localUri)만 영속화하는 선택적 영속화 패턴을 적용합니다.

5디렉토리 구조 해부

각 폴더가 하는 일
JKVideo/ ├── app/ # 화면 (expo-router 파일 기반 라우팅) │ ├── _layout.tsx # 루트 레이아웃 (Stack Navigator) │ ├── index.tsx # 홈 화면 (추천/인기/라이브 탭) │ ├── video/[bvid].tsx # 비디오 상세 (플레이어+댓글+탄막) │ ├── live/[roomId].tsx # 라이브 방송 (HLS+실시간 탄막) │ ├── search.tsx # 검색 (WBI 서명 적용) │ ├── downloads.tsx # 다운로드 관리 │ └── settings.tsx # 설정 (화질, 로그아웃) │ ├── components/ # 재사용 UI 컴포넌트 │ ├── VideoPlayer.tsx # 네이티브 비디오 플레이어 래퍼 │ ├── DanmakuLayer.tsx # 탄막 오버레이 (5레인 스크롤) │ ├── MiniPlayer.tsx # 글로벌 미니 플레이어 │ └── DownloadSheet.tsx # 다운로드 바텀시트 │ ├── hooks/ # 커스텀 훅 (데이터 페칭+비즈니스 로직) │ ├── useVideoDetail.ts / useVideoList.ts │ ├── useLiveDanmaku.ts # 라이브 탄막 (1.5초 폴링) │ └── useDownload.ts │ ├── services/ │ ├── bilibili.ts # Bilibili API 전체 래퍼 (~400줄) │ └── types.ts │ ├── store/ # Zustand 전역 상태 │ ├── authStore.ts # SESSDATA, BUVID3 │ ├── downloadStore.ts # 다운로드 큐 (선택적 영속화) │ ├── videoStore.ts # 재생 상태 │ └── settingsStore.ts # 사용자 설정 │ ├── utils/ │ ├── wbi.ts # WBI 서명 (순수 TS MD5 구현) │ ├── buildMpd.ts # DASH MPD XML 생성 │ ├── danmaku.ts # 탄막 XML 파싱 │ └── lanServer.ts # LAN HTTP 서버 │ ├── app.json / eas.json / package.json

6학습 포인트 (기술별)

이 레포에서 무엇을 배울 수 있는가

6.1 React Native + Expo SDK 55

expo-router v4의 동적 라우팅(app/video/[bvid].tsx), React 19 최신 훅 사용 패턴, EAS Build로 클라우드 빌드 파이프라인 구축법을 배웁니다.

6.2 DASH 적응형 스트리밍

DASH 프로토콜 작동 원리, MPD XML 명세 구조, 비디오/오디오 분리 스트림을 MPD로 합치는 기법, react-native-video의 ExoPlayer/AVPlayer 백엔드 활용, 화질별 스트림 선택 로직을 배웁니다.

핵심 개념
DASH (Dynamic Adaptive Streaming over HTTP)
비디오와 오디오를 분리된 스트림으로 전송하고, 클라이언트가 네트워크 상황에 따라 화질을 동적 전환하는 프로토콜. YouTube, Netflix 등이 사용. JKVideo는 서버에서 받은 분리된 스트림을 MPD XML로 조합해 ExoPlayer에 전달합니다.

6.3 API 리버스 엔지니어링 & WBI 서명

Bilibili WBI 서명 알고리즘 전체 구조, 순열 테이블 기반 키 파생, 순수 TypeScript MD5(외부 의존성 없이 bitwise 연산), 12시간 TTL + stale 폴백 캐싱 전략을 배웁니다.

6.4 탄막(Danmaku) 시스템

XML 기반 탄막 파싱, pako를 이용한 zlib 압축 해제, 5레인 스크롤 탄막 렌더링(타임라인 동기화), 라이브 탄막 1.5초 폴링, 2000개 초과 시 자동 프루닝으로 메모리 관리합니다.

6.5 오프라인 다운로드 시스템

expo-file-system 기반 백그라운드 다운로드, 다운로드 큐 관리, react-native-static-server로 내장 HTTP 서버 구동, LAN QR 코드 공유 패턴을 배웁니다.

7하드웨어 / 시스템 요구사항

개발 환경 + 모바일 기기 최소 요구사항
항목최소권장
Node.js18.x20.x+
RAM4GB8GB+
디스크5GB10GB+
OSmacOS/Windows/LinuxmacOS (iOS 빌드)
AndroidAPI 24+ (Android 7.0)API 30+
iOSiOS 15+iOS 17+

8직접 해볼 수 있는 실습 과제

난이도별 5개 구체적 실습
MISSION 01

Expo 프로젝트 구조 따라하기 ★☆☆☆☆

expo-router + Zustand로 간단한 비디오 브라우저를 만들어봅니다.

npx create-expo-app@latest --template tabs

동적 라우트([id].tsx) 구현, Zustand 스토어 1개로 검색 히스토리 관리, 탭 네비게이션 + 동적 상세 페이지 + 상태 영속화까지 완성이 목표입니다.

MISSION 02

DASH MPD 생성기 구현 ★★☆☆☆

JKVideo의 buildMpd.ts를 이해하고 다중 화질 Representation 지원을 추가합니다. Node.js로 테스트 MPD 파일을 생성해 VLC/mpv로 재생해봅니다.

MISSION 03

WBI 서명 알고리즘 재구현 ★★☆☆☆

wbi.ts의 MD5 구현을 한 줄씩 따라 치며 bitwise 연산을 이해합니다. RFC 1321 테스트 벡터로 MD5 결과를 검증하고, 실제 Bilibili nav API를 호출해 WBI 키를 추출합니다.

MISSION 04

탄막 렌더링 엔진 구현 ★★★☆☆

탄막 XML 파서 구현, Animated API로 수평 스크롤 애니메이션, 5레인 충돌 회피 알고리즘, 비디오 타임라인 동기화. 100개+ 탄막이 끊김 없이 스크롤하면 완성입니다.

MISSION 05

LAN 파일 공유 서버 구현 ★★★★☆

react-native-static-server로 내장 HTTP 서버를 구동하고, 기기 IP+포트로 QR 코드를 생성합니다. 같은 네트워크 PC 브라우저에서 모바일 다운로드 비디오를 스트리밍 재생하면 완성입니다.

9관련 기술 심화 학습 로드맵

주차별 학습 순서
1주차: React Native + Expo 기초 Expo SDK 55 공식 문서 통독 expo-router v4 (Layout, Dynamic, Groups) 실습: Hello World → 탭 앱 → 동적 라우트 앱 2주차: 상태관리 & 데이터 페칭 Zustand 심화 (미들웨어, persist, devtools) React 19 신기능 (use() hook, Actions, Transitions) AsyncStorage 선택적 영속화 패턴 3주차: 비디오 스트리밍 기술 DASH 프로토콜 명세 (MPD, AdaptationSet, Representation) HLS vs DASH 비교 분석 react-native-video 커스터마이징 4주차: 네트워킹 & API 보안 Axios 인터셉터 패턴 MD5/SHA 해시 알고리즘 내부 구조 API 역공학 기법 (Chrome DevTools, 프록시 분석) 5주차: 리얼타임 & 최적화 Animated API 성능 최적화 FlatList 가상화 + 무한 스크롤 탄막 렌더링 엔진 + 라이브 채팅 6주차: 크로스플랫폼 & 배포 Platform.OS 분기 처리 best practices EAS Build + EAS Submit 파이프라인

10핵심 키워드 사전

처음 보는 단어 한눈에 정리
키워드설명
DASHDynamic Adaptive Streaming over HTTP. 비디오/오디오 분리 스트림으로 전송, 네트워크 상황에 따라 화질을 동적 전환하는 프로토콜
MPDMedia Presentation Description. DASH의 XML 매니페스트. 사용 가능한 스트림의 URL/코덱/대역폭 정보 기술
ExoPlayerGoogle의 Android용 미디어 플레이어. DASH/HLS/SmoothStreaming 등 적응형 스트리밍을 네이티브 지원
탄막 (Danmaku)弾幕. 비디오 위에 떠다니는 실시간 댓글 시스템. 니코니코 동화에서 시작, Bilibili에서 대중화
WBIWeb-API Encryption. Bilibili 웹 API의 요청 서명 메커니즘. MD5 해싱으로 위변조 방지
SESSDATABilibili의 세션 쿠키. 로그인 시 발급, 이후 모든 인증 API 요청에 사용
pakoJavaScript용 zlib 구현. inflate/deflate 압축을 브라우저/Node.js에서 처리
Zustand독일어로 "상태". 경량 React 상태관리. Redux 대비 보일러플레이트 적고 훅 기반
expo-routerExpo의 파일 시스템 기반 라우팅. app/ 디렉토리 구조가 곧 URL 경로
HLSHTTP Live Streaming. Apple의 적응형 스트리밍. DASH와 경쟁, iOS 네이티브 지원
안티핫링크Referer 검증으로 외부 사이트에서의 직접 이미지 링크를 차단하는 기법
EAS BuildExpo Application Services. 클라우드에서 Android APK/iOS IPA를 빌드하는 CI 서비스

11참고 링크

더 깊이 파고들 자료