HTTP Range 스트리밍과 HLS의 차이 — Spring Boot 실습 메모

» backEnd

Spring Boot 프로젝트에서 MP4 동영상을 서빙하는 streamRange 메서드를 분석하다가, HLS와 구조적으로 어떻게 다른지 정리하게 됐다.

요약

  • streamRange는 단일 MP4 파일을 HTTP Range 헤더로 쪼개 응답하는 Progressive Download 방식이다.
  • HLS는 영상을 미리 잘게 분할(.ts segment)하고 재생목록(.m3u8)으로 묶어 제공하는 세그먼트 스트리밍 방식이다.
  • 두 방식 모두 HTTP를 사용하지만, 서버 준비 비용·재생 유연성·CDN 캐시 효율이 크게 다르다.

1. streamRange 동작 원리

VideoMngController.javastreamRange 메서드 핵심 흐름:

String range = request.getHeader("Range");
// Range: bytes=0-1048575 형태 파싱

RandomAccessFile raf = new RandomAccessFile(file, "r");
raf.seek(start);           // 요청된 바이트 위치로 이동
// response status 206 Partial Content
// Content-Range: bytes start-end/totalLength
  1. 클라이언트(브라우저/Video.js)가 Range: bytes=N-M 헤더를 보낸다.
  2. 서버가 해당 바이트 구간만 읽어 206 Partial Content로 응답한다.
  3. 파일 전체를 한 번에 내려주지 않으므로 대역폭·메모리 낭비가 없다.
  4. Range 헤더가 없으면 200 OK로 전체 응답한다.

비유: 종이책 한 권을 들고 “50~100페이지만 복사해줘” 하는 것.


2. HLS 동작 원리

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXTINF:6.0,
seg000.ts
#EXTINF:6.0,
seg001.ts
#EXTINF:6.0,
seg002.ts
#EXT-X-ENDLIST

흐름:

플레이어
  │  GET match.m3u8          ← 재생목록 요청
  │  GET seg000.ts           ← 0~6초 세그먼트
  │  GET seg001.ts           ← 6~12초 세그먼트
  └  ...
  • 영상을 미리 ffmpeg 등으로 분할해 두어야 한다.
  • 탐색(seek) 시 플레이어가 해당 시간대의 segment URL로 바로 이동한다.
  • 네트워크 상태에 따라 해상도 playlist를 바꾸는 ABR(적응형 비트레이트)가 가능하다.

3. 한눈에 비교

항목 HTTP Range (streamRange) HLS
파일 구조 단일 MP4 m3u8 + 다수 .ts segment
탐색 단위 바이트 위치 시간 단위 segment
서버 준비 파일 그대로 서빙 ffmpeg 사전 인코딩 필요
화질 자동 전환(ABR) 불가 가능
CDN 캐시 효율 큰 파일 → 비효율 작은 segment → 효율적
클라이언트 지원 <video> 태그만으로 OK Safari 기본, Chrome은 hls.js 필요
DRM / 암호화 별도 처리 필요 segment 단위 AES 암호화 표준 지원

4. 현재 프로젝트 상태

detectContentType 메서드에 이미 HLS MIME 타입이 정의되어 있다.

if (lower.endsWith(".m3u8")) return "application/vnd.apple.mpegurl";
if (lower.endsWith(".ts"))   return "video/mp2t";

즉 서버 코드는 HLS를 받을 준비가 돼 있지만,
현재는 MP4 + HTTP Range 방식만 실제로 사용 중이다.


5. 언제 어떤 방식을 쓸까?

HTTP Range가 더 적합한 경우

  • 이미 업로드된 MP4를 바로 서빙해야 할 때
  • 소규모 동시 접속, 단일 화질로 충분할 때
  • 서버/인프라 단순하게 유지하고 싶을 때

HLS가 필요한 경우

  • 많은 사용자가 동시 시청하고 CDN이 있을 때
  • 네트워크 상태에 따른 화질 자동 전환 필요
  • 라이브/실시간 스트리밍
  • 세그먼트 수준의 DRM/암호화 필요

참고