API 테스트 스텝 간 데이터 전달 완벽 가이드: 동적 값과 변수 추출
API 테스트에서 스텝 간 데이터를 전달하는 두 가지 핵심 방법인 동적 값(Dynamic Values)과 변수 추출(Variable Extraction)을 실제 예제와 함께 마스터합니다.
Spacebar AI
2025년 12월 7일
9분

API 테스트 스텝 간 데이터 전달 완벽 가이드
복잡한 API 테스트 시나리오에서는 한 스텝의 결과를 다음 스텝에서 사용해야 하는 경우가 많습니다. Apidog에서는 두 가지 핵심 메커니즘으로 이를 해결합니다.
두 가지 핵심 방법
1. 동적 값 (Dynamic Values)
이전 스텝의 출력을 실시간으로 직접 참조합니다.
장점: 간단하고 직관적
단점: 일회성 사용에 적합
2. 변수 추출 (Variable Extraction)
중요한 데이터를 변수로 저장하여 여러 스텝에서 재사용합니다.
장점: 재사용 가능, 스크립트에서 사용 가능
단점: 추가 설정 필요
스텝 유형별 데이터 전달
엔드포인트 응답 데이터
데이터 추출
JSONPath를 사용하여 응답에서 특정 값을 추출합니다:
// 응답 예시
{
"products": [
{ "id": "prod_001", "name": "Widget A", "price": 29.99 },
{ "id": "prod_002", "name": "Widget B", "price": 39.99 }
],
"total": 2
}
// JSONPath 추출
$.products[0].id → "prod_001"
$.products[0].name → "Widget A"
$.total → 2
추출한 데이터 사용
API 요청에서:
URL: /api/products/{{products_id}}
Header: Authorization: Bearer {{auth_token}}
Body: { "productId": "{{products_id}}" }
데이터베이스 쿼리에서:
SELECT * FROM products WHERE id = '{{products_id}}'
For 루프에서:
// 응답의 배열 길이만큼 반복
반복 횟수: {{$.1.response.body.products.length}}
ForEach 루프에서:
// 배열의 각 항목에 대해 반복
반복 대상: {{$.1.response.body.products}}
스크립트에서:
const productId = pm.variables.get("products_id");
console.log("Product ID:", productId);
데이터베이스 결과
데이터베이스 스텝의 데이터는 동적 변수로 직접 접근할 수 없습니다. 먼저 변수로 추출해야 합니다.
// DB 결과 예시
[
{ "id": 1, "name": "User A", "email": "a@test.com" },
{ "id": 2, "name": "User B", "email": "b@test.com" }
]
// JSONPath 추출
$[0].id → 1 (첫 번째 레코드의 id)
$ → 전체 결과 세트
For 루프
현재 반복 인덱스에 접근:
// 스텝 ID가 9인 For 루프의 현재 인덱스
{{$.9.index}}
// 스크립트에서
const currentIndex = pm.variables.get("$.7.index");
ForEach 루프
ForEach는 자동으로 두 가지 변수를 제공합니다:
// 스텝 ID가 4인 경우
{{$.4.element}} // 현재 요소 전체
{{$.4.element.id}} // 현재 요소의 id 속성
{{$.4.index}} // 현재 인덱스
// 실제 활용
URL: /api/products/{{$.4.element.id}}/update
Body: { "index": {{$.4.index}} }
스크립트에서 변수 저장
스크립트에서 수동으로 데이터를 변수에 저장:
// Pre-request Script 또는 Post-response Script
// 환경 변수 (현재 환경에 저장)
pm.environment.set('userId', response.data.user.id);
pm.environment.set('products', JSON.stringify(response.data.products));
// 전역 변수 (모든 환경에서 사용)
pm.globals.set('apiVersion', 'v2');
// 로컬 변수 (현재 실행에서만 사용)
pm.variables.set('tempToken', response.data.token);
스크립트에서 변수 읽기
// getter 메서드 사용 (필수!)
const userId = pm.environment.get('userId');
const products = JSON.parse(pm.environment.get('products'));
const apiVersion = pm.globals.get('apiVersion');
const tempToken = pm.variables.get('tempToken');
// 주의: {{userId}} 구문은 스크립트에서 작동하지 않음!
실전 예제: 주문 생성 플로우
Step 1: 사용자 로그인
────────────────────
POST /api/auth/login
Body: { "email": "test@example.com", "password": "***" }
Extract: $.token → {{auth_token}}
Step 2: 상품 목록 조회
────────────────────
GET /api/products
Header: Authorization: Bearer {{auth_token}}
Extract: $.products → {{product_list}}
Step 3: ForEach - 재고 확인
────────────────────
ForEach: {{product_list}}
GET /api/inventory/{{$.3.element.id}}
Assert: $.quantity > 0
Step 4: 주문 생성
────────────────────
POST /api/orders
Body: {
"productId": "{{$.2.response.body.products[0].id}}",
"quantity": 1
}
Extract: $.orderId → {{order_id}}
Step 5: 주문 확인
────────────────────
GET /api/orders/{{order_id}}
Assert: $.status == "pending"
베스트 프랙티스
1. 일회성 데이터 → 동적 값
// 바로 다음 스텝에서만 사용하는 경우
{{$.1.response.body.id}}
2. 재사용 데이터 → 변수 추출
// 여러 스텝에서 사용하는 경우
Extract: $.token → {{auth_token}}
3. 복잡한 로직 → 스크립트
// 조건부 저장, 데이터 가공 등
if (response.data.status === 'success') {
pm.environment.set('processedData', transformData(response.data));
}
4. 디버깅 팁
// 변수 값 확인
console.log("Current auth_token:", pm.environment.get("auth_token"));
console.log("All variables:", pm.variables.toObject());
결론
스텝 간 데이터 전달을 마스터하면 복잡한 API 테스트 시나리오도 깔끔하게 구현할 수 있습니다. 단순한 경우 동적 값을, 재사용이 필요한 경우 변수 추출을, 복잡한 로직이 필요한 경우 스크립트를 활용하세요.