"비즈니스 로직이 버튼 안에 살면, 버튼을 절대 못 바꿔. domain 을 view 밖에 두면, view 가 교체 가능해져."
편안한 실수
UI 짓는 가장 빠른 방법은 로직을 쓰이는 바로 그 자리에 두는 거야: candidate 를 보여주는 컴포넌트가 그걸 fetch 도 하고, lineage 도 추적하고, session 에 어떻게 binding 되는지도 알아. 작동하고, 출하되고, 네 domain 전체를 현재 view framework 에 조용히 용접해. 다른 view 를 원하는 날 — native renderer, 리디자인, 뭐든 — domain 로직이 버리려는 컴포넌트에 엉켜있는 걸 발견해.
Domain core vs View layer
규율은 하나처럼 느껴지는 두 가지를 분리해. domain core 는 앱이 알고 하는 것: workspace 상태, 생성 lineage, 포토샵 session binding, document 모델. view layer 는 앱이 어떻게 보이고 조작되는지: 컴포넌트, 레이아웃, 상호작용. domain core 는 view layer 완전 밖에 살아야 해 — 컴포넌트 안 X, view framework 에 의존 X, 어떻게 표시되는지 모름.
왜 이 특정 앱이 이게 필요한지
이건 그 자체를 위한 추상적 future-proofing 이 아니야 — 지평선에 구체적인 둘째 view 가 있어. 계획이 캔버스를 위한 미래 native 렌더링 레이어 옵션을 명시적으로 보존해, 둘째 캔버스가 언젠가 무거운 native renderer 가 되면. 그 미래 view 는 domain core 가 현재 것에 절대 의존 안 했어야만 domain core 를 재사용할 수 있어. 분리가 알려진, 계획된 미래를 재작성 대신 싸게 유지하는 거야.
테스트: view 스왑에서 뭐가 살아남아?
실제로 분리했는지 확인하는 깨끗한 방법이 있어. 내일 view layer 전체를 삭제하고 다른 framework 로 새로 쓴다고 상상해. 뭐가 살아남아? workspace 상태, lineage 기록, session binding 이 다 안 건드려지고 살아남으면 — 삭제된 컴포넌트에 절대 안 살았으니까 — 분리한 거야. view 삭제가 domain 로직을 같이 데려가면, 로직이 틀린 데 있었던 거야. 사고 실험이 감사야.