모든 스토리지가 동일하게 생성되는 것은 아님: 스토리지 버킷 도입

Storage Standard는 영구 저장소 및 할당량 추정을 위한 API와 플랫폼 저장소 아키텍처를 정의합니다. 과도한 메모리 압력에서 영구 저장소 제거를 보다 예측 가능하게 하는 API를 출시합니다. Chromium 122부터 사용할 수 있습니다.

스토리지 표준은 어떤 문제를 해결하나요?

일반적으로 사용자가 기기의 저장공간이 부족하면 IndexedDB 또는 localStorage와 같은 API로 저장된 데이터는 사용자가 개입할 수 없는 상태에서 손실됩니다. 저장소를 영구적으로 만드는 방법은 StorageManager 인터페이스의 persist() 메서드를 호출하는 것입니다. 동시에 최종 사용자에게 권한을 요청하고 권한이 부여된 영구 스토리지로 변경합니다.

const persisted = await navigator.storage.persist();
if (persisted) {
  /* Storage will not be cleared except by explicit user action. */
}

이 스토리지 유지를 요청하는 방법은 '전부' 또는 '전혀 없음'입니다. 보다 세분화된 지속성 요구사항을 표현할 방법은 없습니다. 모두 하나의 스토리지 버킷입니다.

Storage Buckets API

Storage Buckets API의 핵심 개념은 사이트에 여러 스토리지 버킷을 만들 수 있는 기능을 부여하는 것입니다. 브라우저에서는 다른 버킷과 독립적으로 각 버킷을 삭제하도록 선택할 수 있습니다. 이를 통해 개발자는 가장 중요한 데이터가 삭제되지 않도록 제거 우선순위를 지정할 수 있습니다.

사용 사례 예

스토리지 버킷의 용도를 설명하기 위해 이메일 애플리케이션을 상상해 보세요. 사용자의 전송되지 않은 초안이 클라이언트에만 있는 경우 앱에서 손실된 경우 이를 인정할 수 없습니다. 반대로 이메일이 서버에 저장되어 있다면 브라우저의 저장공간이 과중한 경우 가장 오래된 받은편지함 이메일 중 일부를 클라이언트에서 삭제해도 됩니다.

이메일 앱 인터페이스
받은편지함과 초안을 위한 별도의 스토리지 버킷이 있는 이메일 앱 (설명용으로만 Gmail 작동 방식이 반드시 반영되는 것은 아닙니다.)

Storage Buckets API 사용

새 스토리지 버킷 만들기

새 스토리지 버킷은 StorageBucketManager 인터페이스의 open() 메서드를 사용하여 만들 수 있습니다.

// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');

유지되는 새 스토리지 버킷 만들기

스토리지 버킷을 유지하려면 durabilitypersisted 옵션 인수를 open() 메서드에 전달하면 됩니다.

  • persisted은 스토리지 버킷을 유지해야 하는지 여부를 결정합니다. 허용되는 값은 false (기본값) 또는 true입니다.
  • durability는 정전 시 데이터 손실 위험을 줄이면서 쓰기 성능을 절충하는 데 도움이 되는 힌트를 브라우저에 제공합니다. 허용되는 값은 'relaxed'(기본값) 또는 'strict'입니다.

    • 버킷 'strict'개에서 정전 시 데이터 손실 위험을 최소화하려고 시도합니다. 이로 인해 성능이 저하될 수 있습니다. 즉, 쓰기를 완료하는 데 시간이 더 오래 걸리고, 전체 시스템 성능에 영향을 미칠 수 있고, 배터리 전력을 더 많이 소모할 수 있고, 저장소 기기를 더 빨리 소모할 수 있습니다.
    • 'relaxed' 버킷은 전원 손실이 발생했을 때 지난 몇 초 동안 완료된 쓰기를 '삭제'할 수 있습니다. 따라서 이러한 버킷에 데이터를 쓰면 성능 특성이 향상될 수 있고 배터리 충전이 더 오래 지속될 수 있으며 저장소 기기 수명도 길어질 수 있습니다. 또한 정전 시 'strict' 버킷보다 높은 비율로 데이터 손상이 발생하지 않습니다.
// Create a storage bucket for email drafts that only exist on the client.
const draftsBucket = await navigator.storageBuckets.open('drafts', {
  durability: 'strict', // Or `'relaxed'`.
  persisted: true, // Or `false`.
});

스토리지 버킷에서 Storage API에 액세스

각 스토리지 버킷은 스토리지 API(예: IndexedDB, 캐시 인터페이스, 파일 인터페이스)와 연결됩니다. 이러한 저장소 API는 진입점이 StorageBucket 인터페이스(예: StorageBucket.indexedDB)일 뿐이라는 사실은 평소와 같이 작동합니다.

const inboxDb = await new Promise(resolve => {
  const request = inboxBucket.indexedDB.open('messages');
  request.onupgradeneeded = () => { /* migration code */ };
  request.onsuccess = () => resolve(request.result);
  request.onerror = () => reject(request.error);
});

유용한 리소스