🔥 ggsql 알파 — Posit이 SQL 안에 ggplot2를 심었다

출처: ggsql: A grammar of graphics for SQL — Posit Open Source
출근길에 트위터 피드를 내리다가 Thomas Lin Pedersen이 뭔가를 공개한다는 예고를 봤다. 평소 과장을 잘 쓰지 않는 사람이 "beyond description"이라는 단어를 꺼낸 걸 보니, 큰 걸 들고 나오는구나 싶었다. 링크를 따라가 보니 ggsql 알파였다. 그러니까 SQL 쿼리 맨 뒤에 VISUALIZE 절을 붙여, ggplot2 감성의 그래프를 그리는 새 언어였다.
R도 파이썬도 없이, 쿼리 결과를 그대로 그림으로 뽑는다. 처음엔 "또 SQL 방언인가" 싶었는데, 5분쯤 읽어 보니 이건 방언보다는 증축에 가깝다는 생각이 들었다.
무슨 일이 있었나
Posit 오픈소스 블로그가 2026년 4월 20일에 ggsql 알파 릴리스를 공개했다(verified 2026-04-22). 저자는 네 명이다. Thomas Lin Pedersen은 현재 ggplot2 메인테이너고, Hadley Wickham은 원작자다. 여기에 Teun Van den Brand와 George Stagg가 합류했다. 전부 Posit 소속이다.
GitHub 저장소에 가 보면 코드의 93.4%가 Rust로 쓰여 있고, 라이선스는 MIT다. 현재 버전은 0.2.7(verified 2026-04-22). 알파라는 이름이 무색할 만큼 인프라는 이미 꽤 깔려 있다. Quarto, Jupyter, Positron, VS Code 확장, CLI, 브라우저 플레이그라운드까지 동시에 나왔다.
핵심 문법은 이런 식이다.
VISUALIZE bill_len AS x, bill_dep AS y, species AS color FROM ggsql:penguins
DRAW point
DRAW smoothVISUALIZE bill_len AS x, bill_dep AS y, species AS color FROM ggsql:penguins
DRAW point
DRAW smoothSELECT 대신 VISUALIZE로 시작한다는 점만 다르다. 컬럼을 축(x, y)이나 색(color) 같은 "시각 속성"에 매핑하고, DRAW point로 레이어를 쌓는다. 한 줄 더 얹어 DRAW smooth를 추가하면 회귀선이 따라붙는다. 사전 정의된 차트 타입이 없고, 레이어를 더하고 빼는 방식으로 만들어 간다. 이게 그래머 오브 그래픽스의 기본 설계다.
왜 의미가 있는가

출처: ggsql 발표 블로그
이야기의 핵심은 "런타임을 버린다"는 결정이다.
ggplot2나 plotnine은 각각 R과 파이썬이 필요하다. 뒤집어 말하면, R/파이썬 인터프리터를 같이 들고 다녀야 한다는 뜻이다. ggsql은 Rust로 쓴 단일 실행 파일이고, 필요하면 WebAssembly로도 돌아간다. 내부적으로 DuckDB나 SQLite를 리더로 쓰고, 결과는 Vega-Lite 사양으로 뱉는다. 출력만 보면 우리에게 익숙한 Vega 생태계 위에 얹힌 DSL인 셈이다.
이 결정이 가져다 주는 두 가지가 있다.
첫째, 샌드박싱이 쉬워진다. LLM 에이전트에게 "데이터 좀 그려 달라"고 시키기에 파이썬 실행 환경을 통째로 열어 주는 건 불편한 일이다. ggsql 정도의 제한된 표면이라면, 에이전트가 프로덕션에서 돌아가도 사고 범위가 좁다. Posit은 이미 querychat이라는 자연어 인터페이스에서 ggsql을 붙여 보고 있다고 했다. querychat은 ggsql 발표 이전부터 개발되어 온 인터페이스인데, 이제 그 뒤에 더 안전하게 꽂아 쓸 렌더러가 생긴 모양새다.
둘째, 집계를 DB 쪽에서 한다. 공식 글이 든 예는 꽤 강하다. 100억 행 트랜잭션으로 막대 그래프를 그려도, 클라이언트로 끌어오는 건 막대마다의 집계값이지 원본 100억 행이 아니다. 히스토그램이나 박스플롯, 밀도 플롯 같이 파생 통계를 요구하는 레이어도 레이어당 하나의 SQL로 번역된다. 한 번이라도 ggplot2 코드에 100만 행짜리 데이터프레임을 넣어 본 사람이라면, 이 대목이 왜 중요한지 감이 올 것이다.
그래머 오브 그래픽스와 SQL이 "선언적이고 조합 가능한 연산"이라는 같은 뿌리에서 나왔다는 Posit의 주장은, 솔직히 처음엔 말장난처럼 들렸다. 그런데 예제 하나를 뜯어 보니 생각이 바뀌었다. 매핑은 SELECT 같은 얼라이어스다. DRAW는 JOIN처럼 레이어를 얹는다. SCALE은 데이터 값을 시각 값으로 바꾸는 함수다. 각자가 독립적이고, 순서가 바뀌어도 뜻이 무너지지 않는다. 18년간 ggplot2를 만들어 온 사람들이 SQL이라는 틀에서 다시 문법을 짜면 이런 모양이 나오는구나, 싶었다.
역사적 맥락 — 18년의 주름
ggplot2 첫 릴리스는 2007년 6월이었다(verified 2026-04-22, CRAN 아카이브 기준). Hadley Wickham이 만들었고, Leland Wilkinson의 책 The Grammar of Graphics가 이론적 토대다.
그 사이 경쟁자들은 많았다. 파이썬 쪽에는 plotnine이 ggplot2 문법을 가져다 심었고, JavaScript 쪽에는 Vega-Lite가 JSON 기반의 선언형 문법을 내놨다. Observable Plot도 같은 그래머 오브 그래픽스 계열로 더 간결한 API를 추구한다. SQL 진영에서는 Malloy가 별도의 모델링 언어를 만들어 SQL 엔진 위에 앉혔다. 방향은 다르지만, "SQL에 선언형 데이터 처리의 감각을 더한다"는 흐름은 몇 년째 꾸준하다.
ggsql은 이 흐름 중에서도 가장 "내장 지향"에 가깝다. SQL 위에 새 절을 하나 더 붙였을 뿐이고, 쿼리 한 덩어리로 데이터 변환과 시각화를 모두 끝낸다. 출력은 Vega-Lite이니 Vega 생태계를 그대로 누릴 수도 있다. 이런 스택은 2020년대 초반까지만 해도 몇 군데 흩어져 있던 조각들이었다. 그걸 한 덩어리로 묶어, 쓸만한 알파까지 밀어올린 게 이번 발표의 실제 무게감이다.
내가 느낀 것
솔직히 두 가지 감정이 동시에 들었다.
하나는 기대다. 내 직장에서 가장 많이 다루는 도구는 BigQuery와 DuckDB고, 시각화가 필요할 때마다 결과를 CSV로 내리고 파이썬 노트북을 띄운다. 그 왕복이 늘 어색했다. ggsql이 쿼리 옆에 바로 붙어 있다면, 그 마찰이 꽤 줄어들 것 같다. 특히 Quarto 리포트 안에서, SQL 셀 하나로 집계와 플롯을 끝낼 수 있다면 그건 진짜 편리하다.
또 하나는 조심스러움이다. 알파 버전이고, 루트 문법도 아직 확정이 아니다. 테마 엔진이 없고, 인터랙션도 없고, 언어 서버도 없다. "고성능 라이터를 Rust로 다시 쓰겠다"는 로드맵 항목을 보면, 현재의 Vega-Lite 출력이 영구적인 최종 형태가 아닐 수도 있다는 인상을 받았다(공식적으로 과도기라고 명시되진 않았다). 플러그인 생태계가 자리 잡으려면 시간이 더 필요해 보인다.
그래서 이번 주말엔 DuckDB에 가지고 있는 로그 덤프 하나를 꺼내, ggsql CLI로 설치 가이드 한 번 따라가 볼 생각이다. 내 직관이 맞다면, 한 시간 안에 쿼리 뒤에 VISUALIZE를 자연스럽게 붙이게 될 것이다. 그 한 줄의 거리감이 얼마나 좁혀지는지, 이게 이번 알파의 진짜 시험대 같다.
ggplot2가 18년 동안 쌓아 온 관성을 벗어나 "빈 캔버스"에서 다시 시작한다는 Posit의 문장은, 같은 회사에서 두 도구를 동시에 밀어야 하는 조심스러움이 묻어난다. 그럼에도 나는 이 알파가 반갑다. 오랜만에, 문법 자체가 궁금해지는 도구를 만났다.
참고 자료
- ggsql: A grammar of graphics for SQL — Posit Open Source (2026-04-20) — 이번 알파 발표의 원문
- ggsql 공식 사이트 — 설치, 문법 레퍼런스, 플레이그라운드
- posit-dev/ggsql (GitHub) — 저장소, Rust 소스, 이슈 트래커
- ggplot2 공식 사이트 — 18년짜리 선배이자 문법의 뿌리
- querychat — Posit의 자연어 데이터 탐색 UI, ggsql 연계
- Vega-Lite — ggsql이 내부 출력으로 쓰는 선언형 시각화 문법
- Malloy — 같은 흐름에 있는 SQL 기반 선언형 모델링 언어








