결과물의 변경 없이 코드의 구조를 재조정한다는 의미로 코드의 가독성과
편리한 유지보수를 하기 위해 진행하는 행위를 의미한다.
( 버그를 없애거나 새로운 기능을 추가하는 행위와는 다르다! )
프로그램을 구성하는 요소로, 관련된 데이터와 함수를 하나로 묶은 기능 단위를 의미한다.
- 보통 하나의 파일에 모두 작성하기 보다는 함수 기능 단위로 파일로 분리하여 작성한다.
(모듈 코드 파일화 작업)Ex) main.js 라는 모듈을 기준으로 insert.js , update.js 등의 각 기능이 담긴 파일을 import / export 하여 하나의 프로그램을 만드는 형식으로 이해했다.
기존의 instagram 페이지는 main.js에 모든 기능을 넣어 indexedDB 에 이미지 저장 업로드가 되는것까지 확인되었었다.
-- 여기서는 createIndexedDB 함수 내 새로운 DataBase 버전과 ObjectStore를 만들고
FileReader 객체를 사용하여 파일을 읽어오고 이것을 활용해 들어온 data(인자)를 기반으로
데이터를 조회,수정,삭제하는 기능을 만들어보는 작업을 진행하였다.
window.indexedDB 가 있다면
1. 데이터 베이스를 연다.
// open() 함수 호출 시 이벤트 처리 결과(성공 상태)
var request = window.indexedDB.open("MyTestDatabase");
2. 객체 저장소 (ObjectStore) 생성.
/* - 데이터를 담는 공간으로 여러개의 레코드(key-value)를 가진다.
- ObjectStore 라는 이름은 고유하다.
- IDBRequest.createObjectStore() 함수로 만들어진다.
*/
// ObjectStore를 만들때 해당 이벤트 내에서 진행된다. (데이터베이스 버전 생성 or 업데이트 시)
request.onupgradeneeded = function (event) {
var db = event.target.result;
var objectstore = db.createObjectStore(’MyTest’, { keyPath: ‘id’ });
};
3. 트랜잭션(Transaction) 시작, 데이터 추가 및 읽기 등의 데이터베이스 작업을 요청한다.
// 성공하면!
request.onsuccess = function () {
// person ObjectStore에 readwrite(읽기,쓰기) 권한으로 transaction 생성!
db.transaction([“customers”], "readwrite")
console.log(‘done~!’)
};
4. 앞의 Transaction 에 대한 요청이 성공했다는 가정하에 Dom 이벤트 리스너를 사용해 요청이 완료될때까지 기다린다.
transaction.oncomplete = function (event) {
alert("All done!");
};
transaction.onerror = function (event) {
console.log("error");
};
var objectStore = transaction.objectStore("customers");
for (var i in customerData) {
var request = objectStore.add(customerData[i]);
request.onsuccess = function (event) {
// event.target.result == customerData[i].ssn
};
}
5. 요청 객체에서 찾은 결과를 가지고 무언가를 한다.
[ 데이터 베이스로부터 데이터 가져오기 ]
var transaction = db.transaction(["customers"]);
var objectStore = transaction.objectStore("customers");
// get()을 활용해 key를 가져온다
var request = objectStore.get("444-44-4444");
request.onerror = function (event) { // 에러 발생 시
// Handle errors!
};
request.onsuccess = function (event) { // 성공 시
/* store가 하나이기 때문에 나의 트랜잭션에서 필요한 objectStore들의
리스트를 보낼 필요없이 String 형태로 이름만 보내면됨! */
db
.transaction("customers")
.objectStore("customers")
.get("444-44-4444").onsuccess = function (event) {
alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};
};
인스타그램 클론코딩 강의에서의 postId에서는 const postId = pathArray[]라는
배열 형태로하여 keyIndexDB(= getAllKeysIndexedDB)를 가져오는 메소드가
IndexedDB의 ObjectStore에서 키를 가져올때 키의 순서를 보장하지 않기때문에
키 값이 2로 나왔던 것이었다.
즉, keys 배열을 반복문으로 순회하는 과정에서 첫번째 key가 2가 된것인데 키 배열의
첫번째 요소는 항상 ObjectStore에서 가장 먼저 추가된 키가 아닐수도 있다.
그 이유는 IndexedDB의 내부 동작 방식에 따른 것이며, 개발자가 직접 키의 순서를
제어할 수는 없어서라고 한다.
keys.sort((a, b) => a - b);