본문 바로가기
C.W.K.
Stream
Lesson 02 of 04 · published

오프라인 캐시를 가진 서버 소유 CRUD

~12 min · crud, cache, sync, ownership

Level 0신호 없음
0 XP0/32 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"매크로 목록은 서버가 갖고, 기기는 캐시를 쥐어. 하나는 진실이고, 하나는 자기가 복사본인 걸 아는 빠르고 오프라인에서도 되는 복사본이고."

매크로가 사는 곳

매크로도 대화랑 소유 구조가 같아. 규모만 한 단계 작을 뿐이지. canonical 매크로 묶음은 서버가 가져. 만들고 읽고 고치고 지우는 게 전부 백엔드를 거쳐서 정리되니까, 매크로가 기기를 옮겨 다녀도 따라오고 권위 있는 목록도 하나로 유지돼. 그런데 오프라인에서도 바로바로 쓰고 싶단 말이지. 신호 끊겼다고 저장해 둔 프롬프트에 손도 못 대면 안 되잖아. 그래서 기기가 매크로 목록의 오프라인 캐시를 쥐고, 오프라인일 때 고친 것들엔 pending-sync 표시를 달아 둬. 이 캐시는 자기가 복사본이라는 걸 아는 복사본이야. 빠르고 쓸 만하지만 절대 진실의 출처는 아니고.

캐시는 자기 자리를 알아

이 구분은 역할이 흐릿해지지 않을 때만 굴러가. 서버 목록이 권위고, 기기 캐시는 거기 따르는 편의 층이야.

  • 읽기. 캐시에서 바로 그려. 오프라인에서도 되고. 서버에 닿으면 그때 새로 받아 오고.
  • 오프라인 쓰기. 캐시에 반영하고 pending-sync 로 표시해 뒀다가, 다시 연결되면 서버랑 맞춰.
  • 충돌. 서버 목록이 권위로 이겨. 캐시는 거기서 다시 만들어지고. 로컬에 있다는 이유만으로 캐시가 진실을 덮어쓰는 일은 없어.

퀘스트 전체에서 계속 울리던 얘기가 여기서도 들리지. 반응이 빠르라고 로컬에서 붙잡고 움직이되, 진실은 canonical 저장소가 갖는다는 거. 매크로는 그 대화 패턴을 축소해 놓은 거야. 속도랑 오프라인은 로컬 층이, 권위는 서버 층이 맡고.

첫 sync 는 흡수하지 짓밟지 않아

훔쳐 갈 만한 디테일이 하나 있어. 서버 쪽 매크로 저장소가, 이미 로컬에서 만든 매크로를 갖고 있는 기기를 처음 만나면, 그 목록을 흡수해야지 지우면 안 돼. 백엔드 저장소가 새로 생겼다고 오프라인으로 먼저 시작한 사용자를 벌줄 순 없잖아. 첫 sync 에서 흡수하는 건 작은 다정함이야. 클라이언트 전체를 관통하는, 사용자 입력에 대한 그 존중이 여기서도 똑같이 나타나는 거고. 사용자가 한 작업은 지켜지고, 접혀 들어가고, 절대 안 버려져. 서버가 존재를 알기도 전에 만든 매크로까지도. 캐시는 복사본이지만 그 안에 담긴 사용자 의도는 여전히 소중하게 다뤄지는 거야.

Code

속도랑 오프라인은 캐시가, 권위는 서버가·typescript
// 읽기: 캐시에서 즉시, 권위 있는 서버 목록에서 새로고침.
async function listMacros(): Promise<PromptMacro[]> {
  const cached = await cache.getMacros();      // 즉시, 오프라인에서 작동
  refreshFromServerInBackground();             // 닿을 때 화해
  return cached;
}

// 오프라인 쓰기: 캐시에 적용, pending 표시, 재연결에 화해.
async function saveMacro(m: PromptMacro) {
  await cache.upsert(m, { pendingSync: true }); // 즉시 사용 가능
  if (navigator.onLine) await syncMacro(m);     // 서버가 권위
}

// 첫 sync 는 기기 로컬 매크로를 짓밟는 대신 흡수해 —
// 새 서버 저장소가 자기 존재 전에 사용자가 만든 작업을 접어 넣어.

External links

Exercise

오프라인에서 고친 매크로 하나의 sync 상태를 설계해 봐. 캐시에 반영됨, pending-sync, synced, conflicted. 그다음 첫 sync 가 기존 로컬 매크로를 만나는 경우를 처리해. 기기 목록을 새 서버 저장소로 하나도 안 잃고 접어 넣는 규칙을 써. 마지막으로 같은 매크로를 두 기기에서 오프라인으로 고쳤을 때 어떻게 되는지 정해. 누가 권위로 정리하고, 각 캐시는 어떻게 다시 만들어질지.
Hint
기기 캐시는 늘 아래야. pending 상태로 고친 걸 쥐고 있을 순 있어도, 충돌을 정리하는 건 서버 목록이고 두 캐시는 이긴 쪽에서 다시 만들어져. 첫 sync 는 기기가 서버에 씨를 뿌리는 유일한 순간이고. 덮어쓰지 말고 흡수해. 그 뒤로는 계속 서버가 권위야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.