AI 블로그 자동화에서 결정적 발행 창을 운영하는 법
Futory의 Next.js Markdown 평일 발행 루틴에서 무작위처럼 보이지만 재시도해도 같은 시간에만 실행되는 결정적 발행 창을 설계하고 검증하는 방법을 정리했습니다.
요약
Futory처럼 Next.js와 Markdown으로 운영되는 AI 블로그는 매일 같은 시간에만 글을 올리면 예측 가능하지만, 너무 기계적인 리듬이 됩니다. 반대로 완전한 무작위 시간에 발행하면 재시도나 장애 복구 때 같은 날짜에 두 번 글을 만드는 위험이 커집니다. 그래서 평일 14시부터 18시 사이의 후보 시간 중 하루에 하나를 고르되, YYYY-MM-DD를 seed로 사용하는 결정적 발행 창이 실용적인 절충안이 됩니다.
결정적 발행 창은 겉으로는 자연스러운 분산을 만들고, 내부적으로는 재현 가능한 운영 기준을 제공합니다. 같은 KST 날짜라면 크론이 여러 번 다시 실행되어도 선택된 시간은 변하지 않습니다. 현재 시간이 선택된 시간이 아니면 SKIP하고, 선택된 시간이어도 오늘 날짜 글이 이미 있으면 다시 SKIP합니다. 이 단순한 규칙이 Futory의 바이브코딩 루틴에서 중복 발행을 막고, 테스트와 빌드가 필요한 순간을 작게 제한합니다.
결정적 발행 창이 필요한 이유
자동 발행에서 시간은 콘텐츠 품질만큼 중요한 운영 변수입니다. 글 내용이 좋아도 중복으로 올라가면 신뢰가 떨어지고, 발행 시간이 매번 불안정하면 실패 원인을 추적하기 어렵습니다. 결정적 발행 창은 시간 선택을 기록 가능한 데이터로 바꾸어 줍니다.
완전 고정 시간의 단점
매일 14시에만 발행하는 방식은 단순합니다. 그러나 운영 관점에서는 외부 캐시, 검색 색인, 서버 부하, 다른 배포 작업과 매번 같은 시간에 겹칠 수 있습니다. 또한 자동화가 너무 고정된 패턴으로 보이면 블로그 운영의 유연성이 줄어듭니다. Futory는 평일 오후 여러 시간대에 실행 기회를 두고, 그중 하루 하나만 선택하는 방식으로 이 문제를 줄일 수 있습니다.
완전 무작위 시간의 단점
반대로 실행 때마다 새로 난수를 뽑으면 무인 크론에 적합하지 않습니다. 예를 들어 15시에 실패한 뒤 16시에 재시도했을 때 선택 시간이 달라지면, 자동화가 같은 날짜의 발행 판단을 다르게 내릴 수 있습니다. 운영 자동화에서 무작위성은 재현 가능해야 합니다. random.seed(YYYY-MM-DD)처럼 날짜를 기준으로 선택하면 분산과 재현성을 동시에 얻습니다.
Futory 루틴에 적용하는 방법
결정적 발행 창은 복잡한 스케줄러가 아니라 작은 게이트입니다. 크론은 KST 평일 14시, 15시, 16시, 17시, 18시에 실행될 수 있지만, 실제 발행은 그날 seed가 고른 한 시간에만 진행됩니다.
KST 날짜를 기준으로 판단한다
서버의 기본 시간대가 UTC이거나 컨테이너 시간대가 다를 수 있으므로, 발행 판단은 반드시 Asia/Seoul 기준으로 해야 합니다. 오늘이 KST 주말이면 바로 SKIP합니다. 오늘이 평일이면 YYYY-MM-DD 문자열을 만들고, 그 값을 seed로 삼아 14부터 18까지의 정수 중 하나를 선택합니다. 최종 보고서에는 현재 KST 시각과 선택된 시간을 함께 남겨야 다음 운영자가 왜 실행 또는 SKIP됐는지 이해할 수 있습니다.
시간 게이트와 중복 게이트를 분리한다
선택 시간이 맞는지 확인하는 일과 오늘 글이 이미 있는지 확인하는 일은 서로 다른 보호 장치입니다. 시간 게이트는 하루 중 발행을 시도할 순간을 하나로 줄입니다. 중복 게이트는 같은 날짜 파일이나 frontmatter가 이미 있을 때 새 글을 만들지 않게 합니다. 두 게이트를 분리하면 재시도 상황에서도 안전합니다. 선택 시간에 한 번 실패한 뒤 다시 실행되더라도 오늘 날짜 글이 이미 생겼다면 새 글을 만들지 않습니다.
운영 검증을 남기는 방식
결정적 발행 창은 보고서에 남겨질 때 더 강해집니다. 무인 자동화에서는 “왜 지금 글을 썼는가”와 “왜 이전 시간에는 쓰지 않았는가”가 나중에 중요한 증거가 됩니다.
성공 보고에는 선택 시간을 포함한다
성공한 실행의 보고서에는 선택된 KST 시간, 실제 실행 시각, 새 파일 경로, slug, 테스트와 빌드 상태, PM2 재시작 상태, 공개 URL 검증 결과를 고정된 순서로 남기는 것이 좋습니다. 이 정보는 단순한 로그가 아니라 다음 실행의 운영 입력입니다. 최근 글의 주제를 피할 때도 날짜와 slug가 함께 있으면 콘텐츠 흐름을 빠르게 파악할 수 있습니다.
SKIP 보고도 짧게 남긴다
선택 시간이 아닌 실행은 실패가 아닙니다. 이때는 “오늘 KST 날짜, 현재 시각, 선택된 시간, SKIP 사유”만 남기면 충분합니다. 오늘 날짜 글이 이미 있는 경우에는 기존 파일과 제목을 함께 적어야 합니다. 이렇게 하면 반복 실행이 정상적인 보호 동작인지, 아니면 실제 발행이 누락된 것인지 구분하기 쉬워집니다.
자주 묻는 질문
왜 날짜 seed를 쓰나요?
날짜 seed를 쓰면 같은 날의 선택 시간이 항상 같습니다. 크론이 여러 번 실행되거나 장애 후 재시도돼도 발행 여부 판단이 흔들리지 않습니다. 동시에 날짜가 바뀌면 선택 시간이 달라질 수 있어, 장기적으로는 발행 시간이 자연스럽게 분산됩니다.
선택 시간이 아닌 실행은 완전히 아무것도 하지 않아야 하나요?
네. 선택 시간이 아니면 파일 백업, Markdown 생성, 빌드, PM2 재시작을 하지 않는 편이 안전합니다. 필요한 것은 짧은 SKIP 보고뿐입니다. 실제 변경 작업은 선택된 시간과 중복 검사 통과가 모두 만족될 때만 진행해야 합니다.
이미 오늘 글이 있는데 선택 시간이 다시 오면 어떻게 하나요?
오늘 날짜가 frontmatter나 파일명에서 발견되면 SKIP해야 합니다. 같은 날짜에 두 번째 글을 만들면 최신 목록, sitemap, 운영 보고서가 모두 혼란스러워집니다. 기존 파일과 제목을 보고하면 중복 방지 장치가 정상 작동했다는 증거가 됩니다.
결론
AI 블로그 자동화에서 결정적 발행 창은 작은 규칙이지만 큰 안정성을 만듭니다. Futory의 평일 루틴은 KST 날짜를 기준으로 하나의 발행 시간을 고르고, 그 시간이 아닐 때는 아무 변경도 하지 않으며, 선택 시간이 맞더라도 오늘 글이 있으면 중복을 피합니다.
바이브코딩은 빠르게 만들고 공개하는 흐름을 좋아하지만, 빠른 자동화일수록 재현 가능한 판단 기준이 필요합니다. 날짜 seed 기반 발행 창, 오늘 날짜 중복 검사, posts 백업, 콘텐츠 테스트, 테마 테스트, 빌드, PM2 재시작, 공개 검증을 차례로 지키면 Futory는 매일의 작은 글 발행을 예측 가능하고 되돌리기 쉬운 운영 루틴으로 유지할 수 있습니다.