"Service worker 가 깨었다 잠드는 함수라면, chrome.storage 는 그게 쓰는 메모리야. Lesson 4 는 *중요한 건 다 storage 에 살아야 한다* 는 사실과 화해하는 거."
두 storage 영역: local 과 sync
chrome.storage 는 sub-namespace 여럿 가져. 가장 자주 쓸 두 개:
chrome.storage.local— 머신 단위, extension uninstall 까지 영속. MV3 에서 약 10 MB quota. Promise-based async API. ClipDeck 의 clip / 방문 카운트 / 누적 data 의 기본 선택.chrome.storage.sync— user 의 signed-in Chrome instance 간 sync. 총 약 100 KB, item 당 약 8 KB cap. User 선호 (theme / hotkey config) 용, 누적 data 용 아냐.
덜 일반적이지만 알아둘: chrome.storage.session (2023 추가) 는 worker eviction 견디지만 browser session 끝나면 죽음. chrome.storage.managed 는 read-only, 기업 정책으로 채워짐.
Async API
모든 chrome.storage 작업이 async. MV3 부터 Promise 반환 (옛 callback signature 도 평행 동작). 메서드 여섯 개가 거의 다 커버:
get(key | keys[] | undefined)— 하나, 여럿, 또는 전체 readset(object)— 주어진 object 를 storage 에 merge (idempotent; 무관한 키 손 안 댐)remove(key | keys[])— key 삭제clear()— 이 storage 영역 전체 wipegetBytesInUse(key | keys[] | undefined)— quota 점검onChanged.addListener(fn)— 어느 context 에서든 write 발생 시 반응
set 을 object 로 호출하면 key 를 merge — 전체 storage 를 대체하지 않아. 그래서 { visitCount: 5 } 를 { clips: [...] } 영향 없이 쓸 수 있어. Storage layer 가 feature 간 composable 한 이유.
JSON 만 가능
chrome.storage 는 값을 JSON 으로 serialize. 실용적 결과:
- 일반 object, 배열, 문자열, 숫자, boolean, null — 다 OK.
Dateobject → 들어갈 때 ISO string 으로 변환; 나올 때 문자열 받음. 타입 잃음.Map,Set→{}또는 빈 배열로 됨. 저장 전에Object.fromEntries(map)또는[...set]로 명시 변환.- 함수, method 가진 class instance, circular reference — silent 손상 또는 노골적 실패.
JSON-호환 평범한 shape 만 써. Exotic 타입은 들어갈 때 평범한 값으로 변환, 나올 때 재구성.
변경 listening
chrome.storage.onChanged 는 모든 context — popup / side panel / service worker / content script — 의 매 write 에 fire. Popup 이 worker 가 한 write 에 즉시 반응 가능, message passing 필요 없음.
이게 read-state update 에 chrome.runtime.sendMessage 의 대안. Popup 이 onChanged 구독, SW 가 storage write, popup 재렌더. Round-trip 없음, "worker 깨어 있나" 질문 없음.
ClipDeck 의 첫 storage round-trip
Lesson 6 가 ClipDeck 의 방문 카운터에 storage 사용. 아래 두 번째 code block 이 그 skeleton. 그게 read-do-write-read 패턴의 가장 순수한 형태. Module-level 에서 stateless. ClipDeck 의 clip 리스트 (Track 3 부터) 도 같은 형태 — storage 에서 배열 read, append, write back. Edit / delete (Track 7) 도 같은 형태 — read / mutate / write.
이 한 패턴이 내재화되면 ClipDeck 나머지는 거의 다 변형.