[중급] 재피어 무한 루프, 이 코드 한 줄이면 해결된다

[중급] 재피어 무한 루프, 이 코드 한 줄이면 해결된다

결론부터 말한다. 이 원리 모르면 당신의 재피어(Zapier) 계정은 정지된다.

어느날 SNS 알림이 미친 듯이 울렸다. 똑같은 메시지가 1초에 수십 개씩. 재피어(Zapier)가 무한 루프에 빠져 내 소중한 태스크를 태워먹고 있었다. 이메일을 확인하니 ‘Zap Turned Off’ 경고 메일이 와 있었다. 등골이 오싹했음. (이런 끔찍한 일을 겪어선 안된다.)

무한 루프. 간단하다. A가 B를 바꾸면, 바뀐 B가 다시 A를 트리거하는 구조. 서로의 꼬리를 무는 뱀이다. 정신 차렸을 땐 이미 수천 개의 태스크가 증발하고 난 뒤임.

이걸 막는 방법은 의외로 단순하다. ‘실행 기록’을 남기는 것. 시스템 용어로는 ‘플래그(Flag)’를 박는다고 한다. 이 글에서는 그 원리와 당장 복사해서 쓸 수 있는 코드를 제공한다.


왜 당신의 젭(Zap)은 무한 루프에 빠지는가?

대부분의 직장인, N잡러들이 여기서 좌절한다. 자신은 똑똑하게 자동화 파이프를 짰다고 생각하지만, 시스템 관점에서는 그냥 시한폭탄일 뿐. 흔히 저지르는 실수 5가지를 정리했다.

  1. 양방향 동기화의 함정: 구글 캘린더와 노션을 연동하는 게 대표적. 캘린더에 일정을 넣으면 → 노션에 기록되고 → 노션의 업데이트가 다시 → 캘린더의 일정을 수정하며 트리거. 영원히 끝나지 않는 핑퐁 게임이다.
  2. 트리거와 액션의 동일 소스: ‘구글 시트 A에 새 행이 추가되면(트리거), 구글 시트 A의 특정 행을 업데이트(액션) 해라’. 이런 식의 구조는 100% 터진다. 시스템이 자신의 행동을 새로운 이벤트로 착각하기 때문.
  3. 필터 부재: 가장 흔한 실수. ‘일단 만들고 보자’는 생각으로 필터(Filter) 단계를 건너뛴다. 필터는 자동화 시스템의 ‘브레이크’다. 브레이크 없는 자동차를 도로에 내보내는 것과 같음.
  4. 웹훅(Webhook)의 반향: 외부 서비스에 웹훅을 보내 뭔가 처리하게 하고, 그 처리 결과가 다시 내 재피어 웹훅을 호출하는 구조. 개발자들도 종종 하는 실수다. 메아리가 계속 증폭되는 상황으로 비유할 수 있다.
  5. 부정확한 트리거 조건: ‘필드가 업데이트 될 때마다’ 같은 광범위한 트리거는 재앙을 부른다. 내가 의도한 업데이트와 젭(Zap)이 실행한 업데이트를 구분하지 못하기 때문.

이 5가지 중 하나라도 해당된다면, 당신의 자동화 시스템은 언제 터져도 이상하지 않은 상태다.

가장 간단하고 확실한 해결책: 필터(Filter)로 표식 검사

코딩이고 뭐고 다 필요 없다. 재피어 기본 기능인 ‘필터’만 잘 써도 90%는 막는다.

핵심 로직: 액션(Action)을 실행하기 전에, 이 작업이 이미 실행된 적 있는지 ‘표식’을 검사한다. 표식이 있으면 멈추고, 없으면 실행 후 표식을 남긴다.

예시: 노션(Notion) 데이터베이스 아이템 업데이트 루프 막기

  • 상황: 노션 페이지 내용이 업데이트되면(Trigger), 페이지 제목 끝에 ‘[처리완료]’ 라는 텍스트를 추가(Action)하는 젭.
  • 문제: ‘[처리완료]’ 텍스트가 추가되는 것 자체도 ‘업데이트’이므로, 젭이 자기 자신을 다시 트리거하며 무한 루프 발생.

해결 과정

1단계: 필터 추가
트리거와 액션 사이에 ‘Filter by Zapier’ 단계를 추가한다.

2단계: 필터 조건 설정
필터 규칙을 다음과 같이 설정한다.

  • Field: 노션 페이지 제목 (Title)
  • Condition: (Text) Does not contain
  • Value: [처리완료]

이 설정의 의미는 간단하다. ‘만약 제목에 [처리완료] 라는 텍스트가 포함되어 있지 않을 때만 다음 액션을 실행해라.’
이미 젭이 한 번 실행해서 표식을 남겼다면, 필터 단계에서 걸러져서 젭이 멈춘다. 이걸로 끝임.


좀 더 확실한 방법: ‘Code by Zapier’로 플래그 심기

필터만으로 헷갈리거나, 더 복잡한 시스템을 제어해야 할 때 쓰는 방법이다. ‘Code by Zapier’ 액션을 사용해 자바스크립트(Javascript) 코드로 명확한 플래그를 심고 검사한다. 개발자가 아니어도 그냥 이 코드 복사해서 쓰면 됨.

트리거 다음 단계에 ‘Code by Zapier’를 넣고, ‘Run Javascript’를 선택한다.

아래 코드를 그대로 붙여넣는다.

// 이전 단계에서 넘어온 데이터에서 표식을 찾는다.
const inputData = { 'text': '{{1.text}}' }; // 이전 단계의 데이터를 변수로 가져옴

// 텍스트에 이미 처리 표식이 있는지 확인
if (inputData.text.includes('processed_by_zap')) {
  // 표식이 있으면, 젭을 멈추기 위해 isLoop를 true로 설정
  return { isLoop: true };
} else {
  // 표식이 없으면, isLoop는 false, 원본 데이터는 그대로 전달
  return { isLoop: false, originalText: inputData.text };
}

이 코드 단계 바로 뒤에 필터(Filter)를 추가하고, 조건은 아래와 같이 설정한다.

  • Field: Code by Zapier 단계의 ‘isLoop’ 값
  • Condition: (Boolean) Is false

이렇게 하면 ‘isLoop’가 false일 때만, 즉 무한 루프가 아닐 때만 다음 액션이 실행된다. 마지막 액션 단계에서는 원본 데이터에 ‘processed_by_zap’이라는 텍스트를 추가해주면 완벽한 방어 시스템이 구축된다.

핵심은 하나다. ‘실행 기록’을 남겨서 시스템이 같은 일을 반복하지 않게 하는 것. 이 원리 하나만 기억하면 어떤 자동화 툴을 쓰든 무한 루프 에러는 피할 수 있다.


PipeMaster-Lab 운영정책 및 제보 안내

① 공개된 모든 기록은 특정 기업이나 개인의 청탁 또는 금전적 지원 없이, 시스템 아키텍트의 독립적인 연구 및 실험 결과를 바탕으로 작성됩니다.
② 인용된 외부 콘텐츠 해석에 이의가 있는 경우,
연구실 직통 메일 pipemaster.lab@gmail.com
으로 연락 주시면 24시간 내 회신 및 즉각 조치합니다.
③ 게시된 내용 중 버전 변경으로 인한 정보 불일치나 치명적인 로직 오류를 제보해 주시는 분께는 내부 검토 후 소정의 기프티콘 등 바운티를 지급합니다.
④ 기업 단위의 시스템 아키텍처 컨설팅, 비즈니스 제휴 및 고도화 제안 역시 해당 공식 메일로만 수신 및 회신합니다.
verified

PIPEMASTER RESEARCH LAB

20년 IT 내공과 AI가 결합된 실전 무인 수익 자동화 시스템 연구소
본 콘텐츠는 PipeMaster-Lab 내부 Certified 규격을 엄격히 통과하였음을 증명합니다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다