← 목록
기타 2026-07-20 3KB 읽기 4분

크라우니 오피스 저장 — 로컬+클라우드 동기 (⌘S)

개요

CrownyAI 오피스 ⌘S 저장을 로컬 항상 + 로그인 시 클라우드 upsert로 확장. 무로그인/오프라인은 로컬만(우아, 편집 흐름 무중단). 조용한 데이터 손실 금지(409 충돌 = 사용자 선택).

무엇을 했는지

  1. ⌘S 이중 저장: caSaveOfficeDocument(native/crowny-ai-content.m)가 로컬 cdf 저장 성공 후, 로그인 상태면 같은 cdf 를 caOfficeCloudSaveTitle:cdfData:syncKey:force:POST /api/office/save(:9852) upsert. 로컬 성공 토스트 + 클라우드 성공 시 "☁ 클라우드 저장됨 (vN)" 토스트.
  2. docId↔로컬 매핑: ~/Documents/CrownyOffice/.sync.json { "<제목키>": {"docId","version"} }. 제목키=caSanitizeOfficeTitle(title). static 헬퍼 caOfficeSyncMapLoad/Get/Set. 매핑 없음→신규업로드(docId 없이, 서버 발급), 있음→기존업데이트(docId+baseVersion). 클라우드에서 연 문서(caOpenCloudDocId)도 열 때 매핑 기록 → 편집 후 ⌘S가 같은 docId 업데이트.
  3. 충돌 처리(409): NSAlert 덮어쓰기(force 재시도)/서버본 열기(caOpenCloudDocId 재로드)/취소(로컬만). serverVersion 표시.
  4. 버전 추적: 저장 응답 version 을 매핑에 기록 → 다음 baseVersion.
  5. 오프라인/무로그인: acct 게이트 + NSURLSession 에러 시 조용히 스킵. 자동저장(caAutosave)은 로컬만 유지(과빈도 업로드 방지).
  6. 한선씨 동반: native/저장동기.한선 — 동기판정/충돌감지/충돌해소/다음기준버전, hanseonc_high 컴파일 + 자체시험 14/14 PASS.

관련 파일

  • /Users/ef/CrownyBrowser/native/crowny-ai-content.m — caSaveOfficeDocument(클라우드 분기 추가), caOfficeCloudSaveTitle(신규), caOfficeSyncMap*(신규 static), caOpenCloudDocId(매핑 기록 추가), CAAccount @interface·caLibAuthBaseURL 전방선언 상단 이동(중복 @interface 제거)
  • /Users/ef/CrownyBrowser/native/저장동기.한선 — 판정 SSOT (신규, 14/14)
  • /Users/ef/CrownyBrowser/CLAUDE.md — "오피스 저장 로컬+클라우드 동기" 절 추가
  • 서버 계약: /Users/ef/crowny-ai/server.js /api/office/save|list|get|delete (무수정)

게이트 결과

  • 저장동기.한선 14/14 PASS · make ai 빌드 성공(content.m 경고0) · ./CrownyAI 3초 생존.
  • 실측(curl, 실계정 토큰): ①무로그인 401 ②신규 201 docId=d_e89f…95 v1 ③재편집 200 v2 ④충돌 409 serverVersion=2 ④-b force 200 v3 ⑤오프라인(닫힌포트) 연결실패→스킵 ⑥/list 등장. before/after docId·version 증명(1→2→3).
  • 무회귀: 파일관리.한선 28/28, 문서저장.한선 17 PASS, office파일권한.한선 PASS. 기존 저장/열기/내보내기/라이브러리 로직 무수정(클라우드는 로컬 저장 성공 후 append 분기).
  • 무수정 확인: crownyBridge.js·앱 번들·crowny-shell.m·Makefile 기존 타깃. 동시 편집 factory 세션 심볼(caOpenFactoryInActiveTab) 무손상.

잔여 이슈

  • GUI ⌘S 종단(실 WKWebView 오피스 탭)은 포커스 레이스로 CLI/curl 병행 검증으로 대체. 실사용 GUI 왕복 실측은 후속.
  • 매핑 키=제목(title). 제목 변경 시 새 문서로 취급(최소 안전, 큐잉/rename-추적은 과범위로 생략).
  • 오프라인 저장분의 재로그인/온라인 시 자동 동기(큐잉)는 미구현 — 다음 ⌘S 시 upsert로 자연 수렴.