- PostHog는 ANTLR 기반 C++ SQL 파서를 Claude Code로 16K줄의 Rust 파서와 5K줄의 도구, 수천 줄의 테스트로 재작성했다.
- 예측형 재귀 하강 파서와 Pratt 표현식 코어, 제한적 미리보기와 추측적 백트래킹을 결합해 범용 그래프 순회 비용을 제거했다.
- 노트북 기준 약 70배의 속도 향상을 달성했고, 프로덕션 섀도우 모드에서 수백만 번의 파싱이 단 한 번도 불일치하지 않았다.
AI 코딩 에이전트와 차등 테스트를 결합하면 대규모 컴포넌트도 성능과 안정성을 동시에 끌어올릴 수 있다는 점이 핵심 시사점이다.
PostHog는 데이터 제품의 핵심 의존성인 SQL 파서를 AI 코딩 에이전트 Claude Code를 활용해 사실상 다시 만들었다. 결과는 단순한 모더니제이션이 아니었다. 노트북 기준 약 70배의 속도 향상이 측정됐고, 수백만 건의 실제 쿼리에 대한 프로덕션 섀도우 모드에서 기존 C++ 파서와 한 번도 다른 결과를 내지 않았다. 본문은 도입 배경부터 아키텍처 결정, 검증 방법론, 정량 성과, 한국 조직에의 시사점까지 한 호흡에 정리한다.
왜 PostHog는 SQL 파서를 다시 만들었나
PostHog의 기존 SQL 파서는 ANTLR 기반 C++ 구현이었다. ANTLR는 임의 문법을 빠르게 자동 생성할 수 있다는 장점이 있지만, 런타임에는 ATN 상태 머신 기반으로 모든 토큰과 노드를 거치는 범용 그래프 순회를 수행한다. 이 비용은 데이터베이스에서 가장 자주 호출되는 컴포넌트 중 하나인 파서에서 그대로 누적돼, 분석 워크로드가 커질수록 병목으로 드러났다.
회사는 컴포넌트 하나를 처음부터 다시 쓰는 결정이 흔하지 않다는 점을 인지하고 있었다. 그럼에도 파서를 뜯어고친 이유는 두 가지로 풀이된다. 첫째, 파서의 출력은 이후 단계의 정당성을 결정하는 신뢰 경계이기 때문에 성능과 정확성을 동시에 통제할 가치가 크다. 둘째, Claude Code 같은 AI 코딩 에이전트가 등장하면서 사람이 직접 손으로 짜던 구현 상당 부분을 자동화할 수 있는 조건이 만들어졌기 때문이다.
결국 그들은 Claude Code를 여러 세션에 걸쳐 반복적으로 투입해 16K줄 규모의 Rust 파서 코드, 5K줄에 달하는 주변 도구, 그리고 수천 줄의 테스트 코드를 생성해 냈다.성하도록 했다. 작업의 본질은 ANTLR의 범용 비용을 제거하고 SQL 의미 구조에 꼭 맞는 파서 아키텍처를 새로 그리는 것이었다.
아키텍처 결정: 예측형 재귀 하강 파서와 Pratt 코어의 결합
재작성된 파서는 예측형 재귀 하강 파서를 골격으로 삼고, 표현식 처리는 Pratt 파서를 핵심에 두는 형태다. 여기에 두 가지 보조 기법이 더해졌다. 하나는 정말로 필요한 지점에만 쓰는 제한적 미리보기이고, 다른 하나는 일부 모호 지점에서 활용하는 추측적 백트래킹이다. 결과적으로 가장 흔한 경로에서는 그래프 순회 없이 즉시 전진하고, 드문 경로에서만 비용을 지불하는 구조가 만들어졌다.
ANTLR 범용 그래프 순회를 제거한 이유
ANTLR는 임의 문법을 수용해야 하는 위치에 있는 만큼 ATN 상태 머신을 매번 탐색한다. SQL처럼 잘 정리된 문법 영역에서는 이 탐색의 상당 부분이 불필요한 비용으로 작용한다. PostHog는 SQL이라는 닫힌 도메인에 한정해 설계함으로써 이 일반화 비용을 구조적으로 제거했고, 이는 곧 측정된 속도 차이의 주요 원인으로 분석된다.
제한적 미리보기와 추측적 백트래킹의 균형
재귀 하강 방식은 결정성 있는 문법에선 매우 빠르고지만, 모호 지점이 많으면 막힐 수 있다. PostHog는 모든 지점에서 무차별 백트래킹을 켜는 대신, 미리보기가 가치 있는 곳에서만 토큰을 살짝 들여다보고, 정말 모호한 일부 구문에서만 추측적 백트래킹을 켜는 절충을 택한 것으로 보인다. 이는 “Pratt 코어 위의 얇은 적응층”이라는 묘사에 잘 부합한다.
검증 방법론: 차등 테스트로 신뢰성을 확보하다
대규모 컴포넌트를 한 번에 갈아엎었을 때 가장 큰 리스크는 성능이 아니라 잠재된 동작 차이다. PostHog는 정답을 하나하나 쓰는 방식이 아니라, 이미 검증된 기존 C++ 파서를 기준 구현으로 삼아 차등 테스트를 수행했다. 즉, 새 파서가 옳은지 증명하는 대신, 기존 파서와 동일한지만 검증하는 전략이다.
기존 C++ 파서와 결과를 1대1로 비교
프로덕션 섀도우 모드에서는 실제 트래픽에서 들어오는 익명화된 쿼리를 두 파서에 동시 입력하고, 그 결과를 비교했다. 수백만 번의 파싱 동안 단 한 번의 불일치도 발생하지 않았다는 것은 일회성이 아니라 꾸준히 안정했다는 의미다. 기준선을 끝까지 유지한 채로 교체할 수 있다는 점은 운영 부담이 큰 기업 환경에서 특히 중요한 가치다.
속성 기반 테스트와 ShrinkRay로 엣지 케이스 추적
회사는 익명화된 실제 쿼리, 회귀 테스트, 코드 커버리지를 유도하는 생성기, 속성 기반 테스트, ShrinkRay를 통한 반례 축소까지를 결합해했다. ShrinkRay는 실패한 입력 후보를 자동으로 줄여 재현 가능한 최소 사례를 만들어주는 도구인데, AI가 만든 구현의 결함을 디버깅할 때 효용이 크다. 이 검증 스택 자체가 한 세트로 동작해, “AI가 만든 코드는 신뢰하기 어렵다”는 통념을 실무적으로 무력화한 것으로 보인다.
정량 성과: 노트북 기준 70배, 섀도우 모드 무불일치
성과 지표는 크게 두 축으로 요약된다. 첫째, 성능이다. 노트북 기준 약 70배의 속도 향상은 단순 마이크로 최적화가 아닌 아키텍처 교체에서 가능한 차원의 개선이다. 둘째, 신뢰성이다. 섀도 모드에서 수백만 건 비교해 한 번도 결과가 갈라지지 않았다. 이 두 숫자가 동시에 보고된다는 점이 단순 마이그레이션 사례와 본 사례를 가른다.
| 구분 | 기존 (ANTLR C++) | 신규 (Rust, AI 에이전트)보조) |
|---|---|---|
| 코드 규모 | 생성된 그래머 기반 | 약 16K줄 파서 + 5K줄 도구 + 수천 줄 테스트 |
| 코어 아키텍처 | 범용 ATN 순회 | 예측형 재귀 하강 + Pratt 코어 |
| 상대 속도 | 기준 | 노트북 기준 약 70배 |
| 섀도우 모드 일치도 | 기준 | 수백만 건 단 1건 불일치 없음 |
표에서 드러나듯, 핵심 가치는 단순히 줄 수를 줄이거나 종속성을 제거한 데 있지 않다. 분석 워크로드의 첫 단계가 되는 신뢰 경계를 더 빠르고 더 결정적으로 만든 데 있다.
시사점: AI 네이티브 리팩토링의 실무 레시피
이 사례는 “AI로 코딩을 외주화했다”는 단순한 이야기가 아니다. PostHog는 비교 가능한 기준 구현, 자동화된 차등 테스트, 운영 트래픽을 그대로 쓰는 섀도우 모드를 결합해 교체 작업 전체를 통제 가능한 실험으로 바꾸었다. AI 네이티브 리팩토링이라 부를 수 있는 패턴의 핵심은, 알고리즘 선택과 검증 인프라를 한 묶음으로 설계하는 데 있다.
한국 개발 조직에 적용할 때의 고려사항
한국 조직에 그대로 옮기려면 몇 가지 고려가 필요하다. 첫째, 비교 대상 구현이 존재하는지가 성패를 가른다. 마이그레이션 후보가 이미 안정화돼 있지 않다면, 차등 테스트의 기준선 자체를 마련하는 것부터가 별도 프로젝트가 된다. 둘째, AI 코딩 에이전트가 작성한 코드에 대한 코드 리뷰와 도메인 검증 인력이 확보돼야 한다. 마지막으로, 섀도우 모드 같은 비교 운용을 프로덕션에서 일정 기간 유지할 수 있는 운영 자원과 문화적 합의가 필요하다. 이런 조건이 갖춰질 때 본 사례는 단순 벤치마크가 아니라 실무 레시피로 기능할 수 있을 것이다.
- AI 코딩 에이전트는 단독 도구가 아니라, 비교 가능한 기준 구현과 결합될 때 대규모 리팩토링을 떠받친다.
- SQL처럼 도메인이 닫힌 영역일수록 범용 그래머를 벗어난 아키텍처 선택이 성능 차이를 만든다.
- ShrinkRay와 같은 반례 축소 도구는 AI가 만든 결함을 사람이 디버깅 가능한 형태로 만드는 데 결정적이다.
- 섀도우 모드의 무불일치 기록은 “AI가 짠 코드”라는 라벨을 넘어 정식 컴포넌트로 채택할 근거를 만들어준다.
참고 자료: GeekNews 원문, PostHog 공식 사이트