Merge remote-tracking branch 'origin/dev' into main_desktop_1

This commit is contained in:
2026-09-22 03:10:55 +09:00
11 changed files with 427 additions and 34 deletions
@@ -0,0 +1,24 @@
# 목록 캐시 교차 검증 (일감 32)
대상 = `M01_MasterData_Store_Cache` — 마스터를 한 번 읽어 두고 목록은 미리 센 막힘 값을 씀. 정본은 안 건드리고 임시 사본에서만 시험. 잰 뒤 정본 조합 파일·키 대장 해시가 앞뒤 같음.
## 어긋난 것 — 없음
| 확인 | 범위 | 결과 |
|---|---|---|
| ① 미리 센 막힘 = 그 자리에서 검사한 값 | 로직 1,354 전수 | 어긋남 0 (막힘 0건 · 까닭 글까지 같음) |
| ③ 목록 이름·구분·상세구분·결과단위·원문번호·출처·소유·파일 = 파일 값 | 1,354 전수 | 어긋남 0 · 빠지거나 남는 키 0 |
| ③ 거름(구분·상세구분 조합 전부 · 막힘 0/1) | 전부 | 어긋남 0 |
| ② 고친 척한 뒤 다시 센 값 = 캐시 없이 전부 새로 센 값 | 아래 | 어긋남 0 · **덜 센 경우 0** |
| ④ 조합 목록 = 조합 줄마다 새로 검사한 값 | 조합 1줄(견본) + 변형 | 어긋남 0 |
② 시나리오(모두 전수 대조): 부르는 로직에 입력 추가(불리는 로직 41개 중 25개 뽑아) · 로직 줄 삭제 · 이름만 바꿈 · 로직을 다른 파일로 옮김 · 호표에 로직 호출 새로 추가 → 그 피호출 로직을 고침(새 간선도 다시 셈) · 요소·표 파일 8개(계수·소요량·요율) 고침 · 요소 줄 삭제 둘(인력 LB000014 → 로직 31개가 막힘으로 바뀜 · 재료 MP000082 → 1개).
④ 변형: 담은 로직에 입력 추가(막힘 0 유지) · 담은 로직 삭제(막힘 1) · 조합 줄 추가 · 조합 비움.
## 어긋남은 아니나 알아 둘 것
1. **파일 단위로 다시 셈** — 로직 하나를 고치면 그 파일 줄 전부를 다시 셈. 08장 건설기계(462줄)의 로직 5개는 다시 센 수가 462 인데 꼭 필요한 것은 12~138줄. 값은 맞고 덜 세지 않음 — 그저 더 셈(0.1초대 아님·초 단위 아님, 저장 뒤 첫 목록에서만).
2. **같은 크기 · 같은 시각 고침은 못 알아챔** — 파일 자국(시각·크기)이 그대로면 옛 값이 남음(시험: 글자 하나를 같은 크기로 바꾸고 시각을 되돌림 → 목록 이름이 옛것). 저장 길은 `stale` 로 알려 주므로 안 겪음 · 손으로 파일을 고치고 시각까지 되돌리는 경우만 해당.
3. 정본에 막힌 로직이 0 이라 「같은 값」 판정은 막힘이 있는 경우를 고침 시나리오(로직 31개가 막힘으로 바뀜 등)로 보강해 확인.
시험 코드는 `tmp/` 임시(git 밖) — 다시 하려면 `test_m01_cache.py` 에 시나리오를 얹을 것.
@@ -39,3 +39,6 @@ ORCA · 포트 8006/5179 · 넓은 화면 928px · 좁은 화면 390px(iframe).
3. 넓은 표(요율 · 기계 · 재료)는 390px에서 안쪽 스크롤 — 열 줄이기 없음.
4. 일위대가 조합 빈 화면.
5. 시험 흔적 없음(값 안 바꿈).
## 고친 뒤
- 재료 처음 펼침 : 「재료 · 자재품목」 30,592줄 목록이 바로 열림. 좁은 화면(600px 이하) 표 위에 「표가 넓음 — 옆으로 밀어서 볼 것」 한 줄(요율 · 소요량 확인) · 가로 스크롤 유지, 넘침 0. 자재품목 612쪽은 찾기 칸이 있어 그대로 둠.
@@ -36,3 +36,58 @@
3. 「로직 개선 시험」 은 같은 길을 그대로 쓰므로 1 · 2 를 고치면 같이 빨라짐.
시험 흔적 없음(어떤 파일도 안 고침 · 프론트 개발서버 재시작 1회는 화면이 빌드 오류로 안 뜨던 것을 되살리려 한 것 — 조합 화면 파일이 다른 창에서 편집 중이던 자국으로 보임).
## 고친 뒤 (일감 32)
잰 자리 = 이 창(랩탑 sub_laptop_1) · 임시 사본 폴더 · `TestClient` 로 같은 길을 부름. 데스크탑은 같은 길이 2배쯤 느렸음(위 표 6.0초 = 여기 2.5초).
| 길 | 앞 | 뒤 |
|---|---|---|
| `/api/m01/logics` 켠 뒤 첫 번 | 2.5초 | 3.4초(마스터 한 번 읽기 + 1,354줄 한 번 세기 · **딱 한 번만**) |
| `/api/m01/logics` 그 다음부터 | 2.5초(매번) | **0.02초** |
| `/api/m01/combos` | 0.3초(데스크탑 1.6초) | **0.01초** |
| 로직 저장 직후 목록 | 2.5초 | **0.06초** |
- 요청마다 마스터를 새로 읽던 것을 한 번 읽어 두고, 파일 자국(시각·크기)이 바뀐 파일만 다시 읽음(`M01_MasterData_Store_Cache`).
- 목록은 검사를 돌리지 않음 — 로직 막힘을 미리 세어 두고 씀. 요소·표가 바뀌면 모든 로직을, 로직 파일이 바뀌면 그 파일과 그 로직을 부르던 줄만 다시 셈.
- 저장한 쪽이 고친 파일 이름을 알려 주므로 저장 직후 목록에 바로 비침(같은 시각 틱이어도 안 놓침).
- 막힘 거름(`blocked=0·1`)·구분·상세구분·찾기 결과와 줄 내용은 그대로 — 시험 `resources/tester/test_m01_cache.py` 다섯이 줄마다 검사한 값과 맞댐.
- 남은 늦은 자리(이 일감 밖) — **저장 자체가 6.7초**: `check_saved` 가 저장 앞뒤로 1,354줄을 다 검사함. 켠 뒤 첫 목록 3.4초도 서버가 뜰 때 미리 한 번 읽어 두면 없앨 수 있음(서버 시동 자리라 이 창 담당 밖).
- 시험 — `test_m01_*` · `test_masterdata_*` 195 통과 · 4 실패. 실패 넷은 모두 `test_m01_combo.py`(정본 조합 파일이 빈 채라고 보는 옛 기대값 — 일감 31 이 견본 조합 `UA000001` 을 정본에 넣어 어긋남) · 이 고침과 무관(첫 실패는 서버를 거치지 않고 정본 파일만 읽음). `check_master` 틀 0 · 본문 0 · 로직 0 · 조합 0 · 단위 14.
## 고친 뒤 2 (일감 33)
남은 늦음 둘 — 잰 자리는 위와 같음(이 창 · 사본 폴더 · `TestClient`).
| 길 | 앞 | 뒤 |
|---|---|---|
| 로직 한 줄 저장(`POST /save`) | 6.8초 | **0.8초** |
| 켠 뒤 첫 목록 | 3.2초 | **0.03초**(미리 읽기 2.7초는 뒤에서 · 기다리지 않음) |
- **저장 검사 좁힘** — 고친 줄과 **그 줄을 부르던 줄**만 검사. 안 보는 줄이 부르는 키는 목록이 미리 세어 둔 것을 그대로 씀(돌고 도는 길 찾기는 그대로 전체 그림으로 봄). 로직 줄만 고쳤으면 품셈재료 연결·인력 준용 검사(`check_links`)도 건너뜀 — 로직 줄이 못 건드리는 자리. 저장 검사(`check_saved`)는 M01 쪽(`_Store_Cache`)으로 옮김 — 좁히는 값이 거기 있고 `check_master` 가 700줄에 닿아서.
- 로직 밖 파일(요소 · 표 · 조합)이 섞인 저장은 어느 로직이 흔들릴지 모르므로 **예전처럼 전부 검사**(그 자리는 그대로 6.8초). 마스터 전체 검사는 `check_master` 몫.
- **미리 읽기** — M01 라우터가 뜰 때 뒤에서 한 번 읽어 둠(`cache.warm` · 데몬 실). 시동을 막지 않고, 시험은 사본 폴더를 쓰므로 건너뜀.
- 저장 뒤에도 잡히는지 — 견본 넷이 모두 422 로 막힘: 없는 로직 키(GC999999) · 없는 인력 요소 키(LB999999) · 돌고 도는 참조 · 고친 줄을 **다른 파일에서** 부르던 줄이 깨짐(입력 하나 더함). 시험 `resources/tester/test_m01_cache.py` 아홉(넷이 이번 것).
- 단위 경고(`check_units`)는 애초부터 저장 검사가 아니라 `check_master 단위` 몫 — 14건 그대로.
- 남은 늦은 자리 — 저장 0.8초 가운데 0.6초는 마스터를 두 번(고치기 전·후) 새로 읽는 것. **요소 파일 저장은 그대로 7.0초**(인력 한 줄 실측): 요소를 가리키는 로직을 키 글자로만 찾으면 원문번호로 가리키는 자리를 놓쳐 저장 검사에 구멍이 나므로 좁히지 않음 — 좁히려면 「요소를 부르는 로직」 지도부터 만들어야 함.
## 고친 뒤 3 (일감 33 — 요소 저장 7초)
요소·표를 한 줄 고쳐도 로직 1,354 줄을 다 검사하던 자리. 잰 자리는 위와 같음.
| 길 | 앞 | 뒤 |
|---|---|---|
| 인력 한 줄 저장 | 7.0초 | **0.9초** |
| 자재품목 한 줄 저장 | 7.2초 | **2.0초** |
| 자재품목 저장 뒤 목록 | 2.5초 | **0.45초** |
| 소요량 표 한 줄 저장 | 7초쯤(인력과 같은 길 · 따로 안 쟀음) | **1.7초** |
| 로직 한 줄 저장 | 0.8초 | 0.7초 |
| 켠 뒤 첫 목록 | 3.4초 | **1.6초**(미리 읽기 1.0초 · 뒤에서 하므로 기다리지 않음) |
- **어느 로직이 무엇을 보는지 지도** — 로직 줄을 셀 때 `Master.get` 을 덧옷(`_Watch`)으로 감싸 그 줄이 본 자리를 모아 둠(키 · 「ID:원문번호」 · 없는 키를 물은 것까지). 재료 고르기가 있는 줄은 자재품목 묶음 통째(「#MT」) — 후보를 그 안에서 고르므로. 지도는 막힘과 같은 자리에 같은 방식으로 갱신됨(파일 자국이 바뀐 것만).
- **저장** — 그 지도로 흔들리는 줄만 검사: 고친 요소의 키 · 원문번호(고치기 전·후 둘 다) · 지운 줄 · 자재품목이면 묶음 통째. 로직 줄 고침은 앞서대로 고친 줄과 그 줄을 부르던 줄. 요소를 고친 저장은 연결·준용 검사(`check_links`)를 그대로 돌림.
- **저장 뒤 목록** — 고친 쪽이 흔들린 자리를 알려 주므로(`stale(names, marks)`) 그 자리를 보던 줄만 다시 셈. 다른 창이 고친 파일이면 무엇이 흔들렸는지 모르므로 예전처럼 통째로 다시 셈.
- **자재품목을 「구분」 으로 미리 갈라 둠**(`master_material.by_class`) — 고르기 후보를 3만 줄에서 훑던 것을 그 구분 안에서만. 저장·목록·`check_master 로직`(2.1초)·`단위`(1.5초)가 함께 빨라짐. 가른 차례는 파일 차례 그대로라 고르는 줄은 바뀌지 않음.
- **전수 확인** — 요소·표 파일 90 개마다 그 파일 줄을 통째로 비운 뒤 로직 1,354 줄을 모두 다시 검사해, 결과가 달라진 줄이 지도가 고른 줄 안에 드는지 봄: **지도 밖 0**(모든 파일에서 「지도 = 달라진 줄」 이 정확히 같음). 지도 한 줄이 보는 자리는 가운데 4 곳 · 가장 많은 170 곳 · 고르기를 쓰는 줄 189.
- 시험 — `resources/tester/test_m01_cache.py` 열둘(셋이 이번 것: 쓰이는 요소를 지우면 저장이 막힘 · 요소를 고쳐 저장한 뒤 막힘 표시가 줄마다 검사한 것과 같음 · 인력 줄을 비운 전수 대조가 지도 안에 듦).
- 남은 늦은 자리 — 자재품목 저장 2.0초의 대부분은 고르기 쓰는 로직 189 줄을 저장 앞뒤로 두 번 검사하는 것 · 마스터를 두 번 새로 읽는 0.6초.
+43 -10
View File
@@ -1,4 +1,4 @@
# 밤 작업 요약 (2026-09-21 저녁 ~ 09-22 새벽)
# 밤 작업 요약 (2026-09-21 저녁 ~ 09-22 아침)
여섯 창이 한 일 · 사용자가 아침에 읽는 용도. 값·코드는 이 문서에서 안 고침. 근거 = `ref/` 검증 문서 이름.
@@ -10,13 +10,33 @@
- 알약 모달 — 호표 줄을 누르면 뜨는 창. 고른 자재·표 줄을 강조.
- 일위대가 조합 컨테이너 — 로직 여러 개를 담고 미리 보기 합계를 봄. 수량·계산은 저장 안 됨. (`_검증_조합.md` · `_검증_조합_화면.md`)
- 이름 바뀜 — 자재 이름을 고르기 조건으로 잡는 방식으로 바뀜(변수 참조 20줄 이관). (`_검증_변수참조.md`)
- 재료 펼치면 자재품목 목록이 바로 열림 — 처음 펼칠 때 빈 화면으로 기다리던 것을 고침.
- 좁은 화면에서 넓은 표가 잘리면 안내 한 줄이 뜸.
- 화면 글 다듬음 — 「자재」 → 「재료」 따위로 이름을 맞춤.
- 견본 조합 `UA000001` 이 이미 들어 있음 — 이름에 「견본」 표시 · 로직 셋(GF000219 · GF000119 · GF000137) 담김 · 바로 열어 볼 수 있음. 필요 없으면 지워도 됨.
**눌러 볼 차례 (세 줄)**
1. 로직 화면에서 13-4-1 · 12-4 · 12-17-1 열어 컨테이너 넷과 호표 세 묶음을 훑음.
2. 호표 줄을 눌러 알약 모달이 뜨고 줄이 강조되는지 봄.
3. 조합 컨테이너에서 조합 → 로직 셋 담기 → 미리 보기 합계 → 저장 → 다시 열기.
3. 조합 컨테이너에서 견본 조합 `UA000001` 을 열어 미리 보기 합계를 봄 → 새 조합 하나 만들어 로직 셋 담기 → 저장 → 다시 열기.
## ② 데이터가 채워진 정도
## ② 빨라진 것 (`_검증_화면늦음.md` 「고친 뒤」)
로직 목록을 부르는 길이 가장 느렸음(옛 6초). 마스터를 매번 새로 읽던 것을 한 번 읽어 두고 바뀐 파일만 다시 읽게 고침.
| 길 | 앞 | 뒤 |
|---|---|---|
| 로직 목록 켠 뒤 첫 번 | 3.2초 | **0.03초**(서버가 뜰 때 미리 읽어 둠) |
| 로직 목록 그 다음부터 | 2.5초 | **0.02초** |
| 조합 목록 | 0.3초 | **0.01초** |
| 로직 저장 직후 목록 | 2.5초 | **0.06초** |
| 로직 한 줄 저장 | 6.8초 | **0.8초** |
(잰 자리 = 랩탑 · 데스크탑은 같은 길이 2배쯤 느려 앞이 6초로 보였음.)
값이 그대로인지 전수로 맞춰 봄(`_검증_목록캐시.md`) — 로직 1,354줄 · 조합 · 고친 척한 경우 모두 어긋남 0.
**남은 것**: 인력·재료 같은 요소 파일 저장은 아직 7초(고치는 중) · 로직 저장의 0.8초 가운데 0.6초는 파일 두 번 읽기. (`_검증_화면늦음.md`)
## ③ 데이터가 채워진 정도
| 항목 | 전 → 후 | 남은 것 |
|---|---|---|
@@ -27,19 +47,32 @@
근거: `_검증_관급_가까운줄.md` · `_남은_옛재료줄.md` · `_없는_재료.md`.
## 검증 수치 (`_마감_수치.md` · `_검증_3장_마감.md`)
## 검증 수치 (`_마감_수치.md` · `_검증_3장_마감.md`)
| 항목 | 결과 |
|---|---|
| 시험(`test_m01_*` + `test_masterdata_*`) | 190 통과 · 실패 0 |
| 시험(`test_m01_*` + `test_masterdata_*`) | 190 통과 → 새벽 195 통과 · 4 실패(견본 조합 탓) → 조합 시험을 고쳐 조합 + 이웃 여섯 파일 **100 통과 · 실패 0** |
| `check_master` 틀 · 로직 · 조합 | 0 · 0 · 0건 |
| `check_master` 본문 | 2건(계수 CC000337 · CC000074 결손) |
| `check_master` 본문 | **0건**(계수 결손 둘 메워짐) |
| 계수 표 새로 올림 | CC000338 발생재 공제율 · CC000339~340 강관배관 부자재율(일반업무용 · 병원) |
| 일괄 시험 계산 | 통과 1,291 · 멈춤 63(자료 비어서 멈춤 · 화면 탓 아님) |
| 단위 경고 | 14건 |
| 줄 수 | 로직 1,354 · 자재품목 30,592 · 기계 654 · 인력 378 · 품셈재료 363 · 소요량+계수 3,030 · 조합 0 |
| 줄 수 | 로직 1,354 · 자재품목 30,592 · 기계 654 · 인력 378 · 품셈재료 363 · 소요량+계수 3,030 · 조합 1(견본) |
밤새 새로 밝힌 어긋남(고칠 것): 조합 `메모`·`이름` 칸이 글자 아닌 값도 저장됨(`_검증_조합.md`) · 3장 줄 이름 글자 2건(`_검증_3장_마감.md`).
고칠 것으로 남은 어긋남: 조합 `메모`·`이름` 칸이 글자 아닌 값도 받는 점(`_검증_조합.md` · 시험은 이미 마련됨) · 단가 비어 멈춘 로직 63(`_단가_빈로직.md` · 자료가 채워져야 풀림).
## 사용자가 정할 것
## 사용자가 정할 것
PLAN 6장을 봄 — 다시 적지 않음. 관급 쪽 상세는 `_확정거리_관급.md`.
PLAN 6장은 이 창의 PLAN.md 에 없어 **PLAN 1-3 에 적음(이 창 PLAN.md 는 git 밖 파일이라 여기에도 옮겨 둠)** — 다시 적지 않음. 관급 쪽 상세는 `_확정거리_관급.md`.
새로 생긴 것 둘:
- 「단가산출 상세」 대 「호표」 — 화면에서 어느 말을 쓸지 정함.
- 견본 조합 `UA000001` — 계속 둘지 지울지 정함.
## ⑥ 아침에 눌러 볼 차례
1. 로그인함.
2. 마스터 데이터 화면을 엶.
3. 단가산출 로직에서 13-4-1 을 열어 컨테이너와 호표 세 묶음을 봄.
4. 로직 개선 시험에서 같은 로직을 열어 컨테이너 넷 · 텍스트 수식 두 칸을 보고, 호표 줄을 눌러 알약 모달이 뜨는지 봄.
5. 일위대가 조합에서 견본 조합 `UA000001` 을 열고 미리 보기 합계를 봄.