"매크로 목록은 서버가 갖고, 기기는 캐시를 쥐어. 하나는 진실이고, 하나는 자기가 복사본인 걸 아는 빠르고 오프라인에서도 되는 복사본이고."
매크로가 사는 곳
매크로도 대화랑 소유 구조가 같아. 규모만 한 단계 작을 뿐이지. canonical 매크로 묶음은 서버가 가져. 만들고 읽고 고치고 지우는 게 전부 백엔드를 거쳐서 정리되니까, 매크로가 기기를 옮겨 다녀도 따라오고 권위 있는 목록도 하나로 유지돼. 그런데 오프라인에서도 바로바로 쓰고 싶단 말이지. 신호 끊겼다고 저장해 둔 프롬프트에 손도 못 대면 안 되잖아. 그래서 기기가 매크로 목록의 오프라인 캐시를 쥐고, 오프라인일 때 고친 것들엔 pending-sync 표시를 달아 둬. 이 캐시는 자기가 복사본이라는 걸 아는 복사본이야. 빠르고 쓸 만하지만 절대 진실의 출처는 아니고.
캐시는 자기 자리를 알아
이 구분은 역할이 흐릿해지지 않을 때만 굴러가. 서버 목록이 권위고, 기기 캐시는 거기 따르는 편의 층이야.
- 읽기. 캐시에서 바로 그려. 오프라인에서도 되고. 서버에 닿으면 그때 새로 받아 오고.
- 오프라인 쓰기. 캐시에 반영하고 pending-sync 로 표시해 뒀다가, 다시 연결되면 서버랑 맞춰.
- 충돌. 서버 목록이 권위로 이겨. 캐시는 거기서 다시 만들어지고. 로컬에 있다는 이유만으로 캐시가 진실을 덮어쓰는 일은 없어.
퀘스트 전체에서 계속 울리던 얘기가 여기서도 들리지. 반응이 빠르라고 로컬에서 붙잡고 움직이되, 진실은 canonical 저장소가 갖는다는 거. 매크로는 그 대화 패턴을 축소해 놓은 거야. 속도랑 오프라인은 로컬 층이, 권위는 서버 층이 맡고.
첫 sync 는 흡수하지 짓밟지 않아
훔쳐 갈 만한 디테일이 하나 있어. 서버 쪽 매크로 저장소가, 이미 로컬에서 만든 매크로를 갖고 있는 기기를 처음 만나면, 그 목록을 흡수해야지 지우면 안 돼. 백엔드 저장소가 새로 생겼다고 오프라인으로 먼저 시작한 사용자를 벌줄 순 없잖아. 첫 sync 에서 흡수하는 건 작은 다정함이야. 클라이언트 전체를 관통하는, 사용자 입력에 대한 그 존중이 여기서도 똑같이 나타나는 거고. 사용자가 한 작업은 지켜지고, 접혀 들어가고, 절대 안 버려져. 서버가 존재를 알기도 전에 만든 매크로까지도. 캐시는 복사본이지만 그 안에 담긴 사용자 의도는 여전히 소중하게 다뤄지는 거야.