Files
Aislo/docs/raw/verification/2026-07-18_verify_crs_and_polling_log.md
T
eomsangdonandClaude Opus 5 eb30b774f8 chore(docs): docs 폴더 git 추적 전환 · PLAN·OWNERS 최상위 이관
- `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>
2026-09-09 18:19:07 +09:00

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 상세 검증 결과

  1. 수평/수직 CRS 분해 확인:
    • normalize_crs_metadata() 함수가 복합 CRS에서 수평 CRS(EPSG:5187)와 수직 CRS(KNGeoid24)를 독립적으로 분리하여 JSON 직렬화가 가능한 메타데이터 구조로 정확하게 반환함을 확인하였습니다.
  2. 기존 epsg 필드의 호환성:
    • 복합 CRS의 to_epsg()가 None을 반환하는 문제점을 해결하여, 분해된 수평 CRS 구성요소의 EPSG 코드인 5187을 성공적으로 추출하고 epsg 필드에 세팅하였습니다.
  3. 사설 수직 CRS 보존:
    • KNGeoid24와 같이 공식 EPSG 코드가 없고 사설 코드(EPSG:9995, EPSG:99999)를 갖는 수직 CRS가 custom_vertical_crs 상태로 안전하게 인식 및 유지됨을 검증하였습니다.
    • PRJ 파일 파싱 시 해당 사설 코드 표식이 파싱용 WKT에서 정상 분리되어 custom_authority_codes 리스트에 보존됩니다.
  4. GDAL/PROJ 경고 로깅 차단 및 대체:
    • GeoTIFF 분석 도중 발생하는 proj_create_from_database: crs not found 경고를 스레드 안전한 logging.Filter(_CustomVerticalCrsWarningFilter)를 통해 백엔드 런타임에서 완벽히 여과하고 가독성 높은 B03 도메인 안내 로그(사용자 정의 수직 CRS 코드를 보존합니다...)로 대체 출력함을 확인하였습니다.

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):
    1. 전체 API 로깅 차단: 단 하나의 status API 호출 로그를 줄이기 위해 Uvicorn 전체의 API access_log를 False로 설정하였습니다. 이로 인해 개발/운영 환경에서 다른 중요한 API의 수신 로그와 모니터링 기능이 전부 차단되는 문제가 발생합니다.
    2. 프론트엔드 자원 소모 잔존: 프론트엔드 폴링 코드(B03_FileInput_UI_Page.ts 내 pollWF1Analysis의 5초 단위 checkWF1AnalysisStatus 호출)는 그대로 유지되고 있습니다. 즉, 로그만 안 보일 뿐 브라우저는 여전히 5초 주기로 서버에 무의미한 부하를 가하고 있습니다.

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에서 제거합니다.
  • B04 폴링 로그 제거: 불합격 (FAIL)
    • PLAN.md에 미결 활성 작업으로 상태를 유지하며 체크박스를 미완료([ ]) 상태로 보존합니다.