From 7bb11a5bf098f30285cc1da0eda4766e7e62ad30 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 10:15:42 +0900 Subject: [PATCH] =?UTF-8?q?knowledge(=EA=B2=80=EC=82=AC=EC=BD=94=EB=93=9C)?= =?UTF-8?q?:=20=EA=B2=80=EC=82=AC=EA=B0=80=20=EC=96=B4=EB=94=94=20?= =?UTF-8?q?=EC=9E=88=EB=82=98=20=EB=B6=84=EC=84=9D=20=E2=80=94=20=EB=A7=88?= =?UTF-8?q?=EC=8A=A4=ED=84=B0=20=ED=8B=80=C2=B7=EC=A0=80=EC=9E=A5=C2=B7?= =?UTF-8?q?=EC=9D=B4=EC=A4=91=EA=B3=84=EC=83=81=20=EA=B0=80=EB=93=9C=C2=B7?= =?UTF-8?q?=EC=8B=9C=ED=97=98=20=EB=84=B7=EC=9D=84=20=EA=B0=80=EB=A6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 물음(load_basis_missing 옮길 곳)에 답함. 지금 있는 검사 넷(마스터 틀 검사 check_master.py · M01 저장 검사 · B09 이중계상 가드 Guards.py · resources/tester 시험)을 언제 도는지로 가르고, load_basis_missing 의 10배·100배 검사와 같은 결의 검사는 없음을 확인. 옮길 자리 두 갈래 (새 마스터 JSON vs KnownGaps.py 같은 코드 상수)를 장단점만 적고 고르지 않음. --- .../master_data/ref/_분석_검사코드_어디에.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 resources/master_data/ref/_분석_검사코드_어디에.md diff --git a/resources/master_data/ref/_분석_검사코드_어디에.md b/resources/master_data/ref/_분석_검사코드_어디에.md new file mode 100644 index 00000000..0e473501 --- /dev/null +++ b/resources/master_data/ref/_분석_검사코드_어디에.md @@ -0,0 +1,43 @@ +# 분석 — 검사 코드가 어디에 있나 (사용자 물음) + +분석만 · 코드·데이터 안 고침. 「load_basis_missing() 을 옮겨야 하는데 다른 검사는 어디 있나」에 답함. + +## ① 지금 있는 검사 — 한자리에 모음 + +| 자리 | 파일 | 무엇을 검사 | 누가·언제 돌리나 | +|---|---|---|---| +| 마스터 틀 검사 | `resources/master_data/scripts/check_master.py` | 파일 이름·머리 칸·키 모양·같은 로직 두 번·조합 이름 겹침 같은 **마스터 파일 모양** | 사람이 명령줄로 손수 돌릴 때만(`python check_master.py 틀\|본문\|로직\|조합`) — 자동으로 안 돎 | +| 저장 검사(M01 서버) | `M01_MasterData/M01_MasterData_Store.py`(`save()`) → `M01_MasterData_Store_Cache.py`(`check_saved()`) | [저장] 누른 그 줄과 그 줄이 부르는·부름받는 줄만 좁혀서 **위 마스터 틀 검사를 재사용**(`check_master.check_form`·`check_logics`·`check_links`·`master_combo.check_all`) | 사람이 M01 화면에서 **[저장] 버튼 누를 때마다** 서버가 자동으로 돎. 걸리면 422 로 막고 저장 안 됨 | +| B09 이중계상 가드 | `B09_Estimation/B09_Estimation_Guards.py` | 할증 두 번·소운반 무대 단가 붙음·콘크리트 두 번 쪼갬·작업효율 두 곳 넣음 같은 **원가 계산 규칙 어김** | 프로그램이 **원가를 계산할 때마다**(화면이든 시험이든 그 계산 함수를 부르면 늘) 자동으로 돎. 걸리면 그 자리에서 멈춤(`DoubleCountError`) | +| B08 값 판정 | `B08_Quantity_Engine_Handoff_Boundaries.py` 등 | 수량 인계가 원가 쪽 경계를 넘었는지 | B08 이 수량을 만들 때 자동으로 판정만 하고, 실제로 **멈추는 건** 위 B09 가드(`check_handoff_boundaries`)에 목록을 넘겨서 | +| 화면 쪽 | (자체 검사 없음) | — | 서버가 400·422 로 돌려준 사유 글을 그대로 보여주기만 함. `UnitPriceBuild.unattached`·`component_gaps`(값이 못 붙은 줄)도 **막지 않고 화면에 드러내기만** 하는 안내이지 검사는 아님 | +| 시험 | `resources/tester/*.py` | 코드를 짠 사람이 만든 개별 사례(이 공종은 이 금액이 나와야 함 등) | **사람이 `pytest` 명령을 돌릴 때만** — 프로그램 스스로는 절대 안 돎(위 넷과 가장 다른 점) | + +## ② 언제 도는지 한 줄씩 + +- **check_master.py** — 사람이 도구를 손으로 돌릴 때만(개발 중 확인용). +- **M01 저장 검사** — 사람이 저장 버튼을 누르는 그 순간, 서버가 자동으로. +- **B09 이중계상 가드** — 사람 손 안 타고, 원가 계산 코드가 돌 때마다 자동으로(화면에서 견적을 열어도, 시험이 돌아도 같이 돎). +- **B08 값 판정** — 수량 인계가 만들어지는 계산 도중 자동으로(위 가드에 목록만 넘김, 그 자체로 멈추지 않음). +- **화면** — 스스로 검사 안 하고 서버 응답을 보여주기만. +- **시험(resources/tester)** — 사람이 `pytest` 명령을 줄 때만. + +## ③ load_basis_missing() 의 10배·100배 검사 — 쉬운 말 + +품셈 표 중에는 「이 값에 몇을 곱해야 하나」(예: 「10㎡당」·「100본당」 같은 기준수량)를 원문이 아예 안 적어 둔 표가 있음. 이걸 모르고 그냥 「1개당」으로 셈하면 실제보다 10배·100배 싸거나 비싸게 나옴(실제로 이런 사고가 있었음). `load_basis_missing()`은 「이 표는 그 기준을 못 찾았다」는 목록을 미리 갖고 있다가, 그 표를 쓰는 공종은 곱셈을 하지 않고 **금액을 아예 안 세워서** 틀린 값이 조용히 서는 것을 막음. + +**같은 결(기준수량이 아예 안 적힌 것)의 검사는 다른 데 없음** — 이게 유일함. 결은 다르지만 「막지 않고 알리기만 한다」는 태도가 비슷한 자리는 있음: +- `SUSPICIOUSLY_LOW_KRW`·`SUSPICIOUSLY_HIGH_KRW`(같은 파일 `B09_Estimation_UnitPrice.py` 83~88행) — 일위대가 총액이 100원 미만이거나 100만원을 넘으면 막지 않고 드러내기만 함. 재는 것은 「금액 크기가 수상함」이지 「기준수량이 없음」이 아님. +- `B09_Estimation_KnownGaps.py` — 공종코드별로 「이 값은 반쪽·이 사유로 못 실음」을 파이썬 코드 상수(딕셔너리)로 담아 화면에 드러냄. **모양이 load_basis_missing 과 가장 비슷함**(마스터 JSON 이 아니라 코드 상수로 「알려진 미결」을 들고 있음) — 다만 재는 대상은 다름(공종별 반쪽 값 vs 표별 기준수량 없음). + +결론 — 완전히 같은 검사를 옮겨 합칠 기존 자리는 없음. 옮긴다면 **자리(마스터 JSON이냐 코드 상수냐)를 새로 정하는 일**임. + +## ④ 옮긴다면 어디 — 두 갈래(고르지 않음) + +**갈래 A — 새 마스터 JSON으로(`resources/master_data/` 최상위, M01 이 관리)** +- 좋은 점 — 다른 마스터처럼 `_틀.md` 검사·`check_master.py` 관리를 받음, M01 화면에서 사람이 직접 편집 가능, `old/` 걷기에 안 걸림. +- 나쁜 점 — 이 데이터는 「표 하나가 있다/없다」는 부울 목록이라 인력·재료·기계·소요량·계수·환율·요율·로직 8장 어디에도 깔끔히 안 맞음 — 새 장을 하나 만들거나, 소요량표 항목마다 「밑수없음」 칸을 억지로 끼워야 함(구조를 건드림). + +**갈래 B — `B09_Estimation_KnownGaps.py` 같은 코드 상수 모듈로** +- 좋은 점 — 데이터 모양을 안 바꿔도 됨(지금 old/ JSON 목록을 파이썬 딕셔너리로 그대로 옮기면 끝), 이미 같은 성격의 선례(`KnownGaps.py`)가 있어 빠르고 간단. +- 나쁜 점 — 마스터DB 밖이라 지식DB 검사(`_틀.md`·`check_master.py`)의 관리를 못 받음, 「이 표가 왜 예외인지」 근거를 나중에 사람이 코드 주석에서 또 찾아야 함 — CLAUDE.md 의 「지식DB는 근거·후보 가이드」 원칙과는 조금 어긋남(값이 코드에 굳음).