무료 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에 직접 번들해서 배포
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 특성이 있어서 동시 요청이 많으면 레이트 리밋을 약간 초과할 수 있다. 텍스트 분석 서비스 특성상 허용 가능한 트레이드오프다.
// 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로 해결하는 방법을 정리한다.
Vinext — Vite 위에서 Next.js를 1주일 만에 다시 만든 이야기
Cloudflare가 AI와 함께 단 일주일, $1,100의 API 비용으로 Next.js 호환 프레임워크를 Vite 위에 구축한 과정.
배포 전 출국 심사 — Publint로 npm 패키지 실수를 원천 차단하는 법
npm 패키지의 exports, entry points, 모듈 포맷을 배포 전에 검증하는 Publint 도구 사용법.
Cloudflare Code Mode — 2,500개 API를 1,000 토큰에 담는 MCP의 새로운 패턴
Cloudflare가 공개한 Code Mode는 AI 에이전트에게 수천 개의 API 엔드포인트를 단 2개 도구로 제공하는 MCP 서버 설계 패턴이다.
Cloudflare Workers Static Assets 운용 가이드 — 라우팅과 캐시를 안정적으로 잡는 방법
Workers Static Assets를 기준으로 SPA/SSR 혼합 서비스에서 라우팅, 캐시, Worker 실행 순서를 설계하는 실전 패턴을 정리한다.
validator.js의 isLength가 뚫렸다 — 유니코드 제로 폭 문자가 만든 CVSS 7.5 취약점
CVE-2025-12758로 등록된 validator.js의 isLength() 우회 취약점의 원리, 영향, 대응 방법을 분석한다.
세 번의 리모델링 — 당근페이가 아키텍처를 갈아엎은 진짜 이유
당근페이 백엔드가 Layered에서 Hexagonal을 거쳐 Clean Architecture + Monorepo로 진화한 과정과 각 단계의 트레이드오프를 다룬다.
SVG 아이콘 — 코드 배포 없이 프로덕트 팀이 직접 관리하는 법
CSS mask-image와 S3를 조합해 개발자 개입 없이 아이콘을 교체하는 패턴을 소개한다.