Skip to content

렌더 입자성 캠페인 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.tsxrenderCtx에서 toast 키 은퇴(165 → 164). 루트는 토스트 스토어를 구독하지 않는다
mobileApp.tsx · desktopApp.tsx<LgToast toast={toast} /><ToastBinding />, ctx 타입에서 ToastRenderContext 제거
계측app.tsx · e2e/profile/renderGranularity.profile.mjsdev 전용 손잡이 window.__LG_PROFILE_STORES__(오너 세트) + 시나리오 ④ 토스트 표시·소멸

검증

  • npm run check 1807/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 → 01 → 131~70 ms → 0.6~1.3 ms

토스트 한 번이 루트 전체(약 1,900줄 훅 + 셸 트리 재diff)를 다시 실행하던 비용이 바인딩 한 컴포넌트 재렌더로 줄었다. 토스트는 모든 저장·삭제·오류 피드백에 따라붙으므로 시나리오 공통 효과다.

함정(재사용)

  • 전후 비교를 위해 git stash push -- <파일> 후 계측하고 git stash pop했더니 인덱스 전체가 "삭제됨"으로 올라갔다(작업 트리 파일은 온전). git reset(mixed)으로 인덱스만 HEAD로 되돌려 복구. 이 워크트리에서 부분 stash는 피하고, 기준선은 git show HEAD:파일로 따로 떠서 잰다.