개발 slecs

엔드포인트별 AI 비용과 런타임을 CLI로 즉시 측정

목차

per-endpoint 단위로 런타임 실행 시간과 AI 비용을 CLI에서 바로 확인할 수 있는 도구를 붙였다.


왜 이게 필요했나

AI 기능이 붙은 시스템을 운영하다 보면 어느 순간 반드시 마주치는 질문이 있다. "이 엔드포인트, 실제로 얼마나 걸려? 그리고 AI 호출에 돈은 얼마나 드는 거야?" 처음엔 로그 뒤져서 대략 추측하거나, 별도 대시보드에서 집계된 숫자를 보고 판단하는 식으로 버텼다. 그런데 팀이 AI 기능을 여러 엔드포인트에 걸쳐 붙이기 시작하면서 문제가 생겼다. 어떤 엔드포인트가 비용을 얼마나 잡아먹는지, 어떤 게 레이턴시 병목인지 한눈에 보이지 않는 거다.

개발자가 로컬에서 PR 올리기 전에 "이 변경이 AI 비용에 얼마나 영향을 주는지" 감을 잡을 방법이 없었다. CI에 올리기 전 단계에서 체크할 수단이 없으니, 리뷰 단계에서도 "그냥 괜찮겠지"로 넘어가는 일이 반복됐다. 비용 관련 이슈는 보통 프로덕션 청구서가 나왔을 때야 뒤늦게 인지하는 구조였고, 그게 계속 마음에 걸렸다.

그래서 endpoint2cost라는 CLI 도구를 직접 만들었다. 이름이 말해주듯, 엔드포인트 → 비용/런타임 정보를 바로 뽑아주는 구조다.


무엇을 바꿨나

이번 작업에서 손댄 파일을 보면 방향이 보인다.

파일 역할 변경 의미
package.json / package-lock.json 의존성 및 CLI bin 등록 CLI 도구로 직접 실행 가능하도록 진입점 추가
src/application/entitlement.ts 엔드포인트별 권한/설정 관리 per-endpoint 비용 메타데이터 모델 확장
src/application/init-config.ts 앱 초기화 설정 로직 비용 측정 설정값 주입 구조 추가
src/application/init-config.test.ts 초기화 설정 테스트 새 설정 구조에 맞춰 테스트 보강
.gitignore 제외 파일 관리 CLI 빌드 산출물 제외 처리

entitlement.ts를 건드렸다는 게 흥미로운 포인트였다. 원래 entitlement 레이어는 엔드포인트별 접근 권한이나 기능 활성화 여부를 관리하는 곳인데, 여기에 비용 메타데이터를 얹는 구조를 선택했다. 엔드포인트 단위 설정이 이미 이 레이어에 응집돼 있으니, 비용 정보도 같은 컨텍스트에서 다루는 게 자연스럽다고 판단했다.

init-config.ts에서는 CLI가 실행될 때 어떤 엔드포인트를 측정할지, AI 비용 단가를 어떻게 주입할지 설정을 잡는 로직을 추가했다. 핵심은 설정을 코드에 박지 않고 CLI 인자 또는 설정 파일로 주입할 수 있게 분리한 것이다. 그래야 팀마다, 환경마다 다른 단가 기준을 적용할 수 있다.

// init-config.ts 변경 패턴 (개념 예시)
export function initConfig(options: EndpointCostOptions) {
  return {
    endpoints: options.endpoints,
    aiCostPerToken: options.aiCostPerToken ?? DEFAULT_COST_PER_TOKEN,
    runtimeTracing: options.runtimeTracing ?? true,
  };
}

CLI로 실행하면 대략 이런 흐름으로 결과가 나온다.

$ npx endpoint2cost --endpoint /api/summarize --runs 10

/api/summarize
  avg runtime : 1340ms
  p95 runtime : 1820ms
  avg tokens  : 2100 (prompt: 1800 / completion: 300)
  est. cost   : $0.0042 / call
  10 runs total cost est. : $0.042

숫자만 보는 게 아니라, 팀원이 PR 단계에서 "이 엔드포인트는 호출당 약 얼마"라는 맥락을 갖고 코드 리뷰에 임할 수 있게 된다.


팀 리딩 관점에서 돌아보며

이런 도구는 "만들어야 하나?"를 결정하는 게 사실 제일 어렵다. AI 비용 측정 도구는 서드파티 솔루션도 있고, 클라우드 벤더 콘솔에서 집계해서 보는 방법도 있다. 굳이 직접 CLI를 만드는 트레이드오프를 팀에 설명해야 했다.

내가 선택한 이유는 두 가지였다.

  • 개발 루프에 붙어있어야 한다. 대시보드는 "나중에" 보는 거다. CLI는 "지금 이 코드 짜면서" 바로 돌려볼 수 있다. 피드백 루프가 짧아야 행동이 바뀐다.
  • 엔드포인트 정의와 같은 코드베이스에 있어야 한다. 외부 도구는 엔드포인트 구조가 바뀌면 따로 업데이트해야 한다. entitlement.ts에 같이 붙어있으면 엔드포인트 설정이 바뀔 때 비용 메타데이터도 자연스럽게 같이 관리된다.

물론 아직 초기라 측정 방식이 완전하지 않고, 토큰 단가 기준도 계속 달라진다. 하지만 "측정 가능한 상태"를 만드는 것 자체가 첫 목표였고, 그 목표는 달성했다. 앞으로 숫자가 쌓이면 엔드포인트별 비용 예산 기준을 CI 게이트에 걸 수도 있다.

비용 감각 없이 AI 기능을 붙이는 팀은 언젠가 청구서 앞에서 멈추게 된다. 그 전에 팀이 숫자를 보는 습관을 만들어두고 싶었다.


다음 스텝은 init-config.test.ts에 추가한 테스트를 기반으로, 다양한 모델/단가 조합에서 비용 추정이 얼마나 일관성 있게 나오는지 검증하는 것.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.