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

이름만 바꾸느냐, 다시 쓰느냐

~12 min · same-volume, cross-volume, move

Level 0Finder 에서 헤매는 중
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"두 폴더 건너로 끌어놓는 거랑 USB 로 끌어놓는 건 똑같아 보여. 속에선 하나는 이름표를 옮기고 하나는 책을 통째로 옮겨 적어."

같은 손짓, 다른 두 세계

사용자한테 이동은 그냥 이동이야. 끌어다 놓으면 끝. 그런데 그 한 손짓 아래 파일시스템에선 완전히 다른 두 가지가 벌어져. 출발지와 목적지가 같은 볼륨이면 이동은 이름 바꾸기야. 바이트는 안 움직이고 목록의 항목만 달라지지. 사실상 즉시 끝나고 중간이 없어. 다른 볼륨이면 — 내장 디스크에서 USB 로, 노트북에서 SMB 공유로 — 바이트를 새 볼륨에 옮겨 적고 원본을 지워야 해.

이 갈림이 곧 안전 경계야

속도 얘기가 아니라 위험이 갈리는 자리야. 같은 볼륨 이름 바꾸기는 잃을 게 없어. 바이트가 그대로니까 파일이 한 군데 있다가 없어졌다가 두 군데 어정쩡하게 걸치는 구간이 없지. 볼륨을 넘으면 그 위험이 전부 생겨. 복사가 절반에서 끊길 수 있고, 목적지 볼륨이 사라질 수 있고, 원본을 일찍 지우면 멀쩡한 유일본을 날려. Waygate 는 계획을 확인하는 순간 여기서 갈라. 두 작업에 필요한 안전 장치가 아예 다르거든.

같은 볼륨이어도 확인은 해

'쉬운' 쪽인 같은 볼륨 이름 바꾸기도 눈감고 부르는 건 아니야. Waygate 는 먼저 신분과 충돌 상태를 확인해. 이게 그 파일이 맞나, 목적지 이름이 비었나 아니면 계획해둔 충돌 처리를 써야 하나. 그러고 나서 이름 바꾸기를 실행하지. 쉽다는 게 대충 한다는 뜻은 아니야. 위험이 작으니 장치가 작을 뿐이지.

같은 볼륨 이동은 이름 바꾸기, 볼륨을 넘는 이동은 복사·확인·제자리 옮기기·삭제·확인이야. 바이트가 움직이냐 아니냐는 속도 얘기가 아니라 안전 경계야. 이름 바꾸기는 잃을 게 없고, 볼륨을 넘는 이동엔 원본을 건드리기 전에 확인을 요구하는 고비가 있어.
경로만 봐선 몰라. 형제처럼 붙어 보이는 두 경로가 서로 다른 볼륨에 있을 수 있어. 마운트된 폴더나 firmlink, 트리 깊숙이 붙은 외장 드라이브 때문에. 그래서 Waygate 는 경로 앞부분을 비교하지 않고 볼륨 신분을 대조해서 갈라. 경로는 바이트가 실제로 어디 있는지에 대해 얼마든지 거짓말하거든.

Code

여기서 이후 전부가 갈려·swift
func executeMove(_ plan: OperationPlan) async throws {
    let src = try revalidate(plan.source)
    let dstVolume = try volumeIdentity(of: plan.destination)
    let srcVolume = try volumeIdentity(of: src)

    if srcVolume == dstVolume {
        // SAME VOLUME: a rename. Bytes never move. Nothing to lose.
        try await coordinatedRename(src, to: plan.destination, plan)
    } else {
        // CROSS VOLUME: the full destructive sequence.
        let staged  = try await copyToStaging(src, on: dstVolume)
        try await verify(staged, matches: plan.expectedMetadata)
        let published = try await publish(staged, as: plan.destination)
        try await deleteSource(src)          // <- distinct destructive barrier
        try await verifyAbsence(src)
    }
}

External links

Exercise

내장 디스크의 두 폴더 사이로 파일을 옮겨보고, 그다음 USB 로 옮겨보면서 시간을 재봐. 앞은 거의 즉시고 뒤는 파일 크기만큼 걸려. 바이트한테 실제로 무슨 일이 벌어지는지로 그 차이를 설명하고, 왜 느린 쪽에만 확인 단계가 필요한지도 말해봐.
Hint
같은 볼륨 이동은 목록 항목만 고치니까 크기가 상관없어. 아무것도 안 옮기거든. 볼륨을 넘으면 모든 바이트를 새 볼륨에 실제로 써야 하고, 시간이 걸리는 만큼 끊길 수도 있어. 바이트가 진짜 여행했으니 원본을 지우기 전에 다 도착했는지 확인해야 하는 거고, 이름 바꾸기엔 확인할 게 없었던 거야.

Progress

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

댓글 0

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

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