구축 가이드 · AI 사진 촬영 SaaS

AI 제품 사진 촬영 서비스 구축하기

한 줄 요약

테넌트별로 Photta API 키를 프로비저닝하고(볼륨이 작은 경우 풀 방식 사용), 각 고객의 카탈로그를 큐로 fanout한 뒤, 제품별로 /api/v1/tryon/apparel을 호출하세요. 워커 풀에서 생성 ID를 polling하고 결과를 고객 버킷에 저장한 후, Photta의 credit 비용에 마진을 얹어 각 청구 단위(credit 또는 렌더링된 이미지)로 인보이스를 발행하세요.

  • 크레딧: 2K에서 5 크레딧 · 4K에서 6 크레딧
  • 일반적인 소요 시간: 1.5–4 min
  • 처리 방식: 비동기, 폴링

이 페이지의 모든 수치는 다음 출처를 기반으로 합니다: Photta API 문서 · 확인 완료

고객 카탈로그 전체로 fanout하고, 제품별 try-on 작업을 디스패치하며, credit 단위로 청구하세요. 개별 개발자에게 제공되는 것과 동일한 Photta 프리미티브를 바탕으로 화이트라벨 SaaS를 구성할 수 있습니다. 시스템의 한계 기준만 잘 준수한다면요.

RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
  -H "Authorization: Bearer $PHOTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "product_type": "top",
  "product_images": [
    "https://cdn.yourstore.com/products/shirt-front.jpg"
  ],
  "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
  "product_category": "t_shirt",
  "mannequin_id": "mnk_f3a9b1",
  "pose_id": "pose_c2d4e5",
  "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
  "lock_background": true,
  "resolution": "2K",
  "aspect_ratio": "3:4",
  "body_size": "M",
  "expression": "neutral",
  "user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')

동작 원리

단일 키 환경에서 멀티테넌트 서비스로 전환하기

프로덕션 코드를 작성하기 전에 결정해야 할 5가지 아키텍처 의사결정.

  1. 단계 1

    제품 계약(Contract) 정의하기

    청구 단위당 고객에게 무엇을 제공할지 결정하세요: 렌더링된 이미지 1장? 배치 단위? 월간 credit 풀? 이 결정에 따라 큐 깊이, 재시도 정책, 가격 책정 페이지 문구 등 다른 모든 설계가 좌우됩니다.

  2. 단계 2

    테넌트별 Photta 키 프로비저닝

    소규모: 풀링된 키 1개를 사용하고 자체 데이터베이스에서 테넌트별 사용량을 추적합니다. 대규모: Photta 대시보드를 통해 테넌트당 Photta 키를 1개씩 관리합니다 — 사용량 귀속이 더 명확해지고 유출 시 영향 범위(blast radius)가 줄어듭니다.

  3. 단계 3

    큐를 통한 Fanout 구현

    고객 피드의 각 제품에 대해 사진 작업을 큐에 추가하세요. CSV 가져오기 도중 동기식으로 절대 제출하지 마세요 — 분당 600개 요청 rate limit에 걸려 429 오류로 작업을 잃게 됩니다.

  4. 단계 4

    credit 가격에 마진 더하기

    각 4K 의류 렌더링 비용은 6 credits입니다. 발행하는 모든 인보이스는 credits × 마진으로 계산되어야 합니다. 재무팀이 Photta 인보이스와 매출 항목을 대조할 수 있도록 원장에 원시 credit 비용을 기록하세요.

  5. 단계 5

    레이턴시 및 실패율 모니터링

    테넌트별 완료 시간과 실패율을 추적하세요. 특정 고객의 사진 생성이 일관되게 4분 이상 걸리거나 반복적으로 실패하는 경우, 이는 Photta 문제가 아니라 거의 항상 잘못된 입력값(손상된 URL, 지원되지 않는 product_type) 때문입니다.

필요한 세 가지 핵심 패턴

Fanout, 테넌트별 디스패치, 결제 원장 — 사진 촬영 SaaS의 핵심을 지탱하는 요소들입니다.

// For each product in the customer's feed, kick off a try-on.
for (const product of catalog) {
  await photoQueue.add("photo", {
    customerId: product.customer_id,
    productUrl: product.image,
    productType: product.type, // "top" | "bottom" | "top_and_bottom" | "one_piece"
  });
}
const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "product_type": "top",
    "product_images": [
      "https://cdn.yourstore.com/products/shirt-front.jpg"
    ],
    "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
    "product_category": "t_shirt",
    "mannequin_id": "mnk_f3a9b1",
    "pose_id": "pose_c2d4e5",
    "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
    "lock_background": true,
    "resolution": "2K",
    "aspect_ratio": "3:4",
    "body_size": "M",
    "expression": "neutral",
    "user_instruction": "Keep the collar pattern crisp and centered."
  }),
});
const { data } = await res.json(); // data.id, data.status
// A completed apparel job costs 5 credits at 2K and 6 at 4K.
// Record it to your billing pipeline so you can margin on top of it.
await billingLedger.append({
  customer: data.customerId,
  sku: "photo-4k",
  quantity: 1,
  wholesaleCost: 6, // credits, = your Photta spend
});

개발자가 자주 묻는 질문

Photta를 기반으로 서비스 운영하기

테넌트마다 별도의 Photta API 키가 필요한가요?

아니요, 하지만 규모가 커지면 유용합니다. 소수의 고객만 다룰 때는 키 하나를 풀로 공유하고 자체 데이터베이스에서 테넌트별 사용량을 추적해도 괜찮습니다. 그 이상의 규모에서는 테넌트당 키를 하나씩 두는 것이 사용량 귀속이 더 깔끔하고, 키 교체(rotation)가 쉬우며, 유출 시 피해 범위를 줄여줍니다.

credits가 모두 소진되면 어떻게 해야 하나요?

API는 필요한 수량과 사용 가능한 수량이 담긴 402 insufficient_credits를 반환합니다. 임계값(예: 100 credits)을 설정해 두고 작업 실패가 시작되기 전에 자동으로 충전하세요. 실패한 작업은 credits가 환불되므로 402 오류가 급증해도 피해가 누적되지는 않습니다.

서비스 요금은 어떻게 책정해야 하나요?

Photta는 2K에서 5 credits, 4K에서 6 credits를 부과합니다. 이를 판매 통화로 환산(원가 × 마진 × credit 환율)한 뒤, 이미지당, 배치당, 또는 월 단위 중 과금 방식을 결정하세요. 대부분의 사진 SaaS 제품은 월 최소 사용량을 둔 이미지당 과금 방식을 채택합니다.

Photta는 어떤 SLA를 제공하나요?

문서화된 Photta의 작업당 완료 시간은 1.5분에서 4분입니다. 공식적으로 발표된 가동률(uptime) SLA는 없습니다. 자체 SaaS에서 처리 시간을 보장해야 한다면, 자체 계약에 여유 폭을 두고(예: '1시간 내 사진 제공'은 10배의 여유 확보) 테넌트별 레이턴시를 추적하여 성능 저하를 조기에 감지하세요.

결과물을 화이트라벨로 제공할 수 있나요?

네. 반환된 이미지에는 Photta 브랜딩이 포함되지 않습니다. 자체 CDN 도메인을 전면에 두고 고객의 버킷으로 직접 전달할 수 있으며, 고객은 Photta의 파이프라인에서 생성되었다는 사실을 알 필요가 없습니다. API 자체는 화이트라벨이 아니며, 키와 대시보드에는 Photta 브랜딩이 적용되어 있습니다.

Photta 기반으로 사진 SaaS 배포하기

동일한 API, 귀사의 브랜드, 귀사의 마진. API 키를 발급받고 위 3가지 패턴을 워커에 연결하면 출시 준비의 절반은 끝납니다.