"업무 로직이 버튼 안에 살면 버튼을 영영 못 바꿔. domain 을 view 밖에 꺼내 두면 그때부터 view 가 갈아 끼울 수 있는 게 돼."
편해서 저지르는 실수
UI 를 제일 빨리 짓는 방법은 로직을 쓰이는 자리에 바로 두는 거야. candidate 를 보여 주는 컴포넌트가 그걸 받아 오기도 하고, lineage 도 따라가고, session 에 어떻게 묶이는지도 알고. 잘 돌아가고, 출시도 되고, 그러면서 네 domain 전체를 지금 쓰는 view framework 에 조용히 용접해 버려. 다른 view 를 원하는 날 — native renderer 든 리디자인이든 — domain 로직이 버리려던 컴포넌트에 엉켜 있는 걸 발견하게 되지.
Domain core 와 View 층
규율은 하나처럼 느껴지는 두 가지를 갈라 놓는 거야. domain core 는 앱이 알고 하는 것들이야. workspace 상태, 생성 lineage, 포토샵 session 연결, document 모델. view 층 은 앱이 어떻게 보이고 어떻게 만져지는지 고. 컴포넌트, 배치, 상호작용. domain core 는 view 층 완전히 바깥에 살아야 해. 컴포넌트 안에 있지도 않고, view framework 에 기대지도 않고, 자기가 어떻게 그려지는지 알지도 못하게.
이 앱이 유독 이게 필요한 이유
이건 막연한 미래 대비가 아니야. 눈앞에 두 번째 view 가 구체적으로 있거든. 계획에는 캔버스를 위한 native 렌더링 층 선택지가 명시적으로 열려 있어. 두 번째 캔버스가 언젠가 무거운 native renderer 가 될 수도 있으니까. 그런데 그 미래의 view 가 domain core 를 재사용하려면 domain core 가 지금 view 에 한 번도 안 기댔어야 해. 이 분리가 이미 알려진, 계획된 미래를 재작성 대신 싼 값으로 유지해 주는 거야.
시험: view 를 갈아 끼우면 뭐가 살아남아?
진짜로 갈라 놨는지 깔끔하게 확인하는 방법이 있어. 내일 view 층을 통째로 지우고 다른 framework 로 새로 쓴다고 상상해 봐. 뭐가 살아남아? workspace 상태랑 lineage 기록이랑 session 연결이 아무 상처 없이 남으면 — 지워진 컴포넌트 안에 살았던 적이 없으니까 — 갈라 놓은 거야. view 를 지웠는데 domain 로직이 같이 딸려 나가면 그 로직이 엉뚱한 데 있었던 거고. 이 상상 실험이 곧 점검이야.