렌더 입자성 캠페인 Phase 4-1 — 토스트 바인딩 (루트가 구독을 완전히 내려놓는 첫 화면)
통합 기록(형식 표준, Phase 현황·결과·남은 것): 2026-08-24-render-granularity.md
- 날짜: 2026-08-23 (Phase 3 #617 위에 스택, 오너 결정 D2 (나))
- 목표: 토스트 표시·자동 소멸이 조립 루트(useBarbelicController) 전체를 다시 실행하던 구조를 없앤다. 토스트는 "루트가 값을 렌더에 쓰지 않고 커맨드(showToast·clearToast)만 소유하는" 가장 작은 군집이라, Phase 4 확산 후보 중 가장 먼저·가장 깨끗하게 루트 구독을 뗄 수 있다.
바뀐 것
| 항목 | 파일 | 내용 |
|---|---|---|
| 바인딩 | features/toast/ToastBinding.tsx (신설) | useOwnerStores().toast를 uSES로 구독해 LgToast(ui/shared, 무접촉)에 같은 props를 준다 |
| 어댑터 | controllers/toastController.ts | 구독 제거 — 커맨드(showToast·clearToast)만 반환. ToastRenderContext 타입 소멸 |
| 조립 루트 | appController.tsx | renderCtx에서 toast 키 은퇴(165 → 164). 루트는 토스트 스토어를 구독하지 않는다 |
| 셸 | mobileApp.tsx · desktopApp.tsx | <LgToast toast={toast} /> → <ToastBinding />, ctx 타입에서 ToastRenderContext 제거 |
| 계측 | app.tsx · e2e/profile/renderGranularity.profile.mjs | dev 전용 손잡이 window.__LG_PROFILE_STORES__(오너 세트) + 시나리오 ④ 토스트 표시·소멸 |
검증
npm run check1807/1807 ·check:unused·check:lint(억제 10 유지).- 재조준 1:
backgroundTokens"platform shell components stay split" — 양쪽 셸의 sharedShell import 단언을 ToastBinding import + 바인딩의 sharedShell import로(pending-changes 기존 항목에 사유 병합).
전 → 후 (Phase 0-2 계측기 · 개발 React · CPU 4×)
| 상호작용 | 루트 커밋 전 → 후 | 커밋 전 → 후 | 커밋 시간 합 전 → 후 |
|---|---|---|---|
| ④ 토스트 표시+소멸 (×3) | 1 → 0 | 1 → 1 | 31~70 ms → 0.6~1.3 ms |
토스트 한 번이 루트 전체(약 1,900줄 훅 + 셸 트리 재diff)를 다시 실행하던 비용이 바인딩 한 컴포넌트 재렌더로 줄었다. 토스트는 모든 저장·삭제·오류 피드백에 따라붙으므로 시나리오 공통 효과다.
함정(재사용)
- 전후 비교를 위해
git stash push -- <파일>후 계측하고git stash pop했더니 인덱스 전체가 "삭제됨"으로 올라갔다(작업 트리 파일은 온전).git reset(mixed)으로 인덱스만 HEAD로 되돌려 복구. 이 워크트리에서 부분 stash는 피하고, 기준선은git show HEAD:파일로 따로 떠서 잰다.