기타 개발지식
Indexed DB와 dexie.js (feat. 브라우저에 데이터를 저장하는 방법 비교)
찐코딩
2024. 3. 29. 23:29
브라우저에 데이터 저장하는 방법과 비교
브라우저에 데이터를 저장하는 방법으로는 아래와 같이 크게 4가지가 있다.
방법 | 만료기간 설정 가능 여부 | 브라우저가 닫혀도 데이터 유지 |
오프라인 환경에서도 데이터 유지 |
저장공간 | 특징 |
쿠키 | O | O | X | 4KB | |
local storage | X (사용자가 수동으로 삭제하지 않는 이상 데이터가 계속 남아있음) |
O | X | session stotage와 함께 전체 10MB | 같은 origin에서는 어떤 창이든, 탭이든 데이터를 공유함 |
session storage | X (탭이 종료되면 데이터 삭제) |
X | X | session stotage와 함께 전체 10MB | |
indexed db | X (사용자가 수동으로 삭제하지 않는 이상 데이터가 계속 남아있음) |
O | O | 브라우저의 전체 Disk용량의 80%까지 사용 가능 |
같은 origin에서는 어떤 창이든, 탭이든 데이터를 공유함 비동기 API 방식 일반적으로 localstorage에 비해 속도 느림 |
Indexed DB
🔎 Indexed DB란?
IndexedDB는 브라우저에 내장된 데이터베이스로 localStorage보다 훨씬 강력합니다. 데이터를 지속적으로 저장할 뿐만 아니라, 네트워크 가용성에 관계없이 풍부한 쿼리 기능을 갖춘 웹 애플리케이션을 만들 수 있으므로 이러한 애플리케이션은 온라인과 오프라인 모두에서 작동할 수 있습니다. IndexedDB는 대량의 데이터를 저장하는 애플리케이션(예: 대출 도서관의 DVD 카탈로그)과 지속적인 인터넷 연결이 필요하지 않은 애플리케이션(예: 메일 클라이언트, 할 일 목록 및 작업 목록)에 유용합니다.
📢 Indexed DB의 주요 기능
- 비동기 API: 메인 스레드를 차단하지 않고 효율적인 데이터 처리를 지원
- 키-값 저장소: 데이터를 키-값 쌍으로 저장하여 빠른 검색 및 인덱싱 기능을 제공
- 색인된 쿼리: 색인을 사용하여 복잡한 쿼리를 가능하게 하여 검색 성능을 향상
- 트랜잭션 및 개체 저장소: 개체 저장소를 사용하여 원자성 작업 및 데이터 분리를 용이
- 지속성: 장기 데이터 저장, 브라우저 재시작 및 시스템 충돌 방지 기능을 제공
dexie.js 을 사용하여 Indexed DB 편하게 사용하기
Indexed DB를 사용하면 저장, 읽기 등과 같은 간단한 기능만 사용하려 해도 코드가 복잡하고 지저분해진다는 단점이 있어, 이런 점을 고안하고자 dexie.js라는 indexed DB의 wrapper 라이브러리가 등장한다.
🔎dexie.js를 왜 사용하는가? 코드 비교
id: ‘patric’ 이라는 데이터를 저장하는 기능을 dexie.js 와 indexed DB로 구현한 예제를 비교해보자.
dexie.js을 사용한 예제
// Dexie.js를 사용하여 데이터베이스를 생성합니다.
var db = new Dexie('myDatabase');
// 데이터베이스 스키마를 정의합니다.
db.version(1).stores({
friends: '++id, name' // '++id'는 자동으로 증가하는 기본 키를 의미합니다.
});
// 'patric'이라는 데이터를 저장하는 함수를 정의합니다.
function addFriend() {
db.friends.add({
name: 'patric'
}).then(function() {
console.log('Successfully added patric to friends!');
}).catch(function(error) {
console.error('Error adding patric:', error);
});
}
// 함수 호출
addFriend();
indexed DB을 사용한 예제
// IndexedDB 데이터베이스를 열기
var request = indexedDB.open('myDatabase', 1);
// 데이터베이스 버전 업그레이드 이벤트 처리
request.onupgradeneeded = function(event) {
var db = event.target.result;
// 객체 저장소 생성
var objectStore = db.createObjectStore('friends', { keyPath: 'id', autoIncrement: true });
// 인덱스 생성
objectStore.createIndex('name', 'name', { unique: false });
};
// 데이터 추가 함수
function addFriend() {
// 데이터베이스에 연결
request.onsuccess = function(event) {
var db = event.target.result;
// 트랜잭션 시작
var transaction = db.transaction(['friends'], 'readwrite');
// 객체 저장소 열기
var objectStore = transaction.objectStore('friends');
// 'patric' 데이터 추가
var request = objectStore.add({ name: 'patric' });
// 요청 성공 및 실패 시 이벤트 처리
request.onsuccess = function(event) {
console.log('Successfully added patric to friends!');
};
request.onerror = function(event) {
console.error('Error adding patric:', event.target.error);
};
};
}
// 함수 호출
addFriend();