[Javascript] Indexed DB

[์›๋ณธ ๋งํฌ]

Indexed DB๋ž€?

๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ์ด๋‹ค.
JSON ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๊ณ , Key-Value ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ฐ€์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„๋ฉ”์ธ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, A ๋„๋ฉ”์ธ์—์„œ ๋งŒ๋“  IndexedDB๋Š” B ๋„๋ฉ”์ธ์—์„œ๋Š” ์ ˆ๋Œ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ , ์„œ๋กœ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†๋‹ค.

์•„๋งˆ ์›ฌ๋งŒํ•˜๋ฉด ์“ธ์ผ์ด ์—†์„ ๊ฒƒ ๊ฐ™๊ธด ํ•œ๋ฐ, ํ”„๋ก ํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ผ์ด ์žˆ๋‹ค๋ฉด ํ•œ๋ฒˆ์ฏค ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ง€์› ์ƒํƒœ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค.
IE๋„ ๋ถˆ์™„์ „ํ•˜๊ฒŒ๋‚˜๋งˆ ์ง€์›๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๋‹ค.

https://caniuse.com/indexeddb




๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ด๊ธฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฌ๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ „์—ญ ๊ฐ์ฒด์— ์กด์žฌํ•˜๋Š” 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