JSON은 오랫동안 데이터 직렬화의 표준처럼 사용되어 왔지만, 대규모 데이터 처리와 성능 최적화가 중요한 환경에서는 몇 가지 한계가 드러났습니다. 이 글에서는 JSON의 한계를 극복하고자 실제 대규모 서비스 기업들이 도입한 대체 형식들을 살펴봅니다.
LinkedIn은 성능 최적화를 위해 Google의 Protocol Buffers (Protobuf) 를 채택했습니다.
Uber는 지리 공간 데이터 최적화를 위해 H3 (Hexagonal Hierarchical Spatial Index) 를 개발했습니다.
Slack는 내부 메시징 프로토콜을 JSON에서 커스텀 바이너리 포맷으로 변경했습니다.
| 포맷 종류 | 평균 메시지 크기 (Bytes) |
|---|---|
| JSON | 1200 Bytes |
| 커스텀 바이너리 포맷 | 450 Bytes |
Slack의 최적화된 바이너리 포맷은 평균적으로 JSON 대비 약 62.5% 이상의 데이터 크기를 절감할 수 있습니다.
graph TD
A[JSON: 1200 Bytes] --> B[커스텀 바이너리 포맷: 450 Bytes]
Auth0도 인증 및 보안 토큰 처리 최적화를 위해 Protocol Buffers를 도입했습니다.
포맷 종류크기 (Bytes)
| JSON | 약 100 Bytes |
| Protocol Buffers | 약 40 Bytes |
| H3 Geo-Index* | (적용 불가) |
| BSON (Binary JSON) | 약 80 Bytes |
barChart
title 포맷별 데이터 크기 비교
"JSON" : 100
"Protocol Buffers" : 40
"BSON" : 80
※ H3는 일반 데이터 직렬화에 사용되지 않고, 위치 데이터에 특화된 인덱싱입니다.
BSON은 Binary JSON의 약자로, JSON과 유사한 구조를 가지면서도 이진 데이터로 인코딩하여 더 빠른 파싱과 효율적인 저장을 지원합니다.
Gradle 의존성 추가
dependencies {
implementation 'org.mongodb:bson:4.11.0'
}
Java 코드 예시
import org.bson.BsonBinaryReader;
import org.bson.BsonBinaryWriter;
import org.bson.BsonDocument;
import org.bson.Document;
import org.bson.codecs.BsonDocumentCodec;
import org.bson.io.BasicOutputBuffer;
import java.nio.ByteBuffer;
public class BsonExample {
public static void main(String[] args) {
Document document = new Document()
.append("name", "Alice")
.append("age", 30)
.append("email", "alice@example.com");
BasicOutputBuffer buffer = new BasicOutputBuffer();
BsonBinaryWriter writer = new BsonBinaryWriter(buffer);
new BsonDocumentCodec().encode(writer, document.toBsonDocument(Document.class, null), null);
byte[] bsonBytes = buffer.toByteArray();
System.out.println("Serialized BSON size: " + bsonBytes.length + " bytes");
BsonBinaryReader reader = new BsonBinaryReader(ByteBuffer.wrap(bsonBytes));
BsonDocument decodedDoc = new BsonDocumentCodec().decode(reader, null);
System.out.println("Deserialized BSON Document: " + decodedDoc.toJson());
}
}
| 기업 | 사용 기술 | 주된 목적 | 장점 | 단점 |
|---|---|---|---|---|
| Protocol Buffers | API 성능 최적화 | 작은 크기, 빠른 파싱 | 스키마 관리 필요 | |
| Uber | H3 Geo-Index | 위치 데이터 최적화 | 공간 연산 최적화 | 범용성 부족 |
| Slack | 커스텀 바이너리 포맷 | 실시간 메시징 최적화 | 대역폭 절감 | 디버깅 복잡성 |
| Auth0 | Protocol Buffers | 인증 데이터 최적화 | 빠른 처리, 데이터 무결성 | 호환성 문제 가능 |
| 개인 도입 | BSON | 경량 저장 및 전송 | 빠른 읽기/쓰기, 유연성 | 약간의 오버헤드 |
JSON은 여전히 널리 사용되지만, 대규모 트래픽, 빠른 응답성, 특수 데이터 구조가 필요한 경우에는 대체 형식을 고려할 가치가 있습니다. 특히, Protocol Buffers와 같은 이진 직렬화 포맷은 다양한 기업이 선택하는 대안으로 부상하고 있습니다. BSON은 구조를 유지하면서도 더 나은 성능을 제공할 수 있는 훌륭한 대안이며, Kafka와 같은 스트리밍 환경에서도 유용하게 활용할 수 있습니다. 반면, Uber의 H3처럼 특정 도메인 문제를 해결하기 위한 포맷도 존재한다는 점에서, 상황에 맞는 선택이 중요합니다.
| 백엔드 개발자, 협업이 어렵다고요? 스몰토크부터 시작해봐요 (0) | 2025.05.27 |
|---|---|
| AWS SQS 선택기: Kafka와 RabbitMQ를 제치고 선택한 이유 (0) | 2025.05.15 |
| Java 19 + Spring Boot 3.1.2 JWT 인증 시스템 구축 가이드 (2) | 2025.04.25 |
| 이해하기 쉽게 정리하는 클린 아키텍처 (0) | 2022.08.02 |
| 코드 구성하기 (0) | 2022.06.13 |