# DB 기반 동적 스케줄러 관리 시스템 **날짜**: 2026-01-02 **작성자**: happybell80 **관련 서비스**: rb8001 **상태**: 계획 --- ## 목적 main.py 732줄 중 130줄이 스케줄 관련 코드. DB로 이동하여 동적 관리. ## 테이블 구조 - `scheduled_jobs` 테이블 - 컬럼: `id`(UUID), `name`, `job_type`, `cron_expression`, `enabled`, `config`(JSONB) - 인덱스: `enabled`, `job_type` ## Job Type 매핑 - `naverworks_briefing` → `NaverWorksBriefingSkill.process_briefing` - `daily_summary` → `DMSkill.send_daily_summary_dm` - `companyx_news` → `NewsPostingSkill.process_news_batch` - `lunch_worldcup` → `send_lunch_worldcup_notification` ## 동작 방식 1. 서버 시작 시 DB에서 `enabled=true` 조회 2. `job_type`으로 함수 매핑 3. APScheduler에 등록 4. 런타임 중 API로 추가/수정/삭제 ## API 엔드포인트 - `POST /api/scheduler/jobs` - 새 잡 추가 - `PATCH /api/scheduler/jobs/{name}` - 스케줄 수정 - `DELETE /api/scheduler/jobs/{name}` - 잡 삭제 - `GET /api/scheduler/jobs` - 목록 조회 ## 데이터 예시 | name | job_type | cron_expression | config | |------|----------|-----------------|---------| | naverworks_daily | naverworks_briefing | 0 9 * * mon-fri | {"channel_id": "C09C98KK2TT"} | | team_summary | daily_summary | 0 9 * * 1-5 | {} | | companyx_news | companyx_news | 0 10 * * mon-fri | {"channel_id": "C09CP4MDX71"} | ## 장점 - 재배포 없이 스케줄 변경 - 웹 UI로 관리 가능 - 히스토리 추적 - 백업/복구 용이 ## 현재 문제점 - 환경변수 산재 (`DAILY_SUMMARY_ENABLED` 등) - 새 스케줄마다 main.py 수정 필요 - 스케줄 코드와 비즈니스 로직 혼재