TL;DR
- NDJSON์ ์คํธ๋ฆฌ๋ฐ ํ๋กํ ์ฝ(TCP, UNIX pipe ๋ฑ)์์ ์ฌ๋ฌ JSON ์ธ์คํด์ค๋ฅผ ์ ์กํ๊ธฐ ์ํ ์ค๋ฐ๊ฟ ๊ตฌ๋ถ ํฌ๋งท์ด๋ค.
- ํ ์ค์ ํ๋์ ์ ํจํ JSON ํ ์คํธ,
\n์ผ๋ก ๊ตฌ๋ถ, UTF-8 ์ธ์ฝ๋ฉ ํ์.
NDJSON (Newline Delimited JSON)
๋ฐฐ๊ฒฝ
JSON ์์ฒด์๋ ์คํธ๋ฆผ ๋ด์์ ์ฌ๋ฌ JSON ๊ฐ์ ๊ตฌ๋ถํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. NDJSON์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๋ฐ๊ฟ(\n)์ ๊ตฌ๋ถ์ ๋ก ์ฌ์ฉํ๋ ๊ท์ฝ์ ์ ์ํ๋ค. ์คํธ๋ฆฌ๋ฐ ์ ์ก๋ฟ ์๋๋ผ ๋ฐ๊ตฌ์กฐํ ๋ฐ์ดํฐ์ ์ ์ฅ์๋ ์ ํฉํ๋ค.
ํต์ฌ ๊ท์น
Serialization (์ง๋ ฌํ)
- ๊ฐ JSON ํ ์คํธ๋ RFC 8259๋ฅผ ์ค์ํด์ผ ํ๋ค.
- ๊ฐ JSON ํ
์คํธ ๋ค์ ๋ฐ๋์
\n(0x0A) ๋ฅผ ๋ถ์ธ๋ค. \r(0x0D)๋\n์์ ์ ํ์ ์ผ๋ก ์ฌ ์ ์๋ค (\r\nํ์ฉ).- JSON ํ
์คํธ ๋ด๋ถ์ ์ค๋ฐ๊ฟ(
\n)์ด๋ ์บ๋ฆฌ์ง ๋ฆฌํด(\r)์ด ํฌํจ๋๋ฉด ์ ๋๋ค. - ๋ชจ๋ ๋ฐ์ดํฐ๋ UTF-8 ์ธ์ฝ๋ฉ์ด์ด์ผ ํ๋ค.
Parsing (ํ์ฑ)
- ํ์๋
\n(0x0A)๊ณผ\r\n(0x0D0A) ๋ชจ๋๋ฅผ ์ค ๊ตฌ๋ถ์๋ก ์์ฉํด์ผ ํ๋ค. - ํ์ฑํ ์ ์๋ JSON์ ์๋ฌ๋ฅผ ๋ฐ์์์ผ์ผ ํ๋ค.
- ๋น ์ค ๋ฌด์ ์ฌ๋ถ๋ ์ ํ ์ฌํญ์ด๋ฉฐ, ํด๋น ๋์์ ๋ฌธ์ํํ๊ณ ์ค์ ๊ฐ๋ฅํ๊ฒ ํด์ผ ํ๋ค.
๋ฏธ๋์ด ํ์ & ํ์ฅ์
- Media Type:
application/x-ndjson - File Extension:
.ndjson
์์
{"some":"thing"}
{"foo":17,"bar":false,"quux":true}
{"may":{"include":"nested","objects":["and","arrays"]}}
๊ฐ ์ค์ด ํ๋์ ์ ํจํ JSON ๊ฐ์ฒด์ด๋ฉฐ, ์ค๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
ํ์ฉ ๋งฅ๋ฝ
- ๋ก๊ทธ ์คํธ๋ฆฌ๋ฐ: ๊ฐ ๋ก๊ทธ ์ด๋ฒคํธ๋ฅผ ํ ์ค์ JSON์ผ๋ก ๊ธฐ๋ก โ ํ์ดํ๋ผ์ธ ์ฒ๋ฆฌ ์ฉ์ด
- ๋์ฉ๋ ๋ฐ์ดํฐ ๊ตํ: ์ ์ฒด ํ์ผ์ ํ์ฑํ์ง ์๊ณ ์ค ๋จ์๋ก ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ์ ํฌ๋งท: ML ํ์ต ๋ฐ์ดํฐ, ๋ฒค์น๋งํฌ ๋ฐ์ดํฐ์ ๋ฑ์์ ๋๋ฆฌ ์ฌ์ฉ (์: JSON Lines์ ์ฌ์ค์ ๋์ผ)
NDJSON vs JSON Lines
NDJSON๊ณผ JSON Lines (
.jsonl)๋ ์ฌ์ค์ ๋์ผํ ํฌ๋งท์ด๋ค. ๋ฏธ๋์ด ํ์ ๊ณผ ํ์ฅ์๋ง ๋ค๋ฅด๋ค.
Connections
- JSON Lines โ ์ฌ์ค์ ๋์ผ ํฌ๋งท, ํ์ฅ์ยท๋ฏธ๋์ด ํ์ ๋ง ์์ด
- SSE (Server-Sent Events) โ SSE๋ HTTP ์ด๋ฒคํธ ํ๋กํ ์ฝ(id, retry, event type ๋ด์ฅ), NDJSON์ ํ๋กํ ์ฝ ๋ฌด๊ด ์์ ์ง๋ ฌํ ํฌ๋งท
- Base64 ์ธ์ฝ๋ฉ โ JSON ๋ด ๋ฐ์ด๋๋ฆฌ ํ๋๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ์ฌ NDJSON์ ์ค์ ์ ์๋ค
Source Trail
- ์๋ณธ ์คํ: ndjson/ndjson-spec (GitHub)
- ๊ธฐ๋ฐ ํ์ค: RFC 8259 (JSON)
Discussion
Comments
๋๊ธ์ ์น์ธ ํ ๊ณต๊ฐ๋ฉ๋๋ค.