📌 NestJS + Kubernetes & 마이크로서비스 배포: 실전 가이드 - NestJS GPT API에 결제 시스템 적용하기 – Stripe & Toss 연동 가이드
📌 NestJS + Kubernetes & 마이크로서비스 배포: 실전 가이드
35. NestJS GPT API에 결제 시스템 적용하기 – Stripe & Toss 연동 가이드
GPT API를 서비스에 적용했다면, 다음 과제는 **수익화(Monetization)**입니다.
이번 글에서는 NestJS 기반 AI 서비스에 Stripe 및 토스(Toss)와 같은 결제 시스템을 통합하여 GPT API 사용량 기반 과금을 적용하는 방법을 소개합니다.
SaaS로서 유료 사용자만 AI 기능을 사용할 수 있도록 설정할 수 있으며, API 사용량 추적 및 결제 검증까지 모두 다룹니다. 💳
✅ 1. 구조 개요: GPT API + 유료화 플로우
[사용자] → [NestJS 결제 API (Stripe/Toss)]
→ [결제 성공 시 토큰 or 플랜 부여]
→ [GPT API 요청 시 요금제 체크 + 과금 or 차단]
구성 요소 역할
NestJS API | 사용자 인증, 결제 요청 처리, GPT API 보호 |
Stripe or Toss | 카드 결제 처리, 요금제/청구 관리 |
DB (Plan) | 사용자 플랜/잔여량/과금 상태 저장 |
GPT Proxy | NestJS에서 GPT 호출 전 요금제 체크 + 기록 |
✅ 2. Stripe 연동 (정기 결제 기준)
📦 Stripe SDK 설치
npm install stripe
📂 stripe/stripe.service.ts
import Stripe from 'stripe';
import { Injectable } from '@nestjs/common';
@Injectable()
export class StripeService {
private readonly stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
apiVersion: '2023-10-16',
});
async createCheckoutSession(userId: string, priceId: string) {
const session = await this.stripe.checkout.sessions.create({
mode: 'subscription',
payment_method_types: ['card'],
customer_email: 'user@example.com', // 실제 로그인 유저 이메일
line_items: [{ price: priceId, quantity: 1 }],
success_url: `https://your-site.com/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `https://your-site.com/cancel`,
metadata: { userId },
});
return session.url;
}
}
📂 결제 라우터
@Controller('billing')
export class BillingController {
constructor(private readonly stripeService: StripeService) {}
@Post('subscribe')
async subscribe(@Body('planId') planId: string, @Req() req) {
const userId = req.user.id;
const checkoutUrl = await this.stripeService.createCheckoutSession(userId, planId);
return { url: checkoutUrl };
}
}
✅ 3. 웹훅(Webhook) 처리
Stripe 서버가 결제 성공 시 NestJS에 알림 전송
📂 stripe/stripe.webhook.controller.ts
@Post('webhook')
@RawBody() // 반드시 원본 body 사용!
async handleWebhook(@Req() req: Request) {
const sig = req.headers['stripe-signature'];
const event = this.stripe.webhooks.constructEvent(
req.body,
sig,
process.env.STRIPE_WEBHOOK_SECRET
);
if (event.type === 'checkout.session.completed') {
const userId = event.data.object.metadata.userId;
// 사용자 플랜 DB 업데이트
}
}
✅ 4. GPT API 호출 시 요금제 체크
📂 gpt/gpt.guard.ts
@Injectable()
export class PlanGuard implements CanActivate {
constructor(private readonly userService: UserService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const req = context.switchToHttp().getRequest();
const user = req.user;
const hasQuota = await this.userService.hasValidPlan(user.id);
return hasQuota;
}
}
📂 gpt/gpt.controller.ts
@UseGuards(PlanGuard)
@Post('ask')
async ask(@Body('question') question: string, @Req() req) {
const gptResponse = await this.gptService.ask(question);
await this.userService.decrementQuota(req.user.id);
return { answer: gptResponse };
}
✅ 5. Toss Payments 연동 (한국형 결제)
📦 API 방식으로 결제 요청
@Injectable()
export class TossService {
async requestPayment(orderId: string, amount: number) {
const res = await axios.post('https://api.tosspayments.com/v1/payments', {
orderId,
amount,
orderName: 'GPT 사용권 구독',
successUrl: 'https://your-site.com/success',
failUrl: 'https://your-site.com/fail',
}, {
headers: {
Authorization: `Basic ${Buffer.from(process.env.TOSS_API_KEY + ':').toString('base64')}`,
'Content-Type': 'application/json',
},
});
return res.data;
}
}
💡 웹훅 처리 및 결제 성공 시 로직은 Stripe와 동일하게 적용 가능
✅ 6. 요금제 모델 구성 (DB 기준)
필드 설명
plan_type | free, pro, premium 등 |
gpt_quota | 월 요청 가능 횟수 |
reset_date | 월초 자동 초기화 시점 |
next_billing | 다음 청구일 (Stripe 기준) |
✅ 7. 유료화 SaaS 실전 예시
GPT 기능 유료화 방식
문서 요약 | 10건 이상 요약 시 유료 전환 |
코드 생성 도우미 | 월별 코드 생성 횟수 제한 |
대화형 챗봇 | 월간 토큰 한도 or 정액 요금제 |
웹페이지 분석 & 보고서 | 단건 결제형 또는 프리미엄 플랜 전용 |
✅ 결론: GPT 기반 서비스에 유료화 쉽게 적용하기
✅ Stripe 또는 Toss 연동으로 간편한 결제 처리
✅ NestJS Guard로 유료 사용자만 API 사용 가능
✅ 사용량 제한, 자동 청구, 결제 상태 추적 모두 가능
✅ SaaS 모델 구축을 위한 핵심 기능 확보
다음 글에서는 NestJS 프로젝트를 기반으로 조직형 SaaS 서비스에 필요한 멀티 테넌시(Multi-Tenancy) 구조를 구축하는 전략을 소개합니다! 🏢
🔍 다음 글 예고: NestJS 멀티 테넌시 SaaS 구조 설계 가이드
📌 다음 편: 36. NestJS Multi-Tenant 아키텍처 설계
NestJS GPT 결제,NestJS Stripe 연동,NestJS Toss 결제,NestJS 유료화 API,NestJS SaaS 과금,NestJS 요금제 설정,NestJS GPT 요금제,NestJS 결제 시스템,NestJS 구독 서비스,NestJS GPT 유료 SaaS