웹브라우저에 db를 저장하면 클라이언트와 서버와 모두 좋은 점이 있다.
네트워크를 통하지 않기 때문에 빠르게 데이터를 가지고 올 수 있어 속도가 빠르다.
별도의 서버 없이 오프라인에서 사용 가능하다.
속도가 빠르기 때문에 비용이 절약된다라는 장점이 있다.
사용자의 정보가 서버로 전송 되지 않기 때문에 안전하게 클라이언트 단에 보관된다.
=> 브라우저에 정보를 저장하는 방법은 Cookie, LocalStroage, IndexedDB 가 있다.
=> 그렇기 때문에 Cookie는 데이터의 양이 많으면 많을수록 서버와의 통신속도가 느려진다.
=> 그러나 Cookie와 LocalStorage와 다른 점은 데이터를 저장하는데에 있어서 데이터의 타입이 제한이 없고 저장할 수 있는 데이터의 양이 많다는 것이다. (그러나 이 것은 브라우저의 환경마다 다르다.) 그리고 비동기식으로 작동한다.
Method | 설명 |
---|---|
indexedDB.open | DB를 생성할 때 쓰며 DB 명과 버전을 인자로 받음. |
upgradeneeded | 버전이 업데이트 될 때마다 (ex-> 1 => 2) 실행된다. |
success | IndexedDB에 대한 코드가 성공적으로 수행되었을 때 실행하는 메소드이다. |
error | 에러가 발생하면 에러 객체를 호출한다. |
transaction | 하나의 transaction을 생성하며 테이블 명과 / readwrite, readonly 등 어떻게 하는 용도로 쓸 것인지 인자로 준다. |
createObjectStore | 서버 DB로 치면 테이블을 생성해주는 것이다. IndexedDB에선 objectStore라고 부른다. 테이블 명과 { keyPath: 'id', autoIncreament: true } 와 같이 기본키 및 옵션을 객체 인자로 받는다. |
add | 데이터를 인자로 받으며 보통 데이터는 객체 상태의 데이터이다. |
function createModal() {
// 지시사항에 맞춰 shareBtn 요소에 이벤트를 추가하세요.
shareBtn.addEventListener("click", function () {
if (window.indexedDB) {
const databaseName = "instagram";
const version = 1;
const requst = indexedDB.open(databaseName, version);
const data = {
content: document.querySelector(".modal__write > textarea").value,
image: imageBase64,
}
requst.onupgradeneeded = function() {
requst.result
.createObjectStore("posts", {autoIncrement: true})
}
requst.onsuccess = function () {
const store = requst.result
.transaction("posts", "readwrite")
.objectStore("posts");
console.log(store);
store.add(data)
}
}
})
};
reader.onerror = function (error) {
alert('Error: ', error);
document.querySelector('body').removeChild(modalEl);
};
});
}
//db생성
const dbReq = indexedDB.open('instagram', 1); //db생성(1)
let db;
dbReq.addEventListener('success', function (event) {
db = event.target.result; //db 생성 및 접근권한 획득.
console.log('success');
});
//error handling
dbReq.addEventListener('error', function (event) {
const error = event.target.error;
console.log('error', error.name); // 콘솔에 Error 객체의 name value값 출력.
});
//ubgradeneeded(2)
dbReq.addEventListener('upgradeneeded', function (event) {
//db 버전 업데이트 시 실행
db = event.target.result;
let oldVersion = event.oldVersion;
if (oldVersion < 1) {
// 처음 default = 0. 버전이 1보다 작을 시 테이블과 기본키 생성
db.createObjectStore('posts', { keyPath: 'id', autoIncreament: true });
}
});
//공유버튼 클릭시
shareBtn.addEventListener('click', function (event) {
//테이블에 등록되는거까지만.
const store = db.transaction('posts', 'readwrite').objectStore('posts');
const post = {
id: 2, // generate a unique ID for each post
content: document.querySelector('.modal__write > textarea').value,
image: imageBase64,
};
const addReq = store.add(post);
addReq.addEventListener('success', function (event) {
console.log('success:', post);
});
addReq.addEventListener('error', function (event) {
console.error('error:', event.target.error);
});