SQLite의 LIKE 패턴에 숨겨진 50바이트 제한으로 인해 Agentic Inbox 프로젝트가 긴 이메일 제목을 검색하려고 할 때 Cloudflare Workers가 충돌했습니다. 검색 문자열을 48자로 제한함으로써 이 문제를 해결했습니다.
에지 런타임을 중단시킨 원인
Agentic Inbox는 각 메일함을 Cloudflare Durable Object 내부에서 실행하며, 저장소로 임베디드 SQLite 데이터베이스를 사용합니다. AI 기반 에이전트는 검색 패턴을 %search_term% 형태로 생성합니다. SQLite는 LIKE 패턴의 전체 길이에 대해 50바이트라는 엄격한 상한선을 적용합니다. 사용자가 48자보다 긴 제목을 입력하면, 앞뒤에 붙는 % 기호로 인해 패턴이 이 상한선을 초과하게 됩니다. SQLite는 처리되지 않은 런타임 오류를 발생시켰고, 제약이 많은 Worker 환경은 이를 치명적인 오류(fatal error)로 처리했습니다. 이로 인해 전체 스크립트가 종료되어 인박스를 사용할 수 없게 되었고 AI 에이전트도 작동을 멈췄습니다.
버그 발견 과정
Sentry는 Workers에서 발생한 처리되지 않은 예외(uncaught exceptions)를 기록했습니다. 충돌이 발생했을 때, Sentry는 SQLite가 오류를 일으킨 정확한 라인을 기록했습니다. Sentry의 “Seer AI” 기능은 스택 트레이스를 분석하여 LIKE 패턴 생성 부분을 강조하고, 패턴 길이가 원인임을 제시했습니다. SQLite의 컴파일 타임 문서를 빠르게 확인한 결과 50바이트 제한이 확인되었으며, 팀은 Gemini를 사용하여 이 제한을 검증하고 사용자 입력을 위한 안전한 최대 길이를 계산했습니다.
정밀한 해결책
해결을 위해 기존 검색 루틴 내에서 세 가지 작은 변경을 수행했습니다:
- 입력되는 모든 검색어에 대해 48자라는 엄격한 제한을 적용합니다.
%와일드카드를 결합하기 전에 입력 문자열을 해당 길이로 자릅니다.- 나머지 쿼리는 변경하지 않고 그대로 두어, 새로운 라이브러리를 추가하지 않고도 검색 정확도를 유지합니다.
이 조정은 쿼리가 SQLite에 도달하기 전에 이루어지므로, 최종 패턴이 50바이트 임계값을 초과하지 않게 되어 Worker가 더 이상 충돌하지 않습니다. 추가적인 의존성(dependency)을 추가하지 않았기 때문에 코드베이스는 가볍게 유지됩니다.
이것이 중요한 이유
에지 호스팅 데이터베이스는 저지연(low-latency) 사용 사례에 매력적이지만, 온프레미스 버전과 동일한 제약 사항을 그대로 물려받습니다. 런타임이 처리되지 않은 예외를 치명적인 오류로 취급할 경우, 모호한 컴파일 타임 제한이 운영 환경을 중단시키는 버그가 될 수 있습니다. 이번 사례에서 충돌은 긴 제목을 입력한 모든 사용자에 대해 AI 기반 이메일 어시스턴트의 작동을 중단시켰으며, 이는 사용자 경험과 서버리스 플랫폼의 신뢰성 약속에 직접적인 타격을 주었습니다.
다르게 할 수 있었던 점
해결 방법은 간단하지만, 검증 단계가 누락되었음을 시사합니다. SQL 문자열을 생성하기 전에 패턴 길이를 확인하는 입력값 정제(input sanitization) 과정을 거쳤다면, 운영 환경이 아닌 개발 단계에서 문제를 발견할 수 있었을 것입니다.
향후 주의할 점
에지 런타임에 SQLite를 배포하는 개발자는 패턴 매칭이 포함된 모든 쿼리 구성을 검토해야 하며, 특히 와일드카드나 이스케이프 문자를 추가하는 경우를 주의 깊게 살펴야 합니다. Sentry는 SQLite가 실패한 정확한 라인을 포착했습니다. 에지 컴퓨팅이 확산됨에 따라 숨겨진 플랫폼 제한이 더 자주 드러날 것이며, 문서화된 제약 사항에 따라 입력을 검증하는 습관이 큰 도움이 될 것입니다.
핵심 요약: SQLite LIKE 패턴의 50바이트 상한선은 Cloudflare Workers를 충돌시킬 수 있지만, 검색어를 48자로 제한하면 추가적인 부담 없이 오류를 제거할 수 있습니다. 이는 작은 검증 단계 하나가 에지 서비스의 안정성을 유지할 수 있음을 보여주는 증거입니다.
