동기화의 내부

동기화 작동 방식 문서는 눈에 보이는 부분을 다뤄요. 이 문서는 한 단계 더 들어가서, 각 기기와 서버가 변경 사항을 실제로 어떻게 처리하는지 살펴봐요.

모든 변경은 작업이 돼요

노트를 편집하면 기기는 한 번에 두 가지 일을 해요. 새 텍스트를 로컬 데이터베이스에 저장하고, 대기열에 작업을 추가해요. 작업은 "이 노트가 바뀌었고, 새 버전은 이거예요"라고 알려 주는 작은 기록이에요. 노트를 만들고, 편집하고, 고정하고, 태그를 붙이고, 보관하고, 삭제하는 것 모두 작업이에요.

대기열을 보내기 전에 기기가 그걸 정리해요. 같은 노트를 빠르게 열 번 고치면 하나로 합쳐져요. 아직 입력 중인 노트를 고정하면 고정과 새 텍스트가 하나의 작업으로 병합되기 때문에, 어느 변경도 사라지지 않아요. 중요한 건 대기열의 순서뿐이에요. 기기의 시계가 뭐라고 하든, 나중의 변경이 항상 이전 변경보다 우선해요.

작업은 서버가 받았다고 확인해 준 뒤에야 대기열에서 빠져요. 중간에 연결이 끊기거나 동기화 도중에 앱을 닫아도, 다음번에 대기열이 그대로 남아 있어서 잃어버리는 것이 없어요.

푸시하고, 그다음 풀

동기화는 서버와 나누는 두 가지 간단한 대화예요.

  • 푸시. 기기가 대기열의 작업을 묶음으로 보내요. 서버는 하나씩 적용하고, 계정의 변경 기록에 써 넣으면서 각 항목에 순서대로 다음 번호를 매겨요.
  • 풀. 기기가 "1,234번 이후로 무엇이 바뀌었나요?"라고 물어요. 서버는 그 번호 다음의 기록 항목을 모두 보내 주고, 기기는 그걸 로컬 데이터베이스에 적용해요.

모든 기기가 마지막으로 본 번호를 기억하기 때문에 새로운 것만 내려받아요. 기기가 얼마나 오래 오프라인이었는지는 상관없어요. 멈췄던 바로 그 지점부터 따라잡아요.

노트를 바꾸는 모든 것이 이 기록을 거쳐요. API나 MCP로 연결한 AI 도구가 만든 변경도 마찬가지예요. 그래서 AI 어시스턴트가 써 준 노트도 다른 노트처럼 모든 기기에 나타나요.

충돌을 잡아내는 방법

기기가 보내는 모든 편집에는 그 노트에 대해 마지막으로 본 버전이 함께 적혀 있어요. 그 뒤로 서버의 사본이 바뀌었다면, 즉 그사이에 다른 기기가 편집했다면, 서버는 아무것도 덮어쓰지 않아요. 대신 자기 사본을 돌려보내요.

그러면 기기는 버전 관리 도구가 쓰는 기법인 3방향 병합을 시도해요. 세 가지 텍스트를 비교해요. 두 기기가 출발한 버전, 내 버전, 그리고 서버의 버전이에요. 편집이 노트의 서로 다른 부분을 건드렸다면 둘을 합친 결과를 보내고, 알아차릴 일도 없어요. 두 기기가 같은 줄을 바꿨을 때만 Caliu가 어느 버전을 남길지 물어봐요. 동기화 충돌 해결하기 문서를 참고하세요.

절대 충돌하지 않는 변경도 있어요. 고정, 보관, 읽기 전용 설정은 텍스트 편집으로 치지 않기 때문에 어떤 변경과도 깔끔하게 병합돼요.

모든 기기에 같은 규칙

웹, Apple, Android 앱은 서로 다른 세 가지 언어로 작성됐지만 같은 동기화 규칙을 따라요. 대기열을 정리하는 규칙은 세 앱 모두에서 하나의 공통 테스트 케이스 묶음으로 검증하기 때문에, 한 기기에서 만든 변경은 다른 모든 기기에서도 똑같이 처리돼요.

계정이 없으면

계정이 없으면 어떤 것도 기기 밖으로 나가지 않아요. 로그인하면 기기에 이미 있던 노트가 계정에 합류하고, 다른 변경 사항처럼 업로드돼요.