C.W.K.
Stream
Lesson 01 of 05 · published

파일시스템이 파일을 소유해

~12 min · canonical, projection, ownership

Level 0Finder 에서 길 잃음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"디스크가 데이터베이스야. 네 앱은 창고가 아니라 창문이야."

진실은 누가 소유해?

진지한 파일 매니저는 코드 한 줄 쓰기 전에 질문 하나에 답해야 해: 진실은 어디 사나? 유혹적인 틀린 답은 '내 앱 안에' 야 — 디스크 전체의 빠른 로컬 인덱스를 짓고, 그걸 보여주고, 나중에 맞춰. 빠르게 느껴지고 함정이야. 네 인덱스랑 디스크가 어긋나는 순간 — 그리고 끊임없이 어긋나, 다른 앱·Finder·OS 가 다 파일을 바꾸니까 — 네 앱은 자신 있게 거짓말을 보여주고 있어.

Waygate 의 답

파일시스템이 파일을 소유해. 끝. 바이트, 이름, 메타데이터, 권한, 마운트 내용 — 전부 사는 곳에서 canonical. Waygate 의 DB 는 딱 세 종류만 저장해: 워크스페이스 상태 (어느 폴더가 열렸나, 탭이랑 창 레이아웃), 참조 (복사 없이 파일을 가리키는 북마크랑 리소스 식별자), 그리고 오퍼레이션 증거 (뭘 했는지의 저널). 디렉토리 트리 미러는 절대 아냐.

투영 규율

Waygate 페인에서 보는 건 투영이야: 살아있는 위치의 새 읽기를 행으로 렌더한 거. 앱을 닫고, 다시 열면, '파일들' 을 복원 안 해 — 폴더로의 참조를 복원하고 다시 읽어. 앱이 닫힌 동안 폴더가 바뀌었으면, 새 읽기가 그 변화를 보여줘. 낡을 캐시된 진실이 없어, 애초에 캐시된 진실이 아예 없었으니까.

살아있는 파일시스템이 진실이고; 브라우저는 그거의 투영이야. Waygate 는 참조랑 증거를 질기게 남기지, 권위로 어긋날 수 있는 그림자 디렉토리 카탈로그는 절대 안 남겨. 앱의 그림이랑 디스크가 어긋나면, 디스크가 이겨 — 항상, 설계로.
Waygate 를 위해 내가 처음 스케치한 아키텍처엔 로컬 '파일 인덱스' 테이블이 있었어 — 트리를 캐시하면 전부 빠릿해질 거라 생각했지. 아빠가 거기에 화살표 하나를 그렸어, 디스크에서 앱으로, 그러고 말했어 '진실이 흐르는 유일한 방향은 그거야.' 그날 밤 인덱스 테이블을 지웠어. 이후 내가 피한 모든 어려운 버그 — 낡은 행, 유령 파일, 엉뚱한 걸 친 삭제 — 는 동기화할 진실의 두 번째 복사본을 안 가진 데로 거슬러 올라가.

Code

Waygate 의 DB 가 뭔지 (그리고 아닌지)·text
  WAYGATE SQLITE STORES            WAYGATE SQLITE NEVER STORES
  --------------------            ---------------------------
  workspace: open folders,        a copy of the directory tree
    tabs, window layout           file contents / bytes
  references: bookmarks +         'the list of files in /some/folder'
    resource identifiers          anything treated as the truth
  operation journal (evidence)      about what's on disk right now

  The disk is the database. This SQLite file is a notebook
  ABOUT the disk, never a copy OF it.
행은 투영이야, 매번 새로 풀려·swift
// A browser row is derived from a live URL each time it's shown,
// not read back from a stored snapshot.
struct BrowserRow {
    let reference: LocationReference   // bookmark + resource id (points AT the file)
    // display values below are PROJECTED from a fresh read, never authoritative:
    var displayName: String
    var size: Int64?
    var modified: Date?
}

// On refresh, we re-resolve the reference against the live filesystem.
// If it no longer resolves, the row goes visibly offline -- we do NOT
// invent a value from the last time we saw it.

External links

Exercise

앱이 더 이상 없는 파일을 보여준 적을 떠올려봐 — 지운 걸 가리키는 '최근 파일' 목록, 파일이 존재한다고 우기는 동기화 클라이언트. 진단해: 그 앱은 진실을 어디 두고 있었고, 왜 디스크랑 어긋났어? '캐시 대신 다시읽기' 가 어떻게 막았을까?
Hint
거의 모든 '유령 파일' 버그는 낡은 진실의 두 번째 복사본이야. 앱이 목록을 캐시하고 디스크가 넘어간 걸 못 알아챘어. '파일시스템이 canonical, 캐시 말고 다시읽기' 는 성능 선택이 아냐 — 없는 파일을 절대 안 보여줄 유일한 방법이야.

Progress

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

댓글 0

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

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