스트리밍 및 실시간 데이터 형식: 실무 가이드
현대 웹 개발에서 데이터는 더 이상 정적인 파일이나 단일 API 응답에 머물지 않습니다. 실시간 업데이트, 로그, 대규모 데이터셋은 스트리밍 형식을 필요로 합니다. 이는 전체 페이로드가 준비될 때까지 기다리는 대신, 데이터가 도착하는 즉시 전송하고 처리하는 방식입니다. 이 가이드에서는 스트리밍 및 실시간 통신을 위한 가장 대중적인 형식들을 살펴봅니다.
1. 행 구분 형식 (NDJSON & JSON Lines)
객체 리스트(데이터베이스 레코드나 로그 엔트리 등)를 스트리밍할 때, 표준 JSON 배열 [...]은 파서가 닫는 괄호 ]가 올 때까지 처리를 시작할 수 없다는 문제가 있습니다. 행 구분 형식은 이를 해결합니다.
NDJSON (Newline Delimited JSON)
NDJSON은 각 행이 유효한 JSON 객체인 데이터를 저장하거나 스트리밍하기 위한 표준입니다.
- 작동 원리:
{"id":1}\n{"id":2}\n... - 핵심 장점: 개행 문자
\n을 수신하는 즉시 각 객체를 개별적으로 파싱하고 처리할 수 있습니다. - 사용 사례: 대규모 데이터베이스 내보내기, 구조화된 로깅, 데이터 파이프라인.
JSON Lines (JSONL)
JSON Lines는 본질적으로 NDJSON과 동일합니다. 각 행이 유효한 JSON 값인 텍스트 기반 형식입니다.
- 핵심 장점:
grep,awk,sed와 같은 Unix 도구와의 뛰어난 호환성. - 사용 사례: AI/ML 학습용 데이터셋 저장 및 로그 분석.
CSV 스트림 (CSV Stream)
NDJSON과 마찬가지로, CSV 스트림은 콤마로 구분된 값을 한 줄씩 전송합니다.
- 핵심 장점: 극도로 낮은 오버헤드.
- 사용 사례: 수백만 행의 데이터를 실시간으로 Excel 호환 형식으로 내보내기.
2. Server-Sent Events (SSE)
**Server-Sent Events (SSE)**는 서버가 HTTP를 통해 웹 페이지로 데이터를 푸시할 수 있게 해주는 표준입니다. WebSockets와 달리 서버에서 클라이언트로의 단방향 통신 채널입니다.
- 작동 원리: 서버가 HTTP 연결을 계속 열어두고 특정
text/event-stream형식으로 데이터를 보냅니다. - 프로토콜 형식:
event: user-update data: {"name": "Alice"} event: chat-message data: "Hello world!" - 핵심 장점: 자동 재연결, 가볍고 표준 HTTP/HTTPS를 통해 작동함.
- 사용 사례: 실시간 스포츠 점수, 주가 정보 티커, 소셜 미디어 알림.
3. WebSockets 및 메시지 형식
SSE가 단방향 스트리밍인 반면, WebSockets는 전이중(양방향) 통신 채널을 제공합니다.
WebSocket 메시지 형식
WebSockets는 전송 계층만 제공하므로 개발자가 메시지 형식을 직접 선택해야 합니다.
JSON: 사용 편의성 덕분에 가장 일반적인 선택입니다.
바이너리 (Protobuf/MessagePack): 저지연 및 작은 페이로드 크기가 중요할 때 사용됩니다.
커스텀 텍스트 프로토콜: 간단한 명령을 처리할 때 가끔 사용됩니다.
사용 사례: 실시간 협업 편집(Google Docs 등), 온라인 게임, 채팅 애플리케이션.
스트리밍 접근 방식 비교
| 형식 / 기술 | 방향 | 오버헤드 | 재연결 | 최적 용도 |
|---|---|---|---|---|
| NDJSON / JSONL | 단방향 | 낮음 | 해당 없음 (파일/스트림) | 로그, 데이터 내보내기 |
| SSE | 서버 -> 클라이언트 | 매우 낮음 | 자동 | 실시간 대시보드 |
| WebSockets | 양방향 | 중간 | 수동 | 대화형 앱 |
| CSV 스트림 | 단방향 | 최소 | 해당 없음 | 대규모 보고서 생성 |
FAQ: 자주 묻는 질문
Q: 스트리밍에 왜 JSON 배열을 그냥 사용하지 않나요?
A: 표준 JSON 파서는 "전부 아니면 전무" 방식입니다. 배열 전체가 닫히기 전까지는 객체를 반환할 수 없습니다. NDJSON은 "점진적" 파싱을 가능하게 하여 메모리를 절약하고 지연 시간을 줄여줍니다.
Q: 언제 WebSockets 대신 SSE를 사용해야 하나요?
A: 서버에서 클라이언트로의 알림과 같이 단방향 푸시만 필요한 경우 SSE를 사용하세요. SSE는 구현이 더 쉽고, 연결 끊김을 자동으로 처리하며, WebSockets보다 방화벽 친화적입니다.
Q: Node.js에서 대용량 NDJSON 파일을 어떻게 처리하나요?
A: readline과 같은 스트리밍 파서나 전용 NDJSON 라이브러리를 사용하세요. 이를 통해 수 기가바이트의 데이터도 아주 적은 양의 메모리만 사용하여 처리할 수 있습니다.