acad-tread — 샘플 트리 CRUD(실 DB 반영) + 백업·수정이력 + 모덜리스 (2026-08-06)
페페 지시 ①"트리에 CRUD 기능 추가해줘. 실제 DB에도 반영할것이다. 다만 복구가 필요할 수 있으니 백업하고 수정이력 관리해줘." ②"트리 오픈시 입력/탐지 항목에서 타작업이 안된다. 락 걸지 말고 2개 창에서 모두 작업가능하게 해줘." 앞선 작업(트리 모달 신설) =
session-2026-08-06-group-input-tree-modal.md.
1. 착수 전에 확인한 것 (실측)
- 권한 —
imosadmin=dbo,sysadmin.poin_sample_group/poin_sample_item6종(INSERT/UPDATE/DELETE) 전부 1. 쓰기 없이HAS_PERMS_BY_NAME으로만 확인. - 스키마 —
group_no·item_no= IDENTITY(수동 채번 아님), PK 단일, FK·트리거 없음. 그래서 번호가 바뀌어도 참조가 깨지지 않는다(되돌리기 설계의 근거). - 🔑 그룹엔
remove_yn이 있고 품목엔 없다 → 삭제 방식이 갈린다(아래). - 컬럼 = 그룹(div/name/dimension/shape/join_div/display_order/comment/remove_yn) · 품목(group_no/item_name/thickness
float/width·height·total·edgeint/display_order/comment).
2. 무엇을 만들었나
트리 우클릭 = 편집(페페 택1: 우클릭 메뉴 + 편집창). 새 그룹 / 새 품목 / 수정 / 복제 / 삭제 + 수정 이력 / 새로고침. 품목 더블클릭 = 수정, F2·Del·F5.
- 그룹 편집창 = 구분(도어·EP·도장·오픈장) · 이름* · 규격 · 형상(일자/ㄱ자/T자/ㄷ자) · 조립(단품S/조립품D) · 순서 · 비고.
- 품목 편집창 = 품명 · 두께 · 가로 · 세로 · 수량 · 엣지 · 순서 · 비고. 빈칸 = NULL*, 숫자칸에 오타가 있으면 저장을 막는다(조용히 0으로 들어가는 사고 방지).
- 그룹 복제 = 품목까지 함께 복사(가장 흔한 실무 동작).
- 모든 쓰기 = 파라미터 바인딩(한글·인용부호 안전), 순서는 ①스냅샷 백업 → ②DB → ③이력 → ④트리 재조회.
삭제 정책 (스키마가 강제한 갈림)
| 방식 | 되돌리기 | |
|---|---|---|
| 그룹 | remove_yn=1 숨김 |
remove_yn=0 → 품목까지 그대로 복귀 |
| 품목 | 물리 DELETE(숨김 칸이 없다) | 이력의 before 로 새 item_no 재삽입 |
품목 되살리기에 IDENTITY_INSERT를 쓰지 않는다 — FK가 없어 번호가 바뀌어도 무해한데, 그 스위치는 테이블 잠금·권한·동시성 문제를 부른다.
백업·이력 (복구 경로)
- 위치 =
%LocalAppData%\MDCAD\sample_edit\(DLL 위치 무관 = 통합툴/개별설치 공통). - 백업 = 변경 직전마다
poin_sample_<타임스탬프>.json전체 스냅샷(삭제행 포함 원본 그대로, 실측 58KB). 200개 넘으면 오래된 것부터 정리. - 이력 =
sample_history.jsonl1줄 = 1변경(ts/op/table/key/desc/before/after/backup/user/host/undone). [수정 이력] 창 → 줄 선택 → [되돌리기](되돌리기 자체도 백업+이력op=undo, 원본 줄엔undone표식을 남겨 두 번 되돌리는 사고를 막는다). - 🔑 DB에 이력 테이블을 만들지 않았다 — imos 운영 스키마를 건드리면 poincad(VB)까지 영향 검토가 붙는다. 파일 이력으로 요구(백업·수정이력·복구)가 전부 충족된다.
모덜리스 (페페 지시 ②)
ShowDialog → AcadApp.ShowModelessDialog(form)(실패 시 Show() 폴백). 트리를 열어둔 채 입력/탐지 탭·캐드 작업 계속. 창은 하나만(다시 누르면 기존 창을 앞으로 — 두 개가 열리면 어느 쪽이 최신인지 알 수 없다). 모덜리스라 [+추가] 콜백에서 _working을 매번 다시 확인한다(그 사이 작업이 시작됐을 수 있다). StartPosition은 CenterScreen(모덜리스는 부모 기준 센터가 안 잡힌다).
3. 검증
- 오프라인 자가검증 37항목 ALL PASS (
_verify/SampleTreeCheck.csproj, AutoCAD·DB 없이) - 기존 트리 17 + 우클릭 메뉴 4(구분 노드에선 삭제·수정 비활성 / 그룹·품목에서 라벨이 대상에 맞게 바뀜 / 품목 선택 시 부모 그룹 인식) + 편집창 6(입력칸 개수·겹침·창 밖 검사·값 왕복) + 백업·이력 10(사전 왕복, 한글 desc 왕복, before 원본 복원, DiffText, undone 표식 영속, 숫자칸 검증).
- 🔴 이 검증이 실제 버그를 잡았다 — 폰트를 10pt로 키우며 비고 칸이 [저장] 버튼과 16px 겹쳐 있었다(캡처로는 안 보였다.
DrawToBitmap이 TextBox를 안 그린다). 창 높이 268→296. - 실 DB E2E 10항목 ALL PASS (
--dbtest) — 백업 → 그룹 INSERT → 품목 INSERT → 재조회 일치(두께 4.5 유지·한글 무결) → UPDATE(빈칸→NULL) → DELETE → 되돌리기(새 번호 재삽입) → 그룹 숨김/되살리기 → 테스트 흔적 물리 제거. 실행 후 DB = 116그룹 / 233품목(작업 전과 동일),ZZ흔적 0. - 정리용
PoinDb.DeleteTestGroup(no, tag)은group_no=@no AND group_name LIKE @tag이중 가드라 운영 행에는 걸리지 않는다. ⚠ 태그에_를 쓰면 안 된다(LIKE 한 글자 와일드카드). - 캡처 육안 — 트리 창(수정 이력 버튼·안내문구), 이력 창(되돌리기 목록 실데이터). 🔑 글리프 없는 이모지는 □로 떨어진다(
🕘) → 메뉴·버튼은 텍스트 + 검증된 기호(+,↩)만. - 빌드 0에러 174,080B, 3곳 MD5
4C8A7556일치 + 통합툴 zip 재생성(10항목 135,725B).
4. 남은 것 (페페 몫)
- 사무실 PC 배포 —
C:\dev\pcadtools-plugin\pcadtools-installer-2026-08-06.zip→ AutoCAD 종료 →install.bat→ 재시작. - 육안 1회 — 트리 열고 ①팔레트·캐드가 안 잠기는지 ②우클릭 → 새 품목/수정/삭제 ③[수정 이력] → 되돌리기.
- 실사용 중 삭제·되돌리기가 잦아지면 이력 창에 날짜 필터·검색을 붙이는 게 다음 후보(지금은 최근 300건 단순 목록).