요즘 저는 Google Apps Script(GAS)를 활용해 이런저런 자동화 스크립트를 많이 돌리고 있습니다. 블로그 글 발행부터 간단한 데이터 처리까지, 매일 묵묵히 돌아가는 스크립트들이 제 소중한 시간을 절약해주고 있죠. 덕분에 코딩 자체보다 콘텐츠 기획에 더 집중할 수 있게 된 요즘입니다.
그런데 얼마 전부터 GAS 실행 로그에 심상치 않은 빨간 줄들이 보이기 시작했습니다. 처음엔 대수롭지 않게 생각했어요. 가끔 인터넷 연결이 불안정하거나 구글 서비스에 일시적인 오류가 생길 때도 있으니까요. 하지만 오류 메시지가 반복적으로, 그것도 특정 패턴을 그리며 나타나는 것을 보고는 이건 그냥 넘어갈 문제가 아니라는 생각이 들었습니다.
평화로운 일상 속, 갑자기 나타난 오류 알림
매일 아침 눈뜨면 습관처럼 GAS 실행 로그를 확인하는 버릇이 있습니다. 혹시 밤새 무슨 일이 생기진 않았을까 하는 걱정 때문이죠. 그런데 며칠 전부터 'Script function not found: runPathAutomation' 이라는 섬뜩한 문구가 계속 눈에 띄기 시작했습니다. 처음엔 한두 번이겠거니 했는데, 매일 꾸준히, 그것도 다양한 이름으로 나타나는 오류 로그를 보니 슬슬 불안해지더군요.
특히 'runPath' 라는 이름이 계속 반복되는 것을 보고는 뭔가 익숙한 느낌이 들었습니다. 이 함수는 분명 오래전에 제가 쓰던 블로그 이름인 'Path'와 관련된 자동화 함수였을 텐데 말이죠. 지금은 블로그 이름을 'IssueLog'로 바꾸면서 관련 함수명도 'runIssuelog'으로 모두 변경한 상태였습니다. 설마 하는 마음에 스크립트 편집기를 열어봤습니다.
원인을 찾아 나서는 삽질 여정
스크립트 코드 자체에는 문제가 없어 보였습니다. 최신 함수명은 모두 'runIssuelog'으로 잘 바뀌어 있었고, 정상적으로 작동해야 할 함수들은 문제없이 실행되고 있었습니다. 그렇다면 이 존재하지 않는 함수를 대체 누가 계속 호출하고 있는 걸까요? 이때 제 머리를 스치는 하나의 가능성이 있었습니다. 바로 '트리거'였습니다.
GAS 프로젝트 좌측 메뉴에 있는 시계 아이콘, '트리거' 메뉴를 열었습니다. 그리고 그 순간, 저는 제 눈을 의심했습니다. 트리거 목록에는 무려 17개의 항목이 빽빽하게 채워져 있었습니다! 제가 생각했던 것보다 훨씬 더 많은 트리거들이 무분별하게 쌓여 있었던 거죠. 마치 오래된 서랍에서 잊고 있던 잡동사니들이 튀어나온 기분이었습니다.
'runPathAutomation'이 1개, 'runPath' 관련 트리거가 3개, 심지어 예전에 테스트용으로 만들었던 'runKidStory-in-IssueLog', 'runKidStoryAutomation' 같은 이름들도 섞여 있었습니다. 이 함수들은 블로그 이름을 바꾸거나 스크립트 기능을 리팩토링하면서 이미 코드에서 사라진 지 오래된 것들이었습니다. 그런데도 GAS는 이 존재하지 않는 함수들을 꾸준히, 매 시간마다 호출하려고 시도하고 있었던 겁니다.
숨겨진 구버전 GAS 트리거와의 전쟁, 그리고 깔끔한 정리
저는 즉시 'GAS 트리거 삭제' 작업을 시작했습니다. 하나하나 목록을 살펴보며 어떤 트리거가 살아있어야 할 최신 버전인지, 어떤 트리거가 삭제되어야 할 구버전인지 신중하게 판단했습니다. 이 작업은 생각보다 시간이 좀 걸렸습니다. 제가 만들었지만 기억 저편으로 사라졌던 트리거들이 워낙 많았거든요.
결과적으로 총 17개의 트리거 중 무려 11개를 삭제할 수 있었습니다. 이제 남은 것은 제가 의도했던 정상적인 트리거 6개뿐입니다. 'Lab', 'KidStory' 관련 트리거 2개, 그리고 최근 활발하게 사용하는 'IssueLog' 관련 트리거 3개가 깔끔하게 정리되어 목록을 채웠습니다. 이렇게 정돈된 트리거 목록을 보니 마음이 후련하더군요.
이번 경험을 통해 GAS는 함수명이 변경되더라도 기존에 설정된 트리거에 그 변경 사항을 자동으로 반영해주지 않는다는 중요한 사실을 깨달았습니다. 즉, 제가 함수 이름을 'runPath'에서 'runIssuelog'으로 바꿨을 때, 기존 'runPath'를 호출하던 트리거는 여전히 'runPath'를 찾고 있었던 겁니다. 존재하지 않는 함수를 계속 호출하려니 오류가 날 수밖에요.
GAS 트리거 관리의 중요성: 리팩토링의 완성은 트리거 정리!
이번 'Script function not found' 오류 폭탄 덕분에 저는 아주 값진 교훈을 얻었습니다. GAS 프로젝트를 리팩토링하거나 함수명을 변경할 때는 반드시 트리거 목록을 열어 확인하고, 불필요한 구버전 트리거들을 깔끔하게 정리해야 한다는 것을요. 그렇지 않으면 저처럼 알 수 없는 오류에 시달리게 될 가능성이 큽니다.
이는 단순히 오류를 없애는 것 이상의 의미가 있습니다. 불필요한 트리거는 시스템 자원을 낭비하고, 스크립트 실행 할당량에도 영향을 줄 수 있습니다. 또한, 깔끔하게 정리된 트리거 목록은 나중에 유지보수를 할 때도 훨씬 효율적입니다. "GAS 트리거 관리"는 이제 저의 리팩토링 체크리스트에 필수 항목으로 추가될 것입니다.
여러분도 혹시 저처럼 GAS 실행 로그에 알 수 없는 오류가 반복된다면, 가장 먼저 트리거 목록을 확인해보시길 바랍니다. 오래된 트리거 하나가 여러분의 자동화를 방해하고 있을지도 모릅니다. 오늘의 J.Lab 일지는 여기까지입니다. 다음에 더 유익한 삽질 경험으로 찾아오겠습니다!