HTTP Range 스트리밍과 HLS의 차이 — Spring Boot 실습 메모
Aug 20, 2026
»
backEnd
Spring Boot 프로젝트에서 MP4 동영상을 서빙하는 streamRange 메서드를 분석하다가,
HLS와 구조적으로 어떻게 다른지 정리하게 됐다.
요약
streamRange는 단일 MP4 파일을 HTTPRange헤더로 쪼개 응답하는 Progressive Download 방식이다.- HLS는 영상을 미리 잘게 분할(
.tssegment)하고 재생목록(.m3u8)으로 묶어 제공하는 세그먼트 스트리밍 방식이다. - 두 방식 모두 HTTP를 사용하지만, 서버 준비 비용·재생 유연성·CDN 캐시 효율이 크게 다르다.
1. streamRange 동작 원리
VideoMngController.java의 streamRange 메서드 핵심 흐름:
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
- 클라이언트(브라우저/Video.js)가
Range: bytes=N-M헤더를 보낸다. - 서버가 해당 바이트 구간만 읽어
206 Partial Content로 응답한다. - 파일 전체를 한 번에 내려주지 않으므로 대역폭·메모리 낭비가 없다.
- 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/암호화 필요