본문 바로가기
Programming/11. etc

001_브라우저의 저장소에 대해 알아보자 🌎

by @sangseophwang 2022. 3. 31.

Web Storage

Web Storage란 HTML5부터 제공하는 기능으로, 해당 도메인과 관련된 특정 데이터를 서버가 아니라 클라이언트 웹브라우저에 저장할 수 있도록 제공하는 기능이다.

Web Storage는 키/값 쌍으로 데이터를 저장하고, 키를 기반으로 데이터를 저장한다. 영구 저장소(LocalStorage)임시 저장소(SessionStorage)를 따로 두어 데이터의 지속성을 구분해 사용할 수 있다.

Web Storage는 사이트의 도메인 단위로 접근이 제한된다. 예를 들어 A도메인에서 저장한 데이터는 B도메인에서 조회할 수 없다.

HTML5부터 새롭게 지원하는 저장소이기 때문에 HTML5를 지원하지 않는 브라우저에서는 사용할 수 없다.

Web Storage vs Cookie

웹 스토리지 쿠키
클라이언트에만 존재할 뿐 서버로 전송되지 않는다. 웹사이트에서 쿠키를 설정하면 이후 모든 웹 요청은 쿠키 정보를 포함해 서버로 전송된다.
문자열을 넘어 구조화된 객체를 저장할 수 있다. 문자열만 가능하다.
개수 제한은 없으며, 용량은 약 10MB 제한이 있다. 개수와 용량 제한이 있다. 최대 300개, 하나의 사이트에서 최대 20개, 크기는 4KB로 제한되어 있다.
만료기간의 설정이 없다. 만료일자를 지정하게 되어 있어 언젠가 제거된다.

LocalStorage

- 저장한 데이터를 명시적으로 지우지 않는 이상 영구적으로 보관이 가능하다.
- 도메인마다 별도로 LocalStorage가 생성된다. => 도메인만 같으면 전역적으로 공유가 가능하다.
- Window 전역 객체의 LocalStorage라는 컬렉션을 통해 저장과 조회가 이루어진다.
// 키/밸류 형식으로 로컬스토리지에 저장
localStorage.setItem('name', 'seop'); 

// 스토리지 데이터 불러오기
localStorage.getItem('name');   // seop

// 스토리지 값 삭제
localStorage.removeItem('name');
localStorage.getItem('name');  // null (삭제됨)

// 전체 삭제
localStorage.clear();

SessionStorage

- window.sessionStorage 객체
- 세션 쿠키와 달리 탭/윈도우 단위로 세션 스토리지 생성.
- 즉 window 객체와 동일한 유효 범위 및 생존 기간을 가지며 탭/윈도우를 닫을 시 데이터가 삭제된다.
- 도메인마다 별도로 SessionStorage가 생성된다.
- 사용 방법은 LocalStorage와 동일하다.

IndexedDB

- IndexedDB는 파일이나 Blob 등 많은 양의 구조화된 데이터를 클라이언트에 저장하기 위한 로우레벨 API다.
- LocalStorage의 용량이 약 10MB인 것에 비에 보통 HDD 용량의 50% 정도를 사용할 수 있다.
- IndexedDB는 SQL을 사용하는 관계형 데이터베이스(RDBMS)와 같이 트랜잭션을 사용하는 데이터베이스 시스템이다.
    *트랜잭션 ? 
       데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 객체지향 데이터베이스이며 JavaScript가 인식할 수 있는 자료형과 객체를 저장할 수 있다.
// 데이터베이스 열기
const request = indexedDB.open("notes", 2);
// IndexedDB.open(Name, Version)

// Name 또는 Version과 일치하는 데이터베이스가 없는 경우 호출
request.onupgradeneeded = e => {
	alert("upgrade is called");}

// Name과 Version 모두 일치하는 데이터베이스가 있는 경우 호출
request.onsuccess = e => {
	alert("success is called");}

// Name이 일치하지만 존재하는 DB의 Version 보다 낮은 Version을 호출하면 error가 발생
request.error = e => {
	alert("error is called");}

// Object Store(테이블) 생성
request.onupgradeneeded = e => {                
	db = e.target.result;

	const objectStore = db.createObjectStore("memo", { keyPath: "id" });
}

// 데이터 추가
const memos = [
	{ id: 1, name: "Lee", age: 12, text:"I don't want to go to school."},
	{ id: 2, name: "Kim", age: 25, text:"I don't want to go to work." }
];

let memoObjectStore = db.transaction("memo", "readwrite").objectStore("memo");
memos.forEach(function(memo) {
	memoObjectStore.add(memo);
});

// 데이터 읽기
const request = memoObjectStore.get("1");

request.onerror = e => {
	alert("Error is called");
};

request.onsuccess = e => {
	alert(`Name: ${request.result.name}, Text: ${request.result.text}`);
}

 

반응형

'Programming > 11. etc' 카테고리의 다른 글

005_npm ci, npm i  (0) 2022.05.08
004_cdn 🔗  (0) 2022.04.16
003_css의 다양한 숨김처리 방법  (0) 2022.04.11
002_인터넷 🌎  (0) 2022.04.03

댓글