무료 npm 패키지를 유료 REST API로 — Cloudflare Workers 기반 아키텍처

8 min read
npmCloudflare WorkersAPI비즈니스아키텍처
무료 npm 패키지를 유료 REST API로 — Cloudflare Workers 기반 아키텍처

무료로 배포한 npm 패키지가 Python 개발자에게는 쓸 수 없다. 이 당연한 사실이 비즈니스 기회가 된다.

textlens는 JavaScript용 텍스트 분석 라이브러리다. 가독성 점수(8가지 공식), 감정 분석, 키워드 추출을 제공한다. 주당 177회 다운로드. 괜찮은 숫자지만, 한계가 명확하다. JavaScript 생태계 바깥 — Python, Ruby, PHP, 노코드 플랫폼 — 은 쓸 수 없다.

이걸 유료 REST API로 감싼 여정을 따라가 보자.

왜 API인가

두 가지 대안을 먼저 검토했다.

방법 1: subprocess 래퍼 — Python 코드에서 Node.js 프로세스를 실행하는 방식. Node.js가 설치되어 있어야 한다는 전제가 붙어서, 목적이 사라진다.

방법 2: 직접 재구현 — Python 버전의 textlens를 만드는 것. 기능 동등성 유지에 드는 비용이 크다. 한쪽이 업데이트되면 다른 쪽도 따라가야 한다.

REST API는 이 두 문제를 모두 해결한다. 어떤 언어든 HTTP 클라이언트가 있으면 쓸 수 있다. npm 패키지를 그대로 내부에서 실행하면서 외부에는 언어 중립적인 인터페이스를 제공한다.

아키텍처 스택

Cloudflare Workers

엣지 컴퓨팅 선택의 이유가 분명하다.

  • Cold start 없음: 요청마다 컨테이너를 띄우지 않아서 첫 요청도 빠르다
  • 글로벌 레이턴시: 사용자와 가까운 엣지에서 실행, 서울에서 요청해도 50ms 이하
  • 비용: 요청 백만 건당 약 $0.15. 월 $5 기본료
  • 번들링: npm 패키지를 Worker에 직접 번들해서 배포
workers/analyze.js
import { analyze } from 'textlens';
 
export default {
  async fetch(request, env) {
    // API 키 검증
    const apiKey = request.headers.get('X-API-Key');
    const keyData = await env.KV_KEYS.get(apiKey, { type: 'json' });
 
    if (!keyData) {
      return Response.json({ error: 'Invalid API key' }, { status: 401 });
    }
 
    // 레이트 리밋 체크
    const now = Math.floor(Date.now() / 60000); // 분 단위
    const rateLimitKey = `${apiKey}:${now}`;
    const current = parseInt(await env.KV_KEYS.get(rateLimitKey) ?? '0');
 
    if (current >= keyData.rateLimit) {
      return Response.json({ error: 'Rate limit exceeded' }, { status: 429 });
    }
 
    await env.KV_KEYS.put(rateLimitKey, String(current + 1), {
      expirationTtl: 120
    });
 
    // 텍스트 분석 실행
    const { text } = await request.json();
    const result = analyze(text);
 
    return Response.json({ success: true, data: result });
  }
};

[💡 잠깐! 이 용어는?] 엣지 컴퓨팅(Edge Computing): 데이터센터 한 곳이 아니라, 사용자와 가까운 여러 위치에서 코드를 실행하는 방식. 네트워크 레이턴시를 줄인다.

Cloudflare KV

API 키 관리와 레이트 리밋에 KV 스토리지를 쓴다. Eventually Consistent 특성이 있어서 동시 요청이 많으면 레이트 리밋을 약간 초과할 수 있다. 텍스트 분석 서비스 특성상 허용 가능한 트레이드오프다.

workers/provision.js
// Stripe 웹훅에서 구독 생성 시 호출
async function provisionApiKey(customerId, plan) {
  const apiKey = crypto.randomUUID();
  const rateLimit = plan === 'starter' ? 1000 : 10000; // 분당 요청
 
  await env.KV_KEYS.put(apiKey, JSON.stringify({
    customerId,
    plan,
    rateLimit,
    createdAt: new Date().toISOString()
  }));
 
  return apiKey;
}

Stripe 통합

결제는 Stripe가 다 처리한다. 구독 생성, 업그레이드, 취소 이벤트를 웹훅으로 받아서 API 키를 프로비저닝하거나 비활성화한다. 커스텀 결제 로직을 40줄로 대체했다.

[💡 잠깐! 이 용어는?] 웹훅(Webhook): 특정 이벤트가 발생했을 때 지정된 URL로 HTTP 요청을 보내는 방식. Stripe가 결제 완료 시 서버에 알려준다.

비즈니스 모델

플랜요청 수가격대상
Free월 1,000건무료개발/테스트
Starter월 10,000건$9/월개인 개발자

Free 플랜은 신용카드 없이 시작할 수 있다. "빌드해보고 통합해보고, 실제로 쓰겠다 싶으면 그때 결제"라는 흐름을 만드는 게 목적이다.

첫 번째 유료 고객이 생기면 인프라 비용은 커버된다. 월 $5 기본료 기준으로.

실제 데이터로 보는 한계

솔직하게 말하면, 이 접근이 무조건 성공하는 건 아니다. 개발자가 직접 공개한 수치를 보자.

  • dev.to 포스트 17개, 총 조회수 307회 → GitHub 유입 0
  • Echo JS 제출 → GitHub 스타 5개 획득 (가장 효과적인 채널)
  • npm 주간 다운로드: 첫 주 977 → 둘째 주 63 (94% 감소)

Python 개발자가 실제로 이런 서비스를 필요로 하는지는 아직 검증 안 됐다. 대기자 명단으로 수요를 확인 중이다.

기술 스택은 완성했는데, 시장 수요는 아직 가설 단계다. 이게 사이드 프로젝트의 현실이다.

이 구조에서 배울 것

npm 패키지를 API로 감싸는 이 패턴은 범용적으로 쓸 수 있다.

  • JavaScript 전용 라이브러리가 있다
  • 다른 언어 사용자도 그 기능이 필요하다
  • 직접 포팅하기엔 비용이 크다

이 세 조건이 맞으면, Cloudflare Workers + KV + Stripe 조합으로 주말 하루에 API를 만들 수 있다. 인프라 비용은 $5/월부터 시작. 첫 번째 $9짜리 구독자가 생기면 플러스다.

마무리

오픈소스 라이브러리를 유료 서비스로 바꾸는 건 결국 접근성 문제다. 코드는 공개되어 있어도, 실행 환경이 다르면 쓸 수 없다. REST API는 그 장벽을 없애는 가장 단순한 방법이다. 기술은 간단하다. 어려운 건 수요를 검증하는 것.


참고:

관심 있을 만한 포스트

Cloudflare Workers로 A/B 테스트 — 엣지에서 실험 분기하기

클라이언트 사이드 A/B 테스트가 렌더링을 막는 문제를 Cloudflare Workers로 해결하는 방법을 정리한다.

Cloudflare WorkersA/B Testing

Vinext — Vite 위에서 Next.js를 1주일 만에 다시 만든 이야기

Cloudflare가 AI와 함께 단 일주일, $1,100의 API 비용으로 Next.js 호환 프레임워크를 Vite 위에 구축한 과정.

VinextNext.js

배포 전 출국 심사 — Publint로 npm 패키지 실수를 원천 차단하는 법

npm 패키지의 exports, entry points, 모듈 포맷을 배포 전에 검증하는 Publint 도구 사용법.

npmPublint

Cloudflare Code Mode — 2,500개 API를 1,000 토큰에 담는 MCP의 새로운 패턴

Cloudflare가 공개한 Code Mode는 AI 에이전트에게 수천 개의 API 엔드포인트를 단 2개 도구로 제공하는 MCP 서버 설계 패턴이다.

CloudflareMCP

Cloudflare Workers Static Assets 운용 가이드 — 라우팅과 캐시를 안정적으로 잡는 방법

Workers Static Assets를 기준으로 SPA/SSR 혼합 서비스에서 라우팅, 캐시, Worker 실행 순서를 설계하는 실전 패턴을 정리한다.

Cloudflare WorkersStatic Assets

validator.js의 isLength가 뚫렸다 — 유니코드 제로 폭 문자가 만든 CVSS 7.5 취약점

CVE-2025-12758로 등록된 validator.js의 isLength() 우회 취약점의 원리, 영향, 대응 방법을 분석한다.

보안validator.js

세 번의 리모델링 — 당근페이가 아키텍처를 갈아엎은 진짜 이유

당근페이 백엔드가 Layered에서 Hexagonal을 거쳐 Clean Architecture + Monorepo로 진화한 과정과 각 단계의 트레이드오프를 다룬다.

Clean Architecture당근

SVG 아이콘 — 코드 배포 없이 프로덕트 팀이 직접 관리하는 법

CSS mask-image와 S3를 조합해 개발자 개입 없이 아이콘을 교체하는 패턴을 소개한다.

SVGCSS