광고 자리 모집 중 · 제휴 문의

웹 애플리케이션에 DeepAI Text-to-Image API 연동하기: API Key 인증, REST 명세 및 프로덕션 아키텍처 가이드

365Finds Editorial
Wiki 문서 11,430편 수록

내 AI에서 365 Wiki 사용하기

아래 프롬프트를 복사해 평소 사용하는 AI에 붙여넣고 바로 질문하세요.

전체 Skill 다운로드

먼저 프롬프트로 체험해 보세요. 365 Wiki를 자주 쓴다면 전체 365Wiki Skill을 설치해 매번 붙여넣는 수고를 줄일 수 있습니다. 평소 쓰는 AI가 없다면 Gemini나 Microsoft Copilot 웹 버전도 사용할 수 있습니다.

웹 애플리케이션에 AI 이미지 생성 기능을 도입하면 사용자 맞춤 프로필 아바타 생성, 마케팅 배너 제작, 인터랙티브 크리에이티브 도구 등 다양한 가치를 신속하게 제공할 수 있습니다. 그러나 1인 개발자나 초기 스타트업 엔지니어링 팀 입장에서 독자적인 GPU 추론 인프라(Stable Diffusion 환경 구축, CUDA 드라이버 관리, 콜드 스타트 및 오토스케일링 대응)를 직접 운영하는 것은 막대한 고정 비용과 운영 부담을 초래합니다.

DeepAI는 복잡한 GPU 하드웨어 관리 없이 표준 HTTP POST 요청만으로 프롬프트를 호스팅된 이미지로 변환해 주는 간결한 Text-to-Image REST API를 제공합니다. 본 가이드에서는 안전한 인증 설정, 요청 매개변수 구성, 백엔드 프록시 아키텍처 설계, 그리고 프로덕션 레벨의 에러 처리 및 이미지 영구 저장 전략을 단계별로 다룹니다.


아키텍처 원칙: 백엔드 프록시 패턴이 필수적인 이유

클라이언트 개발 시 자주 발생하는 치명적인 실수는 브라우저 프론트엔드(React, Vue, 바닐라 JS fetch 등)에서 DeepAI API를 직접 호출하는 것입니다. DeepAI는 고정된 API Key를 통해 요청을 인증합니다. 만약 브라우저에서 직접 요청을 보내면 개발자 도구의 네트워크 탭이나 빌드된 자바스크립트 번들에 키가 노출되어 제3자가 계정의 크레딧과 호출 한도를 도용할 위험이 있습니다.

프로덕션 환경의 표준 설계는 **백엔드 프록시 패턴(Backend Proxy Pattern)**을 따르는 것입니다.

[브라우저 클라이언트]
       │
       ▼  (1) POST /api/generate-image { prompt, style, width, height }
[웹 애플리케이션 백엔드 (Node.js / Next.js / Python)]
       │  - 세션 인증, 입력 유효성 검증, 호출 빈도 제한(Rate Limit)
       │  - 환경 변수 process.env.DEEPAI_API_KEY 주입
       ▼  (2) POST https://api.deepai.org/api/text2img (Header: api-key)
[DeepAI 추론 클러스터]
       │
       ▼  (3) JSON 응답 수신 { id, output_url }
[웹 애플리케이션 백엔드]
       │  - 선택 사항: AWS S3 또는 Cloudflare R2로 이미지 비동기 영구 저장
       ▼  (4) 클라이언트에 { imageUrl, id } 반환
[브라우저 클라이언트]

백엔드 프록시를 적용하면 인증 정보를 완벽하게 보호할 수 있을 뿐만 아니라, 비즈니스 로직에 맞춘 접근 제어와 결과 이미지의 캐싱 정책을 유연하게 구현할 수 있습니다.


DeepAI Text-to-Image REST API 상세 규격

DeepAI의 텍스트 기반 이미지 생성 서비스는 단일 HTTP POST 엔드포인트를 제공하며, application/json과 multipart/form-data 본문 형식을 모두 지원합니다.

엔드포인트 및 인증 방식

요청 매개변수 목록

매개변수타입필수 여부기본값설명 및 제약 사항
textstring필수—생성하고자 하는 이미지 내용을 서술한 영어 프롬프트(Prompt).
image_generator_versionstring선택standard생성 모델 버전: standard, hd, genius, super_genius.
widthstring / int선택512가로 픽셀 크기. 32의 배수이며 128~1536 범위 (예: 512, 768, 1024).
heightstring / int선택512세로 픽셀 크기. 32의 배수이며 128~1536 범위 (예: 512, 768, 1024).
negative_promptstring선택—배제할 요소(예: 저화질, 왜곡, 기형, 워터마크 등)를 지정하는 네거티브 프롬프트.
genius_preferencestring선택—genius 모드 사용 시 스타일 선호도: anime, photography, graphic, cinematic.
resolutionstring선택2ksuper_genius 모드 사용 시 해상도: 2k 또는 4k.

권장 해상도 및 화면비 가이드:

성공 응답 구조

이미지 추론이 완료되면 HTTP 200 OK 상태 코드와 함께 JSON 데이터가 반환됩니다.

{
  "id": "59a0e8a9-1123-44b2-9a8c-7981b2345678",
  "output_url": "https://api.deepai.org/job-view-file/59a0e8a9-1123-44b2-9a8c-7981b2345678/output.jpg"
}

단계별 프로덕션 코드 구현

Node.js(Express) 기반 백엔드 라우터와 브라우저 자바스크립트 클라이언트를 활용한 구현 예제입니다.

1. 백엔드 라우트 구현 (Node.js / Express)

서버 환경 변수 DEEPAI_API_KEY를 설정하고, 클라이언트 요청을 검증하여 DeepAI로 프록시합니다.

// server/routes/imageGenRoute.js
import express from 'express';

const router = express.Router();

router.post('/generate-image', async (req, res) => {
  try {
    const { prompt, style = 'standard', width = '512', height = '512', negativePrompt } = req.body;

    if (!prompt || typeof prompt !== 'string' || prompt.trim().length === 0) {
      return res.status(400).json({ error: '유효한 텍스트 프롬프트를 입력해야 합니다.' });
    }

    const apiKey = process.env.DEEPAI_API_KEY;
    if (!apiKey) {
      return res.status(500).json({ error: '서버 환경 설정 오류: DeepAI API 키가 누락되었습니다.' });
    }

    const payload = {
      text: prompt.trim(),
      image_generator_version: style,
      width: String(width),
      height: String(height)
    };

    if (negativePrompt) {
      payload.negative_prompt = negativePrompt.trim();
    }

    // 30초 타임아웃 신호를 포함한 DeepAI REST API 호출
    const response = await fetch('https://api.deepai.org/api/text2img', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'api-key': apiKey
      },
      body: JSON.stringify(payload),
      signal: AbortSignal.timeout(30000)
    });

    const data = await response.json();

    if (!response.ok) {
      const errorMessage = data.err || data.status || 'DeepAI 서비스 호출 중 오류가 발생했습니다.';
      return res.status(response.status).json({ error: errorMessage });
    }

    return res.status(200).json({
      success: true,
      id: data.id,
      imageUrl: data.output_url
    });
  } catch (error) {
    if (error.name === 'TimeoutError') {
      return res.status(504).json({ error: '이미지 생성 요청 시간이 초과되었습니다. 다시 시도해 주세요.' });
    }
    return res.status(500).json({ error: '이미지 처리 중 서버 내부 오류가 발생했습니다.' });
  }
});

export default router;

2. 프론트엔드 연동 및 UI 상태 관리

AI 모델 추론에는 통상 2~8초의 시간이 소요됩니다. 프론트엔드에서는 중복 클릭을 방지하고 로딩 상태를 명확히 표시해야 합니다.

// client/app.js
async function requestAiImage(promptInput) {
  const submitBtn = document.getElementById('btn-submit');
  const previewBox = document.getElementById('preview-container');
  const statusLabel = document.getElementById('status-text');

  try {
    // 로딩 상태 시작
    submitBtn.disabled = true;
    statusLabel.textContent = '이미지를 생성하는 중입니다. 잠시만 기다려 주세요...';
    previewBox.classList.add('loading-skeleton');

    const response = await fetch('/api/generate-image', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        prompt: promptInput,
        style: 'standard',
        width: '512',
        height: '512',
        negativePrompt: 'blurry, deformed, low quality, watermark'
      })
    });

    const result = await response.json();

    if (!response.ok) {
      throw new Error(result.error || `HTTP 요청 실패 상태 코드: ${response.status}`);
    }

    // 결과 이미지 렌더링
    previewBox.innerHTML = `<img src="${result.imageUrl}" alt="${promptInput}" class="result-image" />`;
    statusLabel.textContent = '이미지 생성이 성공적으로 완료되었습니다.';
  } catch (err) {
    statusLabel.textContent = `오류 발생: ${err.message}`;
  } finally {
    submitBtn.disabled = false;
    previewBox.classList.remove('loading-skeleton');
  }
}

예외 처리 및 운영 고려 사항

프로덕션 운영 시 발생할 수 있는 주요 HTTP 상태 코드와 대처 방안은 다음과 같습니다.


자체 스토리지 영구 저장 (Image Persistence)

DeepAI가 응답하는 output_url은 외부 호스팅 링크입니다. 프로덕션 서비스에서 외부 링크에만 의존할 경우 링크 만료, CORS 접근 제한, 다운로드 대역폭 지연 등의 리스크가 따릅니다.

안정적인 운영을 위해서는 백엔드에서 생성 결과를 수신한 즉시 이미지를 스트림으로 다운로드하여 자체 클라우드 스토리지(AWS S3, Cloudflare R2, Google Cloud Storage 등)에 업로드하고, 자체 CDN 도메인 주소를 클라이언트에 전달하는 파이프라인을 구축하는 것이 모범 사례입니다.


요금 체계 및 기술적 의사결정 기준

DeepAI API를 사용하려면 DeepAI Pro 구독(월 9.99달러 또는 연 89.99달러)이 필요합니다. 구독 플랜에 포함된 기본 사용량 초과 시 지갑 잔액에서 건당 차감됩니다:

DeepAI 도입이 적합한 경우

빠르게 MVP를 출시해야 하거나 대규모 GPU 인프라 엔지니어링 없이 핵심 비즈니스 로직에 집중하고 싶은 개인 개발자 및 초기 스타트업에 최적입니다. 복잡한 드라이버 관리와 고가의 GPU 대여 비용을 완전히 절감할 수 있습니다.

자체 서버 구축을 고려해야 할 기준

자사 고유의 LoRA 파인튜닝 가중치를 적용해야 하거나, ControlNet을 통한 정밀한 자세 제어가 필수적인 경우, 혹은 월간 이미지 생성량이 10만 건을 초과하여 전용 GPU 인스턴스 구축의 단위 비용이 더 유리해지는 시점에는 자체 Diffusers/ComfyUI 파이프라인으로 전환하는 것이 타당합니다.

일반적인 웹 기반 이미지 생성 기능 구현에서는 DeepAI REST API가 개발 생산성과 운영 안정성, 비용 효율성 면에서 균형 잡힌 해법을 제공합니다.


참고 자료