MIJI DApp Server Docs

PLAN.md: Avalanche NFT 민팅 서버 (MVP v8 - 안정화)

1. 프로젝트 개요

본 프로젝트는 Avalanche C-Chain(및 향후 EVM 호환 체인)을 지원하는 NFT 민팅/배포 API 서버입니다. NestJS 프레임워크를 기반으로 구축하며, 티켓/쿠폰과 같은 유틸리티 NFT의 메타데이터 관리, 컨트랙트 배포, 비동기 민팅 주문 처리를 핵심 기능으로 합니다.

AI 핵심 지시사항: 이 문서의 모든 지침, 특히 보안(PK 캐싱), 안정성(모든 작업의 비동기 큐 처리), 메타데이터 스키마(v6), 테스트 전략을 최우선으로 준수하여 코드를 생성해야 합니다.

2. 핵심 기술 스택 및 원칙

3. 디렉토리 구조 (모노레포)

AI는 파일 생성 시 반드시 이 모노레포 구조를 따라야 합니다.

/
├─ package.json # pnpm/yarn 워크스페이스 루트
├─ /contracts/ # (P2-1) Hardhat/Foundry 컨트랙트 프로젝트
│ ├─ contracts/
│ │ └─ MijiNft.sol # C-100 (Ownable, EIP-2981)
│ ├─ hardhat.config.ts
│ └─ package.json
└─ /server/ # (핵심) NestJS 서버 프로젝트
├─ /src/
│ ├─ /modules/ # 기능별 모듈
│ │ ├─ /auth/ # (A-120) 단일 키 인증 가드
│ │ ├─ /blockchain/ # (B-100, P1-6) EVM 어댑터 (★PK 캐싱★)
│ │ ├─ /contracts/ # (C-100s) 컨트랙트 배포 (★비동기 큐★)
│ │ ├─ /assets/ # (M-050) S3 파일 업로드
│ │ ├─ /metadata/ # (M-100, M-130, M-140) 메타데이터 관리
│ │ ├─ /minting/ # (T-100s) 민팅 큐 및 프로세서
│ │ ├─ /janitor/ # (T-125) 큐 복구 스케줄러
│ │ └─ /webhook/ # (H-200) 웹훅 발송 (★비동기/재시도 큐★)
│ ├─ /common/ # 공유 모듈, DTO, 스키마
│ │ ├─ /filters/ # (신규) 전역 예외 필터
│ │ └─ /schemas/ # (신규) Mongoose 스키마 정의
│ ├─ /config/ # @nestjs/config 모듈
│ ├─ main.ts
│ └─ app.module.ts
├─ package.json
└─ tsconfig.json

4. NestJS 모듈 상세 정의

4-1. ConfigModule (/src/config/)

4-2. AuthModule (/src/modules/auth/)

4-3. BlockchainModule (B-100, P1-6) (★PK 캐싱★)

4-4. ContractsModule (C-100s) (★비동기 큐★)

4-5. AssetsModule (M-050)

4-6. MetadataModule (M-100, M-130, M-140)

4-7. MintingModule (T-100s)

4-8. TransferModule (가스 대납 Transfer)

4-9. JanitorModule (T-125)

4-10. WebhookModule (H-200) (★비동기/재시도 큐★)


5. MongoDB 스키마 (Mongoose)

(v7 제안서와 동일한 5개 스키마. server/src/common/schemas/ 하위에 정의)

  1. Asset (M-050): original_file_name, s3_key, url, mime_type
  2. Metadata (★핵심★): chain_id, contract_address, token_id, standardFields (Object) (name, image, attributes…), utility (Object) (type, validation_url, data…), current_status
  3. DeployedContract (C-130): chain_id, name, symbol, contract_address, status (DEPLOYING, ACTIVE, FAILED), current_owner_address, deployment_tx_hash
  4. MintingOrder (T-100): chain_id, contract_address, receiver_address, metadata_id (Ref: Metadata), status (PENDING, PROCESSING, SENT, CONFIRMED, FAILED), tx_hash
  5. WebhookLog (H-200): event_type, target_url, related_order_id, payload_sent, status (SUCCESS, FAILED, RETRYING), response_status_code, attempt

6. 핵심 구현 지침 (AI 필독)

6-1. 보안 (P1-2: PK 캐싱)

6-2. 안정성 (비동기 큐)

  1. (B1 수정) 컨트랙트 배포(C-130)는 반드시 deployment-queue를 통해 비동기 처리해야 합니다. API 컨트롤러는 절대 tx.wait()를 호출하면 안 됩니다.
  2. (B2 수정) 웹훅(H-200)은 반드시 webhook-queue를 통해 비동기 처리해야 합니다. Bull의 attempts 및 backoff 옵션을 활성화하여 서버 측 오류(5xx) 시 자동 재시도를 보장해야 합니다.
  3. (T-125) JanitorModule은 minting-queue와 deployment-queue 모두를 감시하여 멈춘(Stuck) 작업을 재시작시켜야 합니다.

6-3. 에러 핸들링 (M3: 전역 필터)

6-4. 테스트 전략 (M2: 필수)

7. 개발 단계 (CI/CD 우선)

  1. Phase 1: 프로젝트 초기화
    • 모노레포 설정 (pnpm init, pnpm-workspace.yaml).
    • contracts/에 Hardhat 프로젝트(MijiNft.sol) 기본 틀 생성.
    • server/에 NestJS 프로젝트(nest new server) 생성.
  2. Phase 2: 인프라 연동 및 “Hello World” 배포 (★가장 중요★)
    • server/에 ConfigModule, DatabaseModule (MongoDB) 구현.
    • server/에 AuthModule (A-120) 및 HttpExceptionFilter (M3) 구현.
    • GET /health 엔드포인트(AuthGuard 적용)를 만들어 실제 MongoDB에 1회 접속하는 로직 구현.
    • [개발 중단 & 배포] 이 상태로 Docker 파일 작성, AWS(ECS/ECR 등)에 배포, CI/CD 파이프라인 완성.
  3. Phase 3: 핵심 모듈 (보안, 메타데이터, 컨트랙트)
    • BlockchainModule 구현 (B-100) (특히 SecretsManagerService(M1) 캐싱 구현).
    • AssetsModule (M-050) 및 MetadataModule (M-100, M-130, M-140) 구현.
    • ContractsModule (C-100s) 구현 (비동기 큐(B1) 방식 적용).
  4. Phase 4: 민팅 및 안정화 (큐, 스케줄러)
    • MintingModule (T-100s) (비동기 큐) 구현.
    • WebhookModule (H-200) (재시도 큐(B2) 방식 적용).
    • JanitorModule (T-125) (Cron 잡) 구현.
    • 테스트(M2): 핵심 서비스들에 대한 Unit/E2E 테스트 스위트 작성.
    • NestJS Swagger (@nestjs/swagger)를 이용해 OpenAPI 문서 자동화.
    • TransferModule (Gasless): Forwarder 관리, 서명 검증, 대납 실행, Silent Failure 감지 구현.