기술 블로그 자동화 파이프라인 — 60개 커밋으로 보는 멀티 플랫폼 발행 전략
기술 블로그를 운영하다 보면 글 쓰기보다 발행 과정이 더 번거로워진다. 이번에 DEV.to, Hashnode, Blogger를 연결한 자동 발행 파이프라인을 구축했다. 60개 커밋에서 AI 활용 패턴과 워크플로우 자동화 전략을 정리한다.
배경: 무엇을 만들고 있는가
기술 블로그 플랫폼마다 독자층이 다르다. DEV.to는 개발자, Hashnode는 영어권 기술 커뮤니티, Blogger는 SEO에 강하다. 하나의 마크다운 파일로 여러 플랫폼에 동시 발행하는 시스템을 만들었다.
현재 상황은 이랬다:
- 한국어/영어 혼재된 200여개 포스트
- 수동 복붙으로 각 플랫폼 발행
- 메타데이터 관리 복잡
- build log 같은 임시 글들이 공개 플랫폼에 노출
목표는 GitHub Actions 기반 완전 자동화였다.
GitHub Actions로 멀티 플랫폼 워크플로우 구축하기
프롬프팅 전략: 워크플로우 생성
AI에게 GitHub Actions 워크플로우를 만들게 할 때는 제약 조건을 명시해야 한다.
“DEV.to API를 사용해서 마크다운 파일을 자동 발행하는 GitHub Action을 만들어줘. 조건:
published: true인 영어 글만 발행build-logslug 포함된 글은 제외- 이미 발행된 글은 업데이트만 (중복 방지)
- frontmatter에서
devto_id추출해서 기존 글 확인- API 실패 시 상세 에러 로그 출력”
이렇게 하면 안 된다:
“DEV.to에 글 올리는 워크플로우 만들어줘”
Claude Code 활용법: 멀티 파일 워크플로우
여러 플랫폼 워크플로우를 동시에 작업할 때 CLAUDE.md에 이런 컨텍스트를 설정했다:
# Blog Automation Project Context
## Current Workflow Files
- `.github/workflows/publish-devto.yml` - DEV.to 자동 발행
- `.github/workflows/publish-hashnode.yml` - Hashnode 자동 발행
- `.github/workflows/publish-blogger.yml` - Blogger 자동 발행
- `.github/workflows/cleanup.yml` - 저품질 글 정리
## Content Rules
- English posts only for external platforms
- Korean posts stay internal
- build-log posts are temporary (exclude from publishing)
- News posts with low engagement get unpublished after 30 days
## API Patterns
- Always check if article exists before creating
- Update existing articles instead of duplicating
- Handle rate limits with exponential backoff
- Log all API responses for debugging
이렇게 설정하니까 AI가 각 워크플로우 파일을 수정할 때 일관된 패턴을 유지했다.
구조화 전략: 플랫폼별 특성 반영
각 플랫폼은 API 구조가 다르다. 하나씩 차근차근 접근했다:
- DEV.to 먼저 구현 (API 문서가 가장 깔끔)
- Hashnode로 확장 (GraphQL이라 복잡하지만 기능 풍부)
- Blogger 추가 (OAuth 인증 복잡함)
- 공통 패턴 추출해서 리팩토링
AI에게 각 단계를 별도 프롬프트로 처리했다. 한 번에 3개 플랫폼을 다 만들라고 하면 섞여서 망한다.
관련 기술 개념: API 인증 패턴
- DEV.to: API Key 기반 (간단)
- Hashnode: API Key + GraphQL (중간)
- Blogger: OAuth 2.0 + refresh token (복잡)
Blogger가 가장 까다로웠다. refresh token을 GitHub Secrets에 저장하고, 만료 시 자동 갱신하는 로직이 필요했다.
콘텐츠 필터링과 품질 관리 자동화
프롬프팅 전략: 정리 규칙 정의
저품질 콘텐츠를 자동으로 정리하는 워크플로우를 만들 때:
“DEV.to API로 내 글들의 조회수를 확인해서, 다음 조건에 맞는 글을 unpublish 처리해줘:
build-log,news태그가 있는 글- 발행한 지 30일 이상 지남
- 조회수 50 이하
- 처리 전에 해당 글 목록을 로그로 출력
- 실제 unpublish 전에 30초 대기 (실수 방지)”
이런 안전 장치를 프롬프트에 명시하는 게 중요하다. AI가 만든 스크립트가 실제 데이터를 건드리기 때문이다.
Claude Code의 slash commands 활용
워크플로우 디버깅할 때 이런 패턴을 썼다:
/commit "fix: add debug output for API responses"- 작은 수정사항 즉시 커밋/review .github/workflows/- 전체 워크플로우 파일 검토/test- 워크플로우 YAML 문법 검증
특히 /review 명령어로 여러 워크플로우 파일의 일관성을 체크하는 게 유용했다.
구조화 전략: 점진적 롤아웃
처음부터 모든 글을 자동 발행하지 않았다:
- 테스트 글 1개로 워크플로우 검증
- 영어 글 10개만 선별해서 발행
- build-log 제외 규칙 추가
- 전체 영어 글 자동 발행 활성화
- 정리 워크플로우 마지막에 추가
각 단계에서 문제가 생기면 즉시 중단하고 수정했다. AI가 만든 코드라도 단계별 검증은 필수다.
관련 기술 개념: frontmatter 메타데이터 관리
각 플랫폼의 글 ID를 frontmatter에 저장하는 패턴:
---
title: "제목"
published: true
devto_id: 12345
hashnode_id: "abc-def-ghi"
blogger_id: "9876543210"
---
이렇게 하면 재발행할 때 기존 글을 업데이트할지, 새 글을 만들지 판단할 수 있다.
영어 콘텐츠 확장 전략
프롬프팅 전략: 번역 vs 현지화
한국어 글을 영어로 확장할 때 단순 번역이 아니라 현지화를 했다:
“이 한국어 기술 블로그 글을 영어권 개발자들이 읽기 좋게 다시 써줘. 조건:
- 한국 특화 내용 (네이버, 카카오 등)은 글로벌 대안으로 교체
- 문체는 Medium/DEV.to 스타일로 (존댓말 → 직설법)
- 코드 예시의 변수명도 영어로
- slug는 영문으로 새로 생성
- 원문 링크를 하단에 추가”
이렇게 하니까 단순 번역보다 훨씬 자연스러운 영어 글이 나왔다.
Claude Code의 배치 처리 활용
8개 글을 한 번에 번역할 때 이런 방식을 썼다:
- 파일 목록 생성:
ls posts/*-ko.md | head -8 - 일괄 처리 프롬프트: “이 8개 파일을 각각 영어로 현지화해줘”
- 검토 후 커밋: 생성된 파일들을 하나씩 검토 후 커밋
AI에게 한 번에 너무 많은 파일을 주면 품질이 떨어진다. 8개 정도가 적당했다.
구조화 전략: 콘텐츠 등급 분류
모든 한국어 글을 영어로 만들 필요는 없다. 이런 기준으로 분류했다:
- Tier 1: 기술 방법론, 프롬프팅 전략 → 영어 번역 우선
- Tier 2: 프로젝트 빌드 로그 → 영어 버전 고려
- Tier 3: 국내 뉴스, 임시 메모 → 한국어만 유지
AI에게 이 분류 기준을 알려주고 어떤 글을 영어로 만들지 추천받았다.
더 나은 방법은 없을까
지금 만든 파이프라인보다 개선할 수 있는 부분들:
1. Notion API + Database 기반 관리
현재는 frontmatter로 메타데이터를 관리하는데, Notion Database를 CMS로 쓰면 더 체계적이다:
- 발행 상태를 GUI로 관리
- 플랫폼별 성과 지표 추적
- 콘텐츠 캘린더 시각화
- 태그/카테고리 일괄 관리
2. OpenAI Batch API로 번역 비용 최적화
현재는 실시간 API로 번역하는데, Batch API를 쓰면 50% 저렴하다:
- 여러 글을 하나의 배치로 묶어서 처리
- 24시간 지연은 있지만 비용 효율적
- 긴 글일수록 효과 큰다
3. MCP 서버로 플랫폼 연동 강화
Model Context Protocol로 각 플랫폼을 연결하면:
- Claude가 직접 API 호출 가능
- 워크플로우 없이도 실시간 발행
- 댓글, 조회수 등 피드백도 실시간 확인
4. 성능 지표 기반 콘텐츠 최적화
현재는 조회수만 보는데, 더 정교한 지표들:
- 플랫폼별 engagement rate
- 키워드별 검색 유입
- 시간대별 발행 효과
- A/B 테스트로 제목 최적화
Google Analytics API나 각 플랫폼의 상세 API를 연동하면 데이터 드리븐 최적화가 가능하다.
정리
- GitHub Actions로 멀티 플랫폼 자동 발행이 가능하다. 제약 조건을 명확히 해야 AI가 정확한 워크플로우를 만든다
- 콘텐츠 필터링 규칙을 자동화하면 플랫폼별 품질 관리가 쉬워진다. 안전 장치는 필수다
- 번역보다는 현지화 관점에서 영어 콘텐츠를 만들어야 해외 독자에게 어필한다
- 단계별 롤아웃과 지속적인 모니터링으로 시스템을 안정화한다
이번 작업의 커밋 로그
05e904e — post: build logs 2026-03-18 (2 posts, en)
4de9884 — post: build logs 2026-03-18 (2 posts, en)
2bb1330 — post: build logs 2026-03-18 (2 posts, en)
d455bdf — chore: update published articles [skip ci]
2ac70e2 — chore: update published articles [skip ci]
1a019c3 — post: build logs 2026-03-18 (2 posts, en)
7f105fb — chore: update published articles [skip ci]
0665de4 — post: build logs 2026-03-17 (2 posts, en)
90f8079 — chore: update published articles [skip ci]
d307780 — post: build logs 2026-03-17 (1 posts, en)
2d578e1 — chore: update published articles [skip ci]
d023b82 — post: build logs 2026-03-17 (1 posts, en)
451daf4 — post: build logs 2026-03-16 (4 posts, en)
ce037d0 — post: build logs 2026-03-16 (4 posts, en)
1ec519e — chore: update published articles [skip ci]
c822f68 — chore: update published articles [skip ci]
b179be0 — post: build logs 2026-03-16 (4 posts, en)
adfb941 — chore: add Blogger URLs [skip ci]
b255ecb — chore: add Blogger URLs [skip ci]
78371ee — post: build logs 2026-03-16 (4 posts, en)
d153687 — chore: update published articles [skip ci]
b8bb05c — chore: add Blogger URLs [skip ci]
5541356 — chore: add Hashnode URLs [skip ci]
8ae8059 — post: build log series (6 posts, en) + unpublish script
1634cb2 — chore: add Blogger URLs [skip ci]
a6fbd48 — chore: add Hashnode URLs [skip ci]
e7ea767 — chore: set published: true for remaining English posts
520f6bd — chore: update published articles [skip ci]
a7eecd1 — chore: remove blogger metadata from Korean posts
6a4f63d — feat: Blogger 영어 글만 발행 + 트렌디 인라인 CSS 적용
b4c1005 — chore: add Blogger URLs [skip ci]
a365f54 — feat: Blogger 워크플로우 OAuth refresh token 방식으로 업데이트
7036543 — chore: add Hashnode URLs [skip ci]
765902d — feat: Medium → Hashnode 워크플로우 교체 (영어 글 자동 발행)
cf8a33f — feat: Medium + Blogger 자동 발행 워크플로우 추가
5320e38 — chore: update published articles [skip ci]
03159a0 — chore: update published dates [skip ci]
928e424 — chore: add publish-drafts workflow
97a8c51 — chore: update published articles [skip ci]
6e951d4 — post: English versions for 8 Korean blog posts
8573bcf — fix: add debug output for DEV.to API response and improve published check
8b7caf0 — chore: update cleanup workflow to unpublish outdated Korean news articles
622d79f — chore: update published articles [skip ci]
6f58931 — chore: update published articles [skip ci]
f68751a — chore: cleanup workflow — delete all unpublished articles
570ed33 — fix: add User-Agent header to cleanup workflow
f2fc77e — chore: cleanup workflow — unpublish low-view news + build logs
23166c5 — chore: update published articles [skip ci]
910e21d — chore: remove chatbot legislation post + add cleanup workflow
20a53c6 — chore: add cleanup workflow for unpublishing jidonglab/build-log articles
ccd5947 — chore: update published articles [skip ci]
4583fec — post: AI news 2026-03-14 (4 posts, ko)
c4fc0f0 — chore: update published articles [skip ci]
5b899f4 — fix: exclude build-log posts from DEV.to publishing
20d37f0 — chore: update published articles [skip ci]
2db63c6 — post: llmtrio-build-log (en/ko)
4ef5a44 — chore: update published articles [skip ci]
c627849 — chore: update published articles [skip ci]
32ffcfb — chore: update published articles [skip ci]
0c8f0fe — chore: update published articles [skip ci]
Comments 0