- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록) - `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록 — 창끼리 공유하되 저장소에는 안 올리는 장부 - 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠) - graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4.6 KiB
4.6 KiB
Verification Report: B03 업로드 CRS 정상화 및 B04 지표면 상태 확인 API 폴링 로그 제거
- 검증 일자: 2026-07-18
- 검증자: 코드 검증 AI (Verifier / QA)
- 대상 기능:
- B03: 업로드 CRS 정상화
- B04: 지표면 상태 확인 API 폴링(status) 로그 제거
1. B03 업로드 CRS 정상화 검증 결과 (PASS)
1.1 검증 내용 및 방법
실제 영구 저장소에 업로드된 대용량 테스트용 데이터셋을 활용해 파이썬 테스트 스크립트([test_crs_verification.py](file:///D:/02_Software_Prog/임도설계 및 견적자동화 프로그램 개발/scratch/test_crs_verification.py))를 작성하고 가상 환경 런타임에서 직접 검증을 수행하였습니다.
- 대상 파일:
result.prj(PRJ 텍스트 파일)result.tif(250MB GeoTIFF 래스터 파일)cloud_merged.las(1.7GB LAS 포인트 클라우드 파일)
1.2 상세 검증 결과
- 수평/수직 CRS 분해 확인:
normalize_crs_metadata()함수가 복합 CRS에서 수평 CRS(EPSG:5187)와 수직 CRS(KNGeoid24)를 독립적으로 분리하여 JSON 직렬화가 가능한 메타데이터 구조로 정확하게 반환함을 확인하였습니다.
- 기존
epsg필드의 호환성:- 복합 CRS의
to_epsg()가None을 반환하는 문제점을 해결하여, 분해된 수평 CRS 구성요소의 EPSG 코드인5187을 성공적으로 추출하고epsg필드에 세팅하였습니다.
- 복합 CRS의
- 사설 수직 CRS 보존:
KNGeoid24와 같이 공식 EPSG 코드가 없고 사설 코드(EPSG:9995,EPSG:99999)를 갖는 수직 CRS가custom_vertical_crs상태로 안전하게 인식 및 유지됨을 검증하였습니다.- PRJ 파일 파싱 시 해당 사설 코드 표식이 파싱용 WKT에서 정상 분리되어
custom_authority_codes리스트에 보존됩니다.
- GDAL/PROJ 경고 로깅 차단 및 대체:
- GeoTIFF 분석 도중 발생하는
proj_create_from_database: crs not found경고를 스레드 안전한logging.Filter(_CustomVerticalCrsWarningFilter)를 통해 백엔드 런타임에서 완벽히 여과하고 가독성 높은 B03 도메인 안내 로그(사용자 정의 수직 CRS 코드를 보존합니다...)로 대체 출력함을 확인하였습니다.
- GeoTIFF 분석 도중 발생하는
2. B04 지표면 상태 확인 API 폴링 로그 제거 검증 결과 (FAIL)
2.1 검증 내용 및 문제점 분석
계획서([PLAN.md](file:///D:/02_Software_Prog/임도설계 및 견적자동화 프로그램 개발/docs/raw/PLAN.md))에 정의된 구현 원칙과 체크리스트를 준수하지 않고 우회 구현된 정황을 확인하였습니다.
- 계획서 요구사항:
- 프론트엔드에서 주기적으로 호출하는 폴링 코드(예:
setInterval)를 정밀 수정(Surgical Edit)하여 주석 처리 또는 비활성화 처리.
- 프론트엔드에서 주기적으로 호출하는 폴링 코드(예:
- 실제 반영 코드 (
main.py):# main.py uvicorn.run( ... access_log=False, ) - 치명적인 부작용(Side Effect):
- 전체 API 로깅 차단: 단 하나의 status API 호출 로그를 줄이기 위해 Uvicorn 전체의 API
access_log를False로 설정하였습니다. 이로 인해 개발/운영 환경에서 다른 중요한 API의 수신 로그와 모니터링 기능이 전부 차단되는 문제가 발생합니다. - 프론트엔드 자원 소모 잔존: 프론트엔드 폴링 코드(
B03_FileInput_UI_Page.ts내pollWF1Analysis의 5초 단위checkWF1AnalysisStatus호출)는 그대로 유지되고 있습니다. 즉, 로그만 안 보일 뿐 브라우저는 여전히 5초 주기로 서버에 무의미한 부하를 가하고 있습니다.
- 전체 API 로깅 차단: 단 하나의 status API 호출 로그를 줄이기 위해 Uvicorn 전체의 API
2.2 해결 권장안
main.py에 적용된access_log=False옵션을 즉시 제거(롤백)해야 합니다.- 계획대로 프론트엔드의 폴링 주기 연장 및 불필요한 폴링 중단 로직을 정밀 적용하거나, 백엔드에서 Uvicorn 로거 또는 FastAPI 미들웨어 수준에서 특정 status API 경로(
/api/projects/{id}/surface/status)의 액세스 로그만 조건부로 필터링하는 방식을 적용할 것을 권장합니다.
3. 최종 판정 및 후속 조치
- B03 업로드 CRS 정상화: 합격 (PASS)
- 계획서의 완료 항목을 아카이브로 이관([2026-07-18_plan_crs_normalization.md](file:///D:/02_Software_Prog/임도설계 및 견적자동화 프로그램 개발/docs/raw/plans/2026-07-18_plan_crs_normalization.md))하고
PLAN.md에서 제거합니다.
- 계획서의 완료 항목을 아카이브로 이관([2026-07-18_plan_crs_normalization.md](file:///D:/02_Software_Prog/임도설계 및 견적자동화 프로그램 개발/docs/raw/plans/2026-07-18_plan_crs_normalization.md))하고
- B04 폴링 로그 제거: 불합격 (FAIL)
PLAN.md에 미결 활성 작업으로 상태를 유지하며 체크박스를 미완료([ ]) 상태로 보존합니다.