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

Jin's Lab

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

blogautomation

블로그 시리즈 글 순서가 뒤죽박죽 — 숫자 순번으로 발행 순서 제어하기

J.Lab ·
목차

    최근 KidStory 블로그를 운영하면서 뼈아픈 실수를 하나 마주했습니다. 신생아부터 12개월까지 월령 순서대로 발행되어야 할 아기 성장 글들이, 엉뚱하게 4개월 글이 먼저 올라오는 등 순서가 뒤죽박죽이 된 겁니다. 독자들이 시리즈를 따라 읽는 데 큰 혼란을 줄 수 있는 심각한 문제였죠. 저는 이 블로그 자동화 발행 순서 문제를 해결하기 위해 곧바로 원인 분석에 들어갔습니다.

    정성껏 준비한 콘텐츠가 제대로 된 순서로 독자에게 전달되지 못한다니, 생각만 해도 답답했습니다. 저의 자동 발행 시스템 어딘가에 허점이 있다는 것을 직감했고, 이참에 시스템을 더 견고하게 만들 필요성을 느꼈습니다.

    노션 데이터베이스에서 뒤죽박죽 순서로 발행되는 블로그 글들을 보여주는 일러스트. 엉킨 화살표들이 혼란스러운 발행 순서를 나타낸다.

    뒤죽박죽 발행 순서, 대체 왜?

    처음 시스템을 구축했을 때, 저는 같은 우선순위('높음') 내에서는 글의 Notion `createdTime`을 오름차순으로 정렬하도록 설정했습니다. 가장 오래된 항목부터 발행되는 방식이었으니, 논리적으로는 문제가 없어 보였죠. 하지만 실제 발행 결과는 전혀 달랐습니다.

    문제의 원인을 파악하고 보니 어이없는 실수가 있었습니다. 처음 Notion에 키워드를 입력할 때, 저는 12개월부터 역순으로 입력했던 겁니다. 결과적으로 4개월 관련 글이 Notion에서는 가장 오래된 항목으로 인식되어, 가장 먼저 발행 우선순위를 얻게 된 것이죠.

    이때 깨달았습니다. '긴급', '높음' 같은 텍스트 기반의 우선순위로는 시리즈 글처럼 정교한 순서 제어가 필요한 콘텐츠에는 한계가 있다는 것을요. 발행 순서를 정확하게 제어하려면 훨씬 더 강력하고 유연한 방법이 필요했습니다. 기존 방식으로는 Notion 시리즈 순서 관리가 너무나 취약했던 셈입니다.

    새로운 '시리즈 순서' 숫자 필드가 추가된 노션 데이터베이스에서, 정돈된 순서로 블로그에 발행되는 글들을 보여주는 일러스트.

    숫자 순번으로 완벽하게 제어하기 위한 아이디어

    해결책은 의외로 간단한 곳에 있었습니다. 기존 Notion 데이터베이스에 있던 '시즌성' 필드를 좀 더 명확한 '글 유형'(예: 연중/계절/시리즈)으로 확장하는 동시에, '시리즈 순서'라는 새로운 Number 필드를 추가하기로 했습니다. 이 필드에 1, 2, 3... 과 같이 순번을 직접 매겨 발행 순서를 지정하는 방식이죠.

    새로운 필드가 생기면서 발행 우선순위 규칙도 새롭게 정립했습니다. 가장 높은 '긴급'(0)을 시작으로, '높음'(10), 그리고 새로 추가된 '시리즈' 글은 `20 + 순번`으로 우선순위를 부여했습니다. 예를 들어, 시리즈의 첫 번째 글은 21, 두 번째 글은 22가 되는 식이죠.

    그다음으로는 '보통'(30), 마지막으로 '낮음'(40) 순으로 이어지도록 했습니다. 이렇게 명확하고 숫자로 된 우선순위를 부여함으로써, 어떤 글도 엉뚱한 순서로 발행될 일이 없도록 만들었습니다. 이제 `블로그 자동화 발행 순서`가 완벽하게 제어될 것이라는 확신이 들었습니다.

    구글 앱스 스크립트 코드가 노션과 블로그 아이콘을 연결하고, 돋보기가 필드명을 검사하는 모습을 추상적으로 표현한 일러스트. 디버깅과 정확성을 상징한다.

    Google Apps Script로 로직 구현 및 깨달음

    새로운 규칙이 정해졌으니, 이 로직을 Google Apps Script(GAS)에 구현하는 일만 남았습니다. 저는 `getItemSortRank()`라는 새로운 함수를 만들어서, Notion에서 글 유형과 시리즈 순서 값을 가져와 위에서 정의한 우선순위 숫자를 반환하도록 코딩했습니다. 이 함수를 통해 각 글의 최종적인 정렬 랭크가 결정되는 것이죠.

    개발을 마치고 세 블로그 파일에 동일하게 적용한 후, 첫 테스트를 진행했습니다. 역시나 작은 삽질이 있었습니다. Notion 필드명을 '시리즈 순번'으로 코딩했는데, 실제 Notion 필드 이름은 '시리즈 순서'였던 겁니다! 사소한 실수였지만, 새로운 필드를 추가할 때는 Notion에서 직접 필드명을 확인하는 습관이 얼마나 중요한지 다시 한번 깨닫는 계기가 되었습니다.

    수정을 마치고 다시 실행하니, 드디어 KidStory 블로그의 시리즈 글들이 완벽하게 월령 순서대로 발행되기 시작했습니다. `GAS 정렬` 로직이 제대로 작동하는 것을 확인했을 때의 쾌감이란! 저의 `자동 발행 우선순위` 시스템이 한 단계 더 진화한 순간이었습니다.

    마치며

    이번 경험을 통해 블로그 자동화 시스템의 신뢰성을 한층 더 끌어올릴 수 있었습니다. 단순히 글을 발행하는 것을 넘어, 콘텐츠의 논리적인 흐름까지 완벽하게 제어할 수 있게 된 것이죠. 이제 `Notion 시리즈 순서` 관리가 훨씬 더 효율적이고 정확해졌습니다.

    작은 디테일이 때로는 전체 시스템의 성패를 가를 수 있다는 것을 다시 한번 배우게 된 소중한 경험이었습니다. 앞으로도 이렇게 '삽질'하며 얻은 지식들을 블로그에 꾸준히 기록해 나가겠습니다. 개발 일지 스타일의 글들이 다른 블로거분들에게도 도움이 되기를 바랍니다.

    blogautomation codelog contentsequencing googlesapps-script notionintegration publishorder seriesmanagement
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    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