project/NestJS + Kubernetes & 마이크로서비스 배포

📌 NestJS + Kubernetes & 마이크로서비스 배포: 실전 가이드 - NestJS GPT API에 결제 시스템 적용하기 – Stripe & Toss 연동 가이드

octo54 2025. 5. 27. 10:50
반응형

📌 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