배치와의 상호작용
운영 스케줄러(scheduler/app.py) 가 시드 데이터에 미치는 영향을 정리합니다. 배치 상세 흐름은 플로우 차트 / Invoice 배치, 기타 배치 참조.
스케줄러 잡 (시간은 KST 기준)
위험 상세
1. partner_usage_task (매월 1일)
매월 1일 09:00, 직전 달 모든 회사의 partner_usage Origin 문서를 upsert_origin_usage() 로 다시 만듭니다. 우리 시드의 Origin doc 이 같은 키(company_id, date, status='Origin') 로 덮어써집니다.
- 데이터 값: discount_policy 도 같이 시드돼 있어 5% 그대로 재계산 → 값은 거의 동일
_seed_marker손실:model_dump()전체 set 이라 marker 가 사라짐 →task clean으로 직전 달 partner_usage 가 안 지워질 가능성- API doc 보존:
existing_api가 있고 status 가Unissued이고refresh_unissued=True일 때만 refresh — 기본값은 False 이므로 시드 API doc 은 보존됨
2. update_nhn_project_list_task (2시간마다)
실제 NHN API 에서 받은 프로젝트와 organization.cloud_accounts 를 비교합니다. dev 환경에 실제 NHN credentials 가 연결돼 있다면 시드 가짜 project_id 가 비활성 처리되거나 BillingCustom 정리 대상이 될 수 있습니다.
- 체크 방법: 시드 후
db.organization.findOne({...}).cloud_accounts가 비어 있으면 동기화에 깎인 것. - 대응: dev 환경의 NHN credentials 자체를 비워두거나, 데모 시연 후 즉시 clean.
3. contract_expiration_task (매일)
Contract.should_notify 조건: enable_notification=True 이고 today == end_date - reminder_days 가 정확히 같은 날.
우리 시드는 enable_notification=True, reminder_days=30, end_date=now+6개월 → 시드 후 약 5개월 후 단 하루 알림 발송 시도.
- 메일 발송: 가짜 도메인이라 실패 로그만 남음
- notification 누적:
notification컬렉션에 row 가 적재되며_seed_marker가 없어task clean으로는 제거 안 됨 - 대응 옵션:
- 시드 contract 의
enable_notification: False로 변경 (가장 깔끔) - 또는
reminder_days: 300처럼 크게 잡아 트리거 시점이start_date이전으로 밀리도록 조정 - 또는
step03_organizations.clean()에notification정리 추가 (marker 없는 row 까지 잡으려면 별도 쿼리 필요)
- 시드 contract 의
운영 권장 패턴
- 단기 시연: 데모 시연 직전
task reset→ 시연 직후task clean. 5개월 미만 보관이면 알림 트리거 없음. - 장기 시드 보관: 위 contract notification 옵션 중 하나 적용 + dev 스케줄러를 꺼두거나 NHN credentials 무효화.
- clean 무결성 검증: 한 번 시드 →
partner_usage_task수동 실행 →task clean후 컬렉션 잔존물 확인. 잔존이 있으면 marker 손실 케이스이므로 step06 에서 별도 정리 로직 추가 필요.
관련 코드 위치
- 스케줄러 정의:
scheduler/app.py - cron 표현식:
config/envs/.env.scheduler - partner_usage 배치 로직:
worker/controllers/partner_usage_task_controller.py - 계약 만료 알림 로직:
worker/controllers/organization_task_controller.py:send_contract_expiration_notification - 자동 정지 로직:
worker/controllers/organization_task_controller.py:auto_suspend_expired_organizations