브라우저가 내 데이터를 버릴 때: 초록 체크가 거짓말을 한다
모바일 localStorage는 용량이 차면 데이터를 조용히 버린다. 그런데 '저장됨' 플래그는 남아 완료 체크가 뜬다. 저장소 계층별 용도, 큰 본문을 IndexedDB에 두는 법, 열 때 정합성 검사, storage.persist()로 eviction 줄이기까지.
9 개의 글
모바일 localStorage는 용량이 차면 데이터를 조용히 버린다. 그런데 '저장됨' 플래그는 남아 완료 체크가 뜬다. 저장소 계층별 용도, 큰 본문을 IndexedDB에 두는 법, 열 때 정합성 검사, storage.persist()로 eviction 줄이기까지.
GAS에서 스코프·트리거·권한은 에러 없이 조용히 실패한다. 매니페스트 스코프 하나가 빠지면 트리거가 한 번도 안 돈다. 왜 조용히 실패하는지, 멱등 설치로 20개 한도를 피하는 법, 하트비트와 '설치 직후 증명'까지.
Apps Script는 promote 하는 순간 100% 사용자에게 나간다 — 카나리가 없다. push와 deploy의 차이, 새 검사를 compat → warn → enforce로 내보내는 법, 옛 클라이언트를 세는 텔레메트리, 그리고 사고 시 롤백 명령까지.
구글 시트는 '2026-06' 같은 문자열을 조용히 Date로 강제 변환한다. 저장·읽기·비교가 각자 월을 다르게 계산하면 완료가 영원히 거부된다. 무엇이 강제 변환되는지, 셀을 텍스트로 고정하고 읽을 때 방어하는 법, 배치 쓰기와 수식 인젝션까지.
AI로 현장 점검 앱을 GAS로 만들었다. 데모는 잘 돌았다. 그리고 배포 버튼 하나에 전 현장이 잠기고, 시트가 날짜를 바꿔치기하고, 초록 체크가 거짓말을 했다. 실제로 하루 종일 잡은 버그들과, GAS로 바이브 코딩하기 전에 미리 신경 쓸 것들.
GAS에서 느린 건 자바스크립트가 아니라 Sheets·Drive 같은 서비스 호출이다. 루프 안 getValue/setValue를 일괄 getValues/setValues로 바꾸면 수십 배 빨라진다.
구글 시트 셀은 5만 자에서 막힌다. 사진·서명을 data URL로 기록 행에 넣으면 저장이 깨진다. 셀에는 메타데이터만 남겨라.
Apps Script는 한 번 실행이 6분에서 강제 종료된다. 대량 작업은 청크 + 커서 + 시간 트리거 재개로 설계해야 절반만 처리되는 사고를 막는다.
SVG foreignObject로 DOM을 캡처하면 모바일 Safari·GAS iframe에서 멈추거나 빈 이미지가 나온다. 직접 캔버스에 그리고, 다운로드는 Web Share로 받아라.