# 뉴스 스킬과 퍼블리시 분리 아키텍처 계획 ## 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): ```nginx 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. 데이터베이스 설계 ```sql 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주차**: 테스트 및 배포