diff --git a/journey/plans/260102_db_scheduler_management.md b/journey/plans/260102_db_scheduler_management.md new file mode 100644 index 0000000..96016ca --- /dev/null +++ b/journey/plans/260102_db_scheduler_management.md @@ -0,0 +1,53 @@ +# 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 수정 필요 +- 스케줄 코드와 비즈니스 로직 혼재 + diff --git a/journey/troubleshooting/250919_naverworks_slack_05_db_scheduler_management.md b/journey/troubleshooting/250919_naverworks_slack_05_db_scheduler_management.md index de170a4..1fa44e2 100644 --- a/journey/troubleshooting/250919_naverworks_slack_05_db_scheduler_management.md +++ b/journey/troubleshooting/250919_naverworks_slack_05_db_scheduler_management.md @@ -1,52 +1,10 @@ # DB 기반 동적 스케줄러 관리 시스템 -## 날짜: 2025-09-22 -## 작성자: Claude / happybell80 -## 관련 서비스: rb8001 -## 상태: 계획 +**날짜**: 2025-09-22 +**작성자**: happybell80 +**관련 서비스**: rb8001 --- -## 1. 목적 -main.py 732줄 중 130줄이 스케줄 관련 코드. DB로 이동하여 동적 관리. - -## 2. 테이블 구조 -- scheduled_jobs 테이블 -- 컬럼: id(UUID), name, job_type, cron_expression, enabled, config(JSONB) -- 인덱스: enabled, job_type - -## 3. 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 - -## 4. 동작 방식 -1. 서버 시작 시 DB에서 enabled=true 조회 -2. job_type으로 함수 매핑 -3. APScheduler에 등록 -4. 런타임 중 API로 추가/수정/삭제 - -## 5. API 엔드포인트 -- POST /api/scheduler/jobs - 새 잡 추가 -- PATCH /api/scheduler/jobs/{name} - 스케줄 수정 -- DELETE /api/scheduler/jobs/{name} - 잡 삭제 -- GET /api/scheduler/jobs - 목록 조회 - -## 6. 데이터 예시 -| 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"} | - -## 7. 장점 -- 재배포 없이 스케줄 변경 -- 웹 UI로 관리 가능 -- 히스토리 추적 -- 백업/복구 용이 - -## 8. 현재 문제점 -- 환경변수 산재 (DAILY_SUMMARY_ENABLED 등) -- 새 스케줄마다 main.py 수정 필요 -- 스케줄 코드와 비즈니스 로직 혼재 \ No newline at end of file +## 계획 +→ 상세: [plans/260102_db_scheduler_management.md](../../plans/260102_db_scheduler_management.md) \ No newline at end of file