- `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>
71 lines
6.9 KiB
Markdown
71 lines
6.9 KiB
Markdown
# 검증 보고서: B06 종횡단 생성 개선
|
|
**검증일**: 2026-07-18
|
|
**검증자**: Antigravity (QA/Verifier)
|
|
|
|
---
|
|
|
|
## 1. 개요
|
|
B05 "경로 확정" 단계 완료 후, B06 "종횡단 생성" 단계 진입 시 발생하던 수동 입력 요구 및 미생성 상태 노출 문제를 개선하는 작업이 완료되었습니다. B04 확정 스냅샷 및 B05 확정 경로의 컨텍스트를 자동으로 상속받아 **진입 즉시 기본 옵션으로 자동 생성**하고, 경로 설계 확정 정보는 **읽기 전용 표시**로 제한하며, 옵션 변경 시에만 **"재생성"** 동작을 제공하도록 변경된 일련의 코드를 검증하였습니다.
|
|
|
|
---
|
|
|
|
## 2. 검증 대상 및 파일별 검증 상세
|
|
|
|
### 📂 백엔드 (Backend)
|
|
1. **[B06_wf3_ProfileCross_Repository.py](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py)**
|
|
- **`get_confirmed_route_context`**: 확정된 최신 경로의 ID와 지표면 모델의 EPSG 좌표계를 `routes` 및 `surface_models` 테이블 조인 쿼리를 통해 가져오는 로직 구현 성공. 최신순 정렬(`ORDER BY r.computed_at DESC, r.id DESC LIMIT 1`)을 통해 컨텍스트 정합성 보장.
|
|
- **`count_cross_sections`**: 특정 경로와 매핑된 횡단면 총 개수 카운트 쿼리 구현 완료.
|
|
- **`get_longitudinal_section`**: 종단면 메타데이터 정보 획득 시, JSON 파싱을 통한 안전한 `data` 처리 구조 적용.
|
|
- **평가**: Raw SQL을 활용하여 ORM 없이 안전하고 정밀하게 작성됨.
|
|
|
|
2. **[B06_wf3_ProfileCross_Schema.py](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Schema.py)**
|
|
- **`SectionOptionDefaults`**: 기본값(측점/횡단 옵션)을 표현하는 Pydantic 모델 선언.
|
|
- **`SectionContextResponse`**: project_id, nullable 경로 정보(route_id, filter_key, method, smooth, crs_epsg) 및 default 옵션을 포함하도록 설계.
|
|
- **`SectionSummaryResponse`**: 기존 요약 응답에 `length_m`, `cross_section_count`를 추가 정의하여 재진입 시 연장 및 횡단면 수를 표현 가능하도록 보강.
|
|
- **평가**: 타입 안정성과 Nullable 처리가 명확함.
|
|
|
|
3. **[B06_wf3_ProfileCross_Router.py](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router.py)**
|
|
- **`GET /api/projects/{project_id}/sections/context`**:
|
|
- `get_confirmed_route_context`와 B04 확정 스냅샷 API인 `get_surface_confirmation_params`를 조합하여 호출.
|
|
- 확정 경로가 없는 경우 예외를 내거나 404를 반환하지 않고, 200 OK 상태에서 속성값들이 null로 설정된 JSON 반환(프론트엔드 오류 방어).
|
|
- defaults는 `SectionGenerationOptions()` 인스턴스의 기본 설정을 매핑하여 제공.
|
|
- **`GET /api/projects/{project_id}/sections/{route_id}`**:
|
|
- 종단면 메타 및 횡단면 카운트를 취합하여 보강된 `SectionSummaryResponse` 규격으로 반환.
|
|
- **평가**: RESTful 원칙에 부합하며 예외 처리가 깔끔함.
|
|
|
|
---
|
|
|
|
### 💻 프론트엔드 (Frontend)
|
|
1. **[B06_wf3_ProfileCross_Api_Fetch.ts](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts)**
|
|
- `SectionContextResponse` 인터페이스 정의 및 `fetchSectionContext(projectId)` API 래퍼 함수 추가 완료.
|
|
- `SectionSummaryResponse` 등의 변경 스키마 타입 현행화.
|
|
- **평가**: 백엔드 Pydantic 규격과 정확히 일치함.
|
|
|
|
2. **[B06_wf3_ProfileCross_UI_Page.ts](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts)**
|
|
- **입력 필드 읽기 전용화**: `routeGroup` 내부의 routeIdField, filterField, methodField, crsField 및 smooth 체크박스를 `buildInfoLine()` 기반의 라벨 행으로 변경.
|
|
- **진입 흐름 제어**:
|
|
- 진입 시 `fetchSectionContext`와 `fetchWorkflowState` 병렬 호출.
|
|
- 확정 경로 유무에 따라 버튼 상태 제어 및 `B06_Profile_No_Confirmed_Route` 안내 메시지 렌더링.
|
|
- 기존 종횡단 결과 존재 시 재생성 없이 결과값 표시 및 확정 활성화.
|
|
- 미생성 상태일 경우 안내 메시지 출력 후 `onB06_Profile_Generate_Click()`을 자동으로 발화하여 무설정 즉시 생성.
|
|
- **재생성 제어**: "재생성" 클릭 시 입력 폼이 아니라 백엔드로부터 받은 상속 경로 컨텍스트 및 사용자 조정 옵션들만 파싱하여 재생성 요청 수행.
|
|
- **평가**: 복잡한 비동기 진입 제어 흐름과 예외적인 분기 처리가 고품질로 설계됨.
|
|
|
|
3. **[B06_wf3_ProfileCross_UI_Style.css](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css)**
|
|
- `.b06-profile__info-line` 스타일 정의 추가. flexbox 및 테마 색상 변수를 활용하여 모던하고 일관된 정보 텍스트 정렬 완성.
|
|
- **평가**: 하드코딩 색상이 전혀 없고 테마 시스템을 잘 재사용함.
|
|
|
|
4. **[ui_template_locale.ts](file:///C:/Program_coding/%EC%9E%84%EB%8F%84%EC%84%A4%EA%B3%84%20%EB%B0%8F%20%EA%B2%AC%EC%A0%81%EC%9E%90%EB%8F%99%ED%99%94%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EA%B0%9C%EB%B0%9C/ui_template/ui_template_locale.ts)**
|
|
- `B06_Profile_Btn_Generate` 명칭을 "종·횡단 재생성(Regenerate Sections)"으로 적용.
|
|
- `B06_Profile_No_Confirmed_Route`, `B06_Profile_Auto_Generating` 등 안내 메시지 키에 대한 한/영 사전 정의 확인.
|
|
- **평가**: 하드코딩 없는 다국어 처리 표준 준수.
|
|
|
|
---
|
|
|
|
## 3. 검증 종합 결과
|
|
* **Surgical Changes 원칙**: 변경 범위 외의 코드 및 불필요한 공백/서식 변경이 전혀 유발되지 않음.
|
|
* **700줄 제약**: 수정이 가해진 파일 중 가장 긴 파일은 `B06_wf3_ProfileCross_UI_Page.ts`로 343줄에 불과하여 단일 소스코드 700줄 제한을 준수함.
|
|
* **실무 적합성**: 확정 경로 컨텍스트를 동적으로 읽어오고 미생성 상태 시 백엔드 기본값으로 백그라운드 자동 생성을 발화하는 흐름이 기획 사양서와 정확하게 부합함.
|
|
|
|
**종합 판정**: **PASS (승인)**
|