0
RX – JSON을 대체하는 랜덤 액세스 데이터 포맷
backend
요약
기사 전체 정리
RX – 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로 바로 설치 가능
댓글
댓글
댓글을 불러오는 중...