서버 없이 데이터를 저장하고 싶어요!

서현 서현

서버 없이 데이터를 저장하고 싶어요!

서버 없이 데이터를 저장하고 싶어요!

웹 개발을 하다 보면 정보를 기억해야 하는 순간이 꼭 옵니다. 회원가입 시 입력한 개인정보뿐만 아니라 이전 페이지에서 무엇을 체크했는지와 같은 사소한 선택지도 있겠죠?

정답은 “아니다” 입니다!

우리는 웹 브라우저에서 제공하는 db를 사용해 데이터를 저장할 수 있어요. 브라우저의 db를 사용할 수 있는 방법엔 “IndexedDB, Cookies, Web storage(Local, Session)”등이 있습니다.

오늘은 위에서 언급한 4가지 방법을 모두 다루려고 합니다!

image

WebStorage

웹 스토리지는 웹 개발을 한다면 한 번쯤은 사용하게 될 친구입니다. Local Storage, Session Storage 두 가지가 있는데, 이 둘의 차이는 ‘무엇을 기준으로 저장되느냐?’에 있습니다.

Local Storage

로컬 스토리지는 창, 즉 브라우저를 기준으로 저장됩니다. 한 브라우저당 하나의 Local Storage을 가집니다. 만약 내가 한 창안에서 여러 탭을 띄웠다면 이 탭들은 같은 Local Storage를 공유합니다. 그래서 한 탭에서 다른 탭으로 이동해도 Local Storage에 저장된 데이터는 사라지지 않습니다. 하지만 사파리와 크롬을 하나씩 띄웠다면, 이 두 브라우저는 각각 다른 로컬 스토리지를 갖고 있겠죠?

Local Storage에 저장한 데이터를 지우려면 JavaScript를 코드로 삭제하거나 브라우저의 캐시 또는 local Storage 데이터를 직접 지워야합니다. 그 때문에 로그인이나 접속 이력 등을 관리할 때 편리합니다.

Session Storage

세션 스토리지는 탭, 즉 세션을 기준으로 저장됩니다. 한 탭 당 하나의 Session Storage를 가집니다. 때문에 내가 탭을 이동하면 이동한 탭의 세션 스토리지는 이전 탭의 스토리지와 다릅니다!

Session Storage에 저장된 데이터는 탭 또는 창이 종료되면 자동으로 삭제됩니다. 이런 이유로 Local Storage보다 데이터 보존 시간이 짧다는 것입니다.

Session Storage는 수강신청 탭에서 세션만료를 체크할 때 사용하거나, 사용자가 ‘입력폼’을 입력하다가 페이지를 벗어난 경우 백업하기 위해 사용하기도 합니다.

사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 키에 데이터 쓰기
window.localStorage.setItem("key", value);
window.sessionStorage.setItem("key", value);

// 키로 부터 데이터 읽기
window.localStorage.getItem("key");
window.sessionStorage.getItem("key", value);

// 키의 데이터 삭제
window.localStorage.removeItem("key");
window.sessionStorage.removeItem("key", value);

// 모든 키의 데이터 삭제
window.localStorage.clear();
window.sessionStorage.clear();

// 저장된 키/값 쌍의 개수
window.localStorage.length;
window.sessionStorage.length;

예제(Local)

  • F12를 눌러 개발자 도구에 들어간 상태에서, 콘솔창에 다음과 같이 쳐봅니다.
  • 그런 다음 ‘Application’에 들어가줍니다.

image

image

  • LocalStorage에 들어가 보면 value를 “gdsc”로 갖는 데이터가 저장되었음을 볼 수 있습니다.
  • 이미 다른 데이터도 많이 저장되어 있죠? 제가 설치한 크롬 확장 프로그램에서 저장해 둔 데이터인 것 같습니다.
  • 탭을 껐다 켜도 남아있어요. 한번 테스트해보세요!
  • Session Storage도 같은 방식으로 테스트할 수 있습니다.

IndexedDB

다음으로는 IndexedDB입니다.

IndexedDB는 관계형 데이터베이스(RDBMS)와 같이 트랜잭션을 사용하는 데이터베이스 시스템입니다. 그러나 IndexedDB는 RDBMS의 고정컬럼 테이블 대신 JavaScript 기반의 객체지향 데이터베이스입니다.

사용할 수 있는 웹 스토리지 중에서 제일 실제 데이터베이스와 비슷하달까요!

문자열 타입의 키&값을 사용해야 하는 webStorage와 달리 IndexedDB에서는 js가 취급하는 모든 타입을 사용할 수 있습니다. 여러개의 데이터베이스를 생성할 수 있으며, 데이터를 요청하고 응답받는 과정이 비동기적으로 작동한다는 점이 특이사항입니다.

그 때문에 단순하고 적은 양의 데이터가 아닌, 많은 양의 구조화된 데이터를 쌓고 싶을 때 추천합니다 😎

사용순서

  1. 데이터베이스 열기
  2. 데이터베이스에 객체 저장소(Object store) 생성하기
  3. 요청 보내기 트랜잭션을 사용해서 보냄. (readonlyreadwriteversionchange)
  4. 요청이 완료될 때까지 기다리기
  5. 요청 결과를 가지고 어떤 동작하기

예시코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//1. 데이터베이스 열기
const idxedDB = window.indexedDB;
const request = idxedDB.open('SampleDB');

//2. 데이터베이스에 객체 저장소 생성하기
IDBRequest.createObjectStore('store_name', {keyPath: 'id'})

//3. 트랜젝션 사용하여 요청 보내기
IDBDatabase.transaction(store_names, mode, options);

//4. 이후 get, put, delete, create를 통해 데이터 수정 가능
const objStore = transaction.objectStore('name');
const request = objStore.add(name); //[POST]
const objStoreRequest = objStore.get(key); //[GET]
const updateRequest = objStore.put(value); //[PUT]
const objStoreRequest = objStore.delete(key); //[DELETE]

C(create), R(read), U(update), D(delete)는 데이터베이스를 사용하기 위한 기초적인 4가지 쿼리 형식이며, 줄여서 CRUD라고 부른답니다! indexedDB에서는 CRUD에 해당하는 메소드들이 add, get, put, delete로 정의되어 있어요 :)

총정리

  session storage local storage indexedDB
용량 가장 적음 보통 가장 큼
수명 탭이 닫히면, 세션이 만료되면 삭제 됨 코드를 통해서 삭제하거나 직접 삭제. 창이 꺼져도 삭제되지 않음 코드를 통해서 삭제하거나 직접 삭제.
방식 동기 동기 비동기
형식 문자열 타입만 가능 문자열 타입만 가능 JS 자료형 가능
여러개의 데이터베이스 X X O
난이도 ⭐️ ⭐️ ⭐️⭐️⭐️

쿠키와 세션을 이용한 로그인 (feat. JWT)

References

브라우저 저장소 (Cookie, WebStorage,Indexed DB)

cool-dawn-szlel

indexedDB에 대해 알아보자!

comments powered by Disqus