IndexedDB
로컬 스토리지의 문제점
저장 용량 제한
동기적 API
단순한 데이터 구조
보안 문제
속도
IndexedDB를 사용하여 문제 해결
대용량 데이터 저장
비동기적 API
구조화된 데이터 저장
트랜잭션 지원
보안
IndexedDB의 사용
TODO List의 CRUD 예시
IndexedDB 세팅
useEffect(() => {const dbName = 'TodoDB';const storeName = 'todos';const request = indexedDB.open(dbName, 1);request.onupgradeneeded = (event) => {const db = (event.target as IDBOpenDBRequest).result;if (!db.objectStoreNames.contains(storeName)) {db.createObjectStore(storeName, { keyPath: 'id', autoIncrement: true });}};request.onsuccess = (event) => {const db = (event.target as IDBOpenDBRequest).result;setDb(db);fetchTodos(db);};request.onerror = (event) => {console.error('Error opening IndexedDB:', (event.target as IDBRequest).error);};}, []);
CRUD
const fetchTodos = (db: IDBDatabase) => {const transaction = db.transaction(['todos'], 'readonly');const store = transaction.objectStore('todos');const request = store.getAll();request.onsuccess = () => {setTodos(request.result);};};const addTodo = (task: string) => {if (!db) return;const transaction = db.transaction(['todos'], 'readwrite');const store = transaction.objectStore('todos');store.add({ task });transaction.oncomplete = () => {fetchTodos(db);};};const updateTodo = (id: number, task: string) => {if (!db) return;const transaction = db.transaction(['todos'], 'readwrite');const store = transaction.objectStore('todos');store.put({ id, task });transaction.oncomplete = () => {fetchTodos(db);};};const deleteTodo = (id: number) => {if (!db) return;const transaction = db.transaction(['todos'], 'readwrite');const store = transaction.objectStore('todos');store.delete(id);transaction.oncomplete = () => {fetchTodos(db);};};
View
<div><h1>Todo List</h1><input type="text" value={newTask} onChange={(e) => setNewTask(e.target.value)} /><button onClick={() => addTodo(newTask)}>Add Todo</button><ul>{todos.map((todo) => (<li key={todo.id}><input type="text" value={todo.task} onChange={(e) => updateTodo(todo.id, e.target.value)} /><button onClick={() => deleteTodo(todo.id)}>Delete</button></li>))}</ul></div>