크라우니 오피스 시트 punch #4 — 시트별 독립 데이터모델 (다중시트)
개요
spec/시트기능-판정표.md가 지적한 "시트탭 전환(예산/인건비/차트)" 항목 — 탭 전환(상태·
스타일)은 실작동하나 "예산"/"인건비" 두 탭이 100% 동일한(byte-identical) 그리드 데이터를
표시하는 기만적 UX를 해소. punch #1(수식엔진)·#2(셀 데이터모델)·#3(서식)에 이어지는 시트
punch #4. 앱 번들(index.html, ModuleSheets.dc.html 등) 무수정 — 기존 §19(crownyBridge.js)
몽키패치 방식을 그대로 확장.
배선 방식
- 데이터 저장소 일반화: 단일
this.state.vals/this.state.format(punch #1~#3)을
this.state.sheets{시트명: {vals, format}} 다중 구조로 교체(CrownyDoc 시트엔진.한선의
this.sheets[i].data/switchSheet 패턴 이식). "예산"·"인건비" 각각 독립 시드:
예산=기존 데모(항목/분류/3분기/4분기 예산표), 인건비=별도 샘플(이름/직급/기본급/수당
직원 3인) — 열 의미부터 다르게 해 "동일 데이터 아님"이 헤더만 봐도 드러나게 했다.
- 탭 전환 = 뷰 전환 + 데이터 스왑 분리:
state.sheet(탭 라벨, 스타일/isChart 분기용)와
state.dataSheet(활성 데이터시트, "마지막으로 선택된 예산/인건비") 두 state로 분리.
"예산"/"인건비" 탭 클릭은 {sheet:label, dataSheet:label}을 함께 갱신하지만, "차트" 탭은
뷰모드일 뿐이라 {sheet:'차트'}만 바꾸고 dataSheet는 그대로 둔다 — 차트 진입/이탈이
활성 데이터시트 선택을 바꾸지 않는다(판정표 "차트는 뷰모드라 별개" 그대로 반영).
- 수식/서식 시트 스코프:
cellsRaw/cellFmt는 매 렌더마다this.state.sheets[dataSheet]
makeEvaluator(cellsRaw)가 그 시트 셀만 참조/평가하므로 수식이 시트 간
누수 없이 그 시트 데이터에만 작동한다. fx바 편집(fxKey)과 ₩/%/.00 서식 버튼 핸들러도
불변 갱신(newSheets[dataSheetName] = {...})으로 활성 시트의 vals/format만 교체하고
다른 시트 저장소는 손대지 않는다(서식 핸들러는 렌더 시 캐시해둔
self.__activeDataSheetName으로 활성 시트를 식별).
- 새 시트 추가(+): 템플릿에 "+" 탭이 시각적으로 존재하지만(CDP 실측: `document.body.
에 "예산\n인건비\n차트\n+" 확인) sheetTabs`(우리 patchedRenderVals의 반환
배열)와 별개의 정적 요소라 onClick 바인딩이 없다 — 과제 지시대로 "없으면 범위 밖" 처리.
- 한선씨 정본:
bundle/office/bridge/시트다중.한선— 다중시트 저장소 조회/쓰기(불변
/switchSheet`)의 다중시트 스왑 규칙을 한선씨 정수/문자열 연산으로
이식(원본이 JS를 "생성"하는 프로그램이라 그대로 가져올 수 없어 시트셀.한선·시트서식.한선과
동일 관행으로 재작성). hanseonc_high 컴파일 + crownyc run 자가검증 12/12 PASS.실측 결과 (CDP :9333, headless Chrome, win/cdp평가.js + 파일-인자 변형 스크립트)
- before: "예산" 탭, C2=
4,200,000선택 → fx바로9999999입력 → Enter → 그리드
9,999,999로 갱신 + 연쇄 재계산 확인(E2 14,799,999, C합계 19,699,999, F열 42%).
- 탭 전환 → byte-diff: "인건비" 탭 클릭 →
document.body.innerText전체가 예산 탭과
4,500,000 — 예산의 변경값 9,999,999와도, 원래 예산 시드값 4,200,000과도 다름).
diff 실행 결과 두 스냅샷이 다름(exit 1) 확인.
- 재전환 → 변경값 유지: "예산" 탭으로 복귀 → C2
9,999,999그대로 유지(스왑이 값을
- 수식 시트 스코프: 인건비 탭에서
=SUM(C2:C4)등 합계 행이 인건비 자체 데이터
11,500,000=4,500,000+3,800,000+3,200,000, D합계
1,000,000, E합계 12,500,000) — 예산 시트의 값이 전혀 섞이지 않음.
- 서식 시트 스코프: 예산 탭 C2에 ₩ 통화 버튼 클릭 →
state.sheets['예산'].format에만
{C2:{type:'currency'}} 기록, state.sheets['인건비'].format은 {} 그대로(격리 확인).
화면도 예산 탭은 ₩9,999,999, 인건비 탭 전환 시 서식 없이 4,500,000(₩ 없음) 확인.
예산 탭으로 되돌아오면 ₩9,999,999 서식도 유지(탭 왕복에도 서식 보존).
- 차트 뷰 분리: "차트" 탭 클릭 후
state.dataSheet가 여전히'예산'으로 불변(차트
state.sheet만 '차트'로 전환.회귀
- 문서 회귀:
회귀실행.sh27/27 PASS(시트 변경이 ModuleDocs를 건드리지 않음, 이 실행이
- 시트 punch #1/#2/#3 회귀: 새 다중시트 모델 위에서 재확인 — G5에 `=VLOOKUP("마케팅",
입력 → 6,500,000` 정확히 조회(수식엔진 회귀 없음), E3(14,500,000>10,000,000)
조건부 서식 배경 rgb(251,239,231)+글자색 rgb(192,91,46) 그대로 적용(서식엔진 회귀
없음), ₩ 통화 버튼도 정상 토글(포맷 버튼 회귀 없음).
- CrownyAI 3초 생존:
./CrownyAI실행 후 15초+ 생존(크래시 없음, 정상 종료 kill로
관련 파일
/Users/ef/crownybrowser/bundle/office/bridge/crownyBridge.js§19 확장(seedBudgetSheet/
/Users/ef/crownybrowser/bundle/office/bridge/시트다중.한선(신규, 자체시험 12/12)/Users/ef/crownybrowser/spec/시트기능-판정표.md(배경 판정표, 이 punch의 근거)/Users/ef/crownybrowser/spec/문서-회귀리포트.md(27/27 최신 갱신)/Users/ef/CrownyDoc/한선씨/시트/시트엔진.한선(이식 원본 —this.sheets/switchSheet
잔여(범위 밖)
- 새 시트 추가(+): 템플릿에 정적 탭으로만 존재, onClick 없음 — 과제 지시대로 이
- 시트 간 참조(예: 예산 시트 수식에서 인건비 시트 셀 참조) — 과제 지시에서 명시적으로
- 정렬(sortDir)·선택(sel)·조건부서식 토글(cond)·함수도우미(helper) state는 시트별
- 시트탭 우클릭(이름변경/삭제/복제), 3개 초과 다중시트 — 판정표 원래 범위 밖 그대로 잔존.
크라우니코드
lookup HIT 0건 / MISS 0건(사전 검색 "다중시트"/"시트탭 전환"/"sheets 배열" 결과 없음) /
learn 1건(시트다중_독립시트스왑_4상판정, 시트다중.한선 전체 내용 등록)