동기화 도구(Dropbox 등)가 파일을 감시하는 환경에서는 파일 쓰기 도중 불완전한 데이터가 동기화되거나 충돌 파일이 생성될 수 있다. atomic rename 기법은 임시 파일에 완전히 쓴 후 원자적으로 교체함으로써 이러한 문제를 방지하고 데이터 무결성을 보장한다.
Atomic file write with rename은 파일 시스템의 rename 작업이 원자적이라는 특성을 이용한 기법이다. 임시 파일에 내용을 완전히 쓴 후 최종 파일명으로 교체하면, 쓰기 도중 프로그램이 비정상 종료되거나 동기화 도구가 파일을 읽을 때 발생하는 부분적이거나 손상된 쓰기를 방지할 수 있다.
동기화 도구(Dropbox, iCloud Drive, Google Drive 등)는 파일 시스템 감시를 통해 변경을 즉시 탐지하고 동기화를 시도한다. 일반적인 writeFile은 파일을 열어 바이트를 순차적으로 기록하는 과정을 거친다. 이 도중에 동기화 도구가 파일을 읽으면 불완전한 내용이 원격으로 복제될 수 있다. 또한 두 프로세스가 동시에 같은 파일을 쓰려 할 때 내용이 뒤섞이는 충돌이 발생할 수 있다.
Rename을 이용한 원자적 쓰기는 이러한 문제를 두 단계로 분리해 해결한다. 먼저 고유한 이름의 임시 파일(예: 원본 파일명에 난수 접미사 추가)에 모든 데이터를 기록한다. 검증이 완료되면 rename 시스템 호출을 통해 최종 위치의 파일을 임시 파일로 대체한다. 대부분의 파일 시스템에서 rename은 원자적 연산이다. 따라서 대상 파일이 완전히 교체되거나 전혀 교체되지 않음이 보장된다.
이 기법을 적용하면 동기화 도구는 항상 완성된 파일만 감지하게 되어 불완전한 동기화를 근본적으로 차단한다. 또한 동시 쓰기 충돌 시 한 프로세스는 성공하고 다른 프로세스는 실패하는 명확한 승자 결정이 이루어진다. 실패한 프로세스는 재시도 로직을 수행할 수 있다.
동기화 환경에서 파일을 다룰 때는 쓰기 연산을 원자적으로 만들어 불완전한 읽기를 방지하는 것이 기본 원칙이다. rename 기법은 그 구현 수단 중 하나이며, Node.js에서는 fs.promises.rename과 임시 파일 생성으로 간단히 적용할 수 있다.
참고: 이 기법은 위키 포지 플러그인에서 문서 저장 시 동기화 충돌을 줄이기 위해 적용된 사례가 있다.
관련 항목으로는 파일 시스템 동기화, 동시성 제어, rename의 원자성, duplicate file detection 등이 있다. 열린 질문으로는 네트워크 파일 시스템(NFS)에서 rename의 원자성은 보장되는가, 그리고 동기화 도구가 rename 전의 임시 파일을 감지하고 동기화하려는 경우는 없는가 등이 있다.