대부분의 개발자는 데이터 형식에 대해 짧은 목록을 갖고 있습니다: API에는 JSON, 스프레드시트에는 CSV, 설정 파일에는 YAML, 레거시 시스템을 다룬다면 XML 정도입니다. 하지만 AI 툴링 공간에 조용히 자리를 잡아가는 새로운 형식이 있습니다 — TOON, 즉 Token-Oriented Object Notation입니다. 이 형식은 하나의 특정 문제를 위해 처음부터 설계되었습니다: 토큰 예산을 낭비하지 않으면서 대형 언어 모델에 구조화된 데이터를 전달하는 것입니다.

TOON이란 무엇인가요?

TOON은 Token-Oriented Object Notation의 약자입니다. 이것은 구조화된 데이터를 LLM 프롬프트나 응답에 삽입할 때 소비되는 토큰 수를 최소화하기 위해 특별히 제작된 압축 데이터 직렬화 형식입니다. JSON에서 모든 불필요한 요소를 제거한 것으로 생각하세요 — 배열에서 반복되는 키 이름, 불필요한 따옴표, 불필요한 공백 없이 — 가능한 한 적은 구문 노이즈로 신호만 남긴 형식입니다.

npm 패키지는 @toon-format/toon이며, 모든 Node.js 프로젝트나 현대적인 번들러에서 작동하는 간단한 encode / decode API를 제공합니다. TOON 파일은 .toon 확장자를 사용합니다.

왜 JSON을 그냥 사용하지 않나요?

JSON은 대역폭이 저렴하고 파싱이 런타임에 의해 처리되는 기계 간 통신에 탁월합니다. 하지만 OpenAI API 또는 Anthropic API에 프롬프트의 일부로 데이터를 전송할 때는 모든 문자가 중요합니다 — 말 그대로. 두 API 모두 토큰당 요금을 부과하며, 토큰은 대략 4자의 영어 텍스트에 해당합니다.

100개의 사용자 레코드 테이블을 생각해보세요. JSON에서는 키 — "id", "name", "role", "email" — 를 레코드마다 반복해야 합니다. 이는 동일한 구조 정보의 100개 복사본입니다. TOON의 표 형식 구문은 이러한 키를 한 번만 정의하고 CSV처럼 행별로 값을 나열하지만, 객체 구조는 보존됩니다. 실제 데이터셋에서 토큰 절감은 압축 JSON에 비해 40~70%에 달할 수 있습니다.

경험 법칙: 프롬프트에 몇 개 이상의 레코드를 포함할 경우, TOON이 JSON보다 거의 항상 더 저렴합니다. 우리의 JSON to TOON 변환기를 사용하여 페이로드가 얼마나 작아지는지 정확히 확인하세요.

TOON 구문 한눈에 보기

TOON은 네 가지 핵심 데이터 형태를 지원합니다: 스칼라(문자열, 숫자, 불리언), 배열, 객체, 표 형식 데이터. JSON으로 작업해본 적이 있다면 스칼라와 컬렉션 구문이 익숙하게 느껴질 것입니다 — 표 형식이 TOON이 진정으로 차별화되는 부분입니다.

단순한 객체는 외부 중괄호의 공백을 제거하고, 불필요한 따옴표를 생략하며, 키-값 쌍을 쉼표로 구분합니다:

text
{name:Alice,age:30,role:admin}

단순한 스칼라 배열은 예상대로 보입니다:

text
[1,2,3]

이제 흥미로운 부분이 있습니다 — 표 형식 데이터. 이것이 LLM 사용 사례에서 TOON을 매력적으로 만드는 구문입니다. 배열의 모든 객체에 대해 키를 반복하는 대신, 헤더에 스키마를 한 번 선언하고 행별로 값을 나열합니다:

text
users[3]{id,name,role}:
  1,Alice,admin
  2,Bob,user
  3,Charlie,editor

이 블록은 3개의 사용자 객체 배열을 나타내며 — 아래 JSON과 동등하지만 — 훨씬 적은 토큰으로 표현됩니다. 헤더 users[3]{id,name,role}는 파서에게 알려줍니다: "이것은 users라는 변수이고, 3개의 행이 있으며, 각 행은 id, name, role 필드에 매핑됩니다". 행은 순수한 값이며, 키 반복이 없습니다.

json
[
  { "id": 1, "name": "Alice", "role": "admin" },
  { "id": 2, "name": "Bob",   "role": "user"  },
  { "id": 3, "name": "Charlie", "role": "editor" }
]

@toon-format/toon 패키지 설치 및 사용

공식 npm 패키지는 JavaScript 값을 TOON 문자열로 인코딩하고 TOON 문자열을 JavaScript 객체와 배열로 디코딩하는 작업을 모두 처리합니다. npm 레지스트리에서 설치하세요:

bash
npm install @toon-format/toon

패키지는 두 가지 함수를 내보냅니다 — encodedecode:

ts
import { encode, decode } from '@toon-format/toon';

// Decode a TOON string → JavaScript value
const toonString = `users[3]{id,name,role}:
  1,Alice,admin
  2,Bob,user
  3,Charlie,editor`;

const users = decode(toonString);
console.log(users[0].name); // "Alice"
console.log(users[1].role); // "user"

// Encode a JavaScript value → TOON string
const config = {
  model: 'gpt-4o',
  temperature: 0.7,
  maxTokens: 1024,
  stream: true
};

const toon = encode(config, { indent: 2 });
console.log(toon);
// {model:gpt-4o,temperature:0.7,maxTokens:1024,stream:true}

encode()indent 옵션은 출력이 보기 좋게 인쇄되는지 여부를 제어합니다. LLM 프롬프트의 경우 토큰 절약을 위해 일반적으로 압축 출력(들여쓰기 없음)이 필요합니다. 디버깅이나 사람이 읽을 수 있는 .toon 파일의 경우 { indent: 2 }를 사용하면 보기 좋게 형식화된 출력을 얻을 수 있습니다.

실제 사용 사례: LLM에 레코드 전송

사용자 활동을 요약해야 하는 제품 분석 기능을 구축하고 있다고 상상해보세요. 데이터베이스에서 최근 세션 레코드를 가져와 자연어 요약을 위해 LLM에 보내려고 합니다. TOON을 사용하면 다음과 같습니다:

ts
import { encode } from '@toon-format/toon';

const sessions = [
  { userId: 101, action: 'login',        duration: 0,   page: '/dashboard' },
  { userId: 101, action: 'view_report',  duration: 142, page: '/reports/q1' },
  { userId: 101, action: 'export_csv',   duration: 8,   page: '/reports/q1' },
  { userId: 102, action: 'login',        duration: 0,   page: '/dashboard' },
  { userId: 102, action: 'edit_profile', duration: 37,  page: '/settings'  }
];

const toonPayload = encode(sessions);
// sessions[5]{userId,action,duration,page}:
//   101,login,0,/dashboard
//   101,view_report,142,/reports/q1
//   101,export_csv,8,/reports/q1
//   102,login,0,/dashboard
//   102,edit_profile,37,/settings

const prompt = `Summarise the following user activity. Data is in TOON format.\n\n${toonPayload}`;

이 5개 세션 레코드의 TOON 표현은 동등한 JSON보다 훨씬 짧습니다. JSON은 "userId", "action", "duration", "page"를 다섯 번씩 반복합니다. 수백 개의 레코드에 걸쳐 절감 효과는 상당하며, 이는 직접적으로 더 낮은 API 비용과 더 빠른 응답 시간 (어텐션 윈도우에서 처리할 토큰이 적음)으로 이어집니다.

TOON의 주요 데이터 유형

TOON은 JavaScript 및 대부분의 다른 언어에서 이미 사용하는 기본 요소에 깔끔하게 매핑됩니다:

  • 문자열 — 특수 문자가 없을 때 따옴표 없음. 쉼표, 콜론 또는 공백이 포함된 경우 이중 따옴표로 묶임.
  • 숫자 — 정수와 부동소수점을 그대로 작성: 42, 3.14, -7.
  • 불리언truefalse, JSON과 동일.
  • Null — 없거나 정의되지 않은 값에는 null로 표기.
  • 배열 — 짧은 목록에는 인라인 괄호 구문 [val1,val2,val3]; 객체 배열에는 표 헤더 구문.
  • 객체 — 단일 객체에는 중괄호 구문 {key:value,key2:value2}.
  • 표 형식 데이터 — 스타: name[n]{col1,col2,...}: 헤더 뒤에 쉼표로 구분된 행 — 동일한 형태의 레코드 컬렉션에 이상적.

TOON과 다른 형식 중 언제 무엇을 선택할까요

TOON은 JSON을 범용 교환 형식으로 대체하려는 것이 아닙니다. 특정 틈새를 채웁니다. 빠른 결정 가이드는 다음과 같습니다:

  • JSON 사용: REST API를 구축하거나, 데이터베이스에 문서를 저장하거나, 서비스 간에 데이터를 전달할 때. JSON은 보편적으로 지원되고, 도구가 잘 갖춰져 있으며, 사람이 읽을 수 있습니다.
  • TOON 사용: 구조화된 데이터가 프롬프트 또는 LLM 컨텍스트 윈도우의 일부이고 토큰 수가 중요할 때. 표 형식은 사용자 목록, 로그 항목, 제품 카탈로그, 분석 이벤트 등 레코드 행으로 작업할 때 빛을 발합니다.
  • CSV 사용: 평면 표 형식 데이터만 필요하고 소비자가 CSV를 기대할 때(스프레드시트, BI 도구). CSV는 객체 중첩이 없으므로 TOON이 더 표현력이 높습니다.
  • YAML 사용: 가독성과 주석이 압축성보다 더 중요한 사람이 편집하는 설정 파일.
  • LLM 도구 출력에도 TOON 사용: LLM이 도구를 호출하고 구조화된 결과를 반환하는 경우, TOON으로 결과를 인코딩하면 API 호출의 입력과 출력 양쪽에서 토큰이 절약됩니다.
TOON이 현재 JSON 페이로드와 어떻게 비교되는지 확실하지 않으신가요? JSON을 JSON to TOON 변환기에 넣으면 두 표현을 나란히 보여주고 예상 토큰 수 비교도 제공합니다.

마무리

TOON — Token-Oriented Object Notation — 은 LLM 시대를 위해 구축된 압축 직렬화 형식입니다. JSON의 친숙한 구조(객체, 배열, 스칼라)를 유지하면서 레코드 전반에 걸친 중복 키 반복을 제거하는 표 형식 구문을 도입합니다. 결과는 동등한 JSON보다 40~70% 더 작을 수 있는 형식으로, OpenAI API, Anthropic API 또는 기타 토큰 청구 LLM 서비스와 함께 작업할 때 직접적으로 더 낮은 토큰 비용으로 이어집니다.

TOON을 직접 탐색하고 싶다면, 여기에 전체 도구 모음이 있습니다: TOON Formatter를 사용하여 TOON 문서를 보기 좋게 인쇄하고 검사하고, TOON Validator로 구문 오류를 잡고, JSON to TOON 변환기로 기존 페이로드를 마이그레이션하고, 반대로 가야 할 경우 TOON to JSON 변환기를 사용하세요. @toon-format/toon npm 패키지는 encodedecode를 제공하여 TOON을 Node.js 또는 브라우저 측 코드에 몇 분 안에 직접 통합할 수 있게 해줍니다.