예약 작업

문서 버전: 20260905

이 문서가 다루는 앱 버전:

  • iOS: >= 3.16
  • Android: >= 1.8.0
  • macOS / Windows(PC): >= 1.0.21

예약 작업은 요청 재생 한 건, 또는 콤보 재생 규칙 전체를 Cron이나 고정 간격으로 자동 실행합니다. 플래시 세일 부하 확인, 오픈 순간 검증, 주기적인 헬스 체크처럼 손으로 누르기엔 늦은 상황에 맞습니다.

전형적인 경우: 쇼핑몰 세일 창은 몇 초뿐이라 손으로 누르면 거의 놓칩니다. 캡처 기록에서 주문 요청을 꺼내거나 콤보 재생으로 묶은 뒤, 예약 작업을 만들고 오픈 직전부터 1초 간격으로 보낸 다음, 본문이 「구매 성공 / 종료」가 되면 자동으로 멈춥니다.

콤보 재생의 편성, 의존성 주입, 표현식은 콤보 재생 사용 가이드를 보세요.


목차

  1. 기능 개요
  2. 빠른 시작
  3. 진입점과 작업 관리
  4. 실행 대상
  5. 스케줄 설정
  6. 자동 종료
  7. 실제로 언제 도는지
  8. 실행 기록과 통계
  9. 대표적인 시나리오
  10. 자주 묻는 질문

1. 기능 개요

기능설명
요청 재생스냅샷 기준으로 HTTP/HTTPS 한 건 재생(Method / URL / Header / Body)
콤보 재생스냅샷 기준으로 콤보 규칙 전체 실행(계층, 표현식, 의존성 주입 포함)
Cron초를 포함한 6필드: 초 분 시 일 월 요일
사용자 지정초 간격으로 반복. 횟수와 지속 시간으로 멈출 수 있음(iOS / PC는 시작 시각도 지정 가능)
자동 종료두 가지뿐. 응답 Body 정규식, JSON 필드 값 완전 일치. 맞으면 작업이 비활성화됨. 일시 정지가 아님
실행 기록별도의 「실행 기록」 패널. Avg / P95 / P99, 성공률

2. 빠른 시작

  1. 먼저 캡처해서 타이머로 칠 HTTP/HTTPS를 확보합니다. 흐름이 필요하면 콤보 재생 규칙을 만들어 저장합니다.
  2. 예약 작업 목록에서 + / 예약 작업 추가를 탭합니다.
  3. Job 이름을 적고 대상을 고릅니다.
    • 요청 재생: 기록에서 한 건. 쿼리, 헤더, Body는 이후에 수정할 수 있습니다.
    • 콤보 재생: 기존 규칙에서 한 건. 각 노드 파라미터도 수정할 수 있습니다.
  4. Cron 또는 사용자 지정을 고르고, 설정 화면의 다음 실행 미리보기가 맞는지 확인합니다.
  5. 필요하면 자동 종료를 켜고, 정규식이나 JSON 필드로 「성공 / 종료」 응답을 잡습니다.
  6. 작업이 사용인지 확인한 뒤:
    • iOS / Android: 캡처(VPN)를 시작합니다. 캡처 전에는 돌지 않습니다. VPN이 켜져 있는 동안 요청 기록에도 남고, 재작성/스크립트도 적용됩니다.
    • 데스크톱: ApiCatcher 창을 열어 둡니다. VPN은 필요 없습니다. 작업이 보내는 트래픽에 재작성/스크립트를 걸려면 캡처를 시작하세요.
  7. 작업을 열어 실행 기록을 봅니다.

3. 진입점과 작업 관리

3.1 「예약 작업」 열기

  • 캡처 홈 오른쪽 위 +예약 작업
  • 요청 재생 또는 콤보 재생 실행 화면 오른쪽 위 알람을 누르면, 지금 요청/규칙으로 바로 만들 수 있습니다

3.2 만들기 / 편집 / 삭제 / 사용

동작방법
만들기목록 오른쪽 위 +, 또는 빈 화면의 「예약 작업 추가」
기록 보기행을
편집왼쪽으로 밀기 → 편집
삭제왼쪽으로 밀기 → 삭제(해당 작업의 실행 기록도 함께 삭제)
사용 / 중지편집 화면의 「사용」 토글

새로 만들면 기본적으로 사용입니다.

기존 작업을 편집할 때 대상 종류를 바꾸거나 다른 요청/규칙을 고를 수는 없습니다. 이름, 사용 스위치, 스냅샷의 요청/노드 파라미터, 스케줄, 자동 종료는 바꿀 수 있습니다.


4. 실행 대상

대상은 두 가지뿐입니다.

Job 대상실행 내용
요청 재생HTTP 한 건. 표현식 주입 지원
콤보 재생여러 HTTP. 콤보 규칙 순서. 의존성 주입과 표현식 주입 지원

콤보 재생 규칙을 고친 뒤 Job에도 반영하려면 새 Job을 다시 만들어야 합니다.


5. 스케줄 설정

종류는 Cron / 사용자 지정입니다.

설정 화면에서 다음 실행 시각을 최대 5개 미리 봅니다.

5.1 Cron

식은 6단, 순서는 다음과 같습니다.

초  분  시  일  월  요일

7단(연도)은 적어도 무시됩니다. 6단보다 짧으면 다음 시각을 계산하지 못해 스케줄되지 않습니다.

Linux crontab의 5필드가 아닙니다. */5 * * * *(5분마다)는 여기서 무효입니다.

쓸 수 있는 문법:

  • *: 해당 필드는 아무 값
  • ?: 일 또는 요일에서 「지정 안 함」
  • 숫자 하나: 초 0, 시 9
  • 초 필드의 간격 /: 0/30은 30초마다

기본 / 플레이스홀더:

0 * * * * ?

매분 0초입니다.

자주 쓰는 예:

의미
0 * * * * ?매분 0초
0 0 * * * ?매시 0분 0초
0 0 9 * * ?매일 09:00:00
0/30 * * * * ?30초마다

「N분마다」가 필요하면 사용자 지정에서 간격을 N × 60초로 두세요.

식 옆 AI로 자연어에서 Cron을 만들 수 있습니다. 만든 뒤 아래 미리보기를 확인하세요.

식이 비었거나 다음 시각을 못 내면 그 작업은 이번엔 스케줄되지 않습니다. 그 이유만으로 자동 비활성화되지는 않습니다.

5.2 사용자 지정

별도의 「종료 시각」 필드는 없습니다. 고정 간격으로 반복하고, 횟수 또는 지속 시간 중 하나에 도달하면 멈춥니다(매번 실행 전에 검사).

필드단위설명
간격얼마나 자주 실행할지. 최소 1
최대 실행 횟수이 횟수에 도달하면 중지
지속 시간첫 실행부터 이 분이 지나면 중지

횟수와 시간은 엔진 메모리에 있습니다. 프로세스가 재시작되면 0으로 돌아갑니다. 이미 꺼진 작업은 자동으로 다시 켜지지 않습니다. 「사용」을 다시 켜면 횟수는 0부터입니다.

횟수나 시간에 도달하면 작업은 사용 안 함으로 저장됩니다.


6. 자동 종료

화면 이름은 자동 종료입니다. 조건이 맞으면 Cron 남은 일정이나 사용자 지정 남은 횟수와 상관없이 멈춥니다.

조건은 두 가지뿐입니다. HTTP 상태 코드로 멈추는 기능은 없습니다.

종류대상규칙
정규 표현식응답 Body 텍스트어디에든 맞으면 됨(전체 문자열이 같을 필요 없음)
필드 선택응답 JSON경로로 꺼낸 값과 「일치 값」이 문자열로 완전히 같아야

보충:

  • 여러 조건은 OR. 하나만 맞아도 중지.
  • 콤보 재생은 관찰 노드를 지정할 수 있고, 그 노드 결과만 봅니다.
  • JSON은 문자열 비교입니다. 숫자 200이면 일치 값도 200. 불린은 true / false.

맞으면 작업을 비활성화합니다. 작업과 기록은 남고, 삭제하지 않습니다.


7. 실제로 언제 도는지

시스템 제약 때문에 플랫폼마다 구현이 다릅니다.

iOS

VPN 프로세스에서 돕니다. 캡처를 시작해야 효력이 있습니다.

상황계속 도는지
캡처 중, 메인 앱이 백그라운드
캡처 중, 메인 앱을 쓸어 없애도 VPN이 살아 있음
캡처 중지타이머 전부 취소, 중지
메모리 회수로 VPN 프로세스가 사라짐중지. 캡처를 다시 시작해야 사용 중인 작업을 다시 읽음
캡처 꺼짐실행 안 함. 저장만 DB에 하고, 다음 캡처 시작 때 스케줄

요청 제한 시간은 15초. VPN이 켜져 있으면 로컬 MITM(127.0.0.1:8888)을 타므로 재작성 규칙과 스크립트가 적용되고, 캡처 기록에도 같은 트래픽이 남을 수 있습니다.

Android

VPN 서비스에서 돕니다. 캡처를 시작해야 효력이 있습니다.

상황계속 도는지
캡처 중, 백그라운드로만 보냄(포그라운드 알림이 남아 있음)대개 예
캡처 중지stop(). 코루틴 취소. 메모리의 횟수/첫 시각 초기화
앱 강제 종료VPN과 프로세스가 함께 죽고 작업도 멈춤
절전으로 프로세스가 죽음중지. 포그라운드 서비스가 다시 살아 start()가 돌면, 아직 사용인 작업을 다시 스케줄

연결/읽기 제한 시간은 각 30초. 마찬가지로 로컬 MITM을 타므로 캡처 기록에 남을 수 있습니다.

데스크톱

앱 프로세스에서 돕니다. 프로세스가 있으면 돌고, 종료하면 멈춥니다.

상황계속 도는지
창이 열려 있음(최소화 가능)
캡처 꺼짐
앱 종료중지

단일 요청은 30초, 콤보 각 노드는 5초입니다. 요청은 시스템 프록시를 탑니다. 로컬 캡처가 켜져 있으면 재작성/스크립트가 적용되고 기록에도 남을 수 있습니다.

콤보 재생 실행(세 플랫폼 동일)

  • 의존 관계로 계층을 나누고, 같은 층은 병렬, 다음 층은 이전 층이 끝난 뒤.
  • 노드가 2xx가 아니거나 전송 실패면 이후 층은 건너뜀(요청 안 함).
  • 스냅샷의 표현식, 의존성 주입, 전역 변수는 모두 실행됩니다.

8. 실행 기록과 통계

작업을 탭하면 실행 기록입니다(편집 화면이 아님).

위쪽 통계는 이 작업의 모든 실행을 모읍니다(타이머 한 번이 한 줄. HTTP 한 건이 아님).

  • Avg / P95 / P99: 각 실행의 전체 소요(해당 기록의 종료 − 시작)를 모은 뒤 평균과 95/99백분위. 화면은 밀리초
  • Success Rate / Success / Failure: 그 실행의 요청이 모두 성공해야 성공. 콤보에서 노드 하나가 실패하면 그 실행은 실패. 이를 전체 기록으로 집계

줄을 탭하면 그 실행에서 보낸 요청을 볼 수 있습니다. 콤보면 먼저 노드 목록, 그다음 노드를 탭합니다.

오른쪽 위에서 이 작업의 기록을 모두 지울 수 있습니다. 작업을 삭제하면 기록도 함께 삭제됩니다.

데이터는 별도 테이블이며, 메인 「기록 / 요청 기록」이 아닙니다. 다만 앞 절처럼 캡처가 켜져 있으면 메인 기록에도 같은 트래픽이 자주 들어갑니다.

메인 기록 쪽에는 예약 작업 표시가 없어 평범한 캡처처럼 보입니다.


9. 대표적인 시나리오

시나리오 1: 세일 오픈 직전 주문 API 연타

  1. 주문 API를 캡처하고 Body / Header를 확인합니다(동적 시각이 필요하면 콤보 노드에 ${method.timestamp()}).
  2. 그 요청 또는 콤보 규칙으로 예약 작업을 만듭니다.
  3. 사용자 지정: 시작은 오픈 몇 초 전(반드시 미래), 간격 1초.
  4. 자동 종료: JSON code200, 또는 "구매 성공" / "종료" 정규식.
  5. iOS / Android는 미리 캡처를 켜 두고, 데스크톱은 창을 열어 둡니다.

시나리오 2: 1분마다 헬스 체크

세 플랫폼 모두 Cron으로 충분합니다.

0 * * * * ?

자동 종료는 두지 않습니다. 직접 끄거나, 모바일은 캡처 중지, 데스크톱은 앱 종료 전까지 1분마다 돕니다.

시나리오 3: 로그인 → 업무 API 정기 회귀

  1. 콤보 재생에서 로그인 → 업무 API, token 의존성 주입까지 맞춥니다.
  2. 그 규칙으로 예약 작업을 만듭니다.

10. 자주 묻는 질문

Q: 저장했는데 안 돌아요.
A: iOS / Android는 먼저 캡처를 시작해야 합니다. 데스크톱은 앱을 열어 두세요. 작업이 「사용」인지, Cron이 6단인지, 미리보기에서 다음 시각이 나오는지 확인하세요.

Q: 사용자 지정을 저장하자마자 사용 안 함이 됩니다.
A: 시작 시각이 과거면 엔진은 한 번도 실행하지 않고 끕니다. 미래 시각으로 바꾼 뒤 다시 켜서 저장하세요.

Q: 콤보 재생을 고쳤는데 예약 작업이 그대로입니다.
A: 의도된 동작입니다. 작업은 만들 때 저장한 스냅샷을 씁니다. 지우고 다시 만드세요.

Q: 메인 기록에도 같은 요청이 보여요.
A: 모바일에서 VPN이 켜져 있으면 예약 재생이 로컬 MITM을 타 일반 캡처와 같은 경로로 저장됩니다. 전용 수치는 작업의 실행 기록을 보세요. 메인 기록에는 예약 작업 표시가 없습니다.

Q: 자동 종료에 상태 200을 넣었는데 안 됩니다.
A: 「HTTP 상태 코드로 멈추기」는 없습니다. JSON 필드(예: code == 200)나 Body 정규식을 쓰세요.

Q: 콤보 노드 일부가 안 나갑니다.
A: 수동 실행과 같습니다. 앞 층이 2xx가 아니면 이후는 건너뜁니다. 건너뛴 관찰 노드에는 Body가 없어 자동 종료도 맞지 않습니다.

Q: 앱을 지우거나 데이터를 지우면 작업이 남나요?
A: 작업과 기록은 기기에만 있습니다. 삭제하거나 데이터를 지우면 사라집니다.

Q: 재작성 규칙을 계속 켜 둬야 하나요?
A: 모바일 예약 요청은 MITM을 탑니다. Mock / 버리기 / 수정이 그 URL에 걸리면, 작업이 보내는 내용도 바뀐 결과입니다. 응답이 이상하면 먼저 재작성과 스크립트를 보세요.