[Javascript] Indexed DB
Indexed DB๋?
๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฅ์ด๋ค.
JSON ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ, ํธ๋์ญ์
์ ์ง์ํ๊ณ , Key-Value ๋จ์์ ๋ฐ์ดํฐ ๊ด๋ฆฌ ์์คํ
์ ๊ฐ์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ฉ์ธ๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์, A ๋๋ฉ์ธ์์ ๋ง๋ IndexedDB๋ B ๋๋ฉ์ธ์์๋ ์ ๋ ์ ๊ทผํ ์ ์๊ณ , ์๋ก ์ํฅ์ ์ค ์ ์๋ค.
์๋ง ์ฌ๋งํ๋ฉด ์ธ์ผ์ด ์์ ๊ฒ ๊ฐ๊ธด ํ๋ฐ, ํ๋ก ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์กํ๊ฒ ๋ค๋ฃฐ ์ผ์ด ์๋ค๋ฉด ํ๋ฒ์ฏค ๊ณ ๋ คํด๋ณผ๋ง ํ ๊ฒ ๊ฐ๋ค.
๋ธ๋ผ์ฐ์ ์ง์ ์ํ๋ ๋์์ง ์๋ค.
IE๋ ๋ถ์์ ํ๊ฒ๋๋ง ์ง์๋๊ณ ์๋ ์ํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
์ ์ญ ๊ฐ์ฒด์ ์กด์ฌํ๋ indexedDB ๊ฐ์ฒด์์ open ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
์ธ์๋ก๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ ์ง์ ํ๋ค.
<script>
const request = window.indexedDB.open('test');
const db = null;
request.onerror = (event) => {
console.log('DB ์ด๊ธฐ ์คํจ');
};
request.onsuccess = (event) => {
console.log('DB ์ด๊ธฐ ์ฑ๊ณต');
db = event.target.result;
};
</script>
๊ทธ๋ฆฌ๊ณ ์ฝ๋ฐฑ์ผ๋ก ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, onsuccess์์ db ๊ฐ์ ๋ฐํ๋ฐ์ ํ ๋นํด์ฃผ๋ฉด ๋๋ค.
์คํ ์ด ์์ฑ
RDB์์์ ํ
์ด๋ธ๊ณผ ๋งค์นญ๋๋ ๊ฒ์ด ๋ฐ๋ก Object Store๋ผ๋ ๊ฒ์ด๋ค.
์คํ ์ด๋ ํค๊ฐ์ ํฌํจํ๋ JSON ๊ฐ์ฒด์ ๋ชฉ๋ก์ ๊ฐ์ง๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก onupgradeneeded์์ ์ ์ํด์ผ ํ๋ค. ์๊ทธ๋ฌ๋ฉด ์ค๋ฅ๋ฅผ ๋ด๋๋ผ.
createObjectStore ๋ฉ์๋์ ์ฒซ๋ฒ์จฐ ์ธ์๋ก ์คํ ์ด์ ์ด๋ฆ์, ๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ์ธ์๋ก ์ด๋ฐ์ ๋ฐ ์ต์
์ ๋ฃ์ด์ค ์ ์๋ค. keyPath๋ ๊ธฐ๋ณธํค๋ก ์ฌ์ฉํ ๊ฐ์ ์ด๋ฆ์ด๋ค.
๊ทธ๋ฆฌ๊ณ onupgradeneeded๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋๋ง ํธ์ถ๋๋ ๋
์์ด๋ผ,
์คํ ์ด ์ ์๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ๋ฒ์ ์ ์ฌ๋ ค์ค์ผ ์ ๋๋ก ๋ฐ์์ด ๋ ๊ฒ์ด๋ค.

๋ง์ฝ ํค๊ฐ ์๋์ผ๋ก ์์ฑ๋๊ฒ ํ๊ณ ์ถ๋ค๋ฉด autoIncrement ์ต์ ๊ฐ์ true๋ก ์ฃผ๋ฉด ๋๋ค.

์คํ ์ด์ ์ญ์
์คํ ์ด๋ฅผ ๋ง๋ ๋ค๋ฉด ์ง์ธ ์ค๋ ์์์ผ ํ์ง ์๊ฒ ๋๊ฐ?
ํนํ ๋ฒ์ ์ ์ฌ๋ฆฌ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์๋ฅผ ๋ฐ๊พธ๋ ค ํ๋ค๋ฉด, ๊ธฐ์กด์ ์ ์๋ฅผ ์ญ์ ํ ํ์๋ ์๋ค.
๊ทธ๋ด ๋๋ deleteObjectStore๋ก ์ง์์ฃผ๋ฉด ๋๋ค.

๋ฐ์ดํฐ์ ์ฝ์
๊ทธ๋ผ ๋ฐ์ค๋น๋ ๋์ผ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ ์ง์ด๋ฃ์ด๋ณด์.
IndexedDB๋ ๊ธฐ์กด์ DB๋ค๊ณผ ๋ค๋ฅด๊ฒ, ์ฝ๊ธฐ๋ ์ฐ๊ธฐ๋ฅผ ํ ๋ ํญ์ ๋ช
์์ ์ผ๋ก ํธ๋์ญ์
์ ๊บผ๋ธ ๋ค์ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
๋จผ์ ๊ฐ์ ธ์ฌ ์คํ ์ด์ ์ฝ๊ธฐ&์ฐ๊ธฐ๋ชจ๋๋ฅผ ์ง์ ํด์ ํธ๋์ญ์ ์ ์ด์ด๋ ํ์, ๊ฑฐ๊ธฐ์ objectStore๋ก ๋น์ฅ ์์ ํ ์คํ ์ด๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ฌ๊ธฐ๊น์ง๋ ์คํ ์ด๋ก ์ด๋ค ์์ ์ ํ๋ ๊ฐ์ ๊ณตํต์ ์ธ ๋ถ๋ถ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ add ํจ์๋ก ์คํ ์ด์ ์ฝ์
์ ํ ์ ์๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ฝ์
ํ ๊ฐ์ ์ค๋ธ์ ํธ๋ก ๋๊ฒจ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.

์ฌ๋ฌ๋ฒ์ ๋ฃ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.

๋ฐ์ดํฐ์ ์กฐํ
์กฐํ๋ ์คํ ์ด ๊ฐ์ฒด์ get ๋ฉ์๋ ๋ฑ์ผ๋ก ์ํํ ์ ์๋ค.
get์ ํค๊ฐ์ ๋ฐ์์ ๊ทธ ๊ฐ์ ํ๋ ๊ฐ์ ธ์ค๊ณ , getAll์ ์ ๋ถ ๊ฐ์ ธ์จ๋ค.
์ง์๋ฅผ ํตํด์ ๋ณต์กํ ์กฐ๊ฑด์ ์ง์ ํ ์๋ ์๋๋ฐ ๊ทธ๊ฑด ๋์ค์ ๋ค๋ค๋ณด๊ฒ ๋ค.
์๋๋ ์คํ ์ด์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ๋ฆฌ์คํธ๋ก ๋ฟ๋ ค์ฃผ๋ ๊ฐ๋จํ ์ฝ๋๋ค.

๋ฐ์ดํฐ์ ์ญ์
๋ฐ์ดํฐ์ ์ญ์ ๋ delete์ clear ๋ฑ์ผ๋ก ์ํํ ์ ์๋ค.
delete๋ ํค๊ฐ์ ๋ฐ์์ ๊ทธ๊ฑธ ์ง์ฐ๊ณ , clear๋ ์ ๋ถ ์ง์ด๋ค.
์ฌ๊ธฐ์๋ ๊ฐ๋จํ๊ฒ clear๋ง ์ผ๋ค.

์์ฉ: ๊ฐ๋จํ ๊ธฐ๋กํ ํ๋ก๊ทธ๋จ
์์ ์ฝ๋๋ค์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ก๋ง ํ๋ ๊ฐ๋จํ ํ์ด์ง๋ฅผ ๊ตฌํํด๋ณด์๋ค.
์์ค๋ ์ฌ๊ธฐ์
https://github.com/myyrakle/indexedDB-Example/tree/main/start
์ฐธ์กฐํ๋ฉด ๋๋ค.
์ ๋ ฅ์ฐฝ๊ณผ ๋ฒํผ 2๊ฐ๊ฐ ์๋๋ฐ

์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํด์ ์ฝ์ ๋ฒํผ์ ๋๋ฅด๋ฉด

๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ค์ ์๋ก๊ณ ์นจํด์ ์ ์ฒด ๋ชฉ๋ก์ ์กฐํํ๋ค.


๊ทธ๋ฆฌ๊ณ ์ ๋ถ ์ง์ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ ๋ถ ๋ ๋ฆฐ ๋ค์์ ์๋ก๊ณ ์นจ์ ํด์ค๋ค.

์ฐธ์กฐ
https://developer.mozilla.org/ko/docs/Web/API/IndexedDB_API/Using_IndexedDB
https://pks2974.medium.com/indexeddb-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-ca9be4add614
https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore