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

Jin's Lab

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

Blogger API

GAS 스크립트 이식 중 만난 Blogger 백데이팅과 분기 설계

J.Lab ·
목차

    최근 블로그 자동화 시스템을 보완하면서 가장 공을 들였던 부분은 퍼머링크 최적화였습니다. 테스트 환경인 Lab에서 멋지게 성공한 영문 퍼머링크 트릭을 드디어 실제 운영 중인 다른 채널들로 전파하기로 마음먹었습니다. 이 과정에서 가장 핵심이 된 작업은 바로 기존의 다양한 발행 환경에 맞춘 GAS 스크립트 이식 작업이었습니다.

    하지만 단순히 코드를 복사해서 붙여넣는 것으로는 끝나지 않았습니다. 내가 운영하는 채널들은 각자 고유한 목적과 구조를 가지고 있었기 때문입니다. 동일한 트릭을 적용하더라도 채널의 성격에 따라 분기 처리를 정교하게 설계해야만 예상치 못한 에러를 막을 수 있었습니다. 오늘은 그 치열했던 삽질과 해결 과정을 기록으로 남겨봅니다.

    하나의 서버에서 여러 클라우드로 코드가 자동 이식되는 모습을 표현한 깔끔한 테크 스타일의 아이소메트릭 일러스트

    동일한 구조를 가진 두 채널의 빠른 이식과 구조 단순화

    먼저 손을 댄 곳은 IssueLog와 KidStory 채널이었습니다. 이 두 곳은 다행히도 기존의 Lab 환경과 완벽히 동일한 구조를 공유하고 있었습니다. 덕분에 기존에 검증해 둔 publishToBlogger 함수와 발행 후 타이틀을 변경하는 renamePostTitle 방식을 그대로 이식하는 것만으로도 충분했습니다.

    여기에 더해 기존 워크플로우를 조금 더 직관적으로 다듬었습니다. 이전에는 발행 후 상태를 검수 대기로 두어 한 번 더 손이 가게 만들었지만, 이번에는 발행과 보완이 성공적으로 끝나면 상태를 바로 완료로 변경하여 종결되도록 프로세스를 단축했습니다. 자동화가 안정 궤도에 올랐다는 확신이 들었기에 내릴 수 있었던 과감한 결정이었습니다.

    참고로 검색 엔진 최적화를 위한 제목 클릭형 최적화는 이번 이식 대상에서 제외하고 오직 Lab 채널에만 단독으로 유지하기로 했습니다. 분석해 보니 이미 IssueLog와 KidStory 같은 소비자 지향형 블로그들은 본문 작성을 시작할 때부터 충분히 짧고 검색 친화적인 제목을 사용하고 있었기 때문입니다. 굳이 불필요한 연산을 추가할 필요가 없다고 판단해 과감히 덜어냈습니다.

    데이터베이스 동기화와 API 패치 요청 과정을 시각화한 미니멀한 테크 그래픽

    구조가 완전히 다른 IT Story 채널을 위한 별도 분기 설계

    진짜 문제는 마이그레이션 전용으로 운영 중인 IT Story 채널이었습니다. 이 채널은 과거에 작성한 글들을 가져오는 용도라 일반 발행 함수가 아닌 publishToBloggerMig 함수를 사용하고 있었습니다. 특히 과거 시점으로 발행일을 고정해야 하는 Blogger 백데이팅 처리가 필수적인 구조였습니다.

    기존의 일반적인 방식대로 일단 글을 발행한 뒤 제목을 변경하려고 하니, 백데이팅 기능과 꼬이면서 원치 않는 형태로 작동하곤 했습니다. 고민 끝에 구조적 차이를 인정하고 완전히 새로운 흐름의 분기 설계를 도입하기로 했습니다. 핵심은 영문 제목과 백데이팅용 published 날짜를 동시에 API insert 요청으로 보내 미리 완벽한 슬러그 예약을 받아두는 것이었습니다.

    원하는 슬러그로 글이 무사히 생성되고 나면, 두 번째 단계로 PATCH published 요청을 보내 제목만 한국어 원제로 덮어씌웠습니다. 이 PATCH 방식은 오직 title 필드만 수정하기 때문에, 이미 고정된 published 날짜나 기확보된 영문 슬러그를 전혀 건드리지 않고 그대로 유지할 수 있었습니다. 덕분에 마이그레이션 중에도 아무런 충돌 없이 백데이팅과 영문 퍼머링크를 동시에 챙길 수 있게 되었습니다. 만약 이 백데이팅 과정에서 API 오류가 발생하면 published 값을 제거하고 재시도하는 안전한 폴백(Fallback) 구조 역시 단단히 유지했습니다.

    웹 링크와 자물쇠 아이콘으로 안전하게 예약되는 URL 구조를 나타낸 벡터 스타일의 그래픽

    테스트 과정에서 관찰한 독특한 슬러그 예약 현상

    새로 설계한 분기 처리를 검증하기 위해 수없이 많은 테스트를 거듭하던 중 매우 흥미로운 현상을 관찰할 수 있었습니다. 테스트를 위해 방금 생성한 글을 삭제한 뒤, 동일한 영문 제목으로 다시 글을 발행하면 Blogger가 기존 주소를 기억하고 있다는 듯 URL 뒤에 _1, _2 같은 숫자 접미사를 붙여 발행하는 것이었습니다.

    알고 보니 구글 블로거는 글을 삭제하더라도 중복 방지를 위해 기존 슬러그를 일정 기간 내부적으로 보관 혹은 예약 상태로 잡아두는 메커니즘을 가지고 있었습니다. 처음에는 코드에 버그가 있는 줄 알고 소스 코드를 한참 헤맸지만, 원인을 알고 나니 비로소 안도할 수 있었습니다.

    실제 운영 환경에서는 매번 새로운 키워드로 완전히 다른 글이 생성되기 때문에 이러한 중복 이슈가 발생할 일이 전혀 없었습니다. 오직 개발 과정에서 동일한 제목으로 끊임없이 지우고 다시 쓰는 테스트를 반복할 때만 발생하는 특유의 현상이었던 셈입니다. 이 사소한 발견 덕분에 플랫폼의 내부 동작 방식을 한 층 더 깊이 이해하게 되었습니다.

    이번 작업을 통해 아무리 좋은 기술적 트릭이라도 대상 플랫폼과 채널의 목적에 맞게 세밀한 분기 설계가 뒷받침되어야 진짜 내 무기가 된다는 것을 깨달았습니다. 깔끔하게 정리된 스크립트가 돌아가는 모습을 보니 그간의 삽질이 모두 값진 거름으로 돌아온 것 같아 무척 뿌듯합니다.

    Blogger API Blogger Automation Code Integration Google Apps Script Web Publishing
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    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