
NDJSON은 Newline Delimited JSON 의 약어로, 각 줄마다 하나의 JSON 객체가 위치하는 텍스트 기반 데이터 포맷이에요. 일반 JSON 과 달리 NDJSON 은 큰 데이터셋이나 스트리밍 데이터를 다룰 때 유용하며, 한 번에 전체 데이터를 메모리에 적재하지 않고 한 줄 씩 처리할 수 있는 장점이 있어요.
{"some":"thing"}
{"foo":170,"bar":false,"quux":true}
{"may":{"include":"nested","objects":["and","arrays"]}}
정말 이게 끝이에요! JSON Array 와 유사해 보이지만 처음과 끝에 대괄호가 없고 각 객체가 쉼표 대신 개행으로 구분 된다는 차이점이 있어요.
NDJSON의 특징
행 단위의 데이터 처리
NDJSON 파일은 각 줄이 독립적인 JSON 객체로 구성되어 있기 때문에, 파일의 일부분만 읽어서 처리할 수 있어요. 이러한 특성 덕분에 메모리를 효율적으로 사용하여 대용량 데이터 처리나 스트리밍 처리에 유리해요.
또한 UNIX Pipes 와 궁합도 좋아요. 마지막 로그를 보려면 어디까지 불러와야 하나 고민되셨나요?
tail -n 1 log.ndjson
끝났어요.
간단한 파싱 구조
각 줄이 JSON 객체 이므로, 줄 단위로 읽어 JSON 파서를 통해 쉽게 객체로 변환할 수 있어요. 이는 데이터의 직렬화/역직렬화 작업을 간편하게 만들어 줘요. 단, 처리할 때 빈 줄이 있는 경우라던가 전체 객체 중 일부만 파싱에 실패하는 등 예외 처리에 대한 고려가 필요해요.
유연한 데이터 추가
JSON Array 와 달리 새로운 데이터 객체를 추가할 때마다 파일 전체를 읽을 필요 없이 파일의 끝에 단순히 추가하면 되므로, 실시간 로그 기록이나 데이터 추가 작업에 매우 효율적이에요. 마찬가지로 최근에 추가된 데이터를 조회하기도 쉬워요.
// json
const data = fs.readFileSync("./log.json", "utf8");
const json = JSON.parse(data);
json.push({ timestamp: new Date().toISOString() });
fs.writeFileSync("./log.json", JSON.stringify(json), "utf8");
// ndjson
const newEntity = { timestamp: new Date().toISOString() };
fs.appendFileSync("./log.json", JSON.stringify(newEntity), "utf8");
정리
NDJSON 은 대용량 데이터 처리, 스트리밍 및 로그 기록에 매우 유용한 데이터 포맷이에요. 각 줄이 독립적인 JSON 객체로 구성되어 있기 때문에, 데이터를 한 줄 씩 처리할 수 있는 유연성을 제공해요.
참고 : NDJSON 공식 스펙
Read more

CSS 전처리기는 아직도 쓸 이유가 있을까?
Sass가 메운 CSS의 빈틈을 모던 CSS가 어디까지 따라잡았는지, 아직 남은 영역은 무엇인지 런타임/컴파일타임 관점으로 정리해요.

URI, URL, URN은 무엇이 다를까?
URI가 큰 우산이고 URL과 URN이 그 안에서 어떻게 다른지, 그리고 왜 셋의 경계가 생각만큼 딱 나뉘지 않는지 정리해요.

블록체인 자금 추적에서 Pari Passu는 어떻게 쓰이나
블록체인 거래 그래프에서 자금이 섞였을 때 Pari Passu 방식이 어떤 의미로 쓰이는지, FIFO와 Rolling Charge와 비교해 실무적으로 확인해야 할 지점을 정리해요.