Vivid Token (VT) 및 크레딧 시스템 설계
최종 수정일: 2026년 1월 19일 상태: 구현 완료
1. 개요 (Overview)
vivid-ai 서비스의 내부 경제 시스템인 Vivid Token (VT) 시스템의 설계 및 구현 명세입니다. 사용자에게는 'Vivid Token'이라는 명칭으로 서비스 가치를 제공하며, 시스템 내부 코드에서는 이를 **Credit(크레딧)**이라는 단위로 관리합니다.
2. 핵심 원칙 (Core Principles)
A. 명칭 정의
- Vivid Token (VT): 사용자에게 노출되는 서비스 내 공식 화폐 명칭입니다.
- Credit (크레딧): 시스템 백엔드 코드, DB 테이블, API 내부에서 사용되는 기술적 명칭입니다. (예:
CreditsService,Wallet.balance)
B. 데이터 무결성 및 동시성 제어
- 비관적 락 (Pessimistic Locking): 잔액 변경 시 TypeORM의
setLock('pessimistic_write')를 사용하여 데이터 경쟁 상태(Race Condition)를 원천 차단합니다. - 정밀도 보장: PostgreSQL의
DECIMAL(15, 2)타입을 사용하여 부동소수점 연산 오차를 방지합니다.
C. 가입 및 지갑 생성
- 자동 생성:
UsersService.findOrCreate로직 내에서 지갑이 없는 유저에 대해 자동으로 지갑을 생성합니다. - 초기 잔액 0 VT: 어뷰징 방지를 위해 기본 잔액은 0으로 설정됩니다.
3. 상세 사양 (Specifications)
A. 트랜잭션 유형 (CreditTransactionType)
시스템 자동 로직과 관리자 수동 개입을 명확히 분리하여 관리합니다.
| 타입 | 명칭 | 방향 | 설명 |
|---|---|---|---|
CHARGE | 결제 충전 | + | 사용자가 PG 또는 Web3 결제를 통해 토큰을 구매한 경우 |
USE | 서비스 사용 | - | 이미지/비디오 생성 시 워크플로우 가격에 따라 차감 |
REFUND | 자동 환불 | + | 생성 작업이 실패(FAILED)했을 때 시스템에 의해 자동 복구 |
BONUS | 시스템 보너스 | + | 이벤트 참여 등 시스템 로직에 의해 지급되는 보너스 |
CANCEL | 취소 복구 | + | 사용자의 요청 또는 시스템 오류로 인한 결제/사용 취소 시 복구 |
ADMIN_ADD | 관리자 지급 | + | 관리자 관리 도구에서 수동으로 지급 (운영 목적) |
ADMIN_SUBTRACT | 관리자 회수 | - | 관리자 관리 도구에서 수동으로 회수 (운영 목적) |
B. 품질 기반 동적 가격 정책 (Quality-based Pricing)
생성 작업 시 사용되는 워크플로우 템플릿에 따라 차등적인 비용이 발생합니다.
- SD (Standard Definition): 워크플로우의
priceSD필드 값을 사용. (기본값: 1.0 VT) - HD (High Definition): 워크플로우의
priceHD필드 값을 사용. (기본값: 3.0 VT) - FHD (Full High Definition): 워크플로우의
priceFHD필드 값을 사용. (기본값: 5.0 VT) - Batch Size 연동: 최종 비용 =
단가(SD/HD/FHD) * batch_size.
C. 자동 환불 정책 (Auto-Refund Policy)
시스템 장애, 연산 서버(Worker)의 비정상 종료, 또는 과도한 대기 상황에서 사용자의 자산을 보호하기 위해 다음과 같은 경우 자동으로 작업을 취소하고 전액 환불합니다.
- 명시적 실패 (Explicit Failure)
- 조건: 작업 상태가
FAILED로 변경되는 즉시. - 동작: 사용된 크레딧을 즉시 지갑으로 환불(
REFUND타입).
- 조건: 작업 상태가
- 대기 시간 초과 (Queue Timeout)
- 조건: 작업이 SQS 대기열(
PENDING) 상태에서 1시간 이상 머무를 경우. (예: 가용 워커가 하나도 없는 상황) - 동작: 시스템 스케줄러가 작업을
FAILED처리하고 자동 환불.
- 조건: 작업이 SQS 대기열(
- 워커 응답 없음 (Worker Crash / Zombie Task)
- 조건: 작업 중(
PROCESSING)인 워커로부터 10분 이상 진행률 업데이트(Redis/DB)가 없는 경우. - 동작: 워커 프로세스 장애로 간주하여 작업을
FAILED처리하고 자동 환불.
- 조건: 작업 중(
4. 관리자 관리 기능 (Admin Features)
관리자 페이지(/admin/users)를 통해 유저별 크레딧을 정밀하게 관리할 수 있습니다.
- 유저 목록 조회:
- 모든 유저의 Wallet 주소와 현재 VT 잔액을 실시간으로 확인.
- 지갑 주소, 닉네임, UUID를 통한 검색 지원.
- 잔액, 가입일 등 주요 지표 기준 정렬 지원.
- 수동 조정 도구:
- 특정 유저 상세 페이지에서
ADMIN_ADD/ADMIN_SUBTRACT타입을 사용하여 즉시 잔액 수정. - 조정 시 반드시 '사유(Reason)'를 입력하도록 하여 감사(Audit) 로그 보존.
- 특정 유저 상세 페이지에서
5. 기술적 구현 상세
- Backend:
src/credits모듈에서 캡슐화되어 관리됨.DataSource를 통한 수동 트랜잭션 제어로 원자성(Atomicity) 보장. - Frontend: React Query 기반의
useCredits훅을 통해 실시간 잔액을 Sidebar 및 팝업에 동기화. - Common Enum: 백엔드와 프론트엔드 간의 타입 일치를 위해
CreditTransactionType전역 관리.