핵심 요약
- 트위터에서 '진짜 개발자는 JSON을 쓰지 않는다'는 글을 보고 자극받은 개발자가 직접 바이너리 스키마 언어 개발에 뛰어들었습니다.
- 간단한 파일 쓰기로 시작했으나 헤더 설계, 가변 정수(varint), 스키마 정의를 거쳐 JSON 용량을 80% 줄이는 포맷을 완성했습니다.
- 타입과 길이 낭비를 줄이기 위해 비트 연산과 스키마 방식을 차례로 도입해 나가는 좌충우돌 구현 과정이 주목을 받았습니다.
요약 트위터(X)에서 "진짜 개발자는 데이터를 JSON 따위로 저장하지 않는다"는 주장을 본 한 개발자가, 자신도 '진짜 개발자'가 되어보겠다며 직접 바이너리 패킹 포맷 개발에 도전한 과정을 공유했습니다. 처음에는 그저 파일 쓰기(wb) 함수 몇 개 쓰는 수준일 줄 알았으나, 결국 JSON 용량을 80% 줄여주는 독자적인 바이너리 스키마 언어 'jBin'까지 만들게 되었습니다.
작성자는 문자열 "hello world"를 ASCII 코드로 치환하고 C언어로 바이너리 파일에 기록하는 기초적인 방법부터 시작했습니다. 숫자를 표현할 때 '104'를 ASCII 3바이트로 적는 대신 1바이트 정수로 아끼려면 디코더가 데이터 유형을 식별할 수 있는 헤더([TYPE][DATA])가 필요하다는 점을 짚었습니다. 이어 가변 길이 문자열을 다루기 위해 길이 정보를 추가한 [TYPE][LENGTH][DATA] 구조를 도입했고, 불필요한 헤더 바이트를 줄이기 위해 MSB(최상위 비트)를 연속 플래그로 활용하는 가변 길이 정수(varint) 인코딩 기법을 구현했습니다.
더 나아가 매 필드마다 타입 정보를 일일이 붙이는 비효율을 해결하기 위해 C 구조체처럼 미리 데이터 규격을 정의하는 '스키마(Schema)' 개념을 도입했습니다. 프로토콜 버퍼(Protobuf)와 마찬가지로 스키마가 미리 타입을 정의해 두면 바이너리 데이터 내부에는 타입 정보를 생략할 수 있게 되며, 작성자는 정수와 불리언을 위한 varint, 고정 소수점(f32, f64), 그리고 문자열을 위한 구분자(delimited) 방식으로 인코딩 타입을 체계화해 나갔습니다. 사소한 인터넷 논쟁에서 출발해 바이트 단위 최적화와 스키마 설계까지 파고든 개발자의 흥미로운 삽질기입니다.
Sponsored · 광고