- Observable Framework는 임시 데이터 탐색에 강한 노트북 모델을 넘어, 빠르게 로드되는 데이터 앱·대시보드·리포트를 정적 사이트로 배포하려는 오픈소스 도구임
- Markdown 안의
js코드 블록과 인라인 표현식이 브라우저에서 실행되고,now같은 반응형 값이 바뀌면 관련 표시도 자동 갱신됨 - Framework는 Observable Notebooks의 반응성을 유지하면서도 단일 Markdown 파일, 표준 JavaScript, Git 친화적인 작업 흐름을 제공함
Inputs,d3,Plot같은 라이브러리는 개발 중 지연 로딩되고, 빌드·배포 시에는 참조된 코드만 jsdelivr CDN에서 자동 로드됨- Data loader를 쓰면 빌드 시점에 임의의 언어로 데이터를 준비해 JSON·CSV 같은 정적 파일로 묶을 수 있어, 백엔드 의존도를 줄인 대시보드 배포가 가능함
데이터 앱을 위한 정적 사이트 생성기
- Observable Framework는 Markdown, JavaScript, 필요하면 다른 언어까지 섞어 인터랙티브 페이지로 컴파일하는 정적 사이트 생성기임
- 전체 기능을 갖춘 핫 리로딩 서버가 포함되어 있어 편집기에서 파일을 수정하고 저장하면 브라우저에 변경 사항이 즉시 반영됨
- 작업이 끝나면 빌드 명령으로 정적 파일 세트를 만들 수 있음
- 이 파일은 서버에 배포할 수 있음
npm run deploy로 Observable의 인증된 공유 플랫폼에 직접 배포할 수도 있음
Markdown 안에서 실행되는 JavaScript
- Framework의 핵심 설계는 Markdown 문서 안에 JavaScript를 넣어 인터랙티브 문서를 만드는 방식임
js로 태그된 Markdown 코드 블록은 사용자의 브라우저에서 JavaScript로 실행됨- 인라인 표현식도 사용할 수 있으며,
${new Date(now)}처럼 현재 시간을 문자열로 표시할 수 있음 now는 epoch 이후 밀리초 단위의 현재 시간을 제공하고 계속 갱신되는 특수 변수임now가 바뀌면 이를 참조하는 셀과 인라인 표현식도 함께 갱신됨
- Observable Notebooks에서는 코드와 Markdown이 별도 셀에 작성되지만, Framework에서는 둘이 하나의 텍스트 문서 안에 들어감
- 인라인 표현식과
js블록은 표시 방식이 다를 수 있음- 인라인 표현식은 JavaScript 객체의 기본 문자열 표현을 사용함
js블록은 Observable의display()함수를 사용하며, 표시 규칙은 inspect/src/inspect.js에 있음
반응형 실행 모델 유지
- Observable Notebooks의 핵심 기능인 반응성이 Framework의 JavaScript Markdown 문서에도 유지됨
- 어떤 셀이 바뀌면 그 셀에 의존하는 다른 셀이 자동으로 다시 평가됨
- 이 방식은 Jupyter notebooks와의 큰 차이점이며, Python notebook 도구인 marimo의 대표 기능이기도 함
- 폼 입력과 함께 쓰면 효과가 큼
- 페이지에 입력을 추가하고 그 값을 문서의 다른 부분에서 참조하면 실시간 상호작용을 쉽게 만들 수 있음
PyPI 다운로드 대시보드 예시
- 예시 대시보드는 Python 패키지별 PyPI 다운로드 통계를 보여주며, Observable Framework 버전은 57줄짜리 Markdown 문서로 구성됨
- 사용자는
Inputs.select()로packages배열에서 패키지를 고름Inputs.select()는 Framework에 포함된 메서드이며 Observable Inputs 문서에서 확인할 수 있음view()함수는 Framework에서 새로 추가된 기능이며, 입력 선택 변경이 문서의 다른 코드 블록에 반영되도록 함
packageName은const로 정의되어 페이지의 다른js블록에서 사용할 수 있음- 데이터는
d3.json()으로 가져옴- Framework에서는 D3 전체를 사용할 수 있음
- URL에는 선택된 패키지 이름이 포함됨
- 데이터 소스는 Datasette의 JSON API임
- SQLite 테이블은 datasette.io/content/stats에 있으며, 최신 PyPI 패키지 통계로 하루 한 번 업데이트됨
- 관련 GitHub Actions 워크플로는 이전 baked data 글에서 다뤄졌음
.json을 URL에 붙이면 JSON을 반환함- 특정 패키지 행만 요청함
- 날짜 내림차순으로 정렬함
- 최대 1,000개 행을 객체 배열로 받음
- SQLite 문자열 날짜는
d3.timeParse("%Y-%m-%d")로 JavaScriptDate객체로 변환됨 - 차트는 Framework에 함께 패키징된 Observable Plot으로 렌더링됨
- 패키지 목록은 Datasette의
/content데이터베이스에 직접 SQL 쿼리를 실행해 가져옴- 쿼리는
select package from stats group by package order by max(downloads) desc _shape=arrayfirst는 결과 행의 첫 번째 컬럼을 JSON 배열로 받는 단축 방식임
- 쿼리는
사용하는 코드만 포함
- 예시 대시보드는
Inputs,d3,Plot같은 추가 라이브러리를 사용함 - 개발 모드에서는 지연 로딩이 적용됨
- 셀에서 처음 사용하려고 할 때만 코드가 로드됨
- 애플리케이션을 빌드하고 배포하면 Framework가 참조된 라이브러리 코드만 jsdelivr CDN에서 자동 로드함
빌드 시점 데이터 캐싱
- Framework의 Data loader는 대시보드 데이터를 빌드 시점에 준비하는 기능임
- Framework 대시보드는 런타임에
fetch()나 그 래퍼를 사용해 어디서든 데이터를 가져올 수 있음- Observable Notebooks도 같은 방식으로 동작함
- 이 방식은 대시보드 성능이 연결된 백엔드에 좌우됨
- Framework는 배포 시점에 대시보드용 데이터를 만들고, 필요한 데이터 부분집합만 정적 파일로 묶는 패턴을 권장함
- 정적 데이터 파일은 대시보드 코드와 같은 정적 호스팅에서 빠르게 제공될 수 있음
- Data loader는 임의의 프로그래밍 언어로 작성한 스크립트임
- 빌드 시 Framework가 스크립트를 실행함
- 스크립트의 표준 출력 결과를 파일로 저장함
- 예시는
quakes.json.sh파일에curl https://earthquake.usgs.gov/earthquakes/feed/…를 넣는 방식임- 빌드 시 파일명은 목적지 파일이
quakes.json이고 실행할 로더가.sh임을 Framework에 알려줌
- 빌드 시 파일명은 목적지 파일이
- 표준 출력으로 JSON, CSV 또는 유용한 형식을 출력할 수 있다면 어떤 기술로든 데이터를 가져올 수 있음
Observable Notebooks와의 차이
- Observable Framework는 Observable Notebooks의 많은 아이디어와 코드를 재사용하지만, 파일 형식과 실행 환경에서 차이가 큼
- 기존 Observable Notebooks는 Jupyter Notebooks와 비교해 다음 특징을 가짐
- Python이 아니라 JavaScript를 사용함
- 노트북 편집기 자체는 오픈소스가 아니며 observablehq.com에서 제공되는 호스팅 제품임
- 노트북을 정적 파일로 내보내 어디서든 실행할 수 있지만, 편집기는 독점 제품임
- 셀은 반응형이며, 어떤 셀이 바뀌면 그 셀에 의존하는 다른 셀이 Excel처럼 자동 재평가됨
- 반응성 모델을 지원하기 위해
viewof라는 커스텀 키워드를 만들었기 때문에 JavaScript 문법이 완전히 표준은 아님 - 편집 가능한 노트북은 복잡한 독점 파일 형식이며 Git 같은 도구와 잘 맞지 않아 Observable이 자체 버전 관리와 협업 시스템을 구현함
- Observable Framework는 이 모델을 더 단순한 파일 형식과 오픈소스 실행 환경으로 옮김
- 문서는 JavaScript 블록이 포함된 단일 Markdown 파일임
- 여전히 반응형이지만 어떤 텍스트 편집기로도 편집할 수 있고 Git에 넣을 수 있음
- 전체가 ISC 라이선스의 오픈소스이며, 전체 편집 스택을 로컬 머신에서 실행할 수 있음
- 커스텀 문법 없이 표준 JavaScript만 사용함
Observable의 방향 변화
- Observable Framework는 Observable이 기존의 독점 Observable Notebook 편집기 중심 협업 도구에서 개발자 도구 쪽으로 더 기울어진 변화로 보임
- Observable의 Twitter 소개 문구는 “The end-to-end solution for developers who want to build and host dashboards that don’t suck”임
- 2023년 10월 3일 Internet Archive 사본에는 “Build data visualizations, dashboards, and data apps that impact your business — faster.”라고 되어 있었음
- Observable Notebooks는 플랫폼의 독점성과 무료 계정의 제한, 특히 무료 비공개 노트북 부재 때문에 사용이 일부 제한될 수 있음
- Observable Plot 같은 오픈소스 라이브러리는 이미 적극적으로 사용할 수 있는 기술로 평가됨
- Observable Framework는 Observable Notebooks를 매력적으로 만들었던 아이디어를 오픈소스, 표준 JavaScript, 단일 텍스트 파일, 정적 배포 모델로 다시 구현함