ì¹ ì¤í ë¦¬ì§ ê°ì²´(web storage object)ì¸ localStorageì sessionStorageë ë¸ë¼ì°ì ë´ì í¤-ê° ìì ì ì¥í ì ìê² í´ì¤ëë¤.
ì´ ëì ì¬ì©íë©´ íì´ì§ë¥¼ ìë¡ ê³ ì¹¨íê³ (sessionStorageì ê²½ì°) ì¬ì§ì´ ë¸ë¼ì°ì 를 ë¤ì ì¤íí´ë(localStorageì ê²½ì°) ë°ì´í°ê° ì¬ë¼ì§ì§ ìê³ ë¨ìììµëë¤. ì´ ë¶ë¶ì ì¡°ë§ê° ë¤ìì ì´í´ë³´ê¸°ë¡ í©ìë¤.
ê·¸ë°ë° "ì¿ í¤ë¥¼ ì¬ì©íë©´ ë¸ë¼ì°ì ì ë°ì´í°ë¥¼ ì ì¥í ì ìëë°, ì ë ë¤ë¥¸ ê°ì²´ë¥¼ ì¬ì©í´ ë°ì´í°ë¥¼ ì ì¥íë 걸ê¹ì?"ë¼ë ìë¬¸ì´ ë¤ ì ììµëë¤. ì¿ í¤ ì´ì¸ìë ë¤ë¥¸ ë°©ìì ì¬ì©íë ì´ì ë ë¤ìê³¼ ê°ìµëë¤.
- ì¿ í¤ì ë¤ë¥´ê² ì¹ ì¤í ë¦¬ì§ ê°ì²´ë ë¤í¸ìí¬ ìì² ì ìë²ë¡ ì ì¡ëì§ ììµëë¤. ì´ë° í¹ì§ ë문ì ì¿ í¤ë³´ë¤ ë ë§ì ìë£ë¥¼ ë³´ê´í ì ììµëë¤. ëë¶ë¶ì ë¸ë¼ì°ì ê° ìµì 2MB í¹ì ê·¸ ì´ìì ì¹ ì¤í ë¦¬ì§ ê°ì²´ë¥¼ ì ì¥í ì ìëë¡ í´ì¤ëë¤. ëí ê°ë°ìë ë¸ë¼ì°ì ë´ ì¹ ì¤í ë¦¬ì§ êµ¬ì± ë°©ìì ì¤ì í ì ììµëë¤.
- ì¿ í¤ì ë ë¤ë¥¸ ì ì ìë²ê° HTTP í¤ë를 íµí´ ì¤í ë¦¬ì§ ê°ì²´ë¥¼ ì¡°ìí ì ìë¤ë ê²ì ëë¤. ì¹ ì¤í ë¦¬ì§ ê°ì²´ ì¡°ìì 모ë ìë°ì¤í¬ë¦½í¸ ë´ìì ìíë©ëë¤.
- ì¹ ì¤í ë¦¬ì§ ê°ì²´ë ëë©ì¸Â·íë¡í ì½Â·í¬í¸ë¡ ì ìëë ì¤ë¦¬ì§(origin)ì 묶ì¬ììµëë¤. ë°ë¼ì íë¡í ì½ê³¼ ìë¸ ëë©ì¸ì´ ë¤ë¥´ë©´ ë°ì´í°ì ì ê·¼í ì ììµëë¤.
ë ì¤í ë¦¬ì§ ê°ì²´ë ëì¼í ë©ìëì íë¡í¼í°ë¥¼ ì ê³µí©ëë¤.
setItem(key, value)â í¤-ê° ìì ë³´ê´í©ëë¤.getItem(key)â í¤ì í´ë¹íë ê°ì ë°ììµëë¤.removeItem(key)â í¤ì í´ë¹ ê°ì ìì í©ëë¤.clear()â 모ë ê²ì ìì í©ëë¤.key(index)â ì¸ë±ì¤(index)ì í´ë¹íë í¤ë¥¼ ë°ììµëë¤.lengthâ ì ì¥ë í목ì ê°ì를 ì»ìµëë¤.
ë ì¤í ë¦¬ì§ ê°ì²´ë Mapê³¼ ì ì¬í©ëë¤. setItem/getItem/removeItemì ì§ìíì£ . íì§ë§ ì¸ë±ì¤ë¥¼ ì¬ì©í´ í¤ì ì ê·¼í ì ìë¤ë ì (key(index))ìì ì°¨ì´ê° ììµëë¤.
ì´ì 본격ì ì¼ë¡ localStorageì sessionStorageê° ì´ë»ê² ëìíëì§ ì´í´ë´ ìë¤.
localStorage ë°ëª¨
localStorageì 주ì 기ë¥ì ë¤ìê³¼ ê°ìµëë¤.
- ì¤ë¦¬ì§ì´ ê°ì ê²½ì° ë°ì´í°ë 모ë íê³¼ ì°½ìì ê³µì ë©ëë¤.
- ë¸ë¼ì°ì ë OSê° ì¬ììíëë¼ë ë°ì´í°ê° í기ëì§ ììµëë¤.
ìë ìì를 ì¤íí´ë´ ìë¤.
localStorage.setItem('test', 1);
ê·¸ë¦¬ê³ ë¸ë¼ì°ì 를 ë«ê³ ì´ì´ë´ ìë¤. ë¤ë¥¸ ì°½ìì 본 íì´ì§ë¥¼ ì´ì´ë´ë ë©ëë¤. ê·¸ë¼ ì´ë° ê²°ê³¼ê° ëì¬ ê²ëë¤.
alert( localStorage.getItem('test') ); // 1
ì¤ë¦¬ì§(domain/port/protocol)ë§ ê°ë¤ë©´ url ê²½ë¡ë ë¬ë¼ë ëì¼í 결과를 ë³¼ ì ììµëë¤.
localStorageë ëì¼í ì¤ë¦¬ì§ì ê°ì§ 모ë ì°½ìì ê³µì ë기 ë문ì
ëë¤. ë°ë¼ì í ì°½ì ë°ì´í°ë¥¼ ì¤ì íë©´ ë¤ë¥¸ ì°½ìì ë³ë ì¬íì ë³¼ ì ììµëë¤.
ì¼ë° ê°ì²´ì²ë¼ ì¬ì©í기
localStorageì í¤ë¥¼ ì»ê±°ë ì¤ì í ë, ìëì²ë¼ ì¼ë° ê°ì²´ì ì ì¬í ë°©ë²ì ì¬ì©í ì ììµëë¤.
// í¤ ì¤ì í기
localStorage.test = 2;
// í¤ ì»ê¸°
alert( localStorage.test ); // 2
// í¤ ìì í기
delete localStorage.test;
íì í¸íì± ë문ì ìì§ ì´ë° ë°©ë²ì´ ì§ìë기ë íì§ë§, ë¤ìê³¼ ê°ì ì´ì ë¡ ì¶ì²íì§ ììµëë¤.
-
ì¬ì©ìë
lengthëtoString,localStorageì ë´ì¥ ë©ìë를 í¤ë¡ ì¤ì í ì ììµëë¤. ì´ë ê² ëë©´getItem,setItemì ì ìì ì¼ë¡ ìëí´ë, ì¼ë° ê°ì²´ì²ë¼ ë¤ë£° ë ìë¬ê° ë°ìí ì ììµëë¤.let key = 'length'; localStorage[key] = 5; // TypeError: Cannot assign to read only property 'length'... -
ë°ì´í°ë¥¼ ìì íë©´
storageì´ë²¤í¸ê° ë°ìíëë°, ì´ ì´ë²¤í¸ëlocalStorage를 ê°ì²´ì²ë¼ ì ê·¼í ë ì¼ì´ëì§ ììµëë¤. ìì¸í ë´ì©ì ì±í° íë°ë¶ì ë¤ë£¨ê² ìµëë¤.
í¤ ìíí기
localStorageë 'í¤â를 ì¬ì©í´ ê°ì ì»ê³ , ì¤ì íê³ , ìì í ì ìê² í´ì¤ëë¤. ê·¸ë ë¤ë©´ í¤ë ê° ì ì²´ë ì´ë»ê² ì»ì ì ììê¹ì?
ìì½ê²ë ì¤í ë¦¬ì§ ê°ì²´ë iterable ê°ì²´ê° ìëëë¤.
ëì ë°°ì´ì²ë¼ ë¤ë£¨ë©´ ì ì²´ í¤-ê°ì ì»ì ì ììµëë¤.
for(let i=0; i<localStorage.length; i++) {
let key = localStorage.key(i);
alert(`${key}: ${localStorage.getItem(key)}`);
}
ì¼ë° ê°ì²´ë¥¼ ë¤ë£° ëì²ë¼ for key in localStorage ë°ë³µë¬¸ì ì¬ì©í´ë ì ì²´ í¤-ê°ì ì»ì ì ììµëë¤.
íì§ë§ ì´ ë°©ë²ì ì¬ì©íë©´ íìíì§ ìì ë´ì¥ íëê¹ì§ ì¶ë ¥ë©ëë¤.
// ì¢ì§ ìì ë°©ë²
for(let key in localStorage) {
alert(key); // getItem, setItem ê°ì ë´ì¥ íëê¹ì§ ì¶ë ¥ë©ëë¤.
}
for key in localStorage ë°ë³µë¬¸ì ì¬ì©íë ¤ë©´ hasOwnProperty를 ì´ì©í´ íë¡í íì
ìì ììë°ì íë를 골ë¼ë´ì¼ í©ëë¤.
for(let key in localStorage) {
if (!localStorage.hasOwnProperty(key)) {
continue; // setItem, getItem ë±ì í¤ë¥¼ ê±´ëëëë¤.
}
alert(`${key}: ${localStorage.getItem(key)}`);
}
ìëë©´ ìëì²ë¼ Object.keysë¡ 'ì기 ìì âì í¤ë¥¼ ë°ìì¨ ë¤ì ìííë ë°©ë²ì ì¬ì©í ìë ììµëë¤.
let keys = Object.keys(localStorage);
for(let key of keys) {
alert(`${key}: ${localStorage.getItem(key)}`);
}
Object.keysë í´ë¹ ê°ì²´ìì ì ìí í¤ë§ ë°ííê³ íë¡í íì
ìì ììë°ì í¤ë 무ìí기 ë문ì
ëë¤.
문ìì´ë§ ì¬ì©
localStorageì í¤ì ê°ì ë°ëì 문ìì´ì´ì´ì¼ í©ëë¤.
ì«ìë ê°ì²´ ë± ë¤ë¥¸ ìë£íì ì¬ì©íê² ëë©´ 문ìì´ë¡ ìë ë³íë©ëë¤.
localStorage.user = {name: "John"};
alert(localStorage.user); // [object Object]
JSONì ì¬ì©íë©´ ê°ì²´ë¥¼ ì¸ ì ì긴 í©ëë¤.
localStorage.user = JSON.stringify({name: "John"});
// ì ì í
let user = JSON.parse( localStorage.user );
alert( user.name ); // John
ëë²ê¹ ë±ì 목ì ì¼ë¡ ì¤í ë¦¬ì§ ê°ì²´ ì 체를 문ìì´ë¡ ë³ííë ê²ë ê°ë¥í©ëë¤.
// 보기 ì¢ëë¡ JSON.stringifyì ìì ìµì
ì ì¶ê°íìµëë¤.
alert( JSON.stringify(localStorage, null, 2) );
sessionStorage
sessionStorage ê°ì²´ë localStorageì ë¹í´ ì주 ì¬ì©ëì§ ììµëë¤.
ì ê³µíë íë¡í¼í°ì ë©ìëë ê°ì§ë§, í¨ì¬ ì íì ì´ê¸° ë문ì ëë¤.
sessionStorageë íì¬ ë ìë í ë´ììë§ ì ì§ë©ëë¤.- ê°ì íì´ì§ë¼ë ë¤ë¥¸ íì ìì¼ë©´ ë¤ë¥¸ ê³³ì ì ì¥ë기 ë문ì ëë¤.
- ê·¸ë°ë° íëì íì ì¬ë¬ ê°ì iframeì´ ìë ê²½ì°ì ëì¼í ì¤ë¦¬ì§ìì ìë¤ê³ ì·¨ê¸ë기 ë문ì
sessionStorageê° ê³µì ë©ëë¤.
- íì´ì§ë¥¼ ìë¡ ê³ ì¹¨í ë
sessionStorageì ì ì¥ë ë°ì´í°ë ì¬ë¼ì§ì§ ììµëë¤. íì§ë§ íì ë«ê³ ìë¡ ì´ ëë ì¬ë¼ì§ëë¤.
ì ì´ì sessionStorage를 ì§ì ì¬ì©í´ ë´
ìë¤.
ìëì ì½ë를 ì¤íí´ë³´ì£ .
sessionStorage.setItem('test', 1);
ì´ì íì´ì§ë¥¼ ìë¡ ê³ ì¹¨ í´ ë´ ìë¤. ë°ì´í°ê° ì¬ì í ë¨ììë ê²ì íì¸í ì ììµëë¤.
alert( sessionStorage.getItem('test') ); // ìë¡ ê³ ì¹¨ í: 1
íì§ë§ ë¤ë¥¸ íìì 본 íì´ì§ë¥¼ ì´ê³ ë°ë¡ ì ììë§ ì¤íí´ë³´ë©´ 'ì무ê²ë ì°¾ì ì ìë¤âë ë»ì ê°ì§ nullì´ ë°íëëê²ì íì¸í ì ììµëë¤.
ì´ë ê² sessionStorageë ì¤ë¦¬ì§ë¿ë§ ìëë¼ ë¸ë¼ì°ì íìë ì¢
ìëì´ ììµëë¤. ì´ë° ì ì½ ë문ì sessionStorageë ì ì¬ì©ëì§ ììµëë¤.
storage ì´ë²¤í¸
localStorageë sessionStorageì ë°ì´í°ê° ê°±ì ë ë, storage ì´ë²¤í¸ê° ì¤íë©ëë¤. storage ì´ë²¤í¸ë ë¤ìê³¼ ê°ì íë¡í¼í°ë¥¼ ì§ìí©ëë¤.
keyâ ë³ê²½ë ë°ì´í°ì í¤(.clear()를 í¸ì¶íë¤ë©´null)oldValueâ ì´ì ê°(í¤ê° ìë¡ê² ì¶ê°ëìë¤ë©´null)newValueâ ìë¡ì´ ê°(í¤ê° ìì ëìë¤ë©´null)urlâ ê°±ì ì´ ì¼ì´ë 문ìì urlstorageAreaâ ê°±ì ì´ ì¼ì´ëlocalStorageësessionStorageê°ì²´
ì¬ê¸°ì ì¤ìí ì ì storage ì´ë²¤í¸ê° ì´ë²¤í¸ë¥¼ ë°ììí¨ ì¤í 리ì§ë¥¼ ì ì¸íê³ ì¤í 리ì§ìì ì ê·¼ ê°ë¥í window ê°ì²´ ì ë¶ìì ì¼ì´ëë¤ë ì¬ì¤ì
ëë¤.
ì¢ ë 구체ì ì¼ë¡ ì¤ëª ì ì´ì´ëê° ë³´ê² ìµëë¤.
ë ê°ì ì°½ì ê°ì ì¬ì´í¸ë¥¼ ëìë¨ë¤ê³ ê°ì í´ë´
ìë¤. ì°½ì ë¤ë¥´ì§ë§ localStorageë ìë¡ ê³µì ë©ëë¤.
ì¤ì 본 íì´ì§ë¥¼ ë ê°ì ë¸ë¼ì°ì ì°½ì ëì ë´ ìë¤.
ë ì°½ìì 모ë storage ì´ë²¤í¸ë¥¼ ìì íê³ ì기 ë문ì í ì°½ìì ìë ìì를 ì¤íí´ ë°ì´í°ë¥¼ ê°±ì íë©´ ë¤ë¥¸ ì°½ì í´ë¹ ì¬íì´ ë°ìëë ê²ì íì¸í ì ììµëë¤.
// 문ìë ë¤ë¥´ì§ë§, ê°±ì ì ê°ì ì¤í 리ì§ì ë°ìë©ëë¤.
window.onstorage = event => { // window.addEventListener('storage', () => {ì ê°ìµëë¤.
if (event.key != 'now') return;
alert(event.key + ':' + event.newValue + " at " + event.url);
};
localStorage.setItem('now', Date.now());
storage ì´ë²¤í¸ì ë ë¤ë¥¸ ì¤ìí í¹ì§ì event.urlì´ ìì´ ë°ì´í°ê° ê°±ì ë 문ìì URLì ì ì ìë¤ë ì ì
ëë¤.
ëí event.storageAreaìë ì¤í ë¦¬ì§ ê°ì²´ê° í¬í¨ëì´ ìëë°, storage ì´ë²¤í¸ë sessionStorageë localStorageê° ë³ê²½ë ë 모ë ë°ìí기 ë문ì event.storageAreaë ì¤í ë¦¬ì§ ì¢
ë¥ì ìê´ìì´ ì¤ì ìì ì´ ì¼ì´ë ê²ì 참조íë¤ë ê² ìì ì¤ìí í¹ì§ì
ëë¤. ë³ê²½ì´ ì¼ì´ë¬ì ë ì°ë¦¬ë event.storageAreaì 무ì¸ê°ë¥¼ ì¤ì í´ 'ìëµâì´ ê°ë¥íëë¡ í ì ìì£ .
ì´ë° í¹ì§ì ì´ì©íë©´ ì¤ë¦¬ì§ì´ ê°ì ì°½ë¼ë¦¬ ë©ìì§ë¥¼ êµííê² í ì ììµëë¤.
모ë ë¸ë¼ì°ì ë ì¤ë¦¬ì§ì´ ê°ì ì°½ë¼ë¦¬ íµì í ì ìëë¡ í´ì£¼ë ë¸ë¡ëìºì¤í¸ ì±ë API(broadcast channel API)를 ì§ìí©ëë¤. ê·¸ë°ë° ì´ APIë 기ë¥ì íë¶íì§ë§, ìì§ ë§ì ê³³ìì ì§ìíì§ ìëë¤ë ë¨ì ì´ ììµëë¤. ë¨ì ì 극복íê² í´ì£¼ë localStorage 기ë°í í´ë¦¬íë¤ì´ ìëë°, ì´ë° ë¼ì´ë¸ë¬ë¦¬ë¤ì ë¸ë¼ì°ì ì ê´ê³ìì´ ì´ëìë ì°½ ê° ë©ìì§ë¥¼ êµíí ì ìê² í´ì¤ë¤ë ì¥ì ì´ ììµëë¤.
ìì½
ì¹ ì¤í ë¦¬ì§ ê°ì²´ localStorageì sessionStorage를 ì¬ì©íë©´ ë¸ë¼ì°ì ì í¤-ê° ìì ì ì¥í ì ììµëë¤. ì´ë,
í¤ìê°ì ë°ëì 문ìì´ì´ì´ì¼ í©ëë¤.- ì í ì©ëì 5MB ì´ìì¸ë°, ë¸ë¼ì°ì ì ë°ë¼ ë¤ë¥¼ ì ììµëë¤.
- í기ëì§ ììµëë¤.
- ì¤ë¦¬ì§(ëë©ì¸Â·í¬í¸Â·íë¡í ì½)ì 묶ì¬ììµëë¤.
localStorage |
sessionStorage |
|---|---|
| ì¤ë¦¬ì§ì´ ê°ì í, ì°½ ì ì²´ìì ê³µì ë©ëë¤. | ì¤ë¦¬ì§ì´ ê°ì ë¸ë¼ì°ì í, iframeìì ê³µì ë©ëë¤. |
| ë¸ë¼ì°ì 를 ê»ë¤ ì¼ë ë¨ìììµëë¤. | íì´ì§ë¥¼ ìë¡ ê³ ì¹¨ í´ë ë¨ìììµëë¤. íì§ë§ íì´ë ë¸ë¼ì°ì 를 ì¢ ë£íë©´ ì¬ë¼ì§ëë¤. |
API:
setItem(key, value)â í¤-ê° ìì ë³´ê´í©ëë¤.getItem(key)â í¤ì í´ë¹íë ê°ì ë°ììµëë¤.removeItem(key)â í¤ì í´ë¹ ê°ì ìì í©ëë¤.clear()â 모ë ê²ì ìì í©ëë¤.key(index)âì¸ë±ì¤ì í´ë¹íë í¤ë¥¼ ë°ììµëë¤.lengthâ ì ì¥ë í목ì ê°ì를 ì»ìµëë¤.Object.keys를 ì¬ì©í´ í¤ ì 체를 ì»ì ì ììµëë¤.- ê°ì²´ íë¡í¼í°ì²ë¼ í¤ì ì ê·¼í ì ìëë°, ì´ ê²½ì°
storageì´ë²¤í¸ê° ë°ìíì§ ììµëë¤.
storage ì´ë²¤í¸:
setItem,removeItem,clear를 í¸ì¶í ë ë°ìí©ëë¤.- ì°ì°(
key/oldValue/newValue)ê³¼ ê´ë ¨ë ë°ì´í° ì ì²´ì 문ìurl, ì¤í ë¦¬ì§ ê°ì²´storageArea를 ê°ì§ê³ ììµëë¤. - ì´ë²¤í¸ê° ìì±ë ê³³ì ì ì¸íê³ ì¤í 리ì§ì ì ê·¼íë 모ë
windowê°ì²´ìì ì¼ì´ë©ëë¤(sessionStorageë í ë´ìì,localStorageììë ì ììì).
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.