← 목록
AI 2026-07-17 8KB 읽기 7분

크라우니 오피스 시트 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.
innerText에 "예산\n인건비\n차트\n+" 확인) sheetTabs`(우리 patchedRenderVals의 반환 배열)와 별개의 정적 요소라 onClick 바인딩이 없다 — 과제 지시대로 "없으면 범위 밖" 처리.
  • 한선씨 정본: bundle/office/bridge/시트다중.한선 — 다중시트 저장소 조회/쓰기(불변
갱신)/독립성 판정/시트전환(차트뷰 분리) 4개 함수, CrownyDoc 시트엔진.한선(`CrownySheet. prototype.sheets/switchSheet`)의 다중시트 스왑 규칙을 한선씨 정수/문자열 연산으로 이식(원본이 JS를 "생성"하는 프로그램이라 그대로 가져올 수 없어 시트셀.한선·시트서식.한선과 동일 관행으로 재작성). hanseonc_high 컴파일 + crownyc run 자가검증 12/12 PASS.

실측 결과 (CDP :9333, headless Chrome, win/cdp평가.js + 파일-인자 변형 스크립트)

  1. before: "예산" 탭, C2=4,200,000 선택 → fx바로 9999999 입력 → Enter → 그리드
9,999,999로 갱신 + 연쇄 재계산 확인(E2 14,799,999, C합계 19,699,999, F열 42%).
  1. 탭 전환 → byte-diff: "인건비" 탭 클릭 → document.body.innerText 전체가 예산 탭과
완전히 다름 확인(헤더부터 "이름/직급/기본급/수당" vs "항목/분류/3분기/4분기", C2= 4,500,000 — 예산의 변경값 9,999,999와도, 원래 예산 시드값 4,200,000과도 다름). diff 실행 결과 두 스냅샷이 다름(exit 1) 확인.
  1. 재전환 → 변경값 유지: "예산" 탭으로 복귀 → C2 9,999,999 그대로 유지(스왑이 값을
되돌리지 않음), 재계산 결과(E2/합계)도 동일하게 유지.
  1. 수식 시트 스코프: 인건비 탭에서 =SUM(C2:C4) 등 합계 행이 인건비 자체 데이터
기준으로 계산됨 확인(C합계 11,500,000=4,500,000+3,800,000+3,200,000, D합계 1,000,000, E합계 12,500,000) — 예산 시트의 값이 전혀 섞이지 않음.
  1. 서식 시트 스코프: 예산 탭 C2에 ₩ 통화 버튼 클릭 → state.sheets['예산'].format 에만
{C2:{type:'currency'}} 기록, state.sheets['인건비'].format{} 그대로(격리 확인). 화면도 예산 탭은 ₩9,999,999, 인건비 탭 전환 시 서식 없이 4,500,000(₩ 없음) 확인. 예산 탭으로 되돌아오면 ₩9,999,999 서식도 유지(탭 왕복에도 서식 보존).
  1. 차트 뷰 분리: "차트" 탭 클릭 후 state.dataSheet가 여전히 '예산'으로 불변(차트
진입이 활성 데이터시트를 안 바꿈) 확인, state.sheet'차트'로 전환.

회귀

  • 문서 회귀: 회귀실행.sh 27/27 PASS(시트 변경이 ModuleDocs를 건드리지 않음, 이 실행이
crownyBridge.js 갱신본을 새로 주입해 실행한 결과라 구문 오류 여부도 함께 검증됨).
  • 시트 punch #1/#2/#3 회귀: 새 다중시트 모델 위에서 재확인 — G5에 `=VLOOKUP("마케팅",
A2:F4,3) 입력 → 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/
seedPayrollSheet 시드 분리, patchedRenderVals의 sheets/dataSheet 조회, sheetTabs 클릭 분기, fxKey·₩/%/.00 핸들러의 불변 갱신, 약 3308~3860줄 구간)
  • /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 없음 — 과제 지시대로 이
punch 범위 밖(신규 시트 추가 로직 자체를 새로 설계해야 함, 판정표 우선순위 목록의 별도 항목).
  • 시트 간 참조(예: 예산 시트 수식에서 인건비 시트 셀 참조) — 과제 지시에서 명시적으로
"범위 밖"으로 지정.
  • 정렬(sortDir)·선택(sel)·조건부서식 토글(cond)·함수도우미(helper) state는 시트별
독립화하지 않음 — 과제 요건이 "셀값·수식·서식" 3종의 시트 스코프만 요구했고, 이들은 UI 상태(어느 셀이 선택돼 있는지 등)라 시트 전환 시 공유돼도 기만적 UX와 무관.
  • 시트탭 우클릭(이름변경/삭제/복제), 3개 초과 다중시트 — 판정표 원래 범위 밖 그대로 잔존.

크라우니코드

lookup HIT 0건 / MISS 0건(사전 검색 "다중시트"/"시트탭 전환"/"sheets 배열" 결과 없음) / learn 1건(시트다중_독립시트스왑_4상판정, 시트다중.한선 전체 내용 등록)