IndexedDB - team-yaza/mozi-client GitHub Wiki
๊ฐ์
- IndexedDB๋ ๋ธ๋ผ์ฐ์ ์ ๋ด์์ ์ ๊ณต๋ ํธ๋์ญ์ ๊ฐ์ฒด ์ ์ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(transactional object store database)์ด๋ค.
- IndexedDB์์ ์ํํ๋ ์์ ์ ํธ๋์ญ์ ์ผ๋ก ๊ทธ๋ฃนํ๋๋ค. ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ์์ ์ด ์ฑ๊ณตํ๊ฑฐ๋ ํน์ ์คํจํ๋ค.
- IndexedDB๋ ๊ฐ์ฒด ์ ์ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค.
- ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด ์ ์ฅ์๋ก ๊ตฌ์ฑ๋๋ค. ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ค์์ ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ๊ฐ๊ณ ๊ฐ๊ฐ์ ์ ์ฅ์๋ ๋ค์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค -> ์ ์ฅ์ -> ๊ฐ์ฒด
- ๊ฐ์ฒด๋ JavaScript ๊ฐ์ฒด, ๋ถ๋ฆฐ, ์ซ์, BLOB(Binary Large Object) ๋ฐ JavaScript๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ ํฌ๋งท ์ค ํ๋์ด๋ค.
- ๊ฐ ๊ฐ์ฒด ์ ์ฅ์์๋ ํ๊ฐ์ง ํ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ค. (์ฌ์ฉ์, ์ฑํ ๊ธฐ๋ก, ์์ฝ ๋ด์ญ๋ฑ)
- ๊ฐ์ฒด ์ ์ฅ์์๋ ํค(key)-๊ฐ(value) ์์ผ๋ก๋ ๋ ์ฝ๋๊ฐ ๋ค์ด์๋ค.
- ํค๋ ๊ฐ์ฒด ์ ์ฅ์์ ๊ฐ๋ณ ๊ฐ์ ์ฐธ์กฐํ๋๋ฐ ์ฌ์ฉ. ํค๋ ๋จ์ํ ์ซ์ ์๋ณ์๊ฐ ๋ ์ ์๊ณ , ๊ฐ์ ๋ํ ํน์ ๊ฒฝ๋ก๊ฐ ๋ ์ ์๋ค.
- IndexedDB๋ ๋์ผ ์ถ์ฒ ์ ์ฑ (Same-Origin Policy)๋ฅผ ๋ฐ๋ฅธ๋ค. ์ฌ์ฉ์๋ ํน์ ์ฌ์ดํธ์์ ์์ฑ๋ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์ฌ์ดํธ์ ๋ ธ์ถ๋ ๊ฒ์ ๊ฑฑ์ ํ์ง ์์๋ ๋ค๋ฅธ ์ฌ์ดํธ์ ๋ฐฉ๋ฌธํ ์ ์๋ค. ๋ค์ ๋งํ๋ฉด ์์ ์ ๋๋ฉ์ธ ๋ด์์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์์ง๋ง, ๋ค๋ฅธ ๋๋ฉ์ธ์ IndexedDB์ ๊ธฐ๋ก๋ ๋ฐ์ดํฐ๋ ์ ๊ทผํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฒ์ ์ ๊ฐ๋๋ค. ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ตฌ์กฐ๋ฅผ ์์ ํ๊ณ ์ถ๋ค๋ฉด ์๋ก์ด ๋ฒ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ด์ด์ผํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ด ๋ upgrade-needed ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. ํ์ฌ ๋ฒ์ ๊ณผ ์ด์ ๋ฒ์ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ์์ ์ด ์ด๋ฒคํธ ์ค์ ์ฒ๋ฆฌ๋ ์ ์๋ค.
- ๋๋ถ๋ถ์ IndexedDB ์์ ์ ๋น๋๊ธฐ์ด๋ค. API๋ ๊ฐ์ด ์์ฒญ๋์์ ๋ ํด๋น ๊ฐ์ ๋ฐํํ์ง ์๋๋ค.๊ฐ์ ์์ฒญํ๋ ๋์ ํด๋น ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํด์ผํ๋ค.
- IndexedDB๋ ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค. ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํด์ ์ํ๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๊ณ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉ.
- IndexedDB๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ด๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์์ ์ฐ๊ฒฐ ์ํ์ ๊ด๊ณ์์ด ์ ๊ทผ ๋ฐ ์กฐ์ ๊ฐ๋ฅํ๋ค.
Pattern
IndexedDB ์์ ์ ๊ธฐ๋ณธ ํจํด์ ์๋์ ๊ฐ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๋ค.
- ๊ฐ์ฒด ์ ์ฅ์์ ์ฝ๊ธฐ ํน์ ์ฐ๊ธฐ๋ฅผ ํ๊ธฐ ์ํด ํธ๋์ญ์ ์ ์์ํ๋ค.
- ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ์ฐ๋ค.
- ๊ฐ์ฒด ์ ์ฅ์์์ ํ์ํ ์์ ์ ์ํํ๋ค.(๊ฐ์ฒด ๊ฒ์, ๊ฐ์ฒด ์ถ๊ฐ, ๊ฐ์ฒด ์ญ์ ๋ฑ)
- ํธ๋์ญ์ ์ ์๋ฃํ๋ค.
1. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ด๊ธฐ
const request = window.indexedDB.open("my-database", 1);
request.onerror = function (event) {
console.log("Database error:", event.target.error);
};
request.onsuccess = function (event) {
const db = event.target.result;
console.log("Database", db);
console.log("Object store names: ", db.objectStoreNames);
};
window.indexedDB.open() ํธ์ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ๋ฐํํ์ง ์๋๋ค. ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ด๊ธฐ ์ํ IDBRequest ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ด ๊ฐ์ฒด๋ฅผ ํตํด ํด๋น ์์ฒญ์ ๋ํ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ์์ ์ด ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ๋ธ๋ผ์ฐ์ ๋ด์ my-database๋ผ๋ ์ด๋ฆ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฑ๋๊ณ ์ด๋ฆฐ๋ค. ์ดํ success ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. success ์ด๋ฒคํธ ์ฝ๋ฐฑ์์๋ ์ด๋ฆฐ IDBDatabase ๊ฐ์ฒด ๋ฐ ํด๋น ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํฌํจ๋ ๊ฐ์ฒด ์ ์ฅ์ ๋ชฉ๋ก์ ์ฝ์์ ๊ธฐ๋กํ๋ค.
์๋น์ค ์์ปค์ ๋ง์ฐฌ๊ฐ์ง๋ก IndexedDB๋ ๋ฒ์ ์ ๊ฐ๋๋ค. ๊ฐ์ฒด ์ ์ฅ์ ์ถ๊ฐ, ๋ณ๊ฒฝ, ์ญ์ ์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์๋ก์ด ๋ฒ์ ์ ์์ฑํด์ผํ๋ค.
IndexedDB.open()์ ๋๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋๋ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฆ๊ฐ์์ผ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์ ๋ง๋ค ์ ์๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ์กด ๋ฒ์ ๋ณด๋ค ํฐ ๋ฒ์ ๋ฒํธ๋ฅผ ๊ฐ์งํ๋ฉด upgrade needed ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค.
request.onupgradeneeded = function (event) {
const db = event.target.result;
db.createObjectStore("customers", { keyPath: "passport_number" });
};
์ด ์ฝ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ upgrade needed ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ์ฆ์ ์คํ๋๋ค. upgrade needed ์ด๋ฒคํธ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๊ณ customers๋ผ๋ ์ด๋ฆ์ ์ ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ์์ฑ. ๋ํ ์ฌ๊ถ๋ฒํธ๋ฅผ ์ ์ฅ์์ ๊ฐ ๊ฐ์ฒด์ ๋ํ ๊ณ ์ ํค๋ก ์ ์ํ๊ธฐ ์ํด keyPath๋ฅผ ์ฌ์ฉ.
2~4. ํธ๋์ญ์ ์์ -> ๊ฐ์ฒด ์ ์ฅ์ ์ด๊ธฐ -> ๊ฐ์ฒด ์ ์ฅ์์์ ํ์ํ ์์ ์ํ
request.onsuccess = function (event) {
const db = event.target.result;
const customerData = [
{
passport_number: "6651",
first_name: "John",
last_name: "Doe",
},
{
passport_number: "6652",
first_name: "Jane",
last_name: "Doe",
},
];
const customerTransaction = db.transaction("customers", "readwrite");
customerTransaction.onerror = function (error) {
console.log("Error: ", error.target.error);
};
const customerStore = customerTransaction.objectStore("customers");
for (let i = 0; i < customerData.length; i++) {
customerStore.add(customerData[i]);
}
};
์ ์ฝ๋๋ ์๋ก์ด readwrite ํธ๋์ญ์ ์ ์์ฑํ๊ณ ์์ ์ ๋ฒ์๋ฅผ customers ๊ฐ์ฒด ์ ์ฅ์๋ก ์ง์ ํ๋ค. ๋ํ ํธ๋์ญ์ ์๋ฌ๋ฅผ ์์ ํด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ์ฝ์์ ๊ธฐ๋กํ๋ค. ๋ค์์ผ๋ก ์์ฑ๋ ํธ๋์ญ์ ์ objectStore() API๋ฅผ ํธ์ถํด customers ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ์ด๊ณ , ๊ฐ์ฒด ์ ์ฅ์์ add() API๋ฅผ ํธ์ถํด ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ค.
IndexedDB์์ ์ํ๋๋ ๋๋ถ๋ถ์ ์์ ์ ํธ๋์ญ์ ์ด๋ค. ๊ฐ์ฒด ์ ์ฅ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ์ ํธ๋์ญ์ ์ ์์ํด์ผํ๋ค. ํธ๋์ญ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์์ transaction()์ ํธ์ถํ์ฌ, ์ฒซ๋ฒ์งธ ์ธ์๋ก ํธ๋์ญ์ ๋ฒ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ผ๋ก ์์๋๋ค.
ํธ๋์ญ์ ์ ๋ฒ์๋ ํธ๋์ญ์ ์ด ์ํฅ์ ์ค ์ ์๋ ๊ฐ์ฒด ์ ์ฅ์ ์ด๋ฆ ํน์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ฒด ์ ์ฅ์ ์ด๋ฆ์ ํฌํจํ ๋ฐฐ์ด์ด๋ค. ํธ๋์ญ์ ๋ฒ์๋ฅผ ์ ์ํ์ฌ, IndexedDB๊ฐ ์๋ก๋ค๋ฅธ ํธ๋์ญ์ ์ฌ์ด์ ๊ฒฝ์ ์ํ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๋๊ฐ ํน์ ๊ทธ ์ด์์ readwrite ํธ๋์ญ์ ๋ฒ์๊ฐ ๊ฒน์น๋ ๊ฒฝ์ฐ ๊ฐ ํธ๋์ญ์ ์ ํ์ ๋ค์ด๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค. ๋ง์ผ ์๋ก๋ค๋ฅธ ๋ฒ์๋ฅผ ๊ฐ๋ readwrite ํธ๋์ญ์ ์ด๊ฑฐ๋ readonly ํธ๋์ญ์ ์ธ ๊ฒฝ์ฐ ๋ณ๋ ฌ๋ก ์คํ๋ ์ ์๋ค.
ํธ๋์ญ์ ๋ด์์ ์คํํ๋ ์์ ๋ค์ ๋ง์น ํ๋์ ์์ ์ธ ๊ฒ์ฒ๋ผ ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋, ๋ชจ๋ ์คํจํ๋ ์์์ฑ์ด ๋ณด์ฅ๋๋ค.
๋ฐ์ดํฐ ์ฝ๋ ๊ฒ์๋ ์ธ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์์ฒญ
- ์ปค์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ์์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ํ
- ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ๋ ์์ ๋ฐ์ดํฐ ๊ทธ๋ฃน์ผ๋ก ๊ฒ์
๋จผ์ ํค๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด ์ ์ฅ์์์ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ฝ์ด๋ณด์.
const request = window.indexedDB.open("my-database", 2);
request.onsuccess = function (event) {
const db = event.target.result;
const customerTransaction = db.transaction("customers");
const customerStore = customerTransaction.objectStore("customers");
const request = customerStore.get("7227");
request.onsuccess = function (event) {
const customer = event.target.result;
console.log(customer);
};
};
๊ฐ์ฒด ์ ์ฅ์์์ get()์ ํธ์ถํ์ฌ ์ฐพ๊ณ ์ํ๋ ๊ณ ๊ฐ ๊ฐ์ฒด์ ์ผ์นํ๋ ํค๋ฅผ ์ ๋ฌํฉ๋๋ค. get()์ ๋น๋๊ธฐ์ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ๋ฐํํ์ง๋ ์์ง๋ง, ์์ฒญ์ ๋ํ๋ด๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ์์ฒญ์ ๋ํ onsuccess ์ด๋ฒคํธ๋ฅผ ์์ ํ์ฌ ์์ ์ด ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์์ฒญํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ IndexedDB ๋ฉ์๋๋ฅผ ์๋ก ์ฐ๊ฒฐํ๋ฉด ๋ ์งง๊ณ ๊ฐ๊ฒฐํ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
request.onsuccess = function (event) {
event.target.result
.transaction("customers")
.objectStore("customers")
.get("6651").onsuccess = function (event) {
const customer = event.target.result;
console.log(customer);
};
};
๋ฒ์ ๊ด๋ฆฌ
๋ง์ด๊ทธ๋ ์ด์ ์ ํน์ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ทธ ๋ค์ ์์ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ธฐ ์ํด ํ์ํ ์์ ๋ชจ์์ด๋ค. ์์น์ ์ผ๋ก ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฐ๊ฐ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ์ต์ ๋ฒ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์๋ค.
๋ค์์ IndexedDB์ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค.
request.onupgradeneeded = function (event) {
const db = event.target.result;
const oldVersion = event.oldVersion;
if (oldVersion < 2) {
db.createObjectStore("cusomers", {
keyPath: "passport_number",
});
}
if (oldVersion < 3) {
db.createObjectStore("employees", {
keyPath: "employee_id",
});
}
};
์ ๋ฉ์๋๋ ์ด์ ๋ฒ์ ๋ฒํธ๋ฅผ ํ์ธํด ๋ชจ๋ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ผ๋ก ๊ฐ์ ธ์ค๋๋ก ์ํํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ 1์์ ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ผ๋ก ์ฎ๊ธฐ๋๋ฐ๋ ์ ์ฉํ์ง๋ง ์์ญ๊ฐ์ ๋ฒ์ ์ ์ ์งํ๊ธฐ๋ ์ด๋ ต๋ค. ๋ฒ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ฌ ์ํ๋ฅผ ํ ์คํธํ๊ณ ํ์์ ๋ฐ๋ผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ด๋ค.
request.onupgradeneeded = function (event) {
const db = event.target.result;
if (!db.objectStoreNames.contains("customers")) {
db.createObjectStore("customers", {
keyPath: "passport_number",
});
}
};
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ ์ ์ ๋ณ๊ฒฝ์ด ํ์ํ์ง ํญ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์กด์ฌํ์ง ์๋ ๊ฐ์ฒด ์ ์ฅ์๋ง ์ถ๊ฐํ ์ ์๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ์ธ๋ฑ์ค์ธ ๊ฒฝ์ฐ์๋ง ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํ ์ ์๋ค.
์ปค์๋ก ๊ฐ์ฒด ์ฝ๊ธฐ
get()์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์ ์ฅ์์์ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์๋ค. ์ํ๊น๊ฒ๋ ์ด ๋ฐฉ๋ฒ์ ์ ํํ ํค๋ฅผ ์๊ณ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ ๋์๋ง ์๋ํ๋ค. ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด์๋ ์ปค์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
์ปค์๋? SQL ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ต์ํ๋ค๋ฉด SELECT * FROM table ์ฟผ๋ฆฌ๋ฅผ ์คํ์์ผ ์ปค์๋ฅผ ์คํํ๋ค๊ณ ์๊ฐํ ๊ฒ์ด๋ค. ์ด ์ฟผ๋ฆฌ๊ฐ WHERE์ด๋ LIMIT์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒ์ฒ๋ผ ์ปค์๋ ์ธ๋ฑ์ค๋ ๋ฐ์ด๋๋ฆฌ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ค. SQL์์ ๋ฐํ๋ ๊ฒฐ๊ณผ์ ๋ฌ๋ฆฌ, ์ปค์๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๊ณ ์์ง๋ ์๋ค. SQL์์ ๋ฐํ๋ ๊ฒฐ๊ณผ์ ๋ฌ๋ฆฌ ์ปค์๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๊ณ ์์ง๋ ์๋ค. ์ด๊ฒ์ ๋จ์ํ ๊ฐ์ฒด ์ ์ฅ์์ ์กด์ฌํ๋ ์ค์ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ ๋ชฉ๋ก์ด๋ค. ์ปค์๋ ๊ฐ์ฒด ์ ์ฅ์์ ์กด์ฌํ๋ ํ๋์ ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, continue()ํน์ advance()๋ฅผ ํตํด์๋ง ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ค๊ณ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ด๋ ์ฉ๋์ด ํฐ ๊ฐ์ฒด์ ์ฅ์๋ฅผ ์ํํ ์ ์๋ค.
์ด์ ์ปค์๋ฅผ ์ด์ด๋ณด์.
const request = window.indexedDB.open("my-database", 3);
request.onsuccess = function (event) {
const db = event.target.result;
const customerTransaction = db.transaction("customers");
const customerStore = customerTransaction.objectStore("customers");
const customerCursor = customerStore.openCursor();
customerCursor.onsuccess = function (event) {
const cursor = event.target.result;
if (!cursor) return;
console.log(cursor.value.first_name);
cursor.continue();
};
};
์ ์ฅ์์ ์ ์ฅ๋ ๊ณ ๊ฐ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ๋๋ฉฐ ์ฝ์์ ์ด๋ฆ์ด ์ถ๋ ฅ๋๋ค.
onsuccess์ด๋ฒคํธ ๋ฆฌ์ค๋์์๋ ์ปค์๋ฅผ ํตํด ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๊ฐ์ฒด์ first_name์ ๊ฐ์ ๋ก๊ทธ๋ก ๋จ๊ธฐ๊ณ , ์ปค์๊ฐ ๋ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก continue() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ์ปค์๊ฐ ์์ผ๋ก ์ด๋ํ ๋๋ง๋ค onsuccess ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋ค์ ์คํ๋๊ณ ๋ค์ ๊ณ ๊ฐ์ ์ด๋ฆ์ ๋ก๊ทธ๋ก ๋จ๊ธด๋ค.
๊ฐ์ฒด ์ ์ฅ์๊ฐ ๋น์ด์๋๋ผ๋ ์ปค์๋ ์์ผ๋ก ์ด๋ํ ๋๋ง๋ค onsuccess ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ ์ด๋ ์ปค์(event.target.result)๋ null์ ๊ฐ๋ฆฌํจ๋ค. onsuccess ํจ์๊ฐ ์ปค์์ ์ ๊ทผํ๊ธฐ ์ ์ ์ปค์๊ฐ null์ ๊ธฐ๋ฆฌํค๊ณ ์์ง ์์์ง ๊ผญ ํ์ธํด์ผํ๋ค.
์๋ก Bubbling๋๋ IndexedDB ์๋ฌ ์ฒ๋ฆฌ
IndexedDB์ ์๋ฌ ์ด๋ฒคํธ๋ ์๋ก ์ ํ๋๋ค.
์ปค์ ์คํ ์์ฒญ ์ค ์ค๋ฅ๊ฐ ์๊ธฐ๋ฉด ํด๋น ์์ฒญ์ onerror ํธ๋ค๋ฌ์ ์ค๋ฅ๊ฐ ์กํ ๊ฒ์ด๋ค. ๋ง์ผ ํด๋น ์์ฒญ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ onerror ํธ๋ค๋ฌ๊ฐ ์ ์๋์ง ์์๋ค๋ฉด ์ด ์ค๋ฅ๋ ํธ๋์ญ์ ์๋ฌ ํธ๋ค๋ฌ์ ์กํ๋๋ก ์ ํ๋ ๊ฒ์ด๋ค. ํธ๋์ญ์ ๋ ์๋ฌ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, ์๋ฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ์๋ฌ ํธ๋ค๋ฌ์ ์กํ๋๋ก ์๋ก ์ ํ๋๋ฆฌ ๊ฒ์ด๋ค.
์ด๋ฌํ ์๋ ๋ฐฉ์์ผ๋ก ์ธํด ๋งค ์์ฒญ ๋ฐ ํธ๋์ญ์ ๋ง๋ค ๋ณ๋์ ์๋ฌ ํธ๋ค๋ฌ๋ฅผ ์ ์ํ๋ ๋์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์์ ํ๋์ ์๋ฌ ํธ๋๋ฌ๋ฅผ ์์ฑํด ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.