일일 콘텐츠 이메일 통합: 플랫폼별 개별 발송에서 Apple 스타일의 통합 요약으로
요약
여러 플랫폼의 개별 이메일 발송 방식을 메타데이터 기반의 통합 시스템으로 전환한 사례를 다룹니다. 중복 코드를 제거하고 데이터 누락 시 발생하는 오류를 방지하여 워크플로우의 안정성을 높였습니다.
핵심 포인트
- 플랫폼별 개별 발송에서 단일 통합 요약 방식으로 아키텍처 개선
- 중앙 집중식 메타데이터 리더를 통한 데이터 관리 단일화
- 데이터 누락 시 에러 대신 항목을 건너뛰는 유연한 예외 처리 구현
- 코드 중복 제거 및 유지보수 효율성 증대
일일 콘텐츠 이메일 통합: 플랫폼별 개별 발송에서 Apple 스타일의 통합 요약으로
TL;DR: 우리는 여러 플랫폼별 이메일 작업을 하나의 메타데이터 기반 통합기(consolidator)로 교체하여, Apple 스타일의 단일 요약을 생성하도록 만들었습니다. 이 변화를 통해 중복을 줄이고, 누락된 필드 오류를 제거했으며, 일일 워크플로우를 더 유지보수하기 쉽게 만들었습니다.
문제점
이전 설정에서는 각 플랫폼(Bluesky, Dev.to, Substack, Medium 등)마다 자체적인 GitHub Action이 있었으며, 이는 src/notifier.py를 트리거하여 일일 이메일을 발송했습니다. 이메일 본문은 플랫폼의 콘텐츠 파일로부터 직접 생성되었습니다. 이러한 아키텍처는 두 가지 주요 문제를 야기했습니다:
- 노력의 중복 – 모든 플랫폼마다 자체적인 이메일 템플릿이 필요했으며, 이는 거의 항상 동기화 상태를 유지해야 하는 6개의 별도 코드 경로를 초래했습니다.
- 취약한 메타데이터 – 이메일 생성은
metadata.json내의 특정 키(key) 존재 여부에 의존했습니다. 포스트에bluesky_uris필드가 누락되면, notifier는KeyError를 발생시켜 전체 일일 발송을 중단시켰습니다:
Traceback (most recent call last):
File "src/notifier.py", line 112, in send_summary
bluesky_cell = f'<a href="{metadata["bluesky_uris"]["bluesky"]}">…'
...
그 결과, 콘텐츠 구조가 변경될 때마다 이메일 템플릿을 수동으로 수정하고 업데이트해야 하는 불안정한 일일 워크플로우가 발생했습니다.
처음 시도했던 것
처음에는 **각 개별 워크플로우를 리팩터링(refactor)**하려고 시도했습니다:
- 각 GitHub Action이 공유된
notifier라이브러리를 사용하도록 업데이트했습니다. - 이메일 템플릿을 중앙 집중화했지만, 각 플랫폼을 위한 별도의
send_*함수는 유지했습니다.
이 접근 방식은 여전히 6개의 별도 함수를 유지해야 했고, 메타데이터를 읽고, 링크를 구성하며, 누락된 필드를 처리하는 로직이 중복되었습니다. 또한 단 하나의 포스트라도 특정 플랫폼의 필드가 누락되면 코드는 여전히 깨졌습니다.
구현
1. 중앙 집중식 메타데이터 리더 (Centralized Metadata Reader)
저는 특정 날짜의 모든 콘텐츠 파일을 읽고 필요한 데이터를 하나의 딕셔너리(dictionary)로 집계하는 src/daily_consolidator.py를 생성했습니다:
# src/daily_consolidator.py
import json
import os
...
이제 이 파일은 매일 어떤 콘텐츠가 존재하는지에 대한 단일 진실 공급원 (Single Source of Truth) 역할을 합니다.
2. 통합 이메일 빌더 (Unified Email Builder)
src/notifier.py는 통합된 메타데이터를 받아 Apple 스타일의 단일 이메일을 생성하도록 재작성되었습니다:
# src/notifier.py
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
...
주요 변경 사항:
- 단일 함수 (
send_summary): 6개의 플랫폼별 함수 대신 하나의 함수를 사용합니다. - Apple 스타일 UI: 최소한의 CSS, 깔끔한 링크, 그리고 일관된 레이아웃을 적용했습니다.
- 유연한 처리 (Graceful handling): 특정 플랫폼의 데이터가 누락된 경우, 에러를 발생시키는 대신 해당 항목을 단순히 건너뜁니다.
3. 일일 통합 스크립트 (Daily Consolidator Script)
이제 src/main.py가 전체 프로세스를 조율합니다:
# src/main.py
import os
from datetime import date
...
이 스크립트는 가볍고 CI 환경에서 실행되며, 일일 이메일을 위한 단일 진입점 (Single Entry Point) 역할을 합니다.
4. GitHub Actions 리팩터링 (GitHub Actions Refactor)
기존의 워크플로 (workflow) 파일들인:
.github/workflows/bluesky-daily.yml.github/workflows/devto-daily.yml
은 삭제되었습니다. 대신 새로운 통합 워크플로가 추가되었습니다:
# .github/workflows/daily-email.yml
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기