브라우저에 이런 친구가 내장되어 있다는 걸 이제야 알았다
indexedDB
는 브라우저에 내장된 데이터 베이스입니다. 따라서, 일반적으로 사용되는 데이터베이스의 사용법과 거의 똑같은 접근이 가능합니다.indexedDB
는 localStorage
와 마찬가지로 데이터를 로컬에 저장할 수 있습니다.localStorage
는 string만을 저장할 수 있는 데 반해 indexedDB
는 키/값 쌍으로 원하는 데이터를 얼마든지 저장할 수 있습니다.localStorage
는 10mb의 용량 제한이 있지만, indexedDB
는 비교적 더 큰 데이터를 저장 할 수 있습니다.(아래 표 참고)아래는 indexedDB
의 단계 별 구현 가이드입니다.
//indexedDB를 Open
let request = window.indexedDB.open("MyTestDatabase");
//db를 할당할 변수 선언
let db;
open
메소드로 indexedDB
를 실행합니다.
//에러 발생시 작동
request.onerror = function(event) {
alert("Why didn't you allow my web app to use IndexedDB?!");
};
//테스트 데이터
const customerData = [
{ ssn: "444-44-4444", name: "Bill", age: 35, email: "bill@company.com" },
{ ssn: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org" }
];
request.onupgradeneeded = function(event) {
db = event.target.result;
// DB에 저장소를 생성합니다.(테이블의 개념)
let objectStore = db.createObjectStore("customers", { keyPath: "ssn" });
// DB에 Index를 생성합니다.(조회 가능한 키, 컬럼의 개념)
// unique여부를 지정할 수 있습니다
objectStore.createIndex("name", "name", { unique: false });
objectStore.createIndex("email", "email", { unique: true })
...
}
onupgradeneeded
는 새로운 데이터베이스가 생성되거나, DB의 버전이 변경되었을 때 작동합니다.indexedDB
의 스토어는 db의 테이블의 역할을 합니다.indexedDB
의 인덱스는 db의 컬럼의 역할을 합니다.keyPath
는 일종의 Primary Key의 역할을 합니다.//indexedDB의 버전이 변경되었을 때 실행됩니다.
request.onupgradeneeded = function(event) {
...
// 위의 Transaction이 정상적으로 수행되었을 때 data를 seeding합니다
objectStore.transaction.oncomplete = (event) => {
let customerObjectStore = db.transaction("customers", "readwrite").objectStore("customers");
customerData.forEach((customer) => customerObjectStore.add(customer));
};
};
store
와 index
를 생성하는 transaction이 정상적으로 실행되었을 때(on complete) 데이터를 입력합니다.add
메소드로 데이터를 입력할 수 있습니다. request.onsuccess = (event) => {
db = event.target.result;
let objRequest = db.transaction(["customers"]).objectStore("customers").get("444-44-4444");
//get이 성공해야 데이터를 조회할 수 있음
objRequest.onsuccess = () => {
console.log(objRequest.result)
}
}
request.onsuccess
는 indexedDB.open
이 성공했을 시 작동합니다. request.onsuccess = (event) => {
db = event.target.result;
let objStore = db.transaction(["customers"]).objectStore("customers");
let objRequest = objStore.get("444-44-4444");
db.age = 100;
objRequest.onsuccess = (event) => {
db = event.target.result;
let requestUpdate = objectStore.put(data);
}
}
put
메소드로 업데이트 합니다. request.onsuccess = (event) => {
db = event.target.result
let objRequest = db.transaction(["customers"]).objectStore("customers").delete("444-44-4444");
...
}
delete
메소드로 삭제합니다const objectStore = transaction.objectStore("toDoList");
const objectStoreRequest = objectStore.clear();
objectStoreRequest.onsuccess = (event) => {
note.innerHTML += '<li>Request successful.</li>';
};
※ 참고링크
MDN