perf(계측): 재확정 체인 병목 추적용 단계 마크 추가

PLAN 0-10. 8000 에서 1회 실측 결과 재확정 체인 292.9s 중 배수유역 분석이 285.0s(97%)로
나와, 그 안쪽을 가르기 위한 마크만 추가. 로직 불변.

- B06 확정: 조회 / 기본설계 계산 / 확정 저장 / 서버 재계산 / 측구 역반영
- 서버 재계산 내부: 상세+DB 병렬 조회 / 포장·세월교 보정 / Node 번들 / 정본 저장
- 배수유역 분석 내부: _prepare(도엽 읽기·좌표변환) / preview_stages / 응답 만들기·저장
- preview_stages: 1차 영역 / 격자 확장·흐름 판정 / 흐름 강도 / 외곽선·기본 관·화살표

`_log_steps` 는 체인 모듈 것을 그대로 씀(지연 임포트로 순환 회피).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-07 03:20:39 +09:00
co-authored by Claude Opus 5
parent 41852da3b3
commit 4da04929c4
4 changed files with 36 additions and 0 deletions
@@ -11,6 +11,7 @@ import asyncio
import json
import logging
import math
import time
from pathlib import Path
from typing import Any
from uuid import UUID
@@ -389,9 +390,13 @@ async def get_primary_region(
logger.info("배수유역: 저장된 분석 결과를 그대로 돌려줍니다 (%s).", stored_path)
return {**saved, "from_cache": True}
from B03_FileInput.B03_FileInput_Service_Chain import _log_steps
marks = [("시작", time.perf_counter())]
prepared = await _prepare(project_id)
if isinstance(prepared, JSONResponse):
return prepared
marks.append(("_prepare(도엽 읽기·좌표변환)", time.perf_counter()))
preview = await asyncio.to_thread(
preview_stages,
prepared["vertices"],
@@ -403,6 +408,7 @@ async def get_primary_region(
status_code=400,
content={"status": "error", "message": "1차 배수유역을 정할 등고선이 없습니다."},
)
marks.append(("preview_stages(유역 산정)", time.perf_counter()))
region = preview.region
to_lonlat = prepared["to_lonlat"]
# 확장을 거치면 격자·해석 영역이 1차 영역보다 커진다. 최종본을 써야 화면과 어긋나지 않는다.
@@ -516,5 +522,7 @@ async def get_primary_region(
_write_stage_arrays(prepared["stored_path"], preview, domain, spec)
_write_road_routing(prepared["stored_path"], preview, spec, prepared["route_line"], to_lonlat)
# 응답 자체를 캐시로 남긴다 — 다음 조회는 배열을 재조립하지 않고 이 파일을 그대로 준다.
marks.append(("응답 만들기·저장", time.perf_counter()))
_log_steps("배수유역 분석 내부", marks)
_save_response(prepared["stored_path"], payload)
return payload