저장소 서비스
쿨다운 및 노출 추적을 위한 영속성 레이어입니다.
저장소 타입
| 저장소 | 목적 |
|---|---|
NudgeCooldownStorage | 마지막 노출 타임스탬프 |
NudgeExposureLogStorage | 노출 히스토리 로그 |
EventLogStorage | 이벤트 추적 히스토리 |
Web (localStorage)
typescript
const coordinator = startCoordinator({
cooldownStorage: new NudgeCooldownStorage({
storage: localStorage,
}),
exposureStorage: new NudgeExposureLogStorage({
storage: localStorage,
}),
});React Native (MMKV)
typescript
import { MMKV } from 'react-native-mmkv';
const storage = new MMKV();
class MMKVStorageAdapter {
get(key) {
const value = storage.getString(key);
return value ? JSON.parse(value) : undefined;
}
set(key, value) {
storage.set(key, JSON.stringify(value));
}
delete(key) {
storage.delete(key);
}
}
const mmkvStorage = new MMKVStorageAdapter();
const coordinator = startCoordinator({
cooldownStorage: new NudgeCooldownStorage({ storage: mmkvStorage }),
exposureStorage: new NudgeExposureLogStorage({ storage: mmkvStorage }),
});인메모리 (테스트용)
typescript
const coordinator = startCoordinator({
cooldownStorage: new NudgeCooldownStorage(),
exposureStorage: new NudgeExposureLogStorage(),
});커스텀 저장소
백엔드 동기화를 위한 IKeyValueStorage 구현:
typescript
class BackendStorage implements IKeyValueStorage {
async get<T>(key: string): Promise<T | undefined> {
const response = await fetch(`/api/storage/${key}`);
return response.ok ? response.json() : undefined;
}
async set<T>(key: string, value: T): Promise<void> {
await fetch(`/api/storage/${key}`, {
method: 'POST',
body: JSON.stringify(value),
});
}
async delete(key: string): Promise<void> {
await fetch(`/api/storage/${key}`, { method: 'DELETE' });
}
}
const coordinator = startCoordinator({
cooldownStorage: new NudgeCooldownStorage({
storage: new BackendStorage(),
}),
});저장소 선택
영구 저장 (localStorage/MMKV): 앱 재시작 후에도 유지
typescript
cooldownStorage: new NudgeCooldownStorage({ storage: localStorage });세션 범위 (sessionStorage): 세션 종료 시 삭제
typescript
eventLogStorage: new EventLogStorage({ storage: sessionStorage });다음 단계
- Coordinator API - API 레퍼런스
- 예제 - 통합 예제