배치와의 상호작용

운영 스케줄러(scheduler/app.py) 가 시드 데이터에 미치는 영향을 정리합니다. 배치 상세 흐름은 플로우 차트 / Invoice 배치, 기타 배치 참조.

스케줄러 잡 (시간은 KST 기준)

주기 (cron)시드 영향
nhn_invoice_task매월 5일 00:00⚠️ NHN API 호출 — dev 에 실제 NHN credentials 없으면 무해
update_nhn_project_list_task2시간마다⚠️ 가짜 cloud_accounts/project_id 가 비활성/제거 위험
partner_usage_task매월 1일 09:00⚠️ 직전 달 Origin doc 갱신 (덮어쓰기로 _seed_marker 손실 가능)
contract_expiration_task매일 09:00⚠️ 시드 5개월 후 단 하루 알림 발송 시도 (notification 누적)
auto_suspend_expired_organizations매일 05:00✅ 안전 (auto_status_change=false, 만료 전)
cleanup_expired_refresh_tokens매일 04:00✅ 무관 (시드 user 의 refresh_tokens=[])
cleanup_token_blacklist매일 04:30✅ 무관

위험 상세

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 까지 잡으려면 별도 쿼리 필요)

운영 권장 패턴

  1. 단기 시연: 데모 시연 직전 task reset → 시연 직후 task clean. 5개월 미만 보관이면 알림 트리거 없음.
  2. 장기 시드 보관: 위 contract notification 옵션 중 하나 적용 + dev 스케줄러를 꺼두거나 NHN credentials 무효화.
  3. 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