JSONata는 복잡한 JSON 데이터 변환을 간단한 쿼리 언어로 처리할 수 있는 강력한 도구다. 그러나 수천만 건의 데이터를 매일 처리해야 하는 환경에서는 성능 병목과 유지보수 비용이 치명적인 문제가 된다. 우리 팀은生成형 AI를 활용해 단 하루 만에 JSONata를 완전히 재작성했고, 이를 통해 연간 50만 달러 이상의 인프라 비용을 절감했다. 어떻게 가능했을까?

문제의 시작: JSONata 성능 병목

우리 플랫폼은 매초 수만 건의 이벤트 데이터를 실시간으로 처리한다. 기존 JSONata 라이브러리는 소규모 데이터셋에서는 완벽하게 작동했지만, 대량 데이터 처리 시 심각한 성능 저하를 보였다. 100MB 이상의 JSON 페이로드를 변환하는 데 몇 초가 소요되었고, 이는 전체 파이프라인의 응답 속도를 끌어내렸다.

프로파일링 결과 JSONata의 핵심 엔진이 순차적 처리 방식을 사용하고 있다는 사실을 발견했다. 멀티코어 환경에서도 단일 스레드로 동작해 CPU 코어 활용률이 15%에 불과했다. 더 큰 문제는 라이브러리의 아키텍처적 한계였다. 객체 재할당과 동적 타입 체킹이 매 변환마다 반복되어 가비지 컬렉션压力가 급증했다.

AI 활용 전략: 코드分析与 재설계

재작성 프로젝트의 핵심은 기존 JSONata의 동작 방식을 정확히 이해하는 것이었다. Claude AI를 활용하여 3만 줄에 달하는 JavaScript 코드를 심층 분석했다. AI는 코드의 기능적 의존성 그래프를 자동으로 추출하고, 각 모듈의 역할과 데이터 흐름을 명확히 문서화했다.

분석 단계에서 가장 놀라운 발견은 전체 코드의 70%가 에러 처리와 경계 케이스 관리에 할당되어 있었다는 것이다. 핵심 로직은 의외로 간결했고, 이는 새로운 구현의 청사진이 되었다. AI는 또한 레거시 코드에서 발견된 수십 개의 미해결 버그와 잠재적 메모리 누수를 식별해 주어 품질 면에서도 큰 도움이 되었다.

// 기존 JSONata의 핵심 변환 로직 (의사코드)
function transform(expr, data, context) {
  // 매 호출마다 새로운 컨텍스트 객체 생성
  let newContext = {...context};
  // 동적 타입 체킹 반복
  if (typeof expr === 'object') {
    if (expr.type === 'function') {
      return evaluateFunction(expr, data, newContext);
    }
  }
  return data;
}

하루 만에 완성한 새 엔진

AI 기반 분석을 완료한 후 실제 재작성 작업은 놀라울 정도로 빠르게 진행됐다. 새 엔진의 핵심 설계 원칙은 세 가지였다. 첫째, WebAssembly 기반의 네이티브 컴파일로 JIT 최적화를 활용한다. 둘째, SIMD 명령어를 통한 데이터 레벨 병렬 처리를 구현한다. 셋째, 객체 풀링으로 메모리 재할당을 최소화한다.

실제 코딩은 Anthropic의 Claude를 통해 진행했다. 자연어로 요구사항을 설명하면 최적화된 코드를 생성해 줬고, 생성된 코드의 정확성은 기존 테스트 스위트로 검증했다. 코드 생성 과정에서 AI는 우리만의 특수한 최적화를 제안했는데, 이는 순수히 인간 개발자만으로는 떠올리기