7.0 KiB
7.0 KiB
Crawler 시스템 파일 구조 및 역할 정의
이 문서는 crawler 폴더 내의 각 파일과 모듈의 역할, 기능, 그리고 상호 작용 방식에 대해 자세히 설명합니다.
📁 디렉토리 구조 및 핵심 파일 요약
| 파일명 | 분류 | 핵심 역할 |
|---|---|---|
| main.py | Core | 크롤러 시스템의 메인 진입점. 전체 수집 프로세스 조율 |
| config.py | Config | 발전소 정보, 비밀번호, 시스템 상수 등 설정 관리 |
| database.py | Data | Supabase 데이터베이스 연결 및 CRUD 처리 |
| crawler_manager.py | Logic | 지능형 스케줄링 관리 (업데이트 패턴 학습 및 최적화) |
| crawler_gui.py | UI | 관리자용 대시보드 (윈도우 GUI), 모니터링 및 수동 제어 |
| daily_summary.py | Batch | 일일 발전 통계 집계 및 요약 테이블 저장 |
| fetch_history.py | Tool | 과거 데이터(Hourly, Daily) 수집 도구 |
| sync_plants.py | Tool | 발전소 메타 정보를 DB와 동기화 |
| verify_data.py | Test | 수집된 데이터의 무결성 검증 및 테스트 스크립트 |
📄 파일별 상세 역할 분석
1. 핵심 시스템 (Core System)
main.py
- 역할: 전체 크롤링 시스템의 오케스트레이터(Orchestrator).
- 주요 기능:
integrated_monitoring()함수를 통해 정의된 모든 발전소를 순회합니다.CrawlerManager를 통해 현재 시점에 실행해야 할 크롤러를 선별합니다.- 각 발전소 타입에 맞는 크롤러 함수(
crawlers패키지)를 동적으로 호출합니다. - 수집된 실시간 데이터를 콘솔에 출력하고,
database.py를 통해 DB에 저장합니다. - 발전량이 0인 경우 등 간단한 이상 감지 로직을 수행합니다.
- 실행 방식: 스케줄러(Cron 등)에 의해 주기적으로 실행되거나, GUI에서 호출됩니다.
--force옵션으로 강제 실행 가능합니다.
config.py
- 역할: 시스템 설정 및 발전소 정보의 단일 진실 공급원(Single Source of Truth).
- 주요 기능:
SYSTEM_CONSTANTS: 각 크롤러 시스템(NREMS, KREMC 등)의 URL 및 API 엔드포인트 정의.COMPANIES: 업체 및 산하 발전소들의 계층 구조, 인증 정보(ID/PW), 용량(Customer ID) 등을 JSON 구조로 관리.get_all_plants(): 계층화된 데이터를 크롤러가 사용하기 쉬운 평탄화(Flat)된 리스트로 변환하여 제공.- 특이 사항: 보안이 필요한 인증 정보가 포함되어 있어 관리에 주의가 필요합니다. 1, 2호기와 같이 하나의 계정으로 분리되는 발전소(
is_split) 설정도 이곳에서 관리됩니다.
crawler_manager.py (Smart Scheduler)
- 역할: 비효율적인 반복 호출을 줄이고 NAS 리소스를 절약하기 위한 미들웨어.
- 주요 기능:
- SQLite 기반 상태 관리:
crawler_manager.db로컬 파일에 각 발전소의 상태 저장. - 학습 모드(LEARNING): 초기에는 자주 실행하며 발전소 서버의 데이터 업데이트 주기 패턴을 학습.
- 최적화 모드(OPTIMIZED): 학습된 업데이트 시점(예: 매시 15분) 전후의 윈도우(Window)에만 크롤링을 허용.
- 야간(21시~05시) 크롤링 자동 차단 로직 포함.
- SQLite 기반 상태 관리:
2. 데이터 관리 (Data Management)
database.py
- 역할: Supabase 클라우드 데이터베이스와의 인터페이스.
- 주요 기능:
- Supabase 클라이언트 싱글턴 연결 관리.
save_to_supabase(): 실시간 발전 데이터(solar_logs) 저장. 일일 통계(daily_stats) 단순 Upsert 처리.save_history(): 과거 내역 저장 시 사용되며,solar_logs(Hourly),daily_stats(Daily),monthly_stats(Monthly) 등 데이터 타입에 따라 적절한 테이블에 저장하고, 월별 통계 자동 갱신 트리거 로직을 포함합니다.
daily_summary.py
- 역할: 수집된 로그 데이터를 기반으로 일일 최종 통계를 확정 짓는 배치 스크립트.
- 주요 기능:
- 특정 날짜의
solar_logs를 모두 조회하여 발전소별 총 발전량, 피크 출력, 발전 시간(이용률)을 계산. - 계산된 확정 데이터를
daily_stats테이블에 저장. - 주로 하루가 끝나는 시점이나 다음 날 새벽에 실행하여 데이터 정확도를 보정합니다.
- 특정 날짜의
3. 사용자 인터페이스 (User Interface)
crawler_gui.py
- 역할: 윈도우 환경에서 크롤러 상태를 시각적으로 모니터링하고 제어하는 관리자 도구.
- 주요 기능:
tkinter기반의 GUI 제공.- 발전소별 현재 상태(대기, 실행중, 최적화 여부), 마지막 실행 시간 등을 트리 뷰(Tree View)로 표시.
- 개별/전체 크롤링 강제 실행, 히스토리 수집 명령, 학습 모드 리셋 등의 제어 기능 제공.
- 실시간 로그 창을 통해 백그라운드 프로세스(
subprocess)의 실행 결과를 출력.
4. 도구 및 유틸리티 (Tools & Utilities)
fetch_history.py
- 역할: 누락된 데이터나 초기 구축 시 과거 데이터를 수집하기 위한 스크립트.
- 주요 기능:
- 특정 발전소 ID를 인자로 받아 과거 데이터를 조회.
- 각 크롤러 모듈(
crawlers/)에 구현된fetch_history_hourly,fetch_history_daily등을 호출. - 시간별(Hourly), 일별(Daily) 데이터를 수집하여 DB에 적재.
sync_plants.py
- 역할: 로컬 코드(
config.py)와 원격 DB(plants테이블) 간의 메타 데이터 동기화. - 주요 기능:
- 새로운 발전소가 추가되거나 이름/용량이 변경되었을 때,
config.py의 내용을 DB의 마스터 테이블에 반영(Upsert). - NREMS 1, 2호기와 같이 논리적으로 분리해야 하는 발전소를 별도 레코드로 DB에 생성.
- 새로운 발전소가 추가되거나 이름/용량이 변경되었을 때,
verify_data.py
- 역할: 크롤링 로직 검증 및 데이터 무결성 테스트.
- 주요 기능:
- 각 발전소별로 샘플 날짜(과거/현재)를 지정하여 실제 데이터를 가져와 봅니다.
- 시간별, 일별, 월별 합계가 논리적으로 맞는지 검증 포맷을 출력하여 개발자가 확인하기 쉽게 돕습니다.
5. 하위 폴더
crawlers/ (폴더)
- 역할: 실제 사이트별 크롤링 로직이 구현된 모듈들의 집합.
- 구성:
nrems.py,kremc.py,hyundai.py,sun_wms.py,cmsolar.py등 사이트 타입별로 파일이 존재.- 각 모듈은 공통적으로
get_current_status()(실시간),fetch_history_*(과거 내역) 등의 인터페이스를 구현해야 함.
venv/, temp_env/ (폴더)
- 역할: Python 가상 환경 폴더. 프로젝트 실행에 필요한 라이브러리(
requests,pandas,supabase등)가 설치됨.
작성일: 2026-01-28