IndexedDB 사용법 정리

IndexedDB 사용법을 간단히 정리하여 포스팅하려 합니다.

기본적인 CRUD부분에 대한 내용입니다.

 

IndexedDB는 웹 인터페이스 중 하나로 로컬 데이터베이스 역할을 합니다.

브라우저에서 제공하는 데이터베이스 라고 이해하면 편하겠습니다.

localStorage, sessionStorage에 저장하기에는 많은 양의 데이터를 저장할 때 주로 쓰입니다.

 

Database 만들기

- 브라우저는 여러개의 Database를 가질 수 있습니다.

- Database에는 Version정보가 있고 여러 개의 ObjectStore를 가질 수 있습니다.

  ( Database 수정시에는 Version을 수정해야 합니다. )

- indexedDB.open(db_name, version) 함수로 Database를 열도록 요청합니다.

// 지원여부확인
if (!window.indexedDB) {
    window.alert("browser doesn't support IndexedDB")
} else {
    var db;
    var request = window.indexedDB.open('myDataBase');
    
    request.onerror = function(event) {
    	alert('failed');
    }
    request.onsuccess = function(event) {
    	db = request.result;
    }
}

 

 

ObjectStore 만들기

- 데이터를 담는 공간입니다.

- 여러개의 레코드 (Key-Value)를 가집니다.

- ObjectStore의 이름은 고유해야 합니다.

- IDBRequest.createObjectStore() 함수로 만듭니다. ( Database가 upgrade 될 때 즉 새로 만들어 지거나 버전을

높여서 오픈할때 ObjectStore를 만들거나 수정할 수 있습니다. )

// 지원여부확인
if (!window.indexedDB) {
    window.alert("browser doesn't support IndexedDB")
} else {
    var db;
    var request = window.indexedDB.open('myDataBase');
    
    // 새로만들거나 버전이 높을때만 발생하는 이벤트 
    // ObjectStroe를 만들거나 수정할때 이 이벤트내에서 진행
    // onsuccess는 이 이벤트가 끝나면 발생됩니다.
    request.onupgradeneeded = function(event) {
    	var db = event.target.result;
        // person 이라는 이름으로 ObjectStore를 만듬, key를 따로 만들지 않고 자동생성함.
        var objectStore = db.createObjectStore('person', {keyPath: 'id'});
    }
    request.onerror = function(event) {
    	alert('failed');
    }
    request.onsuccess = function(event) {
    	db = this.result;
    }
}

 

ObjectStore에 데이터 입력하기

- DB를 연 다음 Transaction 을통해 ObjectStore에 접근하여 입력합니다.

function writeIndexedDB(people) {
    var request = window.indexedDB.open('myDataBase');
    
    request.onerror = function(event) {
    	alert('Database error: ' + event.target.errorCode);
    }
    request.onsuccess = function(event) {
    	var db = this.result;
    	// person ObjectStore에 readwrite(읽기,쓰기) 권한으로 Transaction 생성
    	var transaction = db.transaction(['person'], 'readwrite');
        
        // 완료 및 실패 이벤트 제어
        transaction.oncomplete = function(event) {
        	console.log('done');
        }
        transaction.onerror = function(event) {
        	console.log('fail');
        }
        
        var objectStore = transaction.objectStore('person');
        for(var person of people) {
            var request = objectStore.add(person);
            request.onsuccess = function(event) {
            	console.log(event.target.result);
            }
        }
    }
}

var people = [{
                  id: 1
                , name: 'Aiden'
                , age: 25
                , height: 178
              },
              {
              	  id: 2
                , name: 'Matthew'
                , age: 22
                , height: 182
              },
              {
              	  id: 3
                , name: 'John'
                , age: 26
                , height: 174
              }];

writeIndexedDB(people);

직접 데이터를 입력해보시면 F12(개발자 도구) -> Application에 데이터가 들어간 것을 확인할 수 있습니다.

Chrome Browser에서 IndexDB 확인

 

ObjectStore에 데이터 조회하기

- DB를 연 다음 Transaction 을통해 ObjectStore에 접근하여 조회합니다.

- key를 통해 Value를 가져올 수 있습니다.

function selectOneIndexedDB(key) {
    var request = window.indexedDB.open('myDataBase');
    
    request.onerror = function(event) {
    	console.log(event.target.errorCode);
    }
    request.onsuccess = function(event) {
    	var db = this.result;
        var transaction = db.transaction(['person']);
        
        transaction.onerror = function(event) {
        	console.log('fail');
        }
        transaction.oncomplete = function(event) {
        	console.log(result);
        	console.log('done');
        }
        
        var objectStore = transaction.objectStore('person');
        request = objectStore.get(key);
        request.onsuccess = function(event) {
        	result = event.target.result;
        }
    }
}

- Cursor를 통해 ObjectStore내의 모든 키를 반복하여 데이터를 가져올 수 있습니다.

function selectAllIndexedDB() {
    var request = window.indexedDB.open('myDataBase');
    
    request.onerror = function(event) {
    	console.log(event.target.errorCode);
    }
    request.onsuccess = function(event) {
    	var db = this.result;
        var transaction = db.transaction(['person']);
        
        transaction.onerror = function(event) {
        	console.log('fail');
        }
        transaction.oncomplete = function(event) {
        	console.log('done');
        }
        
        var objectStore = transaction.objectStore('person');
        var request = objectStore.openCursor();
        request.onsuccess = function(event) {
        	var cursor = event.target.result;
            if(cursor) {
            	request = objectStore.get(cursor.key);
                request.onsuccess = function(event) {
                	console.log(event.target.result);
                }
                cursor.continue();
            }
        }
    }
}

 

ObjectStore에 데이터 수정하기

- DB를 연다음 Transaction 을통해 ObjectStore에 접근하여 조회합니다.

- key를 통해 Value를 Update 합니다.

function updateIndexedDB(key, value) {
	var request = window.indexedDB.open('myDataBase');
    
    request.onerror = function(event) {
    	console.log(event.target.errorCode);
    }
    request.onsuccess = function(event) {
    	var db = this.result;
        var transaction = db.transaction(['person'], 'readwrite');
        
        transaction.onerror = function(event) {
        	console.log('fail');
        }
        transaction.onsuccess = function(event) {
        	console.log('done');
        }
        
        var objectStore = transaction.objectStore('person');
        request = objectStore.get(key);
        request.onsuccess = function(event) {
            var data = event.target.result;
            data = value;
            
            var updateRequest = objectStore.put(data);
            updateRequest.onerror = function(event) {
            	console.log('update error');
            }
            updateRequest.onsuccess = function(event) {
            	console.log('update success');
            }
        }
    }
}

updateIndexedDB(1, {id:1, name:'Aiden', age:30, height:180});

 

ObjectStore에 데이터 삭제하기

- DB를 연다음 Transaction 을통해 ObjectStore에 접근하여 조회합니다.

- key를 통해 삭제합니다.

function deleteIndexedDB(key) {
	var request = window.indexedDB.open('myDataBase');
    
    request.onerror = function(event) {
    	alert(event.target.errorCode);
    }
    request.onsuccess = function(event) {
    	var db = this.result;
        var transaction = db.transaction(['person'], 'readwrite');
        
        transaction.onerror = function(event) {
        	console.log('fail');
        }
        transaction.onsuccess = function(evnet) {
        	console.log('done');
        }
        
        var objectStore = transaction.objectStore('person');
        var deleteReqeust = objectStore.delete(key);
        deleteReqeust.onsuccess = function(event) {
        	console.log('deleted');
        }
    }
}

 

- clear() 함수를 통해 데이터 전체 삭제할 수 있습니다.

function deleteAllIndexedDB() {
	var request = window.indexedDB.open('myDataBase');
    
    request.onerror = function(event) {
    	alert(event.target.errorCode);
    }
    request.onsuccess = function(event) {
    	var db = this.result;
        var transaction = db.transaction(['person'], 'readwrite');
        
        transaction.onerror = function(event) {
        	console.log('fail');
        }
        transaction.onsuccess = function(evnet) {
        	console.log('done');
        }
        
        var objectStore = transaction.objectStore('person');
        var deleteReqeust = objectStore.clear();
        deleteReqeust.onsuccess = function(event) {
        	console.log('deleted');
        }
    }
}