시작하며: 403 에러
지난 3편에서 텔레그램 알림까지 완벽하게 세팅했다고 생각하며 위풍당당하게 전체 [Test Workflow] 버튼을 눌렀다.
1일, 2일, 3일 치 일정이 달력에 예쁘게 꽂히고 있었다. 그런데 정확히 15번째 일정(itemIndex: 15) 을 쓰는 순간, 시스템이 붉은 에러를 뿜으며 멈춰버렸다.
{
"errorMessage": "Forbidden - perhaps check your credentials? [item 15]",
"errorDescription": "Rate Limit Exceeded",
"httpCode": "403"
}엥 이게 뭐시냐 하면서 로그를 봤다. 로그에 적힌 Rate Limit Exceeded라는 단어를 보고 구글링을 했다. 이것은 로직이나 인증의 문제가 아니라, 구글이 “님 DDOS임?” 이였다.
1. 일정을 마구 던진 n8n을 막은 구글
상황을 비유하자면 이렇다. 내 비서(n8n)가 30장의 달력 스케줄을 들고 구글로 달려갔다. 그런데 1장씩 정중하게 제출하는 게 아니라, 성격이 급해 갖고 있는 서류를 1초 만에 서류 30장을 구글 얼굴에 던져버린 것 이다.
구글 캘린더 API는 하루 사용량은 100만 건으로 넉넉하지만, 서버 보호를 위해 ‘1초당 보낼 수 있는 횟수(Burst Limit)‘를 제한한다. 15건까지는 어떻게든 받아냈지만, 결국 DDOS 일까 싶어 “너무 빨라! 님 디도스(DDoS) 공격?!” 라며 16번째부터 수령을 거부해 버린 것이다.
2. 해결: 인터벌 주기
n8n을 뒤져보니 ‘Batching(일괄 처리)’ 이 있어 이를 사용했다.
달력에 일정을 쓰는 4번째 HTTP Request (POST) 노드를 열고, JSON 항목 하단 Options를 눌러 Batching을 추가해 다음과 같이 세팅했다.
-
Batching: 활성화 (
true) -
Items per Batch:
5(한 번에 5장씩만 묶어서 제출할 것) -
Batch Interval:
2000(내고 나서 2000ms, 즉 2초 있다가 제출할 것)
이렇게 설정하니 5건 제출 -> 2초 휴식 -> 5건 제출 -> 2초 휴식의 리듬으로 약 10~15초에 걸쳐 제출해 구글도 받아주기 시작했다.

3. 마무리: 자동화의 완성
트러블슈팅이 끝났다. [Test Workflow] 버튼을 다시 눌렀다.
-
비서가 Service Account 신분증 내밀고 과거 달력을 무사히 가져왔다.
-
알고리즘이 30일 치 완벽한 운동 루틴을 계산해 냈다.
-
구글에 가서 5개씩, 2초 쉬어가며 달력에 일정을 입력했다.
-
가지고 있는 N번의 입력 작업이 모두 끝나자, 텔레그램 노드가 단 한 통의 완료 보고 메시지를 폰으로 쏴주었다.

포트 노출 없는 안전한 폐쇄망 환경, 무결점의 루틴 알고리즘, 구글이 DDOS라고 생각못하게 Batching 처리, 그리고 알림까지. 내 홈랩 안에서 1년 365일 조용하고 완벽하게 돌아갈 ‘헬스 루틴 제너레이터’ 생성을 완료했다. 다음은 작성한 코드를 리펙터링하고 생각하지 못한 예외사항을 처리 해보고자 한다.