Files
Aislo/docs/raw/plans/2026-07-18_plan_B06_ProfileCross.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

5.6 KiB

완료 계획: B06 페이지 개선 — 진입 즉시 자동 생성 + 경로 컨텍스트 읽기 전용 표시

이관일: 2026-07-18 이관 원본: docs/raw/PLAN.md


배경

B05 "경로 확정" 후 B06 진입 시, 경로 ID·지면 필터·지표면 표현·좌표계·스무딩을 사용자가 직접 입력해야 하고 결과도 바로 나오지 않는다(B06_wf3_ProfileCross_UI_Page.ts:66-110). 이 값들은 B04(지면 필터·지표면 표현·스무딩·좌표계)와 B05(경로 확정)에서 이미 결정된 값이므로 읽기 전용 표시로 바꾸고, 진입 즉시 config 기본 옵션으로 종횡단을 자동 생성해 결과를 바로 보여준다. 측정/횡단 옵션은 config 기본값을 폼에 미리 채워두고, 사용자가 수정하면 "재생성" 버튼으로 다시 실행한다.

조사 결과 (설계 근거)

  • B04 확정값 공용 함수 재사용: common_util_surface_confirmation.py:42 get_surface_confirmation_params()가 B04 확정 스냅샷(stage 1 params)에서 source_filter/method/smooth/contour_interval_m을 반환 (B05도 동일 함수 사용) → filter/method/smooth 출처로 채택. surface_models.generation_params JSON 파싱보다 단순하고 B05 화면과 값 일치 보장
  • 좌표계: surface_models.crs_epsg — B03 업로드 시 pyproj로 실제 감지·저장된 값. 확정 경로의 routes.surface_model_id로 조회
  • projects.crs_epsgB02_ProjRegister_Repository.py:72에서 5178 하드코딩 → 신뢰 불가, 사용 안 함 (B02 수정은 스코프 밖)
  • smooth도 상속 대상: B04에서 선정된 맵으로 경로를 만들었으므로 종횡단도 동일 조건이어야 함 → 체크박스 제거, 읽기 전용 표시 (사용자 확인 완료)
  • SectionGenerationOptions(B06_wf3_ProfileCross_Engine_Section.py:26-32)가 이미 config_system.pySECTION_* 기본값 참조 → 새 엔드포인트 응답에 기본값을 실어 프론트에 노출(프론트 하드코딩 이중관리 방지)
  • 현재 GET /sections/{route_id} 요약 응답에는 종단 메타(id/경로/상태)만 있고 연장·횡단 개수가 없음 → 재진입 시 기존 결과 카드를 그리려면 보강 필요

구현 체크리스트

백엔드

  • 1. B06_wf3_ProfileCross_Repository.py: get_confirmed_route_context(connection, project_id) 추가 — routes(status='CONFIRMED', computed_at DESC, id DESC) LEFT JOIN surface_models로 route_id + crs_epsg 반환. 경로 없으면 None. 추가로 count_cross_sections(connection, route_id)get_longitudinal_section의 data(JSON, length_m 포함) 반환 보강
  • 2. B06_wf3_ProfileCross_Schema.py: SectionOptionDefaults(station_interval_m, cross_half_width_m, cross_sample_interval_m, long_sample_interval_m), SectionContextResponse(project_id, route_id/filter_key/method/smooth/crs_epsg는 nullable, defaults) 추가. SectionSummaryResponse에 length_m·cross_section_count 필드 보강
  • 3. B06_wf3_ProfileCross_Router.py: GET /api/projects/{project_id}/sections/context 추가 — get_confirmed_route_context + get_surface_confirmation_params 조합으로 응답 구성. 경로 없으면 null 필드로 200 반환(404 아님). defaults는 SectionGenerationOptions() 인스턴스 값 매핑. get_sections는 보강된 요약(연장·횡단 개수) 반환

프론트엔드

  • 4. B06_wf3_ProfileCross_Api_Fetch.ts: SectionContextResponse 인터페이스 + fetchSectionContext(projectId) 추가. SectionSummaryResponse 보강 필드 반영
  • 5. B06_wf3_ProfileCross_UI_Page.ts:
    • routeGroup of input fields 4개(routeIdField/filterField/methodField/crsField)와 smooth 체크박스를 읽기 전용 표시 행(B04 buildInfoLine 패턴)으로 교체 — 경로 ID / 지면 필터 / 지표면 표현 / 스무딩 / 좌표계(EPSG:{n}) 표시
    • 옵션 4개 필드에 context 응답의 defaults 프리필
    • 진입 흐름: fetchSectionContextfetchWorkflowState 병렬 호출 → ① 확정 경로 없으면 안내 + 버튼 비활성화 ② 기존 종횡단 있으면(getSections) 재생성 없이 기존 결과 카드 표시 ③ 없으면 config 기본 옵션으로 generateSections 자동 실행 후 결과 표시
    • 생성 버튼 라벨을 "재생성" 의미로 변경, 클릭 시 폼 파싱 대신 컨텍스트 저장값(route_id/filter_key/method/smooth/crs) + 사용자 조정 옵션으로 요청
  • 6. B06_wf3_ProfileCross_UI_Style.css: 읽기 전용 표시 행 스타일 추가(필요 시)
  • 7. locale 키 정리: ui_template_locale에 읽기 전용 라벨·자동 생성 안내·재생성 버튼 문구 등록(신규 필요분만)

변경하지 않는 것

  • SectionGenerationOptions / config_system.pySECTION_* / _build_options (이미 config 기반)
  • SectionGenerateRequest 스키마 필드 구성(프론트가 컨텍스트 값으로 채워 보내는 방식만 변경)
  • POST generate/confirm 엔드포인트 로직

검증 방법

  1. GET /api/projects/{id}/sections/context — 확정 경로 있는 프로젝트에서 route_id/filter_key/method/smooth/crs_epsg/defaults 확인
  2. 브라우저: B05 경로 확정 → B06 진입 시 자동 생성 실행 후 결과(연장·횡단 개수·파일)가 바로 표시되는지, 경로 정보 5개(ID/필터/표현/스무딩/좌표계)가 읽기 전용으로 표시되는지, 옵션 필드에 20.0/15.0/0.5/1.0 프리필 확인
  3. B06 재진입 시 재생성 없이 기존 결과가 표시되는지 확인
  4. 옵션 수정 → 재생성 버튼 클릭 시 새 옵션으로 재실행되는지 확인
  5. 경로 없는 프로젝트로 B06 진입 시 오류 없이 안내 표시 확인