
최근 대규모 언어 모델을 활용한 애플리케이션 개발이 일반화되면서, 프롬프트에 구조화된 데이터를 어떻게 전달할 것인지가 점점 더 중요한 문제로 떠오르고 있다. 기존의 JSON은 웹 API의 표준으로서 널리 사용되고 있지만, LLM에 데이터를 전달하는 데에는 JSON이 불필요한 토큰 사용을 유발하거나 반복 구조를 지나치게 장황하게 만드는 경우가 많다.
이러한 문제를 해결하기 위해 등장한 형식이 TOON(Token-Oriented Object Notation)이다. TOON은 JSON 데이터 모델을 기반으로 설계되었지만, 프롬프트 맥락에서 효율성과 가독성을 극대화하기 위해 문법과 구조를 재구성한 포맷이다. 특히 반복되는 객체 배열과 같은 구조적 데이터를 압축적으로 표현하면서도 사람이 읽기 쉽게 유지하는 것을 핵심 목표로 한다.
TOON은 JSON과 동일하게 객체, 배열, 문자열, 숫자, Boolean, null과 같은 데이터 타입을 모두 표현할 수 있으며, 중요한 점은 이러한 데이터가 JSON ↔ TOON 간 변환되더라도 손실 없이 동일하게 유지된다는 점이다.
즉, TOON은 고유한 데이터 모델을 도입하지 않고 오직 표현 방식을 개선하는 데에 집중하며, 결과적으로 인공지능 프롬프트 환경에서 “데이터 표시 최적화 방식”이라는 역할을 갖는다. JSON이 웹 표준 데이터 포맷이라면, TOON은 LLM 프롬프트용 데이터 포맷에 더 가깝다고 볼 수 있다.
TOON의 가장 큰 특징은 들여쓰기 기반의 중첩 구조와 반복 객체 배열을 간결하게 줄여내는 배열 문법이다. 일반적인 JSON 객체는 {}와 []로 감싸야 하고 모든 속성명을 매번 반복해야 한다. 예를 들어 사용자 객체 배열을 JSON으로 표현하면 각 객체마다 모든 필드를 반복해야 한다.
반면 TOON에서는 배열을 정의할 때 필드명을 한 번만 선언하고, 이후 각 객체는 CSV와 유사한 형태로 이어서 나열하면 된다. 이 방식은 특히 JSON에서 가장 많은 토큰을 소비하는 패턴인 “objects inside arrays”를 압축하는 데에 효과적이다.
JSON에서 다음과 같은 구조가 있다고 가정하자.
{
"users": [
{ "id": 1, "name": "Alice", "role": "admin" },
{ "id": 2, "name": "Bob", "role": "editor" }
]
}이를 TOON으로 표현하면 다음과 같이 단 한 번의 선언으로 필드를 정의할 수 있다.
users[2]{id,name,role}:
1,Alice,admin
2,Bob,editor여기서 배열의 길이와 필드명이 그 자체로 하나의 스키마처럼 동작하여 LLM이나 사람 모두에게 구조를 한눈에 보여준다. JSON은 기호와 반복된 필드명으로 인해 데이터보다 “구조를 표현하기 위한 텍스트”가 훨씬 많이 등장하는 반면, TOON은 실제 데이터 비중이 훨씬 높아진다.
그 결과 LLM 프롬프트에서는 평균적으로 30%에서 60% 정도의 토큰을 절감할 수 있다는 분석도 있다. 이러한 절감은 곧바로 비용과 성능에 영향을 미치며, 특히 긴 문맥을 요구하는 프롬프트에서는 더 큰 차이를 만든다.
TOON은 배열뿐 아니라 일반적인 중첩 객체도 들여쓰기 기반으로 표현한다. 예를 들어 JSON에서 다음과 같이 작성하던 구조가 있다고 하면,
{
"user": {
"name": "Alice",
"isActive": true,
"languages": ["Korean", "English"]
}
}TOON에서는 다음과 같은 형태로 변환된다.
user:
name: Alice
isActive: true
languages[2]: Korean,EnglishTOON과 JSON의 차이를 문맥 중심으로 비교하면 몇 가지 중요한 관점이 드러난다. JSON은 여전히 API 통신, 웹 개발, 서버 간 데이터 교환을 위한 사실상의 표준 포맷이다. 모든 언어와 플랫폼이 JSON을 지원하며, 그 생태계는 이미 충분히 성숙해 있다. 반면 TOON은 “LLM에게 데이터 구조를 설명하기 위한 포맷”이라는 명확한 목적을 가지고 있다.
즉, JSON이 기계 친화적인 형식이라면 TOON은 LLM 친화적이며, 프롬프트에 삽입되는 데이터에 최적화된 표현식이라고 할 수 있다. 반복 구조를 가진 데이터를 프롬프트에 넣어야 하거나, 데이터 가독성을 유지하면서 토큰 비용을 줄여야 하는 시나리오라면 TOON은 JSON보다 훨씬 실용적인 대안으로 작동한다.
TOON은 실제 업무에서도 몇 가지 구체적인 사용 시나리오를 가진다. 우선 LLM을 통해 데이터 분석, 요약, 패턴 추출 등을 수행할 때 대량의 JSON 데이터를 그대로 넘기면 토큰 비용이 매우 커진다. 이때 JSON을 TOON으로 변환한 뒤 프롬프트에 삽입하면 같은 데이터를 훨씬 적은 토큰으로 전달할 수 있다. 또한 기능 명세서나 요구사항 문서처럼 개발자와 기획자, 디자이너가 함께 읽는 문서에서는 JSON보다 TOON이 훨씬 읽기 쉽고 자연스럽기 때문에 문서 가독성을 크게 향상시킬 수 있다. 마지막으로 LLM 기반 서비스에서 내부 데이터 포맷을 JSON으로 유지하되, LLM에게 전달되는 모든 데이터만 TOON으로 변환해 사용하는 전략은 데이터 구조의 일관성과 프롬프트 효율성을 동시에 확보할 수 있는 효과적인 접근 방식이다.
결론적으로 TOON과 JSON은 서로 경쟁하는 포맷이라기보다, 서로 다른 목적을 가진 두 가지 표현 방식이다. JSON은 웹과 서버 간 데이터 교환의 절대적인 표준으로 계속 사용될 것이며, TOON은 LLM 환경에서 구조화된 데이터를 더 효율적으로 전달하기 위한 전문적인 표현 방식으로 활용될 것이다.
더 읽어보기
2026.03.04
JavaScript를 위한 더 나은 Streams API가 필요하다
이 포스트는 node.js의 코어 컨트리뷰트이며 Cloudflare Workers 팀 소속 개발자 James M Snell이 cloudflare 블로그에 올린 We deserve a better streams API for JavaScript 게시글을 번역한 것이다. 번역하는 과정에서…
2026.03.01
함수, 펑터, 그리고 모나드
복잡한 버그는 대개 거대한 기능이 아니라 사소한 데이터 변환 구간에서 시작된다. 문자열을 한 번 다듬고, 숫자를 한 번 바꾸고, 그 결과를 다음 단계로 넘기는 단순한 흐름이다. 그런데 조건이 조금씩 추가되는 순간 로직은 빠르게 복잡해진다. 값만 바꾸던 코드가 어느새 값의 부재, 비동기…
2026.01.15
Static Hermes로 JavaScript를 C 코드로 컴파일하기
이 포스트는 parcel의 메인테이너 Devon Govett가 자신의 블로그에 올린 How to compile JavaScript to C with Static Hermes 게시글을 번역한 것이다. 번역하는 과정에서 다소 의역이 있을 수 있으며, 일부 번역에는 사견이 포함되어있기도 하다…
2026.01.03
CSS Color Functions
이 포스트는 Sunkanmi Fafowora가 css-tricks에 올린 CSS Color Functions 게시글을 번역한 것이다. 번역하는 과정에서 다소 의역이 있을 수 있으며, 일부 번역에는 사견이 포함되어있기도 하다.몇 달 전 누군가 저에게 “웹사이트가 돋보이려면 무엇이 필요할까…
2026.04.17
Code Server
처음 코드 서버를 만들었던 건 아마도 3년쯤 전의 일이다. 맥미니만 있던 탓에 밖에서 개발하는 게 쉽지 않았고, 아이패드로 언제 어디서든 개발을 하고 싶었던 끝에 찾아낸 해결책이었다. 다행히 집에는 Synology NAS가 있었고, Docker를 통해 어렵지 않게 코드 서버를 만들 수…
2026.04.11
Trie 자료구조
문자열 데이터를 다룰 때 단순히 “이 단어가 있나?”만으로는 부족한 순간이 있다. 자동 완성처럼 특정 접두사로 시작하는 후보를 모아야 할 때도 있고, 어떤 키에 값을 두고 빠르게 찾고 싶을 때도 있다. 이럴 때 가장 자연스럽게 떠올릴 수 있는 자료구조가 바로 Trie이다.Trie는 무엇…
2026.03.19
Streams API 부록 2. 왜 이미지는 위에서 아래로 나타날까
웹 페이지에서 이미지를 로드할 때 흥미로운 장면을 종종 볼 수 있다. 이미지가 한 번에 완전히 나타나는 것이 아니라, 위에서 아래로 조금씩 채워지면서 나타나는 경우가 있기 때문이다. 특히 네트워크가 느리거나 이미지가 큰 경우 이런 현상이 더 분명하게 보인다. 마치 이미지가 위쪽부터 스캔…
2026.03.19
Streams API 부록 1. HTTP 다운로드 진행률은 어떻게 계산될까
파일을 다운로드할 때 가끔 몇 퍼센트 진행되었는지 혹은 진행 막대(progress bar)가 조금씩 채워지는 모습을 볼 수 있다. 그런데 모든 다운로드가 이런 식으로 진행률을 보여 주는 것은 아니다. 어떤 다운로드는 퍼센트가 표시되지만, 어떤 경우에는 진행 막대 없이 로딩 스피너만 계속…
댓글
댓글을 불러오는 중...