diff --git a/journey/troubleshooting/260117_배당_귀족주_자동_수집_로빙_통합_구현.md b/journey/troubleshooting/260117_배당_귀족주_자동_수집_로빙_통합_구현.md new file mode 100644 index 0000000..4a38fb5 --- /dev/null +++ b/journey/troubleshooting/260117_배당_귀족주_자동_수집_로빙_통합_구현.md @@ -0,0 +1,120 @@ +# 배당 귀족주 자동 수집 로빙 통합 구현 + +**날짜**: 2026-01-17 +**작성자**: Agent +**관련 파일**: `rb8001/app/services/dividend/dividend_collector_service.py`, `rb8001/app/scheduler/jobs/dividend_collector.py`, `rb8001/app/scheduler/db_loader.py` + +**참고 문서**: `plans/260116_배당_귀족주_자동_수집_로빙_통합_계획.md` + +--- + +## 테스트 시나리오 (TDD Red) + +### 시나리오 1: 스케줄러 작업 생성 및 실행 + +**기대 동작**: +1. `_run_dividend_collector_with_logging()` 함수 호출 시 `collect_all_dividends()` 서비스 실행 +2. 로깅: 시작/완료/에러 기록 +3. Supabase 데이터 저장 확인: `dividend_history` 테이블에 최신 배당 데이터 저장 + +**검증 항목**: +- 함수 실행 성공 (에러 없음) +- 로그에 시작/완료 메시지 기록 +- DB에 최신 배당 데이터 저장 (오늘 날짜 기준) + +### 시나리오 2: DB 스케줄 등록 및 자동 로드 + +**기대 동작**: +1. `scheduled_jobs` 테이블에 `dividend_collector` 레코드 추가 +2. `JOB_TYPE_MAP`에 매핑 추가 +3. rb8001 서버 재시작 후 스케줄 자동 로드 확인 + +**검증 항목**: +- `scheduled_jobs` 테이블에 레코드 존재 +- `JOB_TYPE_MAP`에 `'dividend_collector'` 키 존재 +- 서버 재시작 후 스케줄 등록 확인 + +### 시나리오 3: 수동 실행 및 자동 실행 + +**기대 동작**: +1. `POST /api/scheduler/jobs/dividend_collector/run` 엔드포인트로 수동 실행 +2. 매주 일요일 새벽 3시 자동 실행 (cron 표현식) + +**검증 항목**: +- API 엔드포인트로 수동 실행 성공 +- 로그에서 실행 결과 확인 +- DB에 최신 데이터 저장 확인 + +--- + +## 구현 가이드 + +### Phase 1: 서비스 및 스케줄러 작업 생성 + +**1-1. 서비스 생성**: `rb8001/app/services/dividend/dividend_collector_service.py` + +```python +async def collect_all_dividends() -> None: + """배당 귀족주 전체 데이터 수집""" + # collect_dividends.py의 메인 로직을 서비스로 이동하거나 import + # 로깅 포함 + pass +``` + +**1-2. 스케줄러 작업 생성**: `rb8001/app/scheduler/jobs/dividend_collector.py` + +```python +def _run_dividend_collector_with_logging() -> None: + """배당 귀족주 수집 스케줄러 작업 (sync 래퍼)""" + # asyncio.run()으로 서비스 함수 실행 + # 로깅 포함 + pass +``` + +**참고 파일**: +- `rb8001/app/scheduler/jobs/diary_generator.py`: 기존 패턴 참고 +- `goosefarminvesting/backend/scripts/collect_dividends.py`: 수집 로직 참고 + +### Phase 2: DB 스케줄 등록 + +**2-1. `scheduled_jobs` 테이블에 레코드 추가** + +```sql +INSERT INTO scheduled_jobs (name, job_type, cron_expression, enabled, config) +VALUES ('dividend_collector', 'dividend_collector', '0 3 * * 0', true, '{}'); +``` + +**2-2. `rb8001/app/scheduler/db_loader.py`의 `JOB_TYPE_MAP`에 매핑 추가** + +```python +JOB_TYPE_MAP = { + # ... 기존 매핑 ... + "dividend_collector": { + "func": "_run_dividend_collector_with_logging", + "module": "app.scheduler.jobs.dividend_collector" + } +} +``` + +### Phase 3: 테스트 및 검증 + +**3-1. 서버 재시작 후 스케줄 로드 확인** +**3-2. API 엔드포인트로 수동 실행 테스트** +**3-3. DB 데이터 확인** + +--- + +## 파일 참조 + +- `rb8001/app/scheduler/jobs/diary_generator.py`: 스케줄러 작업 예시 +- `rb8001/app/scheduler/db_loader.py`: `JOB_TYPE_MAP` 구조 +- `goosefarminvesting/backend/scripts/collect_dividends.py`: 수집 로직 +- `DOCS/journey/plans/260116_배당_귀족주_자동_수집_로빙_통합_계획.md`: 전체 계획 + +--- + +## 다음 단계 + +1. Phase 1 구현: 서비스 및 스케줄러 작업 생성 +2. Phase 2 구현: DB 스케줄 등록 +3. Phase 3 실행: 테스트 및 검증