solorpower/docs/platform_analysis_report.md

12 KiB

태양광 발전소 통합 모니터링 플랫폼 — 종합 분석 보고서

작성일: 2026-04-22 참조 문서: docs/check.md (과업 요구사항), README.md (현 시스템 현황)


1. 프로젝트 전체상 (Vision)

1-1. 현재 시스템 vs. 목표 시스템

구분 현재 SolarPower 목표 플랫폼 (check.md)
사용 주체 내부 관리자 1인 다수의 외부 고객사 (B2B)
발전소 수 약 9개 (고정) 무제한 (사용자가 직접 등록)
크롤러 관리 개발자가 직접 코딩 사용자 계정 기반 자동 생성
UI React Native App (모바일 중심) PC Web 반응형 (발전왕 수준)
인프라 격리 단일 테넌트 멀티 테넌트 (고객사 간 데이터 완전 격리)
확장 목표 현행 모니터링 유지 EMS, VPP까지 단계적 확장

1-2. 제안 아키텍처 개요

flowchart TD
    subgraph CLIENT["클라이언트 (PC Web)"]
        USER["일반 사용자\n(발전소 등록/모니터링)"]
        ADMIN["관리자\n(계정/시스템 관리)"]
    end

    subgraph PLATFORM["플랫폼 코어 (Oracle Cloud)"]
        NEXTJS["Next.js\nFrontend (SSR)"]
        FASTAPI["FastAPI\nBackend (REST API)"]
        SCHEDULER["Crawler Scheduler\n(사용자별 독립 스케줄)"]
        SECRET_MGR["Secret Manager\n(AES-256 암호화)"]
        QUEUE["Task Queue\n(Redis/Celery)"]
    end

    subgraph CRAWLERS["수집 레이어"]
        PROXY["Residential Proxy Pool\n(IP 차단 우회)"]
        HEADLESS["Headless Browser\nCluster (Playwright)"]
    end

    subgraph EXTERNAL["외부 제조사 시스템"]
        NREMS["NREMS"]
        KREMC["KREMC"]
        SUNWMS["Sun-WMS"]
        ETC["기타 제조사..."]
    end

    subgraph DATA["데이터 레이어"]
        SUPABASE["Supabase\n(PostgreSQL + RLS)"]
        TIMESERIES["시계열 DB\n(향후 EMS/VPP용)"]
    end

    USER --> NEXTJS
    ADMIN --> NEXTJS
    NEXTJS --> FASTAPI
    FASTAPI --> SECRET_MGR
    FASTAPI --> SCHEDULER
    SCHEDULER --> QUEUE
    QUEUE --> HEADLESS
    HEADLESS --> PROXY
    PROXY --> NREMS & KREMC & SUNWMS & ETC
    FASTAPI --> SUPABASE
    HEADLESS --> SUPABASE

2. 기능별 위험 요소 및 해결 방안

2-1. 핵심 기능: 발전소 등록 및 자동 데이터 연동

이 기능은 전체 프로젝트에서 기술적 난이도와 리스크가 가장 높은 부분입니다.

🔴 위험 1: 사용자 계정 정보(ID/PW) 보안

문제:

  • 타사 서비스의 평문 비밀번호를 DB에 저장하는 것은 법적·윤리적 리스크를 내포합니다.
  • 서버 침해 시 사용자 계정 유출로 인한 2차 피해 및 배상 책임이 발생합니다.
  • 개인정보보호법 및 정보통신망법 위반 소지가 있습니다.

해결 방안:

1. 양방향 암호화 필수 적용
   - 저장: AES-256-GCM 암호화 후 DB 저장
   - 복호화 키: 애플리케이션 서버 환경변수 또는 전용 KMS(Key Management Service)에 분리 보관
   - DB 유출 시에도 암호화 키 없이는 복호화 불가

2. 저장 범위 최소화
   - 최초 로그인 성공 후 세션 쿠키/토큰만 저장하고 원본 PW는 메모리에서 즉시 파기
   - 토큰 갱신 주기에만 PW 재사용 (접근 빈도 최소화)

3. 사용자 동의 및 약관
   - 계정 정보 위탁 보관에 대한 명시적 동의 받기
   - 개인정보 처리 방침에 해당 내용 명기

🔴 위험 2: 제조사 사이트의 자동화 탐지 및 차단

문제:

  • 다수의 계정이 동일 IP에서 짧은 시간 내 로그인 → 보안 시스템에 의해 IP 차단
  • 사용자 계정이 자동 잠금(Lock) 처리되는 최악의 UX 발생
  • 2단계 인증(MFA), 캡차(CAPTCHA) 등의 방어 기제

해결 방안:

1. 분산 프록시 전략
   - Residential Proxy Pool 사용 (실제 가정용 IP 활용)
   - 사용자별 고정 프록시 IP 할당 (한 IP = 한 계정 원칙)
   - 예시 서비스: Bright Data, Oxylabs, IPRoyal

2. 인간 행동 시뮬레이션
   - requests 방식 → Playwright/Puppeteer 헤드리스 브라우저로 전환
   - 로그인 간격을 랜덤하게 설정 (1~5분 지연)
   - User-Agent, 쿠키, 세션 헤더 완전 복제

3. 세션 캐싱 전략
   - 로그인 성공 후 세션 쿠키를 Redis에 캐싱하여 재활용
   - 세션 만료 직전에만 재로그인 수행 (로그인 빈도 최소화)

4. 실패 대응 UX
   - 수집 실패 감지 즉시 → 사용자에게 이메일/앱 알림
   - "계정 정보를 다시 확인해 주세요" UI 안내 흐름

🟡 위험 3: 제조사별 크롤러 유지보수 부담

문제:

  • 제조사 사이트 UI 변경 시 크롤러 즉시 중단
  • 지원 제조사 수 증가에 따라 유지보수 공수가 선형 증가

해결 방안:

1. 크롤러 플러그인 아키텍처 도입
   - 제조사별 크롤러를 독립 모듈(어댑터 패턴)로 분리
   - 공통 인터페이스(BaseCrawler) 상속으로 신규 제조사 추가 용이

2. 자동 헬스체크 시스템
   - 매 수집 후 데이터 유효성(날짜, 수치 범위) 자동 검증
   - 연속 3회 실패 시 관리자에게 자동 알람 발송

3. 현행 SolarPower 크롤러 재활용
   - NREMS, KREMC, Sun-WMS, Hyundai, CMSolar 크롤러는 이미 검증됨
   - 기존 코드를 멀티테넌트 구조로 래핑하는 방식으로 빠르게 확장 가능

2-2. 멀티테넌시 및 데이터 격리

🔴 위험: 고객사 간 데이터 혼재

문제:

  • 현재 구조는 단일 사용자 가정 하에 설계됨
  • 다수 고객사가 사용할 경우 데이터가 섞일 위험

해결 방안:

1. Supabase Row Level Security (RLS) 적용
   - 모든 테이블에 tenant_id 컬럼 추가
   - RLS 정책: "자신의 tenant_id에 해당하는 행만 SELECT/INSERT/UPDATE 가능"
   - DB 레벨에서 격리 보장 → 애플리케이션 버그로도 타 사용자 데이터 접근 불가

2. 데이터 모델 재설계 필요
   현재:  plants (plant_id, name, ...)
   변경:  plants (plant_id, tenant_id, name, ...)         ← tenant_id FK 추가
          credentials (id, tenant_id, plant_id,
                       encrypted_id, encrypted_pw, ...)   ← 신규 테이블 (암호화 계정 저장)

2-3. 프론트엔드 아키텍처 (PC Web)

🟡 위험: Expo Web의 B2B 대시보드 한계

문제:

  • 현재 React Native(Expo) 기반은 모바일 UX 중심
  • '발전왕' 수준의 복잡한 PC 데이터 대시보드 구현에 Expo는 적합하지 않음
  • 복잡한 그리드, 데이터 테이블, 인터랙티브 차트를 구현하기 어려움

해결 방안:

권장 프론트엔드 스택:
- Framework:  Next.js 14 (App Router, SSR/ISR 지원)
- Styling:    TailwindCSS + shadcn/ui (B2B 대시보드 컴포넌트)
- Charts:     Recharts 또는 Apache ECharts (고성능 시계열 차트)
- State:      Zustand + React Query (서버 상태 캐싱)

기존 Expo 앱은 모바일 알림 수신용으로 유지하고,
PC Web은 Next.js로 별도 구축하는 이원화 전략 추천

2-4. 인프라 확장성 (크롤링 서버)

🟡 위험: 단일 Oracle Cloud 인스턴스의 한계

문제:

  • 고객사 수 증가 → 동시 크롤링 작업 급증
  • 나스의 단일 IP를 Exit Node로 사용 → IP 차단 시 전체 서비스 중단

해결 방안:

단계별 인프라 전략:

[1단계 - 소규모, ~50개 발전소]
  현행 Oracle Cloud + Tailscale(나스) 구조 유지
  Celery + Redis로 크롤링 태스크 큐 관리

[2단계 - 중규모, ~300개 발전소]
  Residential Proxy Pool 도입 (IP 차단 우회)
  크롤링 서버 인스턴스 수평 확장 (2~3대)

[3단계 - 대규모, 300개 이상]
  Kubernetes 기반 크롤러 파드 자동 스케일링
  제조사별 전용 크롤러 워커 분리

3. 법적·사업적 리스크

3-1. 제조사 서비스 약관 위반

위험 수준 내용 대응
🔴 높음 제조사 ToS의 자동화 접근 금지 조항 위반 서비스 초기에 제조사에 협력 제안 검토
🟡 중간 스크래핑 행위 자체의 법적 회색 지대 법무 검토 후 이용약관에 면책 조항 추가
🟢 낮음 수집 데이터 저작권 분쟁 가공된 통계 데이터만 노출, 원문 미재현

3-2. 개인정보 처리

필수 조치:
- 개인정보 처리 방침 수립 (개인정보보호법 준수)
- 타사 계정 정보 위탁 처리에 대한 별도 동의 절차
- 개인정보 보호책임자(CPO) 지정
- 연 1회 이상 보안 취약점 점검

4. 권장 기술 스택

영역 현재 권장 (플랫폼) 이유
Frontend React Native (Expo) Next.js 14 SSR, B2B 대시보드 최적화
Backend FastAPI FastAPI 유지 검증된 구조 재활용 가능
Database Supabase (PostgreSQL) Supabase 유지 + RLS 강화 멀티테넌트 RLS 기능 내장
크롤러 Python requests Playwright (헤드리스) 자동화 탐지 우회
비동기 큐 없음 (Cron) Celery + Redis 다수 계정 동시 수집 관리
암호화 없음 AES-256-GCM + KMS 계정 정보 안전 보관
프록시 Tailscale (나스) Residential Proxy Pool IP 차단 근본 해결
인프라 Oracle Cloud 단일 Oracle Cloud + 수평 확장 트래픽 증가 대응

5. 단계별 개발 로드맵

Phase 1 — MVP (2~3개월)

목표: 소수 고객사를 대상으로 핵심 기능 검증

  • 멀티테넌트 DB 스키마 설계 (RLS 포함)
  • 사용자 회원가입/로그인 (Supabase Auth 활용)
  • 발전소 등록 UI (제조사 선택 → ID/PW 입력)
  • 기존 크롤러를 멀티테넌트 구조로 래핑
  • 기본 모니터링 대시보드 (일/월별 발전량 차트)
  • 수집 실패 알림 시스템

Phase 2 — 안정화 (2~3개월)

목표: 보안 강화 및 운영 안정성 확보

  • AES-256 계정 암호화 체계 적용
  • Playwright 헤드리스 브라우저 전환 (탐지 우회)
  • Celery + Redis 비동기 크롤링 큐 도입
  • 관리자 페이지 구축 (사용자/연동 상태 관리)
  • 크롤러 헬스체크 및 자동 알람 시스템

Phase 3 — 확장 (3~4개월)

목표: 상용 서비스 품질 달성 및 EMS 기반 마련

  • Residential Proxy Pool 연동 (IP 차단 근본 해결)
  • 신규 제조사 크롤러 플러그인 추가 (수요 기반)
  • 시계열 DB 도입 (EMS/VPP 대비)
  • 화이트 라벨링 지원 (브랜드 커스터마이징)
  • 정식 제조사 API 파트너십 추진

6. 종합 평가

현재 프로젝트의 강점 (재활용 가능 자산)

  1. 검증된 크롤러 코드: NREMS, KREMC, Sun-WMS, Hyundai, CMSolar 등 핵심 제조사 크롤러가 이미 운영 검증됨. 플랫폼 전환 시 가장 큰 기술적 자산.
  2. 스마트 스케줄러(crawler_manager): LEARNING/OPTIMIZED 모드 스케줄링 로직은 멀티테넌트 환경에서도 그대로 활용 가능.
  3. FastAPI + Supabase 백엔드: 확장성 있는 구조로 재설계 부담 최소화.

⚠️ 핵심 해결 과제 (우선순위 순)

우선순위 과제 난이도
1 사용자 계정(ID/PW) 암호화 보관 체계
2 IP 차단 우회 인프라 (Residential Proxy)
3 멀티테넌트 DB 설계 및 RLS 적용
4 프론트엔드 Next.js 전환
5 법적 리스크 검토 (약관 위반)

💡 최종 제언

현재 SolarPower 프로젝트는 이 플랫폼을 구축하기 위한 **훌륭한 기술적 원형(Prototype)**입니다. 그러나 단순히 "기능 추가"가 아니라 보안, 멀티테넌시, 인프라 세 축에서 구조적인 재설계가 필요합니다.

특히 계정 정보 보안IP 차단 우회는 서비스 신뢰도의 기반이므로, 개발 착수 전 이 두 가지 아키텍처를 먼저 확정한 후 나머지 기능을 쌓는 순서로 진행하기를 강력히 권장합니다.