개발자
런타임을 소유합니다: 엔진 동작, 검증, 통합, 배포, 안정성.
runtime동작 방식
비즈니스 사용자는 Excel에서 레이아웃을 편집하고, 애플리케이션은 데이터와 입력값을 공급하며, xl3는 그 파일을 결정론적으로 실행합니다. 세 단계를 클릭하며 리포트 하나가 원본 데이터에서 완성된 Excel 파일까지 가는 과정을 따라가 보세요.
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Account | Region | Renewal | Owner | |||
| 2 | Acme Logistics | Seoul | 18400 | Mina | |||
| 3 | Beta Works | Busan | 7200 | Joon | |||
| 4 | |||||||
| 5 | |||||||
| 6 | |||||||
| 7 | |||||||
| 8 |
애플리케이션은 데이터 테이블(.xlsx 시트 또는 언어 중립적인 JSON 소스)과 실행 시 입력값을 xl3에 넘깁니다. 레이아웃에 관한 것은 코드에 하나도 들어가지 않습니다.
책임 기반 자동화
대부분의 Excel 자동화 도구는 개발자를 더 빠르게 만듭니다. xl3는 다른 결과를 지향합니다 — 예전에는 개발자가 필요했던 문서 변경을 운영자가 직접 맡도록 하는 것입니다. 모든 거래처가 저마다의 포맷을 요구할 때, 개발자 한 명이 그 포맷을 하나씩 구현하고 바뀔 때마다 다시 고치는 구조는 병목이 됩니다.
xl3는 수개월간 운영된 사내 서비스에서 다듬어졌습니다. 그 기간 동안 비개발자들이 Excel에서 직접 템플릿과 변환 규칙을 유지했고, 개발자는 거의 전적으로 런타임에 집중했습니다. 실제로 줄어든 것은 코드의 양이 아니라, 애초에 개발자가 손대야 하는 일의 양이었습니다.
런타임을 소유합니다: 엔진 동작, 검증, 통합, 배포, 안정성.
runtime템플릿을 소유합니다: 레이아웃, 열, 반복 규칙, 출력 형식, 문서별 로직 — Excel에서 직접 편집합니다.
template.xlsx문서가 조금 바뀔 때마다 릴리스를 기다리지 않고, 완성된 Excel 파일을 바로 받아 씁니다.
result.xlsxxl3는 개발자를 대체하려는 것이 아닙니다. 개발자는 런타임을, 운영자는 템플릿을 소유하며, 문서 자동화는 개발자만의 업무가 아니라 조직의 역량이 됩니다.
왜 Excel이 템플릿인가
ExcelJS, SheetJS, openpyxl, Apache POI는 스프레드시트의 DOM API입니다. 강력하지만 장황합니다. 리포트 레이아웃, 스타일, 병합 셀, 반복이 코드에 들어가면 열 하나 추가, 소계 이동, 헤더 서식 변경 같은 모든 디자인 변경이 배포가 됩니다.
xl3는 매번 되풀이되는 그 규칙을 다시 Excel 안으로 돌려놓습니다. Excel 파일은 이미 뷰이고, XTL이 이를 실행 가능하게 만듭니다. 애플리케이션은 데이터를 공급하고 엔진을 실행할 뿐입니다. 템플릿은 평범한 .xlsx이므로 — 매크로도, 벤더 클라우드도 없습니다 — diff를 뜨고, 풀 리퀘스트에서 리뷰하고, xl3를 들어본 적 없는 사람에게 건넬 수 있습니다.
라이브러리가 아니라 열린 표준
xl3는 세 부분으로 이루어진, 구현에 독립적인 열린 표준으로 정의됩니다. XTL의 표현 범위는 의도적으로 작게 유지해, 템플릿을 사람이 읽기도 AI가 초안을 쓰기도 쉽습니다.
규범적 정의: xl3 워크북 포맷과 그 작은 임베디드 표현 언어인 XTL. 함수는 파일이 만들어지기 전에 값이 정해져야 할 때만 XTL에 존재합니다 (ADR-0043).
spec/모든 구현이 실행해 적합성을 증명하는 언어 중립적 픽스처. 다른 언어 이식이 맞춰야 하는 계약은 특정 구현이 아니라 이 픽스처 모음입니다.
conformance/@xl3-lang/xl3(TypeScript)는 브라우저와 Node에서 실행됩니다. 유용하지만 규범은 아닙니다. Rust/WASM과 Python 이식이 진행 중입니다.
@xl3-lang/xl3XTL 0.1은 77 ADRs와 169 conformance fixtures를 갖추고 있으며, Stage 2에서 모두 통과합니다. TypeScript 레퍼런스 구현은 @xl3-lang/xl3에 게시되어 있습니다. 포팅 가이드가 계약을 문서화해, 다른 언어 이식이 이를 맞출 수 있게 합니다.
비교
| 접근 방식 | 강점 | 트레이드오프 |
|---|---|---|
| xl3 | 선언적 Excel 템플릿 실행. Excel 파일은 이미 존재하고, xl3가 데이터를 넣어 실행합니다. | 알파 단계, 단일 메인테이너, XTL 표현 범위는 의도적으로 작게 유지되며 1.0까지 계속 진화합니다. |
| Workbook APIs (ExcelJS, SheetJS, openpyxl, POI) | 애플리케이션 코드에서 저수준 또는 완전한 기능의 Excel 파일 생성. | 레이아웃, 스타일, 병합, 반복, 비즈니스 규칙이 코드가 됩니다. 비개발자는 템플릿을 안전하게 편집할 수 없습니다. |
| Python / VBA scripts | 기존 스프레드시트에 가까운 빠른 일회성 자동화. | 규칙이 코드나 한 담당자의 기억 속에 존재하며, 레이아웃 변경에는 여전히 코드 수정이 필요합니다. |
| Power Query / Office Scripts | Excel 생태계 안에서의 Microsoft 365 워크플로와 데이터 정형화. | 테넌트에 종속되며, 워크플로 규칙이 Excel 파일과 함께 이동하지 않습니다. |
| Template engines (JXLS, xltpl, jsreport xlsx) | 스프레드시트형 템플릿에서 의 서버 사이드 리포트 생성. | 유용한 선행 사례지만, 대개 하나의 런타임에 묶여 있고 작고 이식 가능한 Excel 규칙 포맷으로 자리 잡지는 못했습니다. |
| Doc-gen SaaS (Plumsail, Conga, Formstack) | 관리형 문서 워크플로, 통합, 승인, 전달. | 규칙이 벤더 서비스에 존재하며, 직접 검토하고 실행할 수 있는 이식 가능한 Excel 템플릿이 아닙니다. |
| Direct LLM → xlsx | 빠른 탐색적 초안 작성, 일회성 차트. | 반복 운영을 위한 결정론적 변환 계약이 아니며, 실행할 때마다 스타일과 합계가 달라집니다. |
개발자 API
레퍼런스 구현을 설치하고 데이터 버퍼를 넘겨 템플릿을 실행하세요. 운영자 경험은 파일 기반으로 유지하면서 앱이 배포와 검증을 담당합니다. 넘길 .xlsx 파일이 없을 때는 convertJson()이 언어 중립적인 JSON 소스를 그대로 받습니다.
$npm install @xl3-lang/xl3import { convert } from '@xl3-lang/xl3';
const outputs = await convert(templateBuffer, dataBuffer);
// OutputFile[] → formatted .xlsx workbook(s)5분 만에 시작하기 · 명세 읽기 · 포팅 가이드