path
Jin's Lab
코드로 실험하고 기록하는 개발 일지 · J.Lab

Jin's Lab

코드로 실험하고 기록하는 개발 일지. 커리어와 삶의 방향을 탐색하며 기록하는 공간입니다

AutomationTroubleshooting

Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계

J.Lab ·
목차

    J.Lab의 자동화, 뜻밖의 복병을 만나다: Google Apps Script 실행 시간 6분 제한 극복기

    안녕하세요, J.Lab입니다. 요즘 제 블로그 'IssueLog'가 꾸준히 자동 포스팅되고 있는 것, 혹시 알고 계셨나요? 하루에 3건씩 새로운 IT 이슈를 자동으로 수집하고 게시하는 작은 프로젝트인데, 나름 뿌듯하게 지켜보고 있었습니다. 그런데 최근 들어 이상한 점을 발견했어요. 분명 하루 3건 발행 예정인데, 왜 항상 1건만 올라오는 걸까?

    처음에는 단순히 네트워크 문제겠거니, 아니면 스크립트가 중간에 뭔가 에러를 뿜었겠거니 대수롭지 않게 생각했습니다. 하지만 이런 현상이 며칠 연속으로 이어지자, 이건 단순한 문제가 아니라는 확신이 들었죠. 결국, J.Lab의 주말 저녁은 이 미스터리를 파헤치는 디버깅 파티로 바뀌었습니다.

    컴퓨터 화면에 코드와 오류 메시지가 가득하고, 사람이 의아한 표정으로 이를 바라보는 모습. 디버깅 상황을 나타냅니다.

    첫 번째 삽질: 로그를 파고들다, GAS 타임아웃의 흔적

    가장 먼저 Google Apps Script(GAS)의 실행 로그를 확인해봤습니다. 로그는 개발자의 친구이자 유일한 증거 아니겠어요? 그리고 놀랍게도, 로그에는 예상치 못한 오류 메시지가 가득했습니다. 바로 'Execution failed: Exceeded maximum execution time'이라는 문구였죠.

    아, 'GAS 타임아웃' 문제였구나. J.Lab은 머리를 한 대 맞은 기분이었습니다. GAS 스크립트가 실행될 수 있는 최대 시간을 초과해서 강제로 종료되었다는 뜻인데, 분명 스크립트 자체의 복잡도는 그리 높지 않았거든요. 혹시나 해서 구글링을 좀 해보니, GAS는 기본적으로 실행 시간이 6분으로 제한되어 있다는 사실을 다시금 깨달았습니다. 물론 G Suite 계정은 더 길지만, 일반 Gmail 계정은 얄짤없이 6분이죠.

    Gmail 계정의 함정: 랜덤 딜레이, 양날의 검이 되다

    그럼 왜 6분 제한에 걸렸을까? 제 스크립트는 3건의 포스팅을 발행하기 위해 각 포스팅 사이에 '랜덤 딜레이'를 설정해 두었습니다. 봇처럼 보이지 않기 위해 0분에서 30분 사이의 무작위 시간을 기다리도록 설계한 것이죠. 이게 문제의 원흉이었습니다.

    만약 첫 번째 포스팅 후 20분의 딜레이가 걸리고, 두 번째 포스팅 후 또 20분의 딜레이가 걸린다면, 벌써 40분이라는 시간이 흐르게 됩니다. 6분이라는 Google Apps Script 실행 시간 제한을 가볍게 넘겨버리는 거죠. IssueLog 프로젝트가 일반 Gmail 계정으로 실행되고 있었으니, 이 제한은 더욱 치명적이었습니다. 랜덤 딜레이가 저를 구해주기는커녕, 제 발목을 잡고 있었던 겁니다. 약 80%의 스크립트가 이 딜레이 때문에 6분을 초과하여 타임아웃 되는 상황이었던 거죠.

    디지털 시계가 시간을 나타내며 제한 시간에 다다르는 모습을 시각적으로 보여줍니다. 6분 타임아웃의 임박함을 상징합니다.

    문제 해결: 딜레이를 현명하게 조절하다

    원인을 파악했으니 해결책은 의외로 간단했습니다. 바로 랜덤 딜레이 시간을 대폭 축소하는 것이었죠. 기존의 '0분 ~ 30분' 딜레이를 '0분 ~ 2분'으로 과감하게 줄였습니다. 2분 정도의 짧은 딜레이라면, 3번의 포스팅을 모두 처리하더라도 최대 6분(첫 포스팅 시간 + 2분 + 2분)을 넘지 않을 것이라고 판단했죠.

    이 변경 사항을 적용하고 스크립트를 재배포했습니다. 그리고 다음 날부터 IssueLog는 완벽하게 하루 3건의 포스팅을 성공적으로 게시하기 시작했습니다. 혹시 모를 상황에 대비해 다른 자동화 프로젝트인 'KidStory'와 'Jin's Lab'에도 동일하게 랜덤 딜레이를 0~2분으로 축소하는 조치를 취했습니다. 작은 변화였지만, 안정성 면에서는 엄청난 개선이었습니다.

    기어가 원활하게 돌아가고 데이터가 빠르게 흐르며, 모든 자동화 프로세스가 성공적으로 작동하는 모습. 문제 해결 후의 효율성을 나타냅니다.

    마치며: J.Lab의 작은 깨달음과 다음 계획

    이번 경험을 통해 'Google Apps Script 실행 시간 제한'과 'Gmail 계정 제한'이라는 숨겨진 함정을 다시 한번 절감했습니다. 그리고 랜덤 딜레이와 같은 보안(?) 장치가 때로는 서비스의 안정성을 저해할 수도 있다는 사실을 깨달았죠. 항상 최악의 시나리오를 고려하고, 내가 사용하는 플랫폼의 제약을 정확히 이해하는 것이 얼마나 중요한지 되새기게 됩니다.

    이제 IssueLog는 문제없이 잘 돌아가지만, J.Lab은 여기서 멈추지 않을 겁니다. 다음에는 스크립트 타임아웃이나 예상치 못한 오류 발생 시 사용자에게 알림을 보내는 기능, 그리고 보다 유연하게 작업을 재개할 수 있는 에러 핸들링 로직을 추가할 계획입니다. 여러분도 자동화 스크립트를 만들 때 저와 같은 삽질을 겪지 않도록, 이 경험이 작은 도움이 되었으면 좋겠습니다!

    AutomationTroubleshooting CodeLog ExecutionLimit GASTimeout GmailRestrictions GoogleAppsScript RandomDelay
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    path
    J.Lab

    커리어와 삶의 방향을 탐색하며
    기록하는 공간입니다

    카테고리
    403 Forbidden Error 1 AdSense 1 AdSense Bot Detection 1 AI Automation 1 AI Image Generation 1 ai-automation 2 AI-Prompting 1 AIBlogAutomation 1 AICodeLog 1 AIContentGeneration 1 AIImageGeneration 1 AIWritingErrors 1 API Automation 2 API Retry Design 1 api-automation 1 API-Deprecation 1 api-error 1 api-fallback 1 api-retry-strategy 1 api-troubleshooting 1 APIDebugging 1 APIError 1 APIErrorHandling 1 APIIntegration 1 APITokenRenewal 1 AppsScript 1 appsScriptAutomation 1 AutomatedBlogging 1 automation 1 Automation 2 AutomationTroubleshooting 1 Backoff Algorithm 1 Base64Encoding 1 BatchProcessing 1 blog-automation 1 blog-customization 1 blog-migration 3 Blog-Sorting 1 blog-strategy 1 blog-theme-customization 1 blog-workflow 1 blogautomation 1 BlogAutomation 2 Blogger 4 Blogger API 2 Blogger Automation 1 Blogger SEO 1 blogger-api 3 blogger-automation 1 blogger-error-400 1 blogger-labels 1 blogger-seo 1 blogger-tips 1 Blogger-Tips 1 BloggerAPI 3 BloggerBypath 1 BloggerCustomization 2 BloggerFavicon 1 BloggerTemplate 1 BloggerTemplateEditing 1 BloggerTheme 1 BloggerThemeCustomization 1 BloggerXMLStructure 1 Blogging-Automation 1 BloggingTools 1 BlogQuality 1 BlogSpot 1 BWidgetBIncludable 1 CardClickHandler 1 CDATA 1 clamping-text 1 Code Integration 1 codelog 1 CodeLog 1 codeRefactoring 1 contentsequencing 1 cost-reduction 1 CSSOverlay 1 data-parsing 1 DatabaseDesign 1 DataRecovery 1 DateInjection 1 Debugging 2 dev-journey 1 DeveloperJourney 2 DevJourney 1 display-none-seo 1 dom-manipulation 1 dynamic-menu 1 Error-Handling 1 ErrorHandling 1 Execution Timeout 1 ExecutionLimit 1 exponential-backoff 1 FactChecking 1 FaviconEmbedding 1 Feed-API 1 filesystem 1 Flat Illustration 1 FluxModel 1 FreeAIImage 1 FrontEndDev 1 FrontendTips 1 GAS Blogger API 1 gas-automation 1 gas-optimization 1 gas-trigger 1 GASTimeout 1 gasTriggerManagement 1 GCP Project Linkage 1 Gemini 1 Gemini API 1 gemini-api 1 GeminiAPI 1 GeminiPrompt 1 GeminiPromptEngineering 1 GmailRestrictions 1 Google Apps Script 7 Google Discover 1 google-apps-script 3 Google-Apps-Script 1 google-blogger 1 googleAppsScript 1 GoogleAppsScript 6 googlesapps-script 1 hero-image 1 HTMLWidgetBlogger 1 http-429 1 HuggingFace 1 HuggingFaceAPI 1 ico-generator 1 Image Optimization 1 image-automation 1 image-optimization 1 In-App Browser 1 invalid-argument 1 javascript 3 JavaScript 2 javascript-automation 1 javascript-toc 1 jlab-codelog 1 JLabDevLog 1 json-schema 1 label-length-limit 1 linux 1 meta-description 1 Negative Prompt 1 notion-api 1 notion-database 1 notion-gas-integration 1 NotionAPI 1 NotionAutomation 1 notionintegration 1 NotionIntegration 1 OAuth Scope 1 pagination 1 payload-validation 1 permalink-management 1 PersonaDesign 1 pil-image-processing 1 Pinterest 1 Pollinations 1 Pollinations Flux 1 pollinations-api 1 PollinationsAI 1 PositionAbsolute 1 Prompt Design 1 Prompt Engineering 1 prompt-engineering 1 Prompt-Engineering 1 PromptEngineering 1 publishorder 1 python-favicon 1 queue-stuck 1 RandomDelay 1 rate-limiting 1 Refactoring 1 rfc3339 2 Robots Meta Tag 1 RSS Feed 1 scriptNotFound 1 Search Engine Optimization 2 Search-Engine-Optimization 1 SEO Tips 1 seo-optimization 4 SEO-Optimization 1 seriesmanagement 1 SidebarLinks 1 SNSMarketing 1 SVGIcon 1 table-of-contents 1 TechJournal 1 Template 1 ThreadsAPI 1 tistory-migration 1 transparent-favicon 1 triggerCleanup 1 Troubleshooting 1 unzip 1 URL Slug 1 vanilla-js 1 Web Development 1 Web Publishing 2 Web Security 1 web-development 1 Web-Development 1 web-development-tips 1 web-performance 1 web-scraping 1 WebAccessibility 1 WebDevelopment 3 WebDevelopmentTips 1 WebDevJourney 1 windows 1 WorkflowAutomation 1 XMLParser 1 XMLSpecialCharacters 1 XMLTheme 1 zip 1
    인기 글
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    다른 블로그
    IssueLog
    IssueLog
    issuelog.jinbytes.com
    KidStory
    KidStory
    kidstory.jinbytes.com
    IT Story
    IT Story
    jinbytes.com
    © Jin's Lab · J.Lab · All Rights Reserved
    jinbytes.com · Powered by Blogger