DEV Community

Cover image for Zuplo API 사용법
Rihpig
Rihpig

Posted on • Originally published at apidog.com

Zuplo API 사용법

Zuplo에 대해 읽어보셨고 실제 서비스를 구축하고 싶으시다면, 이 글이 바로 여러분을 위한 것입니다. 이 플랫폼은 배우기 쉽지만, 문서는 포털 흐름, CLI 명령 및 학습 센터 기사에 분산되어 있습니다. 이 가이드는 조각들을 하나의 튜토리얼로 엮어냅니다: 프로젝트 생성, 경로 노출, API 키 인증 및 속도 제한 추가, 커스텀 TypeScript 정책 작성, 엣지 배포, 그리고 Apidog로 전체 테스트.

지금 Apidog를 사용해보세요

이 글을 마치면 인증, 속도 제한, 자동 생성된 개발자 포털, 그리고 CI 친화적인 Git 워크플로우를 갖춘 API 게이트웨이가 원본 앞에 실행될 것입니다. 전체 과정은 약 30분 정도 소요됩니다.

아직 Zuplo가 적합한 도구인지 고민 중이시라면, 저희의 관련 게시물인 Zuplo API 게이트웨이란 무엇인가부터 시작하십시오. 다른 모든 것에 대해서는 Zuplo 문서에서 이 가이드가 생략하는 예외 사항들을 다룹니다.

요약 (TL;DR)

  • portal.zuplo.com에서 가입하거나 npm create zuplo로 로컬 프로젝트를 스캐폴딩하세요.
  • config/routes.oas.json에 경로를 정의하고 URL 전달 핸들러를 사용하여 원본으로 전달합니다.
  • 경로 파일을 편집하거나 경로 디자이너를 클릭하여 인바운드 정책(API 키 인증, 속도 제한, 스키마 유효성 검사)을 추가합니다.
  • modules/에 TypeScript 모듈로 사용자 지정 로직을 작성합니다. 런타임은 요청, 컨텍스트 및 환경에 대한 유형화된 액세스를 제공합니다.
  • 연결된 Git 브랜치에 푸시하여 미리보기 환경을 배포합니다. 300개 이상의 엣지 위치에 배포하려면 병합합니다.
  • 운영 환경으로 승격하기 전에 Apidog로 모든 경로를 테스트합니다.
  • 가격은 월 10만 요청 무료로 시작합니다. 빌더 플랜은 월 25달러입니다.

사전 요구 사항

시작하기 전에 세 가지가 필요합니다:

  • Zuplo 계정
  • 게이트웨이를 앞에 둘 원본 API. 없으시다면, 보내는 모든 것을 그대로 반환하는 https://echo.zuplo.io를 사용하십시오.
  • CLI를 사용할 계획이라면 Node.js 18 이상.

로컬 개발을 위해서는 코드 편집기도 필요합니다. TypeScript 확장이 있는 VS Code가 가장 쉽고, Apidog VS Code 확장으로 편집기를 벗어나지 않고 요청을 보낼 수 있습니다.

1단계: Zuplo 프로젝트 생성

시작 방법은 두 가지입니다: 웹 포털 또는 CLI.

옵션 A: 포털 우선

  1. portal.zuplo.com에 로그인합니다.
  2. "새 프로젝트"를 클릭하고 acme-gateway와 같은 이름을 선택합니다.
  3. "빈 프로젝트"를 선택하세요.
  4. 코드 탭에서 시작 파일 트리를 확인합니다.

포털은 기본적으로 프로젝트를 관리형 Git 리포지토리에 연결합니다. 필요시 자체 GitHub, GitLab, Bitbucket 또는 Azure DevOps 리포지토리 연결도 가능합니다.

옵션 B: CLI 우선

로컬에서 바로 개발하려면 CLI를 사용하세요.

npm create zuplo@latest -- --name acme-gateway
cd acme-gateway
npm install
npm run dev
Enter fullscreen mode Exit fullscreen mode

개발 서버는 9000번 포트에서 시작하며, http://localhost:9100의 로컬 경로 디자이너 링크가 출력됩니다. 변경사항은 핫-리로드됩니다.

Zuplo 계정에 로컬 프로젝트를 연결하려면:

npx zuplo link
Enter fullscreen mode Exit fullscreen mode

계정 및 환경 선택 후, 브랜치 배포는 다음과 같이 실행합니다:

npx zuplo deploy
Enter fullscreen mode Exit fullscreen mode

2단계: 첫 번째 경로 정의

config/routes.oas.json을 열고 아래 예시처럼 경로를 추가합니다. OpenAPI 3 문서에 Zuplo 확장이 포함된 구조입니다.

{
  "openapi": "3.1.0",
  "info": { "title": "Acme Gateway", "version": "1.0.0" },
  "paths": {
    "/v1/products": {
      "get": {
        "summary": "제품 목록",
        "operationId": "list-products",
        "x-zuplo-route": {
          "corsPolicy": "anything-goes",
          "handler": {
            "export": "urlForwardHandler",
            "module": "$import(@zuplo/runtime)",
            "options": {
              "baseUrl": "${env.ORIGIN_URL}"
            }
          },
          "policies": { "inbound": [] }
        },
        "responses": {
          "200": { "description": "성공" }
        }
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

ORIGIN_URL 환경 변수는 포털 설정 > 환경 변수 또는 로컬에서는 config/.env에서 설정하세요. 실제 원본이 없으면 https://echo.zuplo.io를 사용하면 됩니다.

로컬 개발 서버에서 http://localhost:9000/v1/products로 접속해 확인할 수 있습니다.

3단계: API 키 인증 추가

API에 인증을 적용하려면 다음과 같이 설정합니다.

경로의 인바운드 정책에 추가:

"policies": {
  "inbound": ["api-key-auth"]
}
Enter fullscreen mode Exit fullscreen mode

config/policies.json 파일에 정책 정의를 작성:

{
  "name": "api-key-auth",
  "policyType": "api-key-inbound",
  "handler": {
    "export": "ApiKeyInboundPolicy",
    "module": "$import(@zuplo/runtime)",
    "options": {
      "allowUnauthenticatedRequests": false
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

API 키 생성 및 테스트:

  1. 포털 > 서비스 > API 키 서비스로 이동
  2. "컨슈머 생성" → 식별자 및 이메일 입력, 키 복사
  3. 헤더 없이 호출 시 401, 키 포함 시 200 확인
curl -i https://YOUR-PROJECT.zuplo.app/v1/products
curl -i https://YOUR-PROJECT.zuplo.app/v1/products \
  -H "Authorization: Bearer YOUR_API_KEY"
Enter fullscreen mode Exit fullscreen mode

OpenAPI 스펙을 Apidog로 가져와 환경에 따라 api_key를 바인딩하면 전체 테스트를 빠르게 구성할 수 있습니다.

4단계: 경로에 속도 제한 적용

속도 제한 정책을 추가하여 API의 안정성을 높이세요.

경로 인바운드 정책에 추가:

"policies": {
  "inbound": ["api-key-auth", "rate-limit-by-key"]
}
Enter fullscreen mode Exit fullscreen mode

config/policies.json에 정의:

{
  "name": "rate-limit-by-key",
  "policyType": "rate-limit-inbound",
  "handler": {
    "export": "RateLimitInboundPolicy",
    "module": "$import(@zuplo/runtime)",
    "options": {
      "rateLimitBy": "sub",
      "requestsAllowed": 60,
      "timeWindowMinutes": 1
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

테스트 예시:

for i in {1..70}; do
  curl -s -o /dev/null -w "%{http_code}\n" \
    https://YOUR-PROJECT.zuplo.app/v1/products \
    -H "Authorization: Bearer YOUR_API_KEY"
done | sort | uniq -c
Enter fullscreen mode Exit fullscreen mode

60개의 200, 10개의 429가 결과로 나와야 합니다.

5단계: 요청 페이로드 유효성 검사

POST 경로에 JSON 스키마 기반 본문 유효성 검사 정책을 추가하세요.

경로 예시:

"/v1/products": {
  "post": {
    "summary": "제품 생성",
    "operationId": "create-product",
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "required": ["name", "priceCents"],
            "properties": {
              "name": { "type": "string", "minLength": 1 },
              "priceCents": { "type": "integer", "minimum": 1 },
              "category": { "type": "string", "enum": ["food", "drink"] }
            }
          }
        }
      }
    },
    "x-zuplo-route": {
      "handler": { /* 위와 동일 */ },
      "policies": {
        "inbound": [
          "api-key-auth",
          "rate-limit-by-key",
          "validate-request"
        ]
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

정책 정의:

{
  "name": "validate-request",
  "policyType": "open-api-request-validation-inbound",
  "handler": {
    "export": "OpenApiRequestValidationInboundPolicy",
    "module": "$import(@zuplo/runtime)",
    "options": {
      "validateBody": "reject"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

누락‧잘못된 필드에 대해 400 반환. Apidog에서 성공/실패/에러 시나리오를 각각 예제로 저장하고, 그룹 실행으로 빠르게 검증하세요.

6단계: 사용자 지정 TypeScript 정책 작성

커스텀 정책 예시: 유료 고객에게는 Cache-Control, 무료 고객에게는 no-store 헤더를 부여.

modules/tiered-cache.ts 작성:

import { ZuploRequest, ZuploContext } from "@zuplo/runtime";

interface PolicyOptions {
  paidPlanHeader: string;
  paidMaxAge: number;
}

export default async function (
  response: Response,
  request: ZuploRequest,
  context: ZuploContext,
  options: PolicyOptions,
): Promise<Response> {
  const plan = request.user?.data?.plan ?? "free";

  if (plan === "free") {
    response.headers.set("Cache-Control", "no-store");
  } else {
    response.headers.set(
      "Cache-Control",
      `public, max-age=${options.paidMaxAge}`,
    );
  }

  context.log.info(`Cache header set for plan=${plan}`);
  return response;
}
Enter fullscreen mode Exit fullscreen mode

config/policies.json에 정책 등록:

{
  "name": "tiered-cache",
  "policyType": "custom-code-outbound",
  "handler": {
    "export": "default",
    "module": "$import(./modules/tiered-cache)",
    "options": {
      "paidPlanHeader": "x-plan",
      "paidMaxAge": 300
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

경로에서 outbound 정책 연결:

"policies": {
  "inbound": ["api-key-auth", "rate-limit-by-key"],
  "outbound": ["tiered-cache"]
}
Enter fullscreen mode Exit fullscreen mode

Vitest/Jest 등으로 단위 테스트도 가능합니다.

7단계: 엣지에 배포

배포는 Git 기반으로 단순합니다.

git add .
git commit -m "인증, 속도 제한, 계층형 캐시를 포함한 제품 게이트웨이 추가"
git push origin feature/products-gateway
Enter fullscreen mode Exit fullscreen mode

Zuplo는 브랜치별 미리보기 환경을 자동 빌드하며, 미리보기 URL에서 바로 테스트할 수 있습니다.

배포 확정:

git checkout main
git merge feature/products-gateway
git push origin main
Enter fullscreen mode Exit fullscreen mode

병합 후 60초 이내에 300+ 엣지에 자동 배포됩니다.

8단계: 개발자 포털 생성

포털은 https://YOUR-PROJECT.developers.zuplo.com에서 자동 생성 및 호스팅됩니다.

  • 라우트별 문서 및 Try-it 콘솔
  • 다양한 언어의 코드 샘플
  • API 키 셀프 발급
  • 브랜딩 커스터마이즈 (포털 > 개발자 포털 > 설정)

커스터마이즈가 필요하다면 Zuplo 개발자 포털 리포지토리를 포크하여 별도 Next.js 앱으로도 사용 가능합니다.

9단계: Apidog로 모든 것을 테스트

운영 중 사고를 예방하려면, 모든 경로/정책/에러 케이스를 반드시 테스트하세요. Apidog로 자동화할 수 있습니다.

워크플로우:

  1. https://YOUR-PROJECT.zuplo.app/openapi에서 OpenAPI 스펙을 Apidog로 가져오기
  2. local, preview, production 환경 생성 및 각 환경별 base_url, api_key 지정
  3. 각 경로별로 성공/실패/속도제한 트리거 요청 예제 저장 후 그룹 실행
  4. Apidog 자동화 시나리오로 호출 연결 및 응답 어설션
  5. 코드 샘플 자동 생성 후 팀 문서/런북에 활용

Postman에서 이전하려면 API Testing without Postman 가이드 참고. 아직 설치하지 않았다면 Apidog 다운로드하세요.

Zuplo 사용에 대한 일반적인 질문

스펙을 변경하지 않고 환경 간에 경로를 어떻게 전환합니까?

환경별로 ORIGIN_URL을 환경 변수로 관리하고, 핸들러 옵션에서 ${env.ORIGIN_URL}로 참조하면 됩니다.

Zuplo를 오프라인으로 실행할 수 있습니까?

가능합니다. npm run dev로 로컬 게이트웨이(9000번), 로컬 경로 디자이너(9100번)를 실행하세요. 관리형 API 키 서비스만 클라우드 연결이 필요하며, npx zuplo link로 연동할 수 있습니다.

잘못된 배포를 어떻게 롤백합니까?

git revert로 병합 커밋을 되돌리고 푸시하면 Zuplo가 이전 상태로 롤백합니다. 별도의 롤백 UI는 없습니다.

배포 중 진행 중인 요청은 어떻게 됩니까?

엣지에서 원자적으로 처리됩니다. 진행 중인 요청은 이전 버전에서 완료되고 새 요청은 새 버전으로 전달됩니다.

Zuplo를 gRPC 또는 WebSockets와 함께 사용할 수 있습니까?

지원합니다. urlForwardHandler는 WebSocket 업그레이드를 프록시하고, gRPC 핸들러도 제공합니다.

Zuplo API를 AI 에이전트에 어떻게 노출합니까?

경로에 MCP 서버 핸들러 설정 후 OpenAPI 스펙을 지정하면, 동일한 인증 및 속도 제한 정책으로 AI 에이전트에 노출할 수 있습니다. 자세한 내용은 Zuplo MCP 서버 문서 참고.

운영 환경에서 게이트웨이 비용은 얼마입니까?

무료는 월 10만 요청, 빌더 플랜은 월 25달러(100만 요청), 엔터프라이즈는 연간 계약 시 월 1,000달러부터 시작합니다. Zuplo 가격 페이지에서 최신 정보를 확인하세요.

결론

이제 API 키 인증, 키별 속도 제한, 요청 유효성 검사, 사용자 지정 TypeScript 아웃바운드 정책 및 개발자 포털을 갖춘 Zuplo 게이트웨이를 완성했습니다. 모든 것은 Git 워크플로우로 글로벌 엣지에 배포됩니다. 동일한 프로젝트가 미리보기, 프로덕션, MCP 기반 AI 에이전트까지 모두 처리합니다.

테스트 루프를 자동화하는 것이 핵심입니다. 브랜치 병합 전 Apidog로 모든 미리보기 환경을 테스트하면, 인증 헤더 누락, 스키마 오류, 잘못된 속도 제한 등 문제를 사전에 방지할 수 있습니다. 오늘 Apidog 다운로드로 게이트웨이에 연결하십시오.

Top comments (0)