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

건너뛰기, 둘 다 두기, 덮어쓰기, 취소

~12 min · collision, explicit-decision, replace

Level 0Finder 에서 헤매는 중
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"'여기 이미 파일 있는데요' 는 사람한테 물을 질문이지 앱이 동전 던져 정할 일이 아니야."

충돌이 나는 순간

notes.txt 를 이미 notes.txt 가 있는 폴더로 복사해. 파일 관리자에서 제일 흔하면서 제일 위험한 순간이야. 기본값을 잘못 잡으면 조용히 데이터가 사라지거든. 기본이 덮어쓰기면 사용자가 지키고 싶었을 파일이 날아가고, 기본이 건너뛰기면 가져오려던 파일이 안 와. 안전한 짐작이란 게 없어. 유일하게 안전한 설계는 이걸 사람이 고르는 일로 만드는 거야.

선택지와 그게 남는 자리

Waygate 가 주는 선택은 정해져 있어. 건너뛰기(있던 걸 두고 들어오는 걸 포기), 둘 다 두기(들어오는 걸 다른 이름으로), 덮어쓰기(들어오는 게 이기되 원래 것을 먼저 지켜둠), 폴더면 되는 경우 합치기, 그리고 취소(작업 전체 중단). 중요한 건 고른 결정이 계획에 적힌다는 거야. 어딘가의 '항상 이렇게' 설정에서 실시간으로 읽어오거나 어느 페인이 포커스를 가졌는지로 넘겨짚지 않아.

덮어쓰기도 먼저 지켜두고 덮어

'덮어쓰기' 조차 눈감고 밀어버리는 게 아니야. 계획대로 Waygate 는 원래 목적지 파일을 먼저 지키거나 따로 빼둬. 그래서 덮어쓰는 도중에 끊겨도 복구가 어느 쪽이 사용자가 원한 버전인지 짐작할 필요가 없어. 옛 파일은 새 파일이 쓰이기 시작하는 순간 사라지지 않고, 덮어쓰기가 확실히 끝날 때까지 남아 있어. 크래시가 나도 계획과 저널이 무슨 의도였는지 말해주고.

충돌 선택은 계획에 남는 결정이야. 건너뛰기, 둘 다 두기, 덮어쓰기, 합치기, 취소 중에서 고르지 포커스나 예전 설정에서 넘겨짚지 않아. 덮어쓰기는 원래 파일을 먼저 지켜두고 진행해서, 중간에 끊겨도 되살릴 수 있고 크래시가 나도 앱이 어느 쪽을 살릴지 짐작할 일이 없어.
조용한 '항상 덮어쓰기' 설정. 파일 관리자에서 제일 위험한 UI 는 앞으로의 작업까지 조용히 지배하는 '전부에 적용 / 항상 덮어쓰기' 야. 6주 뒤에 난 충돌이 사용자가 켠 줄도 잊은 체크박스로 결정되고, 파일 하나가 사라지지. Waygate 는 결정을 작업 위에, 눈에 보이게, 중요한 그 순간에 둬. 나중에 뒤통수치는 설정으로 두지 않고.

Code

결정은 실시간 설정이 아니라 계획에 담긴 값·swift
enum CollisionDecision {
    case skip            // keep existing, drop incoming
    case keepBoth        // bring incoming under a distinct name
    case replace         // incoming wins -- but protect the old one first
    case merge           // folders only, where supported
    case cancel          // stop the whole operation
}

func applyReplace(_ incoming: URL, over existing: URL, _ plan: OperationPlan) async throws {
    // Protect the existing destination BEFORE the incoming file lands:
    let backup = try await stageExistingForReplace(existing, plan)
    try await journal.mark(plan.id, .replacedDestProtected, evidence: backup)
    try await publish(incoming, as: existing)        // now the swap is recoverable
    // A crash between these lines -> journal knows the old file is staged,
    // recovery restores or completes deterministically, never guesses.

External links

Exercise

파일 도구들이 쓰는 충돌 기본값을 다 적어봐. 덮어쓰기, 건너뛰기, 자동 이름 붙이기, 물어보기. 각각에 대해 그 기본값이 조용히 잘못 동작하는 현실적인 상황을 하나씩 지어봐. 그다음 정해. 어느 게 눈앞에서 고르는 선택으로는 괜찮고, 어느 게 영구 설정으로 두면 위험해?
Hint
자동 기본값은 전부 틀리는 경우가 있어. 덮어쓰기는 더 새 파일을 날리고, 건너뛰기는 원하던 걸 빠뜨리고, 자동 이름 붙이기는 중복을 흩뿌리지. 그래서 '그때그때 물어보기' 가 안전한 기준이야. 눈에 보이는 작업 하나에 대한 선택이면 뭐든 괜찮고, 보지도 않는 충돌까지 결정하는 영구 설정이면 뭐든 위험해.

Progress

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

댓글 0

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

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