docs: record stage 8 completion
Some checks failed
CI / Crawler (Python ${{ matrix.python-version }}) (3.10) (push) Has been cancelled
CI / Crawler (Python ${{ matrix.python-version }}) (3.11) (push) Has been cancelled
CI / API (Python 3.11) (push) Has been cancelled
CI / Database migration (push) Has been cancelled
CI / App web build (Node 20) (push) Has been cancelled

This commit is contained in:
haneulai 2026-08-07 15:43:14 +09:00
parent f2bb131884
commit 5e47d71285

View File

@ -10,7 +10,7 @@
## 현재 진행 현황 ## 현재 진행 현황
최종 갱신: 2026-08-07 14:42 KST 최종 갱신: 2026-08-07 15:41 KST
| 단계 | 작업 | 상태 | 현재 결과 | | 단계 | 작업 | 상태 | 현재 결과 |
|---:|---|---|---| |---:|---|---|---|
@ -22,7 +22,7 @@
| 5 | API 정확성과 응답 규약 | 완료·운영 반영 | 문자열 ID, 입력 오류, 실제 DB health, 응답 모델, 최신 로그 단일 조회와 동기 호출 처리 완료 | | 5 | API 정확성과 응답 규약 | 완료·운영 반영 | 문자열 ID, 입력 오류, 실제 DB health, 응답 모델, 최신 로그 단일 조회와 동기 호출 처리 완료 |
| 6 | 통계 생성 경로 일관성 | 완료·운영 반영 | 공통 일간 저장 정책, 월간 자동 집계, 출처·갱신 시각과 오타 컬럼 마이그레이션 완료 | | 6 | 통계 생성 경로 일관성 | 완료·운영 반영 | 공통 일간 저장 정책, 월간 자동 집계, 출처·갱신 시각과 오타 컬럼 마이그레이션 완료 |
| 7 | 테스트와 재현 가능한 개발 환경 | 완료·운영 반영 | Python/npm 의존성 고정, 5개 사이트 응답 fixture, 4개 CI job과 새 환경 설치 검증 완료 | | 7 | 테스트와 재현 가능한 개발 환경 | 완료·운영 반영 | Python/npm 의존성 고정, 5개 사이트 응답 fixture, 4개 CI job과 새 환경 설치 검증 완료 |
| 8 | 저장소 및 코드 구조 정리 | 대기 | 기능·데이터 안정화 후 진행 | | 8 | 저장소 및 코드 구조 정리 | 완료·운영 반영 | 생성 산출물 제거, 앱 설정·API·통계 hook/차트/UI 분리, 업체 선택 경계와 구조 문서 정리 |
현재 운영 상태: 현재 운영 상태:
@ -36,10 +36,13 @@
- 완료된 백필 cron은 현재도 매시간 무작업 실행 중이며, 비활성화 여부는 별도 운영 결정으로 남겨 두었다. - 완료된 백필 cron은 현재도 매시간 무작업 실행 중이며, 비활성화 여부는 별도 운영 결정으로 남겨 두었다.
- 인증 토큰 교체, 환경변수 정리, API 인증과 Supabase 접근 정책 강화는 사용자 결정에 따라 후순위로 보류 중이다. - 인증 토큰 교체, 환경변수 정리, API 인증과 Supabase 접근 정책 강화는 사용자 결정에 따라 후순위로 보류 중이다.
- 1~7단계 기능 변경은 커밋 `a716dbe`로 원격 `main`에 push했고 운영 서버의 `HEAD``origin/main`을 최신 `main`으로 정렬했다. 복구용 `deploy_backups/`, `deploy_staging/`은 서버에 보존하되 Git에서는 제외한다. - 1~7단계 기능 변경은 커밋 `a716dbe`로 원격 `main`에 push했고 운영 서버의 `HEAD``origin/main`을 최신 `main`으로 정렬했다. 복구용 `deploy_backups/`, `deploy_staging/`은 서버에 보존하되 Git에서는 제외한다.
- 8단계 구현 커밋 `f2bb131`을 원격과 운영 서버에 반영하고 Expo 웹 빌드도 교체했다. 공개 health·발전소·업체 필터 비교 API와 웹은 모두 HTTP 200이며 서버 배포본의 API 33개·crawler 36개 테스트가 통과했다.
다음 진행 기준: 다음 진행 기준:
- 다음 구현 단계는 8단계 `저장소 및 코드 구조 정리`이다. - 계획된 기능·구조 개선 1~8단계는 모두 완료됐다.
- 9단계 보안 개선은 사용자 결정에 따라 계속 보류한다.
- 별도 후속 항목은 npm 감사 경고 17건, Gitea Actions runner의 실제 실행 확인, 완료된 백필 cron 비활성화 여부다.
- 단계별 세부 원인, 수정 내용, 테스트와 배포 기록은 이 문서의 `6. 운영 서버 기준선 점검 결과``7. 변경 기록`에 보존한다. - 단계별 세부 원인, 수정 내용, 테스트와 배포 기록은 이 문서의 `6. 운영 서버 기준선 점검 결과``7. 변경 기록`에 보존한다.
## 2. 작업 원칙 ## 2. 작업 원칙
@ -255,7 +258,7 @@
### 7단계: 테스트와 재현 가능한 개발 환경 ### 7단계: 테스트와 재현 가능한 개발 환경
상태: 대기 상태: 완료·운영 반영 (2026-08-07)
대상: 대상:
@ -280,7 +283,7 @@
### 8단계: 저장소 및 코드 구조 정리 ### 8단계: 저장소 및 코드 구조 정리
상태: 대기 상태: 완료·운영 반영 (2026-08-07)
대상: 대상:
@ -302,6 +305,14 @@
- 저장소에 실행 환경 산출물과 런타임 로그가 추적되지 않는다. - 저장소에 실행 환경 산출물과 런타임 로그가 추적되지 않는다.
- 화면 컴포넌트와 데이터 접근 로직이 독립적으로 수정 및 테스트 가능하다. - 화면 컴포넌트와 데이터 접근 로직이 독립적으로 수정 및 테스트 가능하다.
적용 결과:
- Git에 추적되던 `crawler/venv_win/`, `app/server.log`와 현재 라우팅에서 참조되지 않는 크롤러 구형 사본 4개를 제거했다. 가상환경·로그·DB·Expo 산출물과 서버 배포 임시 파일의 ignore 규칙을 명시했다.
- 완료 목적과 주의사항이 기록된 `crawler/scripts_archive/`는 운영 이력 자료로 유지하고, 저장소에 포함된 가상환경을 전제로 하던 실행 안내를 재생성 가능한 `.venv` 방식으로 수정했다.
- 앱의 환경 선택을 `config/appConfig.js`, HTTP 계약을 `services/solarApi.js`, 상세 통계 상태를 `hooks/usePlantStats.js`, 차트 변환을 `utils/statsChart.js`, 기간 UI를 `components/StatsPeriodControls.js`로 분리했다.
- `EXPO_PUBLIC_API_BASE_URL``EXPO_PUBLIC_COMPANY_ID`를 환경 경계로 정의했다. 비교 API에는 선택적 `company_id` 필터를 추가하고 알림 변경은 발전소 응답의 실제 `company_id`를 사용한다.
- 설정·서비스·hook·컴포넌트 책임과 생성 파일·archive 정책을 `docs/repository_structure.md`에 문서화했다.
### 9단계: 보안 개선 — 후순위 보류 ### 9단계: 보안 개선 — 후순위 보류
상태: 보류 상태: 보류
@ -337,8 +348,8 @@
| 4. KST 시간대 통일 | 완료 | 2026-08-06 | 2026-08-06 | 공통 KST 유틸리티, UTC 반개구간과 경계 테스트, 운영 cron 검증 완료 | | 4. KST 시간대 통일 | 완료 | 2026-08-06 | 2026-08-06 | 공통 KST 유틸리티, UTC 반개구간과 경계 테스트, 운영 cron 검증 완료 |
| 5. API 정확성과 응답 | 완료 | 2026-08-07 | 2026-08-07 | 문자열 ID, 응답 모델, DB health, 단일 최신 로그 조회와 운영 배포 완료 | | 5. API 정확성과 응답 | 완료 | 2026-08-07 | 2026-08-07 | 문자열 ID, 응답 모델, DB health, 단일 최신 로그 조회와 운영 배포 완료 |
| 6. 통계 생성 경로 일관성 | 완료 | 2026-08-07 | 2026-08-07 | 공통 DB 저장 함수·월간 트리거·출처 필드·오타 마이그레이션과 운영 검증 완료 | | 6. 통계 생성 경로 일관성 | 완료 | 2026-08-07 | 2026-08-07 | 공통 DB 저장 함수·월간 트리거·출처 필드·오타 마이그레이션과 운영 검증 완료 |
| 7. 테스트 및 개발 환경 | 다음 작업 | | | | | 7. 테스트 및 개발 환경 | 완료 | 2026-08-07 | 2026-08-07 | 의존성 고정, fixture·회귀 테스트, CI와 새 환경 설치 검증 완료 |
| 8. 저장소 및 코드 구조 | 대기 | | | | | 8. 저장소 및 코드 구조 | 완료 | 2026-08-07 | 2026-08-07 | 산출물·구형 사본 제거, 앱 계층 분리, 환경별 설정과 업체 경계, 운영 배포 완료 |
| 9. 보안 개선 | 보류 | | | 단독 저장소 사용 중이므로 후순위 | | 9. 보안 개선 | 보류 | | | 단독 저장소 사용 중이므로 후순위 |
## 6. 운영 서버 기준선 점검 결과 ## 6. 운영 서버 기준선 점검 결과
@ -743,3 +754,31 @@ CI 및 문서:
- 2026-08-07 12:00 KST 실제 cron에서 3호기는 직전 값과 동일하여 정상적으로 저장을 건너뛰었고 나머지 8개 발전소는 저장에 성공했다. SQLite 잠금, 수집 실패, 통계 저장 실패와 Telegram 오탐은 발생하지 않았다. - 2026-08-07 12:00 KST 실제 cron에서 3호기는 직전 값과 동일하여 정상적으로 저장을 건너뛰었고 나머지 8개 발전소는 저장에 성공했다. SQLite 잠금, 수집 실패, 통계 저장 실패와 Telegram 오탐은 발생하지 않았다.
- 직접 배포된 서버 파일과 원격 커밋을 전체 인덱스로 대조하고, 내용이 달랐던 앱 소스 2개와 백필 문서는 `/home/ubuntu/solorpower/deploy_backups/20260807_git_alignment/`에 백업했다. 이후 커밋이 변경한 63개 경로만 `origin/main`과 일치시켰다. - 직접 배포된 서버 파일과 원격 커밋을 전체 인덱스로 대조하고, 내용이 달랐던 앱 소스 2개와 백필 문서는 `/home/ubuntu/solorpower/deploy_backups/20260807_git_alignment/`에 백업했다. 이후 커밋이 변경한 63개 경로만 `origin/main`과 일치시켰다.
- 정렬 후 로컬·원격·운영 서버가 동일한 최신 `main`을 가리키며 crawler 36개와 API 31개 테스트, 내부·공개 health HTTP 200을 다시 확인했다. 14:40 KST 정기 crawler도 9건의 실시간·일간 통계를 정상 저장했다. - 정렬 후 로컬·원격·운영 서버가 동일한 최신 `main`을 가리키며 crawler 36개와 API 31개 테스트, 내부·공개 health HTTP 200을 다시 확인했다. 14:40 KST 정기 crawler도 9건의 실시간·일간 통계를 정상 저장했다.
### 7.8 저장소 및 코드 구조 정리
작업일: 2026-08-07
저장소 정리:
- Git에 잘못 포함되어 있던 `crawler/venv_win/`의 Windows 실행 파일과 활성화 스크립트, Expo 개발 로그 `app/server.log`를 제거했다. `.gitignore`에는 가상환경, `*.log`, 로컬 DB, 빌드 산출물, Supabase CLI와 서버 배포 산출물 규칙을 유지하고 추적 가능한 `.env.example` 예외를 추가했다.
- `crawler/crawlers/`의 현재 라우팅과 다른 코드에서 참조되지 않는 `cmsolar_old.py`, `cmsolar_old2.py`, `sun_wms_old.py`, `sun_wms.py.backup`을 제거했다. 이전 내용은 Git 이력에서 복구할 수 있다.
- 2026년 2월 데이터 정정 기록과 실행 주의사항이 있는 `crawler/scripts_archive/`는 보존했다. 문서의 `venv_win` 의존 안내는 새 `.venv` 생성과 고정 requirements 설치 방식으로 바꿨다.
- 최상위 디렉터리와 앱 내부 책임, 생성 파일 제외 및 archive 정책을 `docs/repository_structure.md`에 기록하고 README, `crawler/DEVELOPMENT.md`, `AGENTS.md`, 개발·테스트 문서의 오래된 경로와 명령을 정리했다.
앱과 API 구조:
- 운영 URL과 업체 `1`이 여러 화면에 직접 작성되어 있던 구성을 `app/config/appConfig.js``EXPO_PUBLIC_API_BASE_URL`, `EXPO_PUBLIC_COMPANY_ID` 경계로 이동하고 `app/.env.example`을 추가했다.
- 대시보드, 알림, 상세 통계, 전체 비교와 업로드의 `fetch`/응답 오류 처리를 `app/services/solarApi.js`로 통합했다.
- 상세 화면의 요청 상태와 최신 실시간 요약은 `app/hooks/usePlantStats.js`, 시간·일·월·연 차트 가공은 `app/utils/statsChart.js`, 날짜·기간 선택 UI는 `app/components/StatsPeriodControls.js`로 분리했다. `PlantDetailScreen.js`는 735줄에서 498줄로 줄었다.
- 상세 화면에서 선언만 되고 설정되지 않아 항상 숨겨졌던 `todayData`를 발전소 최신 로그에서 계산하도록 했고, 시간 막대에 연결돼 있던 정의되지 않은 `showTooltip` 참조를 제거했다.
- 비교 API는 `company_id`를 선택적으로 받아 해당 업체 발전소만 반환한다. 파라미터를 생략한 기존 호출은 전체 비교 계약을 유지한다. 업체 ID 0의 422 응답과 업체 필터 적용을 회귀 테스트로 추가했다.
검증 및 운영 반영:
- 로컬 Node 환경에서 `npm run test:ci`를 실행하여 Expo 웹 bundle 535개 모듈과 정적 export 생성을 확인했다.
- 운영 코드와 분리한 서버 `/tmp` 복사본 및 실제 배포본에서 API 테스트 33개가 모두 통과했다. 배포본의 crawler 테스트 36개도 모두 통과했다.
- 구현 커밋 `f2bb131`을 원격 `main`에 push하고 운영 서버가 fast-forward pull했다. 배포 전 API와 웹 파일은 `/home/ubuntu/solorpower/deploy_backups/20260807_repository_cleanup/`에 보존했다.
- 새 웹 export를 `/var/www/html/dist`에 교체하고 `solar-api`를 재시작했으며 Nginx를 reload했다. 두 서비스 모두 active이고 공개 `/health`, `/plants/1`, `company_id=1` 비교 API와 웹 루트가 HTTP 200을 반환했다. 비교 응답은 업체 1의 발전소 9개만 포함했다.
- 검증 후 `/tmp` 테스트 복사본, 단계 전용 `deploy_staging`과 중복 이전 웹 디렉터리는 제거했다. 이전 운영 API·웹 복구본은 위 backup 경로에 유지했다.
- 로컬·원격·운영 서버는 커밋 `f2bb131`로 일치하고 운영 서버 작업 트리는 clean 상태다.