SELFISH AAA

📋 이번 주 이야기할 것

크루 테스트 D-day 실전 돌리면서 터진 것들 + 해결기

  1. 크루 테스트 D-day — 당일 알림톡 4종 동시 발송
  2. 취소 버튼 구현 삽질기 (5번의 시도)
  3. 발송 직전 DB 조회로 전환
  4. 인사이트: AI가 삽질할 때 끊어주는 법 (시즌2)

1️⃣ 크루 테스트 D-day (4/13) — 당일 알림톡 4종 발송

지난주까지의 상황

  • ①오픈알림, ②리마인드, ③D-1, ⑤할인쿠폰 — 4종 발송 성공 확인 완료
  • 오늘(4/13)은 공유회 당일. ④당일리마인드, ⑥입장링크, ⑦혜택안내, ⑧시작알림 4종이 한꺼번에 나가는 날

오늘 해야 했던 것

  1. 취소 버튼 만들기 — 승인 눌렀다가 “아 잠깐” 하면 취소할 수 있어야 함
  2. 발송 직전 DB 조회 — 승인 시점이 아니라 실제 발송 시점에 신청자 목록을 조회하도록 변경
  3. 14:00에 ④ 당일리마인드 잘 가는지 확인

2️⃣ 취소 버튼 구현 — 5번의 삽질

왜 필요했나

Slack에서 “이대로 발송” 눌렀는데, 카피 오타를 발견했거나 시간을 잘못 설정한 경우. 현재는 한번 승인하면 되돌릴 수 없었음.

삽질 과정 (5번의 시도)

시도 1: 실행 ID 저장 → API로 중지 승인 시 n8n 실행 ID를 저장해두고, 취소 시 n8n API로 해당 실행을 stop하는 방식. → ❌ staticData에 실행 ID 저장까지는 됐는데, Code 노드에서 fetch가 안 됨

시도 2: fetch 대신 axios n8n Code 노드에서 require('axios') 시도 → ❌ Module 'axios' is disallowed — n8n 보안 정책으로 외부 모듈 차단

시도 3: this.helpers.httpRequest() n8n 내장 헬퍼 함수 사용 시도 → ❌ Code 노드에서는 this.helpers 접근 불가 (HTTP Request 노드에서만 가능)

시도 4: n8n API로 waiting 실행 직접 중지 외부에서 API 호출로 waiting 상태인 실행을 stop → ❌ waiting 상태 실행은 일반 목록에 안 나옴. DELETE는 되는데 POST stop은 “not found”

시도 5 (최종): staticData 플래그 방식 ✅ 발상 전환. 실행을 “중지”하는 게 아니라, Wait 끝나고 나서 “취소됐는지 확인”하는 방식.

취소 누름 → staticData에 cancel_4_iid79 = true 저장

Wait 끝남 → "혹시 취소 플래그 있어?" 확인

있으면 → 발송 안 하고 종료
없으면 → 정상 발송

→ HTTP 호출도 없고, 외부 모듈도 필요 없고, n8n 기본 기능(staticData)만으로 해결

💡 인사이트: “안 되면 관점을 바꿔라”

Claude한테 “하나씩 꼭 이렇게 해봐야 아는 거야?” 라고 물었더니 멈춤. 그래서 “다른 관점에서 생각해봐” 한 마디 했더니 — “실행을 멈추는 게 아니라, 실행은 두고 발송만 안 하면 되잖아” 로 발상 전환.

시도 1~4는 전부 “실행을 중지한다”는 같은 관점에서의 변주였음. 관점 자체를 바꾸니까 1분 만에 해결.

지난주 삽질(타임존)이랑 같은 패턴:

  • 지난주: “시간을 하나씩 대입” → “서버한테 직접 물어보면 끝”
  • 이번주: “실행을 중지하려고 API 4번 시도” → “취소 플래그만 심으면 끝”

공통점: Claude가 같은 방향으로 계속 시도하면, “방향 자체가 맞아?” 한 마디가 삽질을 끊어줌


3️⃣ 발송 직전 DB 조회 — 승인 시점 vs 발송 시점

문제

기존: 승인 누를 때 DB에서 신청자 조회 → 3시간 뒤 발송 → 승인 후~발송 전 사이에 새로 신청한 사람은 알림톡을 못 받음

변경

발송 직전(Wait 끝난 후)에 DB 조회하도록 순서 변경:

Before:

승인 → SQL생성 → DB조회 → 발송데이터 → Wait(대기) → 취소확인 → 발송

After:

승인 → SQL생성 → Wait(대기) → 취소확인 → DB조회 → 발송데이터 → 발송

기술적 챌린지

Wait 노드를 지나면 이전 노드의 데이터가 다 날아감. → staticData에 템플릿 정보를 저장해두고, DB조회 후 다시 꺼내 쓰는 방식으로 해결.

실전에서 의미

실제 공유회 때 오후 3시 발송이면, 오후 3시 기준 신청자 DB로 발송됨. 아침에 승인해도 발송 직전까지 신청한 사람은 다 포함.


4️⃣ 기타 수정사항

  • ⑤ 할인쿠폰 모달: 신청페이지 URL 입력 필드 추가 (기존에 빠져있었음)
  • Slack 메시지 순서 보장: 카테고리별 메시지가 뒤섞이던 문제 → 1초 간격 배칭 추가
  • 취소→재승인 플로우: 취소 후 다시 “이대로 발송” 누르면 cancel 플래그 자동 삭제 → 정상 발송

이번 주 인사이트 정리

상황내가 한 것결과
Claude가 fetch→axios→helpers→API 4연속 실패”하나씩 해봐야 아는 거야?” + “다른 관점에서 생각해봐”staticData 플래그로 1분 만에 해결
승인 시점에 DB 조회하면 중간 신청자 누락”실전 공유회 때도 적용되는 거 맞지?” + “발송 직전 기준으로 바꿔줘”Wait 후 DB조회로 전환
취소 눌렀는데 “예약된 발송 없음”로그 확인 요청 → 취소 메시지 카피 문제 발견n8n 표현식 제약 파악 후 Code 노드로 이동

하네스 엔지니어링 패턴 (시즌2):

  1. 같은 방향 3번 실패 = 방향이 틀렸다는 신호 → “다른 관점에서 해봐”
  2. “됐어? 안 됐어?”만으로도 충분 → 기술 몰라도 결과 확인은 할 수 있음
  3. 실전 질문이 스펙을 만든다 → “실제 공유회 때도 이렇게 되는 거 맞지?”가 발송직전 조회 기능으로 이어짐

다음 스텝

  • 오늘 14:00 ④ 당일리마인드 발송 확인 (코이 포함 5명)
  • ⑥⑦⑧ 순차 발송 확인
  • 4/16 ⑨ VOD 발송으로 테스트 완료
  • 4/17 testMode 해제 → 프로덕션 전환
  • 4/28 공유회에서 첫 실전 풀사이클 운영