Codex CLI가 세션 복원을 180ms에서 12ms로 줄인 방법
OpenAI Codex CLI의 플러그인 캐시·MCP 스트림 벌크 스캔·SQLite State DB 세션 복원 최적화를 Claude Code·Antigravity CLI와 비교해 정리한다.
2026-08-12 · 최초 발행 2026-08-02
병목에서 시작된 업데이트
2025년 말 OpenAI가 Codex CLI를 오픈소스로 공개한 뒤, 커뮤니티 피드백과 내부 벤치마크로 세 가지 병목이 드러났다. TUI 초기화 시 매 실행마다 플러그인 디스커버리를 처음부터 다시 수행하는 비효율, MCP 서버나 Ollama 같은 로컬 모델과 통신할 때 대용량 스트림을 바이트 단위로 스캔하는 구조적 한계, 이전 세션을 재개할 때 파일 시스템 전체를 탐색해 상태를 복구하는 느린 경로다. 이 세 병목은 개발자 경험을 크게 갉아먹었고, 2026년 2분기 업데이트에서 한꺼번에 해소됐다.
플러그인 캐시로 콜드 스타트 줄이기
기존 Codex CLI는 실행할 때마다 $PATH, 설정 디렉터리, 환경 변수를 전부 스캔해 플러그인 목록을 구성했다. 플러그인이 많은 엔터프라이즈 환경에서는 이 과정이 500ms 이상 걸리기도 했다. 개선 후에는 디스커버리 결과를 ~/.codex/plugin-cache.json에 저장하고, 다음 실행 시 mtime 비교로 캐시 유효성을 검사한 뒤 그대로 재사용한다.
캐시가 무효화되는 조건은 세 가지다 — 설정 파일(.codex/config.yaml)의 수정 시각이 캐시보다 최신이거나, $PATH 환경 변수가 바뀌었거나, 캐시 TTL(기본 24시간)이 초과된 경우다. 이 전략으로 불필요한 파일 시스템 I/O가 사라지면서 콜드 스타트 기준 약 40~60%의 초기화 시간 단축 효과가 확인됐다.
MCP 스트림, 바이트 순회 대신 벌크 스캔
MCP는 JSON-RPC over stdio 또는 SSE 방식으로 통신한다. 기존 구현은 스트림에서 JSON 경계를 찾을 때 바이트 단위로 순회하며 \n 문자를 탐색했는데, 이는 수백 KB 이상의 파일 내용이나 도구 출력 같은 대형 응답에서 CPU 사용률이 급등하는 원인이었다. 개선된 구현은 Buffer.indexOf() 기반 벌크 스캔으로 바꿔 한 번의 호출로 구분자를 찾고, 내부 링 버퍼를 도입해 메모리 재할당 빈도를 줄였다. 실측 기준 512KB 이상의 MCP 응답 처리에서 CPU 사용률이 약 35% 감소했다.
로컬 LLM을 HTTP 스트리밍 API로 제공하는 Ollama와 통신할 때는 각 토큰이 {"model":"llama3","response":"...",...} 형태의 JSON 객체로 스트리밍되는 구조 자체가 파싱 오버헤드를 키웠다. 이번 업데이트에서는 Ollama 전용 스트림 파서를 분리해 필요한 필드(response, done)만 선택적으로 파싱하는 partial JSON 파싱 전략을 적용했고, 이로써 Ollama 스트림 처리 레이턴시가 약 20~30% 개선됐다.
MCP 도구 스키마는 JSON Schema를 활용하며, 복잡한 도구는 oneOf나 allOf 조합으로 파라미터를 정의한다. 기존 Codex CLI는 이를 단순 object 타입으로 평탄화해서 LLM에 전달했는데, 그 결과 모델이 올바른 파라미터 구조를 추론하지 못하는 문제가 있었다. 개선 후에는 스키마를 원형 그대로 보존해 Claude 3.7이나 GPT-4o 같은 모델이 구조를 정확히 이해하고 호출할 수 있게 됐다 — 도구 호출 성공률을 실질적으로 끌어올린 핵심 변경이다.
SQLite로 옮긴 세션 상태
Codex CLI는 세션을 재개하는 --resume 플래그와 마지막 세션을 자동으로 불러오는 --resume-last 옵션을 제공한다. 기존 구현에서는 ~/.codex/sessions/ 디렉터리를 mtime 역순으로 정렬해 가장 최근 파일을 찾는 방식이었는데, 세션 수가 수백 개에 달하면 이 정렬 연산이 눈에 띄게 느려졌다.
개선 후에는 SQLite 기반 State DB(~/.codex/state.db)가 세션 메타데이터(세션 ID, 생성 시각, 마지막 메시지 요약, 파일 경로)를 인덱스와 함께 저장한다. --resume-last 실행 시 SELECT * FROM sessions ORDER BY updated_at DESC LIMIT 1 단일 쿼리로 최신 세션을 즉시 조회한다.
| 항목 | 기존 방식 (파일 시스템) | 개선 방식 (State DB) |
|---|---|---|
| 최신 세션 탐색 | 디렉터리 전체 정렬 O(n log n) | 인덱스 조회 O(1) |
| 세션 메타데이터 접근 | JSON 파일 파싱 | 칼럼 직접 조회 |
| 동시성 처리 | 파일 락 수동 관리 | SQLite WAL 모드 |
| 스토리지 효율 | 세션마다 별도 JSON | 단일 DB 파일 |
| 복원 레이턴시 (100세션 기준) | ~180ms | ~12ms |
State DB는 기존 파일 기반 세션과 하위 호환성을 유지한다. DB에 세션이 없으면 자동으로 파일 시스템 폴백 탐색을 수행해, 마이그레이션 기간 중 데이터 손실이 없도록 설계됐다.
Claude Code·Antigravity CLI와 비교하면
| 기능 | Codex CLI (2026.06) | Claude Code | Google Antigravity CLI |
|---|---|---|---|
| TUI 스타트업 | 플러그인 캐시 (빠름) | 즉시 실행 (매우 빠름) | Go 바이너리 (빠름) |
| 세션 복원 | State DB (O(1)) | 내장 세션 관리 | 파일 기반 |
| MCP 지원 | oneOf/allOf 완전 지원 | 완전 지원 | 부분 지원 |
| 로컬 모델 | Ollama 최적화 | 미지원 (클라우드 전용) | Ollama 지원 |
| 스트림 최적화 | 벌크 스캔, 링 버퍼 | 네이티브 스트리밍 | 청크 방식 |
| 오픈소스 | MIT 라이선스 | 미공개 | Apache 2.0 (일부) |
| 환경 진단 | codex env-check 자동화 |
진단 도구 내장 | 제한적 |
Claude Code는 Anthropic 자체 인프라와 긴밀하게 통합돼 초기 실행 속도가 빠르지만 로컬 모델 지원이 없다. Codex CLI는 Ollama를 통한 로컬 모델 연동과 MCP 생태계 호환성이 강점이고, 2026년 업데이트로 성능 격차를 상당 부분 좁혔다.
엔터프라이즈에서 붙여 쓰는 패턴
여러 MCP 서버를 단일 Codex CLI 인스턴스에 연결해 파일 시스템·데이터베이스·외부 API를 통합 도구로 쓰는 MCP 서버 페더레이션은 codex.yaml의 mcp.servers 배열에 서버 목록을 선언하면 된다. 사내 보안 정책으로 외부 API 호출이 제한된 환경이라면 Ollama를 내부 추론 서버로 두고 Codex CLI를 클라이언트로 구성하는 Ollama 프록시 패턴을 쓸 수 있는데, CODEX_API_BASE_URL 환경 변수로 엔드포인트를 지정한다.
강화된 codex env-check 명령은 MCP 서버 연결 상태, Ollama 가용성, API 키 유효성을 일괄 점검해 CI/CD 파이프라인의 사전 점검 단계로 넣을 수 있다. State DB의 세션 테이블에는 workspace 칼럼이 추가돼 디렉터리별로 세션을 격리할 수 있는데, 모노레포 환경에서 서브패키지마다 독립적인 에이전트 컨텍스트를 유지하는 데 유용하다.