chore(sync): 공유 docs 파일 담음 — 합류점과 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 16:59:40 +09:00
co-authored by Claude Opus 5.5
parent ee3741254d
commit d3d4447523
11 changed files with 466 additions and 0 deletions
@@ -0,0 +1,101 @@
# 구조물 정의 틀 (PLAN 48-1)
정본 = `resources/master_template/구조물정의.json` 한 벌. 서버 · 화면은 이 한 벌만 읽음.
## 1. 길
| 길 | 누가 | 하는 것 |
| --- | --- | --- |
| `GET /api/m02/structure-definition` | 로그인 누구나 | 정의 한 벌 그대로 |
| `PUT /api/m02/structure-definition` `{판, 정의}` | 시스템 관리자만(아니면 403) | 통째로 고쳐 씀 · 낡은 판 409 · 검사 틀림 422 |
| `GET /api/projects/structure-types` | 로그인 | 정의의 `types` + `표시` · `그룹` 을 옛 꼴 그대로(`visible` · `groups`) |
| `PUT /api/m02/structure-options` · `structure-option-groups` | 시스템 관리자 | 정의의 `표시` · `그룹` 칸만 고쳐 씀(같은 판 · 같은 이력) |
- 서버 읽기 = `B05_Profile_Structures_Schema.load_definition()` · `load_structure_types()` · 쓰기 = `M02_SO_Definition.save()` · `save_sections()`.
## 2. 담는 것
| 칸 | 꼴 | 뜻 |
| --- | --- | --- |
| `판` | 정수 | 저장마다 +1 · 앞 판은 `구조물정의_이력/판_N.json` |
| `schema_version` · `comment` | 수 · 글 | 옛 레지스트리 머리 그대로 |
| `구조물군` | `{군 키: 이름}` | 구조물군 이름(A 횡단배수 …) |
| `동작` | `{동작 이름: 뜻}` | 손코딩 특수 동작 목록(5장) |
| `types` | 종류 목록 | 종류 · 옵션 · 선택지 · 기본값 · placement 등(옛 `B05_Profile_Structure_Types.json` 꼴 그대로) |
| `종류` | `{종류 키: {기준측점?, 동작?}}` | 종류마다 덧칸 — 없으면 기본 |
| `표시` | `{종류 키: {옵션 키: false}}` | 끈 옵션만(옛 `구조물옵션표시.json`) |
| `그룹` | `{종류 키: [그룹]}` | 옵션 그룹(옛 `구조물옵션그룹.json` · 46장) + 형상 칸 |
| `배치` | `{종류 키: {옵션 키: {줄, 칸, 너비}}}` | B05 · B06 좌측 「구조물 배치」 칸 자리 — 없으면 지금 차례 |
| `규칙` | 규칙 목록 | 상위 옵션 값 → 하위 옵션(4장) |
## 3. 키 규칙
- 키 = 만들 때 자동 · 안 바뀜 · 영문 소문자 · 숫자 · `_`. 이름(`name` · `label` · 선택지 글 · 그룹 `이름`)은 자유.
- 종류 키(`type_id`) 는 정의 안에서 하나 · 옵션 키(`key`) 는 종류 안에서 하나 · 그룹 id 는 `g` + 소문자 · 숫자.
- 지움 = 「안 씀」(`enabled: false`) — 종류 · 옵션을 목록에서 빼지 않음.
- 저장된 값의 키가 지금 정의에 없으면 = 지난 정의 값 — 버리지 않고 남김(오류 없음 · 계산은 없는 값으로).
- 프로젝트 `structures.json` 에 저장 때 정의 판(`definition_version`).
## 4. 옵션
### 꼴
| `input` | 이름 | 값 |
| --- | --- | --- |
| `select` | 고르기 | `choices` 중 하나(선택지 있어야 함) |
| `number` | 숫자 | 0 이상 수 · `unit` |
| `text` | 글 | 글 |
| `bool` | 예/아니오 | 참 · 거짓 |
- 옵션 덧칸(옛 그대로) = `label` · `choices` · `unit` · `default` · `required` · `phase`(b05 · detail) · `enabled` · `empty_means` · `default_basis` · `warn_above` · `warn_message` · `not_in_table`.
### 배치 칸
- `줄` = 몇째 줄(1부터) · `칸` = 그 줄 몇째 칸(1부터) · `너비` = 칸 몇 개 차지(1부터). 셋 다 1 이상 정수.
### 그룹
```
{"id": "g1a2b3c", "이름": "유입구 기슭막이", "옵션": ["옵션 키", …],
"형상": {"길이": {"받기": true, "뜻": "유입구 기슭막이 연장"}, "높이": {…}, "전": {…}, "후": {…}}}
```
- 옵션 하나는 한 종류 안에서 그룹 하나에만 · 빈 그룹(옵션 0)도 그룹 · 그룹에 안 넣은 옵션 = 본체 칸.
- `형상` = 그룹이 받을 형상 칸(길이 · 높이 · 기준 측점 전 · 후) — 칸마다 `받기`(켬끔) + `뜻`(무엇을 정하는지). 없는 칸 = 안 받음.
### 종류 덧칸
- `기준측점` = 종류 맨 위 기준 측점 칸 보이기(없으면 보임).
- `동작` = 이 종류에 붙인 특수 동작 이름들(`동작` 목록 안에서).
## 5. 규칙 꼴
```
{"종류": "종류 키",
"만약": {"옵션": "상위 옵션 키", "값들": ["값", …]},
"그러면": {"옵션": "하위 옵션 키", "선택지": ["값", …], "보이기": false, "기본값": "값"}}
```
- 만약 상위 옵션 = 값들 중 하나 → 그러면 하위 옵션의 선택지 / 보이기 / 기본값(셋 중 하나 이상).
- 상위 · 하위는 같은 종류 안 · 서로 다른 옵션 · 고르기 꼴이면 값들은 선택지 안 · 하위 `선택지` 는 고르기 꼴의 선택지 안 · `기본값` 은 (좁힌) 선택지 안.
- 계산 · 연동 제어는 넣지 않음(48-5).
## 6. 동작 이름(손코딩 특수 동작)
| 이름 | 붙은 종류 | 하는 것 |
| --- | --- | --- |
| `계곡통과시설` | pipe · box_culvert · ford_pavement · ford_bridge · revetment | 관 지점 정본 시설 — 부속 옵션 서브폼 · 저장은 폼이 아는 칸만 |
| `유입유출_묶음` | pipe | 유입구(집수정 · 기슭막이 택일) · 유출구(기슭막이) 소그룹 |
| `기슭막이_한벌` | pipe · revetment | 형태 · 길이 · 높이 · 바닥 보호공 한 벌 |
| `BOX_본체규격` | box_culvert | 본체 규격 프리셋(폭 × 높이) |
| `날개벽` | box_culvert · ford_bridge | 날개벽 유입 · 유출 · 짧은쪽 높이 · 길이 · 각도 |
| `월류단면` | ford_pavement · ford_bridge | 월류 폭 · 높이 · 바닥 경사 · 포장 두께 + 개략 단면 · 필요 수심 미만 되돌림 |
| `포장_물넘이_겹침` | pavement_concrete | 포장 구간이 물넘이를 품으면 나눔 · 끝만 걸치면 저장 멈춤 |
- 정의에서 붙이고 뗌 = `종류.{키}.동작` · 새 동작은 코딩 뒤 목록에 이름을 더함.
## 7. 판 · 이력
- 저장 = 읽어 간 `판` 을 같이 보냄 → 같으면 앞 판을 `구조물정의_이력/판_N.json` 으로 남기고 새 판 = N + 1.
- 검사(틀리면 422 · 안 씀) = 칸 꼴 · 종류 키 · 옵션 키 겹침 · 고르기 선택지 있음 · 구조물군 있음 · 표시 · 그룹 · 배치 · 종류 덧칸 · 규칙 대상 있음.
- 판 1 = 옛 `B05_Profile_Structure_Types.json`(37종 · 옵션 235) + `구조물옵션표시.json` + `구조물옵션그룹.json` 을 키 그대로 옮김.
@@ -0,0 +1,12 @@
# 구조물 표 01 — 횡단배수 › 배관 (사용자 10-5 · 원문 그대로 · 탭 구분)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목 컨테이너 4 컨테이너 4 옵션항목 컨테이너 5 컨테이너 5 옵션항목
(필수)컨테이너 제목 : 관 (필수)컨테이너 제목 : 관 보호공 (유입) (필수)컨테이너 제목 : 관 보호공 (유출) (선택)컨테이너 제목 : 흙막이 추가 | 여러개일수 있음. (선택)컨테이너 제목 : 도수로/돌붙임 | 여러개일수 있음.
횡단배수 배관 측점 No, + 측점거리 관경 800, 1000, 1200, 1500 구조 집수정, 흙막이 구조 흙막이 구조 흙막이 구조 도수로, 돌붙임
관 길이 입력값 아님, 자동계산됨 형태 집수정 : I형, L형, ㄷ형 | 흙막이 : 돌 쌓기(찰), 돌 쌓기(메), 콘크리트, 돌망태, 통나무/목재틀, 바자 형태 (같음) 형태 (같음)
길이 수기입력 길이 수기입력 길이 수기입력
높이 수기입력 및 횡단도에서 제어 높이 수기입력 및 횡단도에서 제어 높이 수기입력 및 횡단도에서 제어
기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) (같음) (같음)
기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산) (같음) (같음)
운영(사용자 10-5): M02 「구조물 옵션 정의」 = 이름 · 값 이름 바꿀 때만 · 구조는 사용자가 엑셀 표로 주는 대로 브레인이 구조물마다 작업 창 하나에 코드로 넣음 · 연동 계산까지 · 구조물별 계산 파일 따로 됨.
@@ -0,0 +1,8 @@
# 구조물 표 02 — 횡단배수 › 박스암거 (사용자 10-5 · 고친 판 · 원문 그대로)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목
(필수)컨테이너 제목 : 본체 (필수)유입 구조 (필수) 유출 구조
횡단배수 박스암거 측점 No, + 측점거리 본체 규격 2.0 X 2.0, 3.0 X 3.0, 사용자 입력 구조 없음, 날개벽, 흙막이 구조 없음, 날개벽, 흙막이
(첫 판: 날개벽(유입) · 날개벽(유출) 설치 있음/없음 → 이 판으로 바뀜)
사용자 참고(10-5): 컨테이너 항목별로 이전에 작업한 구조물 조합의 키값을 연결할 예정 · 연결 코드는 이미 있음.
@@ -0,0 +1,5 @@
# 구조물 표 03 — 횡단배수 › 물넘이 포장 (사용자 10-5 · 원문 그대로)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목
(필수)컨테이너 제목 : 경사각도 (선택)컨테이너 제목 : 도수로/돌붙임
횡단배수 물넘이 포장 측점 No, + 측점거리 경사각도 각도 수기입력 구조 도수로, 돌붙임
@@ -0,0 +1,8 @@
# 구조물 표 04 — 횡단배수 › 세월교 (사용자 10-5 · 원문 그대로)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 컨테이너 2 컨테이너 2 옵션항목 컨테이너 3 컨테이너 3 옵션항목
(필수)컨테이너 제목 : 세월교 (필수)유입 구조 (필수) 유출 구조
횡단배수 세월교 측점 No, + 측점거리 관경 800, 1000, 1200, 1500 구조 없음, 날개벽, 흙막이 구조 없음, 날개벽, 흙막이
월류 폭 수기 입력
월류 높이 월류 폭과 높이는 연동 자동계산
수량(련) 수기 입력
@@ -0,0 +1,6 @@
# 구조물 표 05 — 횡단배수 › 노출형 횡단수로 · 개거(겉도랑) (사용자 10-5 · 원문 그대로)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목
컨테이너 없는 항목 측점 하단에 구조물 조합 연결 항목 넣기
횡단배수 노출형 횡단수로 측점 No, + 측점거리
횡단배수 개거(겉도랑) 측점 No, + 측점거리
@@ -0,0 +1,7 @@
# 구조물 표 06 — 횡단배수 › 맹암거 (새 종류 · 사용자 10-5 · 원문 그대로)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목
횡단배수 맹암거 측점 No, + 측점거리 (필수)컨테이너 제목 : 맹암거
암거 높이 수기입력
암거 경사 수기입력
* 종단 배수의 암거와는 다른 내용임
@@ -0,0 +1,25 @@
# 구조물 표 07 — 안전부대용지 · 종단배수 · 계류사방 (사용자 10-5 · 원문 그대로)
사용자: 다음 종단배수 전체 항목은 구조물 연결 지정 없으며 현재처럼 숨김처리. 계류사방 항목도 숨김처리
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목
안전부대용지 대피로 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용
상세 대피소, 정차/작업장, 차돌림곳
컨테이너 없는 항목 측점 하단에 구조물 조합 연결 항목 넣기
안전부대용지 반사경 측점 No, + 측점거리
안전부대용지 경계석 측점 No, + 측점거리
안전부대용지 위험표시 측점 No, + 측점거리
안전부대용지 국가지점번호판 측점 No, + 측점거리
안전부대용지 취수정 측점 No, + 측점거리
안전부대용지 준공표지판 측점 No, + 측점거리
안전부대용지 차단기 측점 No, + 측점거리
안전부대용지 취수정 측점 No, + 측점거리 (원문에 두 번 · 하나로 봄)
(덧 · 사용자 10-5)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목
(필수)컨테이너 제목 : 상세 내용
안전부대용지 가드레일 측점 No, + 측점거리 형태 수기입력
길이 수기입력
기준측점 전 수기입력(길이 + 기준측점 전/후에 따라 연동 계산)
기준측점 후 수기입력(길이 + 기준측점 전/후에 따라 연동 계산)
@@ -0,0 +1,19 @@
# 구조물 표 08 — 안전부대용지 사토장 · 토취장 · 노면공 콘크리트 포장 · 기타 (사용자 10-5 · 원문 그대로)
구조물군 상세 종류 기본 옵션 컨테이너 1 컨테이너 1 옵셩 항목 … 상세 설계 필수 선택
안전부대용지 유용토운반작업장(사토장) 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용
사토장 부피 수기입력
안전부대용지 토사채취장(토취장) 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용
토취장 부피 수기입력
노면공 콘크리트 포장 측점 No, + 측점거리 (필수)컨테이너 제목 : 상세 내용
포장사양 콘크리트, XXX
높이 수기입력
기타 수기입력 측점 No, + 측점거리 (선택)컨테이너 제목 : 상세 내용 (상세 설계) 도수로(or 돌붙임)
비고 수기 입력 (상세 설계) 도수로(or 돌붙임) 관보호공, 옹벽, 돌쌓기, 흙막이, 큰톨쌓기 가 같은 형상으로 보임.
(가드레일은 표 07 덧과 같음)
사용자(10-6): 기타 항목의 목적은 우리 프로그램에 등록되지 않은 구조물을 수기입력하여 등록하기 위함임.
@@ -48,3 +48,136 @@
4. 구조물 조합의 단가산출 상세화면에도 원문보기 우측 패널이 있어야함. 우측 패널은 단가산출 로직을 선택할 경우에 원문을 보여주는 기능이며 패널을 접었다 펼수 있어야함.
5. 원문 패널 추가에 따라 현재 단가산출 로직 항목을 선택하면 옵션창이 보이나 선택하면 하이라이트를 하고 원문을 보일수 있게 함. 그리고 옵션설정에 대한 조정은 올리기, 내리기, 빼기 버튼의 이름을 위로, 아래로, 삭제로 변경하고 아래로 와 삭제 사이에 신규 버튼(이름 : 옵션)을 추가하여 선택할 수 있게 변경. 버튼 사이간격에 대해 템플릿화하여 적용.
6. 구조물 조합의 면적산출 우측패널에 별도의 도면 패널 추가(기능은 4번 요청 확인)
## 구조물 옵션 정의 페이지 (10-5 · 원문 그대로)
이제부터 다시 계획서를 세울 예정임.
1. 목표 : 현재 구조물 옵션 보이기의 컨테이너 항목을 기준으로 프로젝트 내부에 사용하는 구조물의 옵션 항목 및 제어를 설정하는 페이지를 궁성
2. 상세 내용
- 현재 M02의 구조물 옵션보이기 항목으로 구조물군과 구조물 종류를 설정하고 이름을 변경할 수 있게 반영
- 구조물 종류를 선택시 우측에 해당항목의 일위대가 그룹을 지정하고 변수를 편입할수 있게 반영(기반영), 추가로 배치 순서를 조절할 수 있게, 행열의 크기 제어도 같이
- 구조물 종류의 특정 옵션의 옵션 값 항목을 지정할 수 있게 반영
- 구조물 종류의 최상위에 기본값인 기준 측점을 표현할건지에 대한 기능
- 구조물의 길이, 높이, 기준측점 전/후 값에 대한 옵션 사용여부 및 어떤걸 제어하는지에 대한 결정
- 구조물 옵션과 값들의 이름 변경기능
- 옵션들은 상위에 따라 하위 옵션을 변경할 수 있게 반영
3. 현재 B05와 B06의 방대한 변경이 필요하니 순차적으로 진행, 가자먼저 작업할 내용은 B05와 B06에 좌측 패널의 구조물 배치 컨테이너에 보일 항목을 반만들수 있게 반영하고 선택에 따라 변경되는 변수 값과 제어는 별도로 작업 할 예정. 일단 방향성에 대해 검토해보고 대화부터 하자. 내가 원하는 방향은 결국 내가 프로그래머가 아니라서 나중에 항목을 추가하거나 옵션을 변경하였을때 프론트엔드에 기능을 구현하고 변경하고 싶은것임.
## 원문 보기 패널 (10-5 · 원문 그대로)
계획서는 작성해주고 빠르게 작업해줄 내용이 M01과 M02에서 원문보기가 패널 양식을 사용하지 않고 있음. 추가로 M01페이지의 원문보기에서 md파일을 보기가 깨짐이 있음. M02는 정상. M01의 경우 흐름도와 원분은 우측 패널로 구현되어있음. 좌측 패널과 동일하게 접었다 펴는 양식 제대로 확인할 ㄱ서.
그리고 우측 패널의 내용은 메인 화면의 스크롤과 별개로 동작하게 반영
추가로 원문에서 표는 스크롤로 매우 낮은 공간만 보이고 스크롤 표현되어서 보기가 힘듬. 그냥 표가 길더라도 보여줄것. 어차피 상세페이지와 원문의 우측 패널의 영역은 별도의 스크롤 영역이라 무관함.
원문은 M01과 M02에 표현되고 있는데 일원화 할것. M02가 더 가독성이 좋음.
## 일위대가 조합 · 면적산출 알약 (10-5 · 원문 그대로)
다시 돌아가서 M02 페이지에
1-1. 구조물 조합의 면적산출에서 도면으로 보내진 셀의 영역을 표현이 되게하기
1-2. 구조물 조합의 면적산출에서 알약을 선택을 했을때 셀이 반짝임은 있지만 반대로 셀을 선택했을때는 잘 안보임.
1-3. 구조물 조합의 면적산출에서 일위대가의 로직을 삭제했을때 기 지정된 알약이 잔존하고 있음. 삭제가 힘들다면 느낌표라도 보여지게 하고 삭제가능한지 검토
2. 원문 표기의 '산림품셈 3-4-2 1' 항목 확인
3. 구조물 조합의 일위대가 상세 화면에서 단가산출 로직에 들어가는 로직항목들은 단가산출 로직 뿐만아니라 단일 단가산출 로직을 일위대가로 승격시킨 선택지와 다른 일위대가로 만들어진 조합도 선택이 되어야함.
4. 방법 : 구조물 조합 컨테이너 하단에 일위대가 조합 컨테이너를 추가하고 여기에 마스터, 회사, 개인의 권한을 구현, 이때는 두가지의 선택지가 있음. 하나는 일위대가로 승격시킨 단가산출로직의 리스트와 일위대가에 사용하기 전 사전 조합으로 만들어진 조합으로 구분함.
5. 단가산출 승격은 단가산출 로직의 항목들을 검색하여 선택하면 일위대가 형태로 저장이 됨. (도면 X, 면적산출 X)
6. 일위대가 사전 조합은 단가산출 승격 + 다른 일위대가의 조합으로 그룹(도면 X, 면적산출 X)
7. 일위대가 조합은 구조물 조합의 일위대가 상세화면에서 선택할 수 있어야함.
8. 구조물 조합의 일위대가 상세화면에서의 로직테이블은 일위대가 목록표임. 여기서 행을 눌렀을때 하단에 상세 내역이 보였으면 함. 상세내역은 M01페이지의 단가산출 로직을 보면 시험계산 컨테이너 내부에 기준단위에 대한 테이블 리스트가 있음. 이걸 B02 구조물 조합의 일위대가 조합에 맞게 넣어주면 됨. 행을 선택했을때만 보여주면 되고 다른 행을 선택하면 닫히면 됨.
9. 구조물 조합의 일위대가 상세화면에 단가산출 로직 테이블의 이름 좌측 열을 추가하고 구분을 추가함. 구분은 출처로 단가산출인지, 일위대가 조합인지, 단가산출을 승격한 정보인지 표기 항목은 4음절로 표기,
일단 상세히 반영 가능성에 대해 상세히 검토후 계획서에 반영
## 오른쪽 패널 높이 (10-5 · 원문 그대로)
하나씩 수정 내용에 대해 요청할께. M01 단가산출 로직 상세와 M02의 구조물 조합의 일위대가와 면적산출에는 우측 패널이 존재함. 이 우측 패널의 높이는 화면에 맞춰서 높이를 결정하게 했으면 함. 스크롤 동작시 움직임.
추가로 너가 오해한게 있는데 구조물 조합의 일위대가 상세페이지에서 단가산출 로직 행을 선택했을때 나오는 상세정보를 해당행이 아래에 별도의 행으로 구분하여 접었다 폈다하면서 내용을 보줬으면 해. 별도의 공간에 M01처럼 보여달라는게 아니라 테이블에 맞춰서 정보를 넣어달라는 의미였어.
## 서고 · 고르기 창 (10-5 · 원문 그대로)
1. 로직고르기 모달창에서 찾기 버튼은 필요없어 보임. 다른 찾기 기능을 보면 없어도 될것같아. 그리고 단가 승격과 사전 조합을 별도의 버튼으로 활성화하는데 이건 그냥 구분정보를 보여줘서 선택을 유도해도 되지 않을까?
2. 일위대가 조합 컨테이너에는 새로, 본떠 만들기, 지우기 버튼은 필요없고 단가산출 승격 이라는 항목과 일위대가 사전조합이라는 항목 두게만 있으면 될것같음. 그리고 해당 항목을 누르면 상세에 테이블형태로 리스트 들을 보여주고 거기에 생성, 복사, 삭제 버튼이 있으면 됨.
3. 사전 조합도 동일함
단위를 선택하게 하는 항목들 중 선택 후 나오는 단위 표기 버튼이 너무 작음 저장같은 버튼과 같은 크기로 변경
사전조합에 상세에서 보여지는 단가산출 로직의 선택 기능이 없음
구조물 조합의 일위대가에서 조합 테이블에 넣어준 상세 항목 펼쳐짐 화살표는 필요없어.
그리고 로직 고르기 모달창에서 구분과 상세 구분은 2열 구조로 변경하고 찾을때 나온 항목들의 이름들은 좌측 맞춤으로 글자를 맞춰야지. 찾기의 공용화 양식이 없는거야?템플릿 있을것같은데?
단가산출과 일위대가 사전조합에서 테이블의 양식도 M01에 공통테이블 양식이 있을것같고 버튼들도 M01에 템플릿이 있을거야. 확인해봐 그리고 사전조합의 경우에 검색은 별도의 창이 아니라 구조물 조합의 일위대가 테이블의 조건 추가와 같은 기능이어야.
일위대가 사전조합에서 나오는 모당창의 형식 뿐만아니라 내용도 구조물조합의 일위대가의 상세 화면에서 로직 추가와 같아야된다고 선택되는 항목도
어차피 신규로 키값을 만들지 않았음? 그럼 당연히 해당 연결정보와 구분, 상세구분을 만들어야하지 않음?
다음으로 구조물 조합에서 일위대가의 상세페이지에서 테이블 행 선택에서 단가승격이야 단가산출과 같은 항목이라 문제가 없는데 일위대가 사전조합의 경우에는 전체를 다 표현하는데 문제가 있어. 일위조합인 경우에는 조합의 세부항목을 기준으로 노무비, 재료비, 경비를 값을 가져와서 사용하면 가능하지 않을까?
추가로 구조물 조합의 일위대가 상세페이지의 로직 테이블의 순서 열에서 존재하는 버튼을 2행 구조로 변경
단가 승격에도 옵션 버튼이있어야할것같고. 일위조합의 경우에는 바로 옵션으로 지정할수 없으니 수정버튼(모달)도 잇어할것 같은데?
맹암거처럼 cad연결이나 횡단도에 그릴지 말지는 이번 수정 후에 작업할거야. 너는 B05/B06 좌측 패널의 생성과 기존 로직 연결에만 신경쓸것.
나는 이제 자러 갈거니 너가 다른 워크트리들을 잘 제어해서 계획서의 내용을 반영하고 최종검증을 진행 후 아티팩트로 결과를 보여주는데 만약 개선이 필요하다고 판단되는 부분이 있다면 계획서에 내용을 추가해서 개선할것.
(10-6 사용자)
1. 내가 넣어준 선택지 외에는 다른 정보들은 필요없는 상황임.
2. 각 워크트리는 자기의 검증프로젝트를 가지며 수정해도 상관없음.
3. 기타 표가 뭐임? 내가 넣어준거에는 없는데?
4. 물넘이 경사는 내가 다시 요청하겠음.
5. 세월교도 보고 내가 판단하겠음.
6. 현재 만들어진 프로젝트는 이전 로직으로 만들어진 프로젝트로 필요시 재생성
7. 현재 횡단도의 구조물을 선택하면 좌측 패널 활성화부분 재점검
8. 좌측 패널의 좌측 하단의 구조물리스트와 하이라이트 기능들 점검
(10-6 사용자 · 구조물별 수정 요청 1차)
1. 공통
- 좌측 패널의 컨테이너 내부 구조물 조합 항목의 고르기 버튼의 이름은 '선택'으로 변경
- 패널 내부 설명은 공간이 부족하니 별도로 빼서 작성할 예정 ? 버튼으로 연결하여 별도의 모달창으로 작업예정이며 각페이지에는 설명서를 넣을 예정. 내부에 들어갈 말은 나도 수정할 수 있게 별도로 페이지별 항목별 별도의 파일로 관리. 여기서 ? 버튼의 위치는 좌측 패널의 좌측하단 초기화 버튼이 있는 그룹들 중 제일 좌측에 존재. 다른 B02 ~ B09 까지 공통사항
- 횡단도
2. 배관
- 관컨테이너 : 관 길이의 사용자의 입력을 받는 정보가 아니라 보여주는 정보임. 라벨은 유지하고 내부 내용은 자동계산으로 변경, 관 길이 항목은 소수점 없음
- 관 보호공(유입) 컨테이너 :
ㄱ. 집수정은 길이, 기준측점 전/후의 내용이 필요 없음.
ㄴ. 높이에 따라 집수정의 형상이 변경 연결이 안되어 있음.
ㄷ. 흙막이의 돌쌓기(찰)의 경우 다른 형태 대비 모양이 변함. 모양은 같고 형태에 따라 내부 모양만 변하는게 맞음.
- 관 보호공(유출) :
ㄱ. '관길이 15m 좌우 자동 자리 ...' 설명 필요 없음
ㄴ. 지난 정의 값이라는 항목은 필요없음. 향후 다 정리하고 사용하지 않는 코드들은 삭제 예정
ㄷ. 추가 기슭막이(단)이 흙막이 추가 흙막이 추가에 대한 내용이었음. 별도 버튼으로 추가하는게 아님. 상단 컨테이너의 흙막이 옵션중 추가 기슭막이(단)의 값에 따라 생성되는데 이때 추가되는 기슭막이의 이름을 흙막이로 변경하고 선택되었을때 보여주는게 아니라 항상 보이게
ㄹ. 도수로/돌붙임은 일단 유지
(10-6 사용자 · 공통 덧)
공통
- 기존 배관에서 박스암거로 변경할 경우 횡단도의 그림이 업데이트 안됨. 확인 및 업데이트
- 추가로 관련된 정보 중 확인해줘야 할 내용이 기존에 화면의 B05/B06의 실시간 제어와 동작 속도/보안 개선을 위해 많은 작업이 있었는데 좌측 패널 통합 이후 많이 느려진 걸로 보임. 재확인. 이건 확인부터 하는게 좋겠음.
(10-6 사용자 · 추가 요청)
- 사면 안정 그룹의 종류들 전체가 컨테이너 구성이 안되어 있음. 현재 기준 측점을 제외한 옵션들을 하나의 컨테이너에 넣고 그 안에 집계 항목 지정 넣을것
(10-6 사용자 · 추가 요청)
- 안전부대용지 그룹의 사토장의 기준측점 표현이 예전 코드입. 토취장과 동일하게 구성
(10-6 사용자 · 다음 수정)
- B05/B06의 종단도 내널에서 구조물 알약을 선택하면 정보 라벨이 나오는데 위치가 상하 제어 버튼에 가려져서 안보여 최상위로 올려주고 그럼 버튼이 가려지니까 Y축 방향으로 조금 쉬프트 해줘. 그리고 안에 내용은 중요한 정보만 보여주면 됨. 지금은 너무 많이 나와. 중요한 정보라면 아마 기준 측점 정보와 컨테이너가 있는 경우 제일 앞에 있는 옵션값만 있어도 될것같아.
(10-6 사용자 · 신규 기능)
다음은 신규 기능이야. 구조물 조합을 지정해야하는 경우에가 있는데 이때 좌측 패널의 구조물 리스트의 항목들에 측점정보 좌측에 연결되었거나 연결되지 않은 정보를 알려주는 기능이 있었으면 함. 이때 구조물에 따라 선택이나 필수 정보들에 의해 램프와 램프의 색상으로 표현되게 하면 될것같아. 램프영역에 의해 글자들의 배열이 깨지는건 싫으니 별도의 영역을 먼저지정하고 램프는 3행 다열 구조로 구성해줘. 램프의 사이즈는 작아도 되니 현재의 리스트 높이를 깨지 않는 범위에서 진행해줘.
(10-6 사용자 · 중요)
이건 중요한 부분인데 B05와 B06은 같은 프론트엔드를 공유하고 같은 결과와 묶여있어야하는데 지금 분리되어있는것같아. 하나를 변경하면 다른 페이지로 이동되었을때 이전자료를 가지고 있는것같아. 저장하는 데이터 셋의 위치가 일원화 되어있지 않는것같은데. 확인해봐.
(10-6 사용자 · 추가 요청)
- 구조물 배치에 구조물 조합 선택의 프론트엔드를 2행 구조로 변경해줘. 다른 옵션들을 보면 제목과 입력을 2행 구조로 반영되어 있잖아. 글자 폰트와 크기도 같은걸 사용해줘.
(10-6 사용자 · 추가항목)
B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의 제목은 원근, 직교 로 변경하고 기본값을 직교로 변경해줘.
(10-6 사용자 · 추가항목)
- B05의 3D 영역에서 Front, Side버튼의 방향이 대각선 방향인것같아. 방향 재설정 해줘.
(10-6 사용자 · 추가 요청)
- 페이지의 좌측 패널의 공통항목으로 들어온 버튼 세트의 버튼 크기가 조금 이상함. 점검
@@ -0,0 +1,142 @@
# 54-5 B05 · B06 실시간 조작 속도 · 보안 재확인 (조사 · 보고만)
- 기준 커밋: `6233daab1` (sub_laptop_8 = origin/main_laptop_1)
- 검증 프로젝트: `sub8_검증` (`c81b21f8…`) · 노선 224 · 저장 · 확정 누르지 않음(캐시만 · 브라우저 문맥 버림)
- 측정 도구: 헤드리스 Chrome(실 GPU — ANGLE D3D11 Intel Iris Xe) · 1509×1069 · 페이지 안 계측(Event Timing · Long Task · fetch/XHR 감쌈 · sessionStorage 쓰기 셈 · DOM 변화 셈 · WebGL clear 셈) + CDP 메인 스레드 시간
- ⚠ ORCA 내장 탭이 10초마다 강제로 내려감(다른 창 탭 여럿 · 숨은 탭 10초 뒤 버림 · `tab switch --focus` 로도 같음) → 10초 넘는 측정 불가 → 측정 전용 헤드리스 Chrome 으로 대체(공용 브라우저 아님 · 화면 안 띄움 · ORCA 탭은 닫음)
- 통합 전 판 실행 대조는 안 함(워크트리 금지) → 통합 전 실측값은 커밋 글에 남은 수치로 대조(`9da48d5e7` 9-12 · `1abb456ef` 9-06)
## ① 기준 커밋
속도 · 실시간 · 보안 작업
| sha | 날짜 | 내용 |
|---|---|---|
| 7fdbb343a | 08-23 | 코리도 편집 즉시 반영 · 프리즈 제거(프레임 갭 3603→100ms) |
| 08c0dc322 | 08-29 | 자동저장 제거 · 초기값 스냅샷 |
| a35c8ff35 | 09-03 | 계획선 편집 중 횡단 재계산을 브라우저로 — 서버 왕복 제거 |
| c2f681f9d · 8dca4bbfb | 09-04 | 휠 · 세로 맞춤 실시간(다시 그리기 대신 변환) |
| 3cd717d8f | 09-06 | [저장]·[확정] 정본 서버 재계산 |
| 9da3bce1b | 09-06 | 카드 버튼 즉시 저장 → 캐시 · `designRequestSeq` 제거(최신만 채택은 `B05_Profile_UI_Profile_Preview.ts:35-57` seq 가 맡음) |
| c0bfcba34 | 09-06 | 유토 배분을 서버 Node 로(사용자 확정 · 400ms 잠잠해지면 · 최신만) |
| df2dedcbc · 8e3c1f91f | 09-06 | 진입 중복 호출 제거 |
| 0b30f5b03 · 1abb456ef · 4df5d0a7e | 09-06 | 지형 색인 · 카드 강제 레이아웃 67→1회 · B06 진입 2.3~2.9s → 2.0s |
| 674777626 | 09-06 | 세션 확인 활동시각 쓰기 1분 1회 |
| **9da48d5e7** | 09-12 | **B06 ▲▼ — `refreshCards` 묶음 + 120ms 디바운스 · 한 번 누름 920→17~23ms · 최장 멈춤 180~229ms · 1.5초 누름 누적 멈춤 2,577→473ms** |
좌측 패널 통합(통합 직전 기준 `cd26699d2` 09-29)
| sha | 날짜 | 내용 |
|---|---|---|
| 439f605ba · 7760dcd77 · 2c520537b | 09-29 | 좌측 칸 등록부 · 설계 가게 한 곳 · 저장 한 줄기 |
| 38aae89b2 | 09-29 | 종단도 한 벌(`design_profile.ts`) — B06 위 종단도도 B05 것으로 |
| 8a9456579 | 09-29 | 고름 한 곳 |
| **dd8066275** | 09-29 | **옛 B06 계획선 편집 껍데기 삭제 — 120ms 디바운스 같이 사라짐** · 유토 뱃지 한 계산(전 측점 `structureAreaRows`) |
| 90a2cb9a1 | 09-29 | 한 페이지 뼈대 · 숨은 3D 그리기 멈춤 |
| **473d959d6** | 09-29 | **가운데 보기 전환 — 폼 한 벌 · `pipeReloadTimer` 추가** |
| 7f04bf961 · 767adc4a4 | 09-29~30 | 관 · 옹벽 칸 한 곳 |
| fc54a385d | 10-05 | 구조물 배치 칸을 정의대로 |
| 0a095c14b … 1a9055444 | 10-05~06 | 52장 명세 공용 틀 + 구조물별 폼 |
## ② 수치 (지금 판)
열: 입력→그림 = Event Timing 최대(ms · 괄호 = 그중 JS) · 긴 작업 = 50ms 넘는 멈춤(ms) · 요청 = 조작 하나에 나간 요청(올림/받음) · 캐시 쓰기 = sessionStorage setItem 수 · 좌측 = 좌측 패널 DOM 갈아 끼운 노드 수 · DOM = 전체 · 오버레이 = 잠금 오버레이 뜸
### B05 (종단 보기)
| 조작 | 입력→그림 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM | 오버레이 |
|---|---|---|---|---|---|---|---|
| 쉼 3초(3D 켜짐) | — | 0 | 0 | 0 | 0 | 1 | 0 |
| 종단 패널 펼침 | 16~24 | 0 | 0~1(설정 PUT) | 0 | 0 | 0~17 | 0 |
| 구조물 고르기(목록 클릭) | 72~136 (38~54) | 0~57 | 0 | 1 | 95~114 | 106~147 | 0 |
| 좌측 칸 — 돌쌓기 높이 2→1.5 | 16 | 53 · 88 | 0 | 1 (2KB) | 68 | 84 | 0 |
| 좌측 칸 — 돌쌓기 측점 +m | 80~128 | 52~76 · 88 | 0 | 1 (2KB) | 72 | 88 | 0 |
| 좌측 칸 — 메모 6자 타자 | ≤24 | 0 | 0 | 0 | 0 | 0 | 0 |
| 좌측 칸 — 배관 관경 바꿈 | — | 59~64 · 68~93 | **1 · POST detail-basins 1KB/96KB · 211~478ms** | 1~2 | 52~119 | 143~245 | 0 |
| 측점 끌기(구조물 알약 40px) | **160~240 (57~87)** | 59~95 · 62~95 | 0 | 1~2 | 136~158 | 172~182 | 0 |
| 종단 점 ▲ 한 번 | 56~72 (12~22) | 53~78 | 1 · haul-plan 22KB/0.6KB(400ms 뒤) | 2 | 0 | 36 | 0 |
| 종단 점 ▲ 2.5초 길게(약 20회) | 32~56 | 최대 64 | 2 · haul-plan | **42** | 0 | 558 | 0 |
- 쉼 3초 메인 스레드 시간 **1,484~1,600ms (≈50%)** · WebGL clear 700회(초당 ≈230) — 3D 가 가만히 있어도 매 프레임 그림 → 위 모든 B05 조작에 깔리는 바닥 부하
- B05 진입: 5.9초 · 요청 21 · 받음 등고선 geojson **36.7MB** + 지형 미리보기 7.8MB + 등고선 7.0MB + 횡단 상세 2.6MB · 진입 때 `POST route/structures/migrate`(쓰기) · 긴 작업 합 832ms
### B05 ↔ B06 넘김
| 조작 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM |
|---|---|---|---|---|---|
| B05 → B06 (첫 번째) | **752** · 214 · 403 · 72 · 57 · 154 (합 1,652) | 6 · pipe-points 96KB 다시 받음(1,036ms) · missing-stations 541ms · haul-plan | 10~11 | 392~525 | 2,402~2,560 |
| B06 → B05 | 198~231 · 104~114 | 1 (structures) | 2 | 207~390 | 863~1,094 |
| B05 → B06 (두 번째) | **1,231~1,242** · 76~98 · 81~125 · 137~148 | 2 (structures · pipe-points — 메인 스레드 막혀 1,308~1,341ms 대기) | 1 | 260~371 | 1,474~1,611 |
- B06 쉼 3초 메인 스레드 5ms · WebGL 0 (숨은 3D 멈춤은 정상)
- 통합 전 B06 페이지 진입 긴 작업 합 1,604~1,728ms(1abb456ef) → 지금은 **같은 페이지 안 보기 바꿈인데도** 1.5~1.7초를 매번 다시 씀
### B06 (횡단 보기)
| 조작 | 입력→그림 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM |
|---|---|---|---|---|---|---|
| 종단 점 ▲ 한 번 | 40 | **587** | 1 · haul-plan | 2 | 0 | 900 |
| 종단 점 ▲ 2.5초 길게 | pointerup **344** | **663 · 558 · 545 · 500** · 95 · 162 · 161 (합 2,684) | 4 · haul-plan(325~851ms) | 8 | 0 | 3,564 |
| 횡단 조정 줄 — 카드 암 경계 ▲ | 96 (63) | 68 | 0 | 1 | 67 | 118 |
| 구조물 고르기(돌쌓기) | 128 (74) | 80 | 0 | 2 | **247** | 279 |
| 구조물 고르기(배관) | 120 (75) | 82 | 0 | 2 | **286** | 342 |
| 좌측 칸 — 배관 관경 바꿈 | — | 109 · 54 | **2 · POST detail-basins + haul-plan** | 3 | 52 | 717 |
| 좌측 칸 — 돌쌓기 높이 2→1.5 | 16 | 0 | 0 | **0** | **0** | **0** |
- **B06 ▲ 통합 전 대비(9da48d5e7 실측)**: 한 번 누름 최장 멈춤 180~229 → **587ms** · 길게 누름 누적 멈춤 473ms(1.5초) → **2,684ms(2.5초)** · 9-12 에 고친 것이 9-29 통합에서 되돌아감
- B06 보기에서 돌쌓기 높이 칸을 바꿔도 캐시 쓰기 · 화면 변화 0 (B05 보기에선 즉시 반영) — 속도와 별개 흠 의심 · 확인 필요
- 잠금 오버레이: 모든 조작에서 0 (규칙 맞음)
## ③ 느린 원인 후보 (6)
| # | 자리 | 왜 | 실측 근거 | 생긴 때 |
|---|---|---|---|---|
| S1 | `A00_Common/design/design_profile.ts:125` (`CROSS_PREVIEW_DEBOUNCE_MS = 16`) · `:367-392` · `B06_Section/B06_Section_UI_Section_View.ts:393-397` · `:287-291` · `B06_Section/B06_Section_Cross_Refresh.ts:129-140` | B06 ▲ 마다(초당 10회) 전 측점 재계산 → 바뀐 측점 카드 전부 다시 만들기 → 종단도 두 번 그림(`draw()` + `refreshCards`→`redrawProfile`) → 전 측점 `structureAreaRows` · 옛 B06 120ms 디바운스 사라짐 | B06 ▲ 587ms · 길게 500ms+ ×4 | dd8066275 · 38aae89b2 (통합) |
| S2 | `A00_Common/design/design_view_cross.ts:493-497` (`host.onShow`) | 횡단 보기 보일 때마다 구조물 다시 읽기 · 상세 다시 받기 · `reconcileStaleDesigns` 전 측점 재계산 · 카드 전부 다시 — 바뀐 것 없어도 | B05→B06 1,231ms 한 덩어리 · pipe-points 96KB 매번 | 473d959d6 (통합) |
| S3 | `B05_Profile/B05_Profile_UI_Viewer.ts:357-376` (`animate`) | 3D 가 쉬는 중에도 매 프레임 `renderer.render` — 메인 스레드 ≈50% 상시 점유 → 모든 B05 조작이 그 위에 얹힘 | 쉼 3초 CPU 1.5초 · clear 230/초 | 통합 전부터(90a2cb9a1 은 숨길 때만 멈춤) |
| S4 | `A00_Common/design/design_view_cross.ts:140-143` (`pipeReloadTimer`) → `B05_Profile/B05_Profile_UI_Drainage_Panel.ts:551-553` · `:402-407` · B05 쪽 `:612-613` | 관 옵션 하나 바꿀 때마다 서버 `detail-basins` 왕복(96KB 받음) → 배수유역 목록 다시 그림 → 관 변경 알림 다시 퍼뜨림 — 5장 「조작 중 네트워크 왕복 금지」 어긋남 | 관경 바꿈 POST 163~478ms · B06 DOM 717 | B05 쪽 통합 전부터 · B06 쪽 473d959d6 |
| S5 | `B06_Section/B06_Section_UI_Page_Pipe_Options.ts:144-148` | 관 옵션 바꿀 때 덮는 범위 측점마다 `refreshCard` → 측점마다 공용 종단도 전체 `draw()` — 9-12 에 고친 꼴(측점 수만큼 다시 그림)이 다시 생김 | 코드 읽기 · 관경 바꿈 긴 작업 109ms | 통합 때 커짐(무거운 공용 종단도로 바뀜) |
| S6 | `B05_Profile/B05_Profile_UI_Structures_Panel.ts:393-400` (`liveCommit`) → `B05_Profile_UI_Structures_Panel_Commit.ts:216-219` · `B06_Section/B06_Section_UI_Page_Structures_Panel.ts:167-172` · `A00_Common/design/design_structure_form.ts:158-159` · `:214-234` · B06 쪽 `design_view_cross.ts:207-224` · `:447-462` | 고르기 · 칸 하나 · 알약 끌기마다 좌측 목록 통째 + 명세 폼 다시 만들기 · B06 은 목록을 두 번 다시 그리고 카드 전체 · 공용 종단도까지 | 고름 B05 95~114 · B06 247~286 노드 · 알약 끌기 160~240ms | 통합 · 52장 폼으로 무거워짐 |
덧(조작 아님): B05 진입 등고선 geojson 36.7MB · 진입 때 `structures/migrate` 쓰기 · 유토 배분 `haul-plan` 은 조작마다 22KB 올림이나 사용자 확정 설계(서버 Node · 400ms 잠잠 · 최신만)
## ④ 보안 (흠 11)
인증 · 권한 공통: 모든 B04/B05/B06 라우터가 `protected_with_company`(`main.py:613-637`) → 세션 + 회사 + 프로젝트가 같은 회사인지(`common_util/common_util_auth.py:105` · `:179` · `:187`) · `project_id` UUID 형 · `route_id` 는 프로젝트와 대조 · 조작 중 자동저장 PUT 없음
| # | 무게 | 자리 | 흠 |
|---|---|---|---|
| H1 | **치명** | `B05_Profile/B05_Profile_Structures_Schema.py:175` · `B05_Profile/B05_Profile_Structures_Repository.py:123` · `M02_MasterTemplete/M02_Item_Snapshot.py:67-69` · `:155-165` · `:212-223` | 구조물 저장 때 `structure_id` 아무 글자 그대로 저장 → 저장 뒤 `safe_sync` 가 `base / structure_id` 폴더를 `shutil.rmtree` · 그 자리에 씀 → `"../../.."` · 절대경로로 서버 디스크 폴더 지우기 가능(회사 사용자 누구나) · 안전 이름 `FOLDER_PATTERN`(`:53`) 이 있는데 여기선 안 씀 (코드로 확인함) |
| H2 | 높음 | `B05_Profile/B05_Profile_Schema.py:66-67` · `:272` → `B05_Profile/B05_Profile_Engine_Solver.py:49-155` · `common_util/common_util_surface_sampler.py:134` · `B05_Profile/B05_Profile_Engine_Skeleton.py:284` | `filter_key` · `method` 자유 글자가 파일 이름에 들어감 → 경로 넘기(다른 프로젝트 지형 읽기 · 캐시 파일 쓰기) · confirm 은 값을 저장까지 |
| H3 | 중간 | `B05_Profile/B05_Profile_Structures_Repository.py:200-202` · `common_util/common_util_drainage_pipes.py:345-361` | **52장 명세 칸 서버 검사 없음** — 정의에 없는 키(동적 `{머리}_{n}_{항목}` 포함)는 `continue` 로 통과 · 관 `options` 그대로 저장 · 명세 규칙은 브라우저(`A00_Common/design/design_structure_spec.ts`)에만 · 파이썬 짝 없음 · 자유 글자 길이 제한 없음 |
| H4 | 중간 | `A00_Common/design/design_structure_ford_calc.ts:10` | 세월교 폭→최소 높이 규칙이 브라우저에만 · 서버는 받은 `ford_height_m` 그대로 — 5장 ⛔(브라우저만 계산) |
| H5 | 중간 | `B05_Profile/B05_Profile_Router_Corridor.py:131-160` · 호출 `B05_Profile_UI_Corridor.ts:208` · `:228` | 코리도 PUT 이 브라우저가 만든 기하 · hash 를 검사 없이 저장 · 첫 빌드 때 자동 PUT — 5장 ⛔ · 서버가 만들 수 있음(`B05_Profile_Corridor_Prebuild.py`) |
| H6 | 중간 | `B06_Section/B06_Section_Schema.py:198` · `B06_Section/B06_Section_Router_Confirm.py:124-169` | B06 저장 · 확정이 브라우저 `mass_haul` · 면적 · 관 길이를 먼저 적고 서버 재계산이 덮음 — 재계산 실패하면 로그만 · 브라우저 값 남음 · `standard_cross_section` 검사 없는 dict |
| H7 | 낮음 | `B06_Section/B06_Section_Schema.py:174-177` (대 `:44-47`) | `CrossSectionPatch` 의 `ground_type` 등 자유 글자 · 사전 키 · 목록 길이 제한 없음 |
| H8 | 낮음 | `B06_Section/B06_Section_Router.py:599` | 안 쓰는 `POST cross-design` 이 DB 에 바로 씀(저장 밖 쓰기 길) |
| H9 | 낮음 | `design_view_profile.ts:503` · `:459` · `B05_Profile_UI_Corridor.ts:208` | [저장] 밖 쓰기 — 등고선 간격 PUT · 진입 때 structures/migrate · 코리도 첫 PUT — 5장 어긋남 |
| H10 | 낮음 | `B06_Section_Router.py:431` · replan · cross-preview | `cross_half_width_m` 상한 없음 · `vertices` 길이 제한 없음 · 코리도 크기 검사가 전체 파싱 뒤 |
| H11 | 낮음 | `station_offsets` · `curve_radii` · 관 `chainage_m` · `B05_Profile_Repository.py:256` | NaN/Infinity 통과 · 관 측점이 노선 길이 검사 없음 · `surface_model_id` 조회에 프로젝트 조건 없음(좌표계 코드만 샘) |
- 참고: 프로젝트 권한이 회사 단위뿐(멤버 · 읽기 전용 역할 없음) — 정책 결정 사항
- 서버 정본 재계산: 계획선 저장(`B05_Profile_Router.py:387-402`) · B06 저장(`recompute_server_side`) 맞음 · 구조물은 등록부 대조만(재계산 아님)
## ⑤ 고칠 갈래와 차례 (8 · 작은 것부터)
| 차례 | 갈래 | 크기 | 예상 효과 |
|---|---|---|---|
| 1 | H1 — `structure_id` 를 `FOLDER_PATTERN` 으로 스키마 검사 + `sync_snapshots` 에서 한 번 더 | 몇 줄 | 서버 폴더 지우기 막음(최우선) |
| 2 | H2 — `filter_key` · `method` 를 Literal 화이트리스트 | 몇 줄 | 경로 넘기 막음 |
| 3 | S1 — 횡단 쪽 재계산 120ms 디바운스 되살림 · `onCrossDesignsUpdated` 받는 쪽에서 종단도 두 번째 그리기 뺌 · 숨은 보기 건너뜀 | 작음 | B06 ▲ 587ms → 9-12 수준(최장 ≈200ms · 길게 누적 ≈0.5초) |
| 4 | S5 · S4 — 관 옵션 측점 루프를 `refreshCards` 한 번으로 · `detail-basins` 서버 왕복을 [저장] 때로(조작 중은 로컬) | 작음~중간 | 관 옵션 조작 왕복 0 · 다시 그림 1회 |
| 5 | S2 — 횡단 보기 다시 보일 때 가게 판번호가 같으면 다시 읽기 · 전 측점 재계산 건너뜀 | 중간 | 보기 넘김 1.2~1.7초 → 바뀐 것만 |
| 6 | S3 — 3D 그리기를 「바뀔 때만」(카메라 움직임 · 장면 변경 때 render 요청) | 중간 | 쉬는 중 메인 스레드 ≈50% → ≈0 · B05 조작 전반 체감 |
| 7 | S6 — 고름 · 칸 바꿈 때 좌측 목록 통째 대신 바뀐 줄만 · 폼 다시 만들기 줄임 · B06 목록 두 번 그리기 없앰 | 중간 | 고름 B06 120ms → B05 수준 이하 |
| 8 | H3~H11 — 52장 명세 서버 clean(파이썬 짝 + 거울 시험) · 세월교 높이 서버 검산 · 코리도 서버 생성 · B06 재계산 실패 시 거절 · 안 쓰는 POST 삭제 · [저장] 밖 쓰기 정리 · 상한 · NaN 막기 | 큼 | 5장 「서버 정본」 · 입력 검사 채움 |
## 남은 확인
- B06 보기 돌쌓기 높이 칸 바꿈 반영 0 (캐시 · 화면 모두) — 별도 흠 의심
- B05 배관 관경 바꿈 뒤 고름이 풀린 일 1회(재현 불확실)
- 통합 전 판 실행 대조가 필요하면 브레인 결정(워크트리 필요)
- ORCA 내장 탭 10초 강제 내림 — 다른 창 탭 정리 또는 탭 보이게 두면 풀릴 수 있음