본문으로 건너뛰기
피드

RX – JSON을 대체하는 랜덤 액세스 데이터 포맷

backend 약 5분
vote
0
댓글
북마크

대용량 JSON을 전체 파싱 없이 원하는 값만 직접 읽을 수 있는 새 텍스트 포맷 RX가 공개됨. 92MB 배포 매니페스트 기준 조회 속도가 JSON 대비 23,000배 빠르고, 파일 크기도 5.1MB로 대폭 줄어드는 성능을 보여줌.

  • 1

    92MB JSON → 5.1MB RX, 라우트 조회 69ms → 0.003ms (실제 프로덕션 데이터 벤치마크)

  • 2

    인코딩된 버퍼를 파싱 없이 직접 읽음 — 배열 O(1), 오브젝트 키 O(log n) 접근

  • 3

    반환값이 읽기 전용 Proxy라 기존 JS 코드(map/filter/JSON.stringify 등)에서 거의 그대로 동작

  • 4

    텍스트 인코딩이라 copy-paste 가능, 바이너리 툴 불필요

  • 5

    빌드/배포 아티팩트처럼 한 번 쓰고 드문드문 읽는 대용량 JSON에 최적화된 포맷

  • JSON의 고질적인 문제인 "전체 파싱" 없이 원하는 값만 바로 읽을 수 있는 새 포맷 RX가 공개됨
  • creationix가 만든 오픈소스 프로젝트로, "no-SQL SQLite"처럼 비정형 데이터에 데이터베이스 수준의 랜덤 액세스를 제공하는 게 컨셉임

성능 벤치마크 (92MB 배포 매니페스트, 라우트 키 35,000개 기준)

JSON RX
파일 크기 92 MB 5.1 MB
라우트 1개 조회 69 ms (전체 파싱) 0.003 ms (~16번 인덱스 이동)
힙 할당 횟수 2,598,384 ~10
  • 조회 속도 차이가 무려 23,000배 수준임. 단순 벤치마크가 아니라 실제 프로덕션 데이터 기준이라 더 설득력 있음

어떻게 동작하나

  • 인코딩 시 중복 값을 자동으로 제거(포인터 방식으로 재사용), 오브젝트 스키마 공유, 문자열 prefix 압축, 정렬 인덱스 추가가 자동으로 이뤄짐
  • 인코딩된 버퍼를 그대로 쿼리 — 별도 파싱 단계 없이 버퍼를 직접 읽음
  • 배열 접근은 O(1), 오브젝트 키 조회는 O(log n)
  • 반환값은 읽기 전용 Proxy 형태라 기존 JS 코드에서 거의 그대로 쓸 수 있음
    • Object.keys(), for...of, .map(), .filter(), 구조분해, JSON.stringify() 모두 지원

사용 예시

import { stringify } from "@creationix/rx";
const rx = stringify({ users: ["alice", "bob"], version: 3 });

import { parse } from "@creationix/rx";
const data = parse(rx) as any;
data.users[0] // "alice" — 파싱 없이 버퍼 직접 읽기
data.version  // 3
JSON.stringify(data) // 그대로 동작
  • 문자열 기반은 stringify/parse, 바이너리(Uint8Array) 기반은 encode/open 사용
  • CLI 툴도 제공되고, rx.run에서 브라우저로 바로 인스펙트 가능함

잘 맞는 케이스 vs 맞지 않는 케이스

이럴 때 쓰기 좋음

  • 빌드/배포 아티팩트, 라우트 테이블처럼 한 번 쓰고 드문드문 읽는 대용량 JSON
  • 브라우저, 엣지 런타임, 워커 프로세스에 임베드하는 데이터셋
  • 전체 문서 파싱이 병목인 워크플로우

이럴 때는 적합하지 않음

  • JSON 파싱이 이미 빠를 만큼 작은 문서
  • 사람이 직접 편집하는 설정 파일
  • 자주 쓰거나 변경이 많은 데이터 (그냥 DB 써야 함)
  • gzip/zstd 압축 전송 크기를 최소화해야 하는 경우
  • 테이블 구조면 SQLite, 고정 스키마면 Protobuf가 더 적합

포맷 구조

  • 텍스트 인코딩이라 바이너리처럼 툴을 타지 않고, copy-paste나 문자열 삽입이 가능함
  • 값은 오른쪽에서 왼쪽으로 읽는 구조: [body][tag][b64 varint]
  • 태그 종류: + 정수, * 소수, , 문자열, ' ref/리터럴, : 오브젝트, ; 배열, ^ 포인터, . 체인, # 인덱스

정리

  • JSON이 너무 크고 느리지만, SQLite나 Protobuf처럼 구조를 강제하고 싶지는 않은 그 사이 어딘가를 정확히 겨냥한 포맷임
  • 대규모 빌드/배포 파이프라인에서 매니페스트나 라우트 테이블을 다루는 팀이라면 한번쯤 검토해볼 만함
  • MIT 라이선스, npm 패키지 @creationix/rx로 바로 설치 가능

JSON이 너무 크고 느리지만 SQLite나 Protobuf처럼 스키마를 강제하기 싫은 틈새를 정확히 겨냥한 포맷. 대규모 배포 파이프라인이나 엣지 런타임에서 라우트 테이블 같은 읽기 전용 대용량 데이터를 다루는 팀에게 실용적인 선택지가 될 수 있음. 다만 쓰기가 잦거나 소규모 데이터엔 오히려 오버엔지니어링.

댓글

댓글

댓글을 불러오는 중...

backend

잘못된 추상화보다 중복이 낫다는 샌디 메츠의 고전 조언

샌디 메츠는 중복을 없애려다 잘못된 추상화를 만들면 코드가 조건문과 파라미터로 부풀어 더 위험해진다고 말한다. 이미 틀어진 추상화는 억지로 보존하지 말고, 다시 호출부에 인라인해서 중복을 되살린 뒤 현재 요구사항에 맞는 새 구조를 찾는 편이 빠르다는 주장이다.

backend

리눅스 커널, 6년·360개 넘는 패치 끝에 strncpy 제거

리눅스 커널이 오랫동안 버그의 원인이던 strncpy API 사용을 Linux 7.2에서 제거했어. NUL 종료 동작이 직관적이지 않고 불필요한 zero-fill로 성능 문제도 있던 API를 6년 동안 약 362개 커밋으로 걷어낸 작업임.

backend

덕디비는 왜 빠를까: 서버 없는 분석 엔진의 내부 구조 뜯어보기

DuckDB가 단일 바이너리, 인프로세스 실행, 컬럼형 저장, 최적화 패스, Parquet 푸시다운으로 빠른 분석 쿼리를 처리하는 방식을 깊게 설명한 글이다. 6GB Parquet 파일을 노트북에서 바로 SQL로 읽는 경험 뒤에 어떤 설계가 깔려 있는지 따라간다.

backend

피지독, 포스트그레스를 수평 확장시키겠다고 550만 달러 투자 유치

피지독은 포스트그레스 앞단에 프록시를 두고 샤딩과 라우팅을 처리해 수평 확장을 가능하게 하겠다는 오픈소스 프로젝트다. 이미 프로덕션에서 초당 200만 건이 넘는 쿼리를 처리하고, 확인된 규모만 20테라바이트 이상을 샤딩했다고 밝히며 550만 달러 투자를 공개했다.

backend

펜타시스템, EDB 포스트그레SQL로 국내 엔터프라이즈 DB 전환 시장 공략

펜타시스템테크놀러지가 EDB와 파트너 계약을 맺고 국내에 EDB 포스트그레SQL 기반 데이터 플랫폼을 공급한다. 기존 상용 DBMS 정책 변화로 비용 부담이 커진 기업들을 겨냥해, 오픈소스 기반 엔터프라이즈 데이터 플랫폼 전환 수요를 잡겠다는 전략이다. 금융, 공공, 제조, 유통, 클라우드, AI 데이터 분석 환경까지 적용 범위를 넓히려는 움직임이다.