데이터 직렬화 형식 가이드: Parquet, Avro, Proto 등
데이터 엔지니어링 및 소프트웨어 개발의 세계에서 데이터를 저장하고 전송하는 방식은 매우 중요합니다. JSON은 가독성 덕분에 웹 API의 왕으로 통하지만, 빅데이터 처리, 고주파 메시징 또는 특수 디버깅에는 너무 크거나 느린 경우가 많습니다.
이 가이드에서는 기본 JSON 및 CSV 이외에 데이터 직렬화에 사용되는 특수 파일 확장자를 살펴봅니다.
빠른 참조표: 데이터 직렬화 형식
| 확장자 | 전체 이름 | 형식 | 주요 사용 사례 |
|---|---|---|---|
.ndjson, .jsonl |
줄 바꿈으로 구분된 JSON | 텍스트 (ASCII) | 로그 파일, 데이터 스트리밍, 빅데이터 가져오기 |
.parquet |
Apache Parquet | 바이너리 (열 지향) | 빅데이터 분석 (Hadoop, Spark, AWS S3) |
.avro |
Apache Avro | 바이너리 (행 지향) | 스키마를 포함한 데이터 직렬화 (Kafka) |
.proto |
Protocol Buffers | 텍스트 (DSL) | gRPC 인터페이스 및 데이터 구조 정의 |
.bson |
Binary JSON | 바이너리 | MongoDB 저장 및 데이터 교환 |
.cbor |
Concise Binary Object Representation | 바이너리 | IoT, 저대역폭 환경 |
.har |
HTTP Archive | 텍스트 (JSON) | 브라우저의 네트워크 요청 디버깅 |
.edn |
Extensible Data Notation | 텍스트 (Lisp 방식) | Clojure 생태계, 메타데이터 설정 |
1. 스트림 친화적 JSON (.ndjson, .jsonl)
표준 JSON은 파싱을 위해 전체 파일을 메모리로 읽어 들여야 합니다([로 시작하고 ]로 끝남). 이는 100GB 로그 파일의 경우 불가능한 일입니다.
- NDJSON / JSONL: 각 줄이 유효하고 독립적인 JSON 객체입니다.
- 왜 사용하나요? 전체 파일을 로드하지 않고도 파일을 한 줄씩 읽을 수 있습니다. 파일이 잘리거나 손상되어도 데이터 세트 전체가 아닌 마지막 줄만 손실됩니다.
2. 빅데이터 열 지향 저장소 (.parquet, .orc)
기존 데이터베이스는 데이터를 행 단위로 저장합니다. 분석 데이터베이스는 종종 열 지향(Columnar) 저장소를 선호합니다.
- Parquet: 빅데이터의 산업 표준입니다. 데이터를 열 단위로 저장하기 때문에 데이터를 훨씬 더 효과적으로 압축할 수 있으며 특정 쿼리에 필요하지 않은 열은 "건너뛸" 수 있습니다.
- ORC: Optimized Row Columnar. Parquet과 유사하지만 주로 Apache Hive 생태계에서 사용됩니다.
3. 스키마 우선 직렬화 (.avro, .proto)
키 이름("first_name")이 모든 레코드에서 반복되는 JSON과 달리, 스키마 우선 형식은 "규칙"과 "데이터"를 분리합니다.
- Avro: 스키마는 JSON으로 저장되지만 데이터는 바이너리입니다. 속도가 빠르고 스키마 진화를 지원하기 때문에 Apache Kafka의 표준으로 사용됩니다.
- Protobuf (.proto): Google에서 개발했습니다.
.proto파일에 데이터 구조를 정의하면 컴파일러가 선호하는 언어의 코드를 생성합니다. gRPC의 중추 역할을 합니다.
4. 바이너리 JSON 대안 (.bson, .cbor, .msgpack)
JSON의 유연성은 좋지만 더 빠른 속도나 더 작은 파일 크기가 필요하다면 바이너리 형식이 정답입니다.
- BSON: MongoDB에서 내부적으로 사용됩니다. JSON보다 더 많은 데이터 유형(날짜 및 바이너리 데이터 등)을 지원합니다.
- CBOR: 매우 작고 효율적으로 설계되었습니다. 대역폭의 1바이트가 중요한 IoT(사물 인터넷) 장치에서 널리 사용됩니다.
- MessagePack: CBOR과 유사하며, "JSON 같지만 빠르고 작은" 형식입니다.
5. 특수 형식 (.har, .edn)
- HAR (HTTP Archive): Chrome 또는 Firefox DevTools에서 네트워크 추적을 "내보내기"한 적이 있다면 그것이 바로
.har파일입니다. 실제로는 탐색 세션의 모든 헤더, 쿠키 및 응답 본문을 포함하는 거대한 JSON 파일일 뿐입니다. - EDN: 주로 Clojure 진영에서 사용됩니다. 사용자 정의 유형(태그)과 더 복잡한 데이터 구조를 기본적으로 지원하기 때문에 JSON보다 강력합니다.
이 파일들을 보는 방법
- NDJSON/JSONL: 아무 텍스트 편집기나
jq명령줄 도구를 사용하세요. - Parquet: 전용 뷰어나 Python 라이브러리(
pandas또는fastparquet등)가 필요합니다. - Protobuf: 일반적으로 바이너리 데이터를 디코딩하려면
.proto정의 파일이 필요합니다. - HAR: Chrome/Firefox DevTools로 다시 드래그 앤 드롭하거나 온라인 HAR 뷰어를 사용할 수 있습니다.
자주 묻는 질문 (FAQ)
Q: 왜 Parquet 파일이 CSV보다 작나요?
A: Parquet은 "딕셔너리 인코딩" 및 "런 길이 인코딩"과 같은 고급 압축 기술을 사용합니다. 데이터를 열 단위로 저장하기 때문에 열 내의 값("국가" 등)이 동일한 경우가 많아 텍스트 파일에 비해 엄청난 압축률을 얻을 수 있습니다.
Q: .proto 파일을 편집할 수 있나요?
A: 네, .proto 파일은 데이터 구조를 정의하는 사람이 읽을 수 있는 텍스트 파일입니다. 하지만 여기서 생성된 바이너리 데이터를 직접 "편집"할 수는 없습니다. 컴파일된 코드를 사용해야 합니다.
Q: .bson은 JSON과 같나요?
A: 완전히 같지는 않습니다. BSON은 JSON과 유사한 데이터를 포함하지만 표준 JSON이 지원하지 않는 Buffer, Long, Decimal128과 같은 유형도 추가된 바이너리 표현입니다.
Tool3M 관련 도구
- JSON CSV 변환기: 구조화된 데이터를 평면 테이블로 변환합니다.
- 바이너리 직렬화 가이드: Protobuf 및 MessagePack에 대해 자세히 알아보세요.