DOCS/plan/250906_news_skill_publish_separation.md
happybell80 5ae841cf27 계획 문서 검증 결과 반영 및 87줄로 압축
- rb8001 DM 전송 및 스케줄링 현황 반영
- company-x_hompage 코드 100% 재사용 가능 확인
- ProcessLock 완전 구현 상태 명시
- Nginx 설정 예시 코드 추가
- 현실적 일정으로 수정 (코드 90% 재사용)
2025-09-06 14:01:10 +09:00

3.2 KiB

뉴스 스킬과 퍼블리시 분리 아키텍처 계획

1. 현재 구조 및 검증 결과

  • 기존 시스템: company-x_hompage - 완전 자동화된 뉴스 수집/게시
  • rb8001 현황: DM 전송(DMSkill), Cron 트리거(/api/cron/daily-summary), asyncio 스케줄링 구현
  • 재사용 가능 자원: collectors 모듈 100%, ProcessLock 구현 완료, thumbnail_manager 활용 가능

2. 목표 아키텍처

  • skill-news(8511): 뉴스 수집/요약 → Slack DM 전송
  • skill-publish(8512): 사용자 선택 뉴스 → Squarespace 게시
  • 데이터 흐름: 수집 → 검증/요약 → DM 전송 → 사용자 선택 → 게시 → 결과 보고

3. 구현 계획

Phase 1: skill-news (1주차)

기존 코드 재사용 (company-x_hompage/src/):

  • collectors/google_news_collector.py (100% 재사용)
  • collectors/scrape_news_playwright.py (100% 재사용)
  • collectors/summarize_news.py (100% 재사용)
  • utils/process_lock.py (완전 구현됨 - PID 확인, 타임아웃, atexit)
  • collectors/thumbnail_manager.py (이미지 처리)

새로 구현:

  • Slack 인터랙션 핸들러 (rb8001 DMSkill 참조)
  • APScheduler 통합 (rb8001은 asyncio만 사용 중)

Phase 2: skill-publish (2주차)

기존 코드 재사용 (company-x_hompage/src/publishers/):

  • squarespace_login.py, squarespace_publisher.py
  • post_formatter.py (중복 체크 로직 포함)

Phase 3: 통합 및 배포 (3주차)

Nginx 설정 추가 (nginx-infra/server-nginx-default):

location /skill-news/ {
    proxy_pass http://localhost:8511/;
    proxy_set_header Host $host;
}
location /skill-publish/ {
    proxy_pass http://localhost:8512/;
}

Slack App 권한 (추가 확인 필요):

  • 필수: chat:write, im:write
  • 권장: files:write, users:read, channels:read

4. 데이터베이스 설계

CREATE TABLE rb_news (
    id UUID PRIMARY KEY,
    keyword VARCHAR(100),
    title TEXT,
    url TEXT UNIQUE,
    publisher VARCHAR(200),
    published_date DATE,
    summary TEXT,
    status VARCHAR(50), -- collected, selected, published
    slack_ts VARCHAR(50),
    created_at TIMESTAMP
);

5. API 엔드포인트

skill-news:

  • POST /collect: 뉴스 수집 (Cron 트리거)
  • GET /news/{date}: 날짜별 조회
  • POST /slack/interactive: 버튼 응답

skill-publish:

  • POST /publish: 선택 뉴스 게시
  • GET /status/{id}: 게시 상태

6. 주요 개선사항

  • 스케줄링: rb8001의 asyncio → APScheduler 업그레이드
  • DM 전송: rb8001 DMSkill 로직 활용 (3명 하드코딩 → DB 연동)
  • ProcessLock: 이미 구현된 정교한 락 메커니즘 그대로 사용
  • 모니터링: /health 엔드포인트 + Slack 오류 알림

7. 리스크 및 해결방안

  • Slack 권한: 실제 필요 scope는 운영 중 확인 후 추가
  • 비동기 처리: rb8001처럼 asyncio 기반 구현
  • 중복 실행: ProcessLock으로 완벽 방지 (타임아웃 3600초)

8. 일정 (현실적 추정)

  • 1주차: skill-news 구현 (코드 90% 재사용으로 충분히 가능)
  • 2주차: skill-publish + Slack 통합
  • 3주차: 테스트 및 배포