최근 토이 프로젝트를 진행하며, 게임의 점수를 저장하고 쇼핑몰 물품을 장바구니에 저장하는 작업을
localStorage
를 통해 진행했다. 여태까지 스토리지, 쿠키등 저장소에 대하여 많이 들어봤지만, 정확한 개념은 모르고 사용했다. 이번에 정리를 하며 브라우저 저장소에 대한 개념을 정리해보자
서버가 사용자의 웹 브라우저에 전송하는 작은 크기의 조각, 브라우저는 그 데이터 조각들을 저장해 놓았다가 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용
기존 쿠키의 문제점을 극복하기 위해 웹 브라우저가 직접 데이터를 저장할 수 있게 해준다. HTML5 이전에는 응용 프로그래이 데이터를 요청할 때마다 매번 쿠키에 그 정보를 저장했지만, 웹 스토리지는 사용자 측에서 좀 더 많은 양의 정보를 안전하게 저장할 수 있도록 한다.
즉 , 웹 스토리지는 서버가 아닌, 클라이언트에 데이터를 저장할 수 있도록 지원하는 HTML5의 새로운 기능, 쿠키의 기능 자체는 유사하지만, 쿠키는 약 4KB까지 밖에 저장 공간을 이용하지 못하는 반면에 웹 스토리지는 약 5MB까지 저장 공간을 이용할 수 있다.
Key : Value 쌍으로 데이터를 생성, Key를 기준으로 데이터를 조회, 변경, 삭제한다.
클라이언트에 대한 정보 및 데이터를 서버에 불필요하게 저장하지 않으며, 로컬에만 정보를 저장
Domain별로 (local/session) Storage가 생성된다.
브라우저 종료시에도 유지되는 데이터를 저장할 수 있는 객체
로컬 스토리지는 브라우저에 반영구적으로 데이터를 저장하며, 브라우저를 종료해도 데이터가 유지된다. 브라우저 자체에 반영구적으로 데이터가 유지되지만, 도메인이 다른 경우에는 로컬 스토리지에 접근할 수 없다.
// 로컬 스토리지 쓰기
localStorage.setItem("key",value);
localStorage.key = value;
// 로컬 스토리지 접근
localStorage.getItem('key');
localStorage.key;
// 로컬 스토리지 삭제
localStorage.removeItem('key');
localStorage.clear();
하나의 세션만을 위한(새로고침해도 유지되는) 데이터를 저장하는 객체
세션 스토리지는 각 세션마다 데이터가 개별적으로 저장된다. 세션 스토리지는 로컬 스토리지와 다르게 세션을 종료하면 데이터가 자동으로 제거된다. 같은 도메인이라도 세션이 다르면 데이터에 접근할 수 없다.
// 세션 스토리지 쓰기
sessionStorage.setItem("key",value);
sessionStorage.key = value;
// 세션 스토리지 접근
sessionStorage.getItem('key');
sessionStorage.key;
// 세션 스토리지 삭제
sessionStorage.removeItem('key');
sessionStorage.clear();
로컬 | 세션 |
---|---|
만료 기한 없이 저장 | 종료, 새 탭을 열 경우 데이터가 삭제 |
지속적으로 필요한 정보를 저장하기에 좋음 | 잠시동안 필요한 정보를 저장하기에 좋음 |
IndexedDB는 색인이 포함된 JSON객체가 모여있는 트랜잭셔널 로컬 데이터베이스를 위해 W3C가 권고한 웹 브라우저 표준 인터페이스의 하나이다.
Key-value로 데이터를 관리하며 B-Tree 데이터 구조를 가진다.
Index를 이용해 빠르게 검색이 가능하다.
IndexedDB 데이터는 영속적으로 유지되지만, 특정 상황에 따라 삭제될 수 있다.
IndexedDB 는 Transaction Model 을 따르며, 모든 변경은 Transaction 안에서 일어난다.
만약 Transaction 내에서 문제가 생긴다면, 모든 변경사항을 폐기되고 이전 상태로 돌아간다.
IndexedDB 와 localStorage의 차이점
localStorage | IndexedDB |
---|---|
적은 양의 데이터를 저장할 때 유용 | 많은 양의 구조화된 데이터를 저장할 때 유용 |
동기적으로 작동하며, 오직 문자열 타입의 키&값만을 사용 | JS가 인식할 수 있는 자료형과 객체 사용가능 |
JSON.stringify / JSON.parse와 같은 함수가 필요 | 키,값 형태로 데이터가 저장되며 문자열 타입이 아니어도 상관없다 |
비동기적으로 작동 |
https://pks2974.medium.com/indexeddb-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-ca9be4add614
https://doinge-coding.tistory.com/entry/%EC%9B%B9%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-IndexedDB-Cache-API
https://mong-blog.tistory.com/entry/indexedDB%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
안녕하세요, 제로베이스 프론트엔드스쿨 멘토입니다. 작성해주신 글 잘 읽었고, 앞으로의 더 나은 블로깅을 응원하는 마음에서 작은 의견을 남기고 갑니다 :)
감사합니다!