๋ชฉ์ฐจ
1. localStorage
2. localStorage์ JSON
1. ๋ก์ปฌ์คํ ๋ฆฌ์ง ๊ฐ๋
localStorage๋ ํฌ๋กฌ๊ณผ ๊ฐ์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
์ฆ ์น ์์ ์ฐ๋ฆฌ์ ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๐ก
๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์๋ ์ ์ฅ๋์๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ์ ์งํ ์ ์๋ค.
๋ณดํต์ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ์ ๋ณด๋ ์ค์ ๋ฑ์ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋๋ฐ,
Key- Value ๊ฐ์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
localStorage.setItem("ํค", "๊ฐ");
ํค์๋ ๋ด๊ฐ ์ ์ฅํ๊ณ ์ถ์ DB ๋คํฑ์ด์ ์ด๋ฆ์ ์ ํด์ฃผ๋ ๊ฒ์ด๊ณ ,
๊ฐ ๊ฐ์ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ ์๋ฏธํ๋ค.
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ local Storage ๊ฐ ํ์ธํ๊ธฐ
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ localStorage๋ฅผ ํ์ธํ๋ ค๋ฉด
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์์ localStorage ๊ฐ์ ํ์ธ ํ ์ ์๋ค.
1. ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ํด๋น ํ์ด์ง์์ 'F12' ํค ๋๋ฌ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฐ๋ค.
2. 'Application' ํญ ์ ํ
3. Storage > localStorage ์์ญ์์ ํ์ธํ๋ ค๋ ๋๋ฉ์ธ์ ์ ํํ๊ณ ํด๋น ๋๋ฉ์ธ์ localStorage ๊ฐ์ ํ์ธ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด,
์น ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํ์ฌ
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ ๋ ฅํด์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์๋ ํด๋น ์์ด๋๋ฅผ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ ,
์ฌ์ฉ์๊ฐ ๋ค์์ ๋์ผํ ํ์ด์ง์ ๋ฐฉ๋ฌธํ๋ฉด
์์ด๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์์ ์ด์ ์ ์ ๋ ฅํ๋ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ๋์์ฃผ๋๋ก ๊ตฌํ ํ๋ ๋ฐฉ์์ฒ๋ผ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.
๊ฐ๋จํ๊ฒ ์ฌ์ฉ์ ์ด๋ฆ์ ์ ๋ ฅ ๋ฐ๊ณ , localStorage์ ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํด๋ณด์ .
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Momentum App</title>
</head>
<body>
<form id="login-form">
<input
required
maxlength="15"
type="text"
placeholder="What is your name?"
/>
<input type="submit" value="Log In" />
</form>
<h1 id="greeting" class="hidden"></h1>
<script src="app.js"></script>
</body>
</html>
๊ฐ๋จํ๊ฒ ์ฌ์ฉ์์ ์ด๋ฆ์ ์ ๋ ฅ๋ฐ๋ ํ๋ฉด์ ๋ง๋ค๊ณ , ์ ๋ ฅ์ ํด๋ณด์.
์ด๋ฆ์ ์ ๋ ฅํ๊ณ ์ฝ์์ฐฝ๊ณผ ์น ํ๋ฉด์ ํ์ธํด๋ณด๋ฉด
์ ๋ ฅํ ์ด๋ฆ์ด ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ผ ํฌ๋กฌ ์ฐฝ์ ๋ซ๊ณ ๋ค์ ๋ค์ด์๋ณด์.
ํฌ๋กฌ์ ๋ซ๊ณ ๋ค์ ์ด์ด ๋ค์ด์์์๋ ๋ถ๊ตฌํ๊ณ
๋ฐฉ๊ธ ์ ์ ์ ๋ ฅํ ์ด๋ฆ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๊ณ ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
const loginForm = document.querySelector("#login-form");
const loginInput = document.querySelector("#login-form input");
const greeting = document.querySelector("#greeting");
//String๋ง ์ ์ฅํ๋ ๋ณ์: ๋๋ฌธ์๋ก ์ฐ๋ ๊ด์ต
const HIDDEN_CLASSNAME = "hidden";
const USERNAME_KEY = "username";
function onLoginSubmit(event) {
event.preventDefault();
loginForm.classList.add(HIDDEN_CLASSNAME);
const username = loginInput.value;
localStorage.setItem(USERNAME_KEY,username);
paintGreetings(username);
}
loginForm.addEventListener("submit", onLoginSubmit);
function paintGreetings(abc){
greeting.innerText = `Hello ${abc}`;
greeting.classList.remove(HIDDEN_CLASSNAME);
}
const savedUsername = localStorage.getItem(USERNAME_KEY);
console.log(savedUsername);
//localstorage์ ์ ์ ์ ๋ณด๊ฐ ์๋ค๋ฉด, form์ submit์ ๊ธฐ๋ค๋ฆผ.
if(savedUsername === null){
//show the form
loginForm.classList.remove(HIDDEN_CLASSNAME);
loginForm.addEventListener("submit", onLoginSubmit);
}
else{ //localstrage์ ์ ์ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ์ ์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ธ์๋ก ๋ฃ์ด์ค.('savedUsername')
//show the greetings
paintGreetings(savedUsername);
}
ํ๋ฆ ์ดํด๋ฅผ ์์ ๊ฐ์ ธ์จ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ค.
์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ป๋ค๊ฐ ๋ค์ ๋ค์ด์๋ localStorage๋ก๋ถํฐ ์ ๋ ฅํ๋ ์ด๋ฆ์ ๊ฐ์ ธ์ค๋๋ก ๋์ํ๋ ์ฝ๋๋ค.
1) paintGreetings(username); ์ผ ๊ฒฝ์ฐ
์์ username์ loginInput.value๊ฐ abc ์ผ๋ก ๋ฐ์์ง.
2) paintGreetings(savedUsername);์ผ ๊ฒฝ์ฐ
localStorage์์ ๊บผ๋ด์ค๋ ์์ USERNAME_KEY์ ๋์ํ๋ ํค username์ ์ ๋ ฅ๋ ์ด๋ฆ value๊ฐ abc ์ผ๋ก ๋ฐ์์ง.
์ด๋ฅผ ํตํด ์ฌ๋ฐฉ๋ฌธ ์ localStorage์ ๋ฐ์ดํฐ์ ์ ๋ฌด์ ๋ฐ๋ผ ํ๋ฉด์ input์ฐฝ๋ง ๋์์ฃผ๊ฑฐ๋ ,
๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น ์ด๋ฆ๊ณผ ํจ๊ป Hello๋ผ๋ ์ธ์ฌ์ ์ด๋ฆ์ ํ๋ฉด์ ๋์์ฃผ๊ฒ ๋๋ ๊ฒ์ด๋ค.
2. localStorage์ JSON
1) localStorage๋ก ์ ์ฅํ๊ธฐ
: Object ํ์ → String ํ์ ๋ณํ
์๋ฐ์คํฌ๋ฆฝํธ์์ localStorage.setItem()์ ์ฌ์ฉํ ๋, localStorage๋ JS์ Object๋ฅผ ์ ์ฅํ ์ ์๋ค.
์ฆ, Object ํ์ ์ String ํ์ ์ผ๋ก ๋ณํํด์ localStorage์ ์ ์ฅํด์ผํ๋ค.
Object๋ฅผ String์ผ๋ก ๋ณํํ์ง ์๋ ๊ฒฝ์ฐ, value ๊ฐ์ [object Object], [object Object] ๋ผ๋ ๊ฐ์ด ๋ค์ด๊ฐ๋ค.
๋ณํ์ JSON.stringify()๋ก ํ๋ค.
function savePlease() {
localStorage.setItem(ITEMSAVED_LS, JSON.stringify(itemSaved))
}
2) localStorage์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ถ๋ฌ์ค๊ธฐ
: ์๋ ๊ฐ์ฒด๋ก ๋ณํ
: JSON.parse();
localStorage์์ JS๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋์๋ JSON.parse(localstorage key) ๋ฅผ ํตํด ๋ณํํด์ฃผ์ด์ผ ํ๋ค.
const savedToDos = localStorage.getItem(TODOS_KEY);
if(savedToDos !== null){
//string์ ๋ค์ array๋ก ๊บผ๋ด๊ธฐ ์ํด parse
const parsedToDos = JSON.parse(savedToDos);
//item ๊ฐ์๋๋ก ์๋ ํจ์๋ฅผ ํธ์ถ
//forEach() : ๋ฐ์์จ array๋ฅผ for๋ฌธ ์์ด item ํ๋์ฉ function์ ๋ฃ์ด์ค!
parsedToDos.forEach((item) => console.log("This is the turn of "+ item ));
//parsedToDos.forEach(sayHello);
toDos = parsedToDos;
//์ด์ ์ ์ ์ฅํด๋๋ ๋ฐฐ์ด์ ๋ถ๋ฌ์ ์ถ๋ ฅํจ.
parsedToDos.forEach(paintToDo);
}
๋ง์ฝ, localstorage value๋ฅผ object๋ก ๋ณํํ์ง ์๊ณ JS๋ก ์ฌ์ฉํ๋ค๋ฉด,
๊ฐ์ ์ถ๋ ฅ๋์ง๋ง forEach๋ฌธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์๋ํ๋ฉด ์ฝ๋ ๋ด์ ๋ณ์๊ฐ object ํ์ ์ด ์๋, stringํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ forEach๋ฌธ์ Array object์์๋ง ์ฌ์ฉ๊ฐ๋ฅํ ๋ฉ์๋๋ผ๋ ์ด์ ๋ ์๋ค.
๐ก
์ ๋ฆฌํ๋ฉด,
๊ฐ์ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ์ถ์๋?
-> ๋ฐฐ์ด ํ์์ผ๋ก ๋ฃ์ผ๋ฉด ๋๋ค.
๋ฐฐ์ดํ์์ string ํ์์ผ๋ก ๋ฐ๊ฟ์ค์ผ ๋ฃ์ ์ ์๋ค. JSON.stringify();
๊ทธ๋ผ "["a","b","c"]" ํ์์ผ๋ก ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌ๋ฉด ๋ฐฐ์ด ํ์์ ์ฌ์ฉํ ์ ์๋ค.
๋ฐ๋ผ์ JSON.parse()๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋ผ ["a","b","c"] ์ ๋ฐฐ์ด ๋ชจ์ต์ด ๋๋ค.
์ด๋ฌํ ๋ฐฐ์ด ํ์์์ ํน์ ๊ฐ์ ์ฐพ๊ธฐ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก 'id'๊ฐ ์ด๋ค.
๋ฐฐ์ด์ id ๊ฐ์ ์ ํด์ฃผ๊ธฐ ์ํด์ ๋ค์ ๊ฐ์ฒด(Object)๋ก ๋ฐ๊ฟ์ค๋ค.
๊ทธ๋ผ {text:"a", id=" " } ๊ณผ ๊ฐ์ ๊ฐ๊ฐ์ id๊ฐ ๋ถ์ฌ๋ ํํ๋ก ๋ฐ๋๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ id๋ฅผ ๋ง๋ค์ด์ค ๋ ์๋์ผ๋ก ์ค๋ณต๋์ง ์๋๋ก ๋ง๋ค์ด์ค์ผํ๋๋ฐ,
์ด๋ ์ ์ฉํ๊ฒ Date.now(); ์ด๋ค.
*Date.now()๋ ๊ธฐ์ค์ด ๋๋ UTC ๊ธฐ์ค์ผ๋ก 1970๋ 1์ 1์ผ 0์ 0๋ถ 0์ด๋ถํฐ ํ์ฌ๊น์ง ๊ฒฝ๊ณผ๋ ๋ฐ๋ฆฌ ์ด๋ฅผ ๋ฐํํ๋ค.
์ฆ, ๋ด ์์๊ณผ ๋ฌ๋ฆฌ ํ์ฌ์ ์๊ฐ์ ๋ด๋ ๊ฒ์ด ์๋๋ผ
ํน์ ์์ ์ผ๋ก๋ถํฐ ๊ฒฝ๊ณผ๋ ์๊ฐ์ ๋ด๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ๋ด๋ ๊ฐ์ ๊ฐ์ ์๊ฐ ์๊ณ ๊ณ ์ ํ ๊ฐ์ด ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ key๊ฐ์ ์ค๋ณต๋ ์ผ์ด ์์ด์ง๋ค.
์ด id๊ฐ์ html๋ด์ id๊ฐ๊ณผ ๋์ผ์ ํด์ฃผ๊ณ ,
ํด๋น id๊ฐ์ ์ ํํด์ ๊ทธ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ์์ผ๋ก ํน์ ๊ฐ๋ค์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
โ ์์ฝ
1. localStorage๋?
- ์น ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ผ๋ก, ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋จ.
- ์ฃผ๋ก ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ ๋ณด๋ ์ค์ ๊ฐ์ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋จ.
- localStorage.setItem(key, value)๋ก ์ ์ฅํ๊ณ , localStorage.getItem(key)๋ก ๋ถ๋ฌ์ด.
2. localStorage์ JSON ๋ณํ
1) localStorage์ ๊ฐ์ฒด ์ ์ฅ
- localStorage๋ ๋ฌธ์์ด๋ง ์ ์ฅ ๊ฐ๋ฅ
- ๊ฐ์ฒด(Object)๋ฅผ ์ ์ฅํ๋ ค๋ฉด JSON.stringify() ์ฌ์ฉ
- ๋ณํํ์ง ์์ผ๋ฉด [object Object]๊ฐ ์ ์ฅ๋จ
2) localStorage์์ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
- ์ ์ฅ๋ ๋ฌธ์์ด์ ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ค๋ฉด JSON.parse() ์ฌ์ฉ
- ๋ณํํ์ง ์์ผ๋ฉด ๋จ์ ๋ฌธ์์ด๋ก ์ธ์๋จ
3) localStorage์์ ๋ฐฐ์ด ํ์ฉ
- ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ ์ฅํ๋ ค๋ฉด ๋ฐฐ์ด(Array) ํํ๋ก ์ ์ฅ
- ๋ฐฐ์ด์ JSON.stringify()๋ก ๋ณํ ํ ์ ์ฅ
- ๋ถ๋ฌ์ฌ ๋ JSON.parse()๋ก ๋ค์ ๋ฐฐ์ด๋ก ๋ณํ
3. ๊ณ ์ ํ ID ๊ด๋ฆฌ (Date.now())
- ๋ฐ์ดํฐ๋ง๋ค ๊ณ ์ ID ๋ถ์ฌ ์ Date.now() ํ์ฉ
- Date.now()๋ 1970๋ 1์ 1์ผ๋ถํฐ์ ๊ฒฝ๊ณผ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋ฐํ
- ์ค๋ณต๋์ง ์๋ ID ์์ฑ ๊ฐ๋ฅ
*์ฐธ๊ณ ๋ฐ ์ถ์ฒ
https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage
'๐ป > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด Jsonํ์ ๋ณํ, ajax๋ฅผ ํตํด controller์ ๋๊ธฐ๊ธฐ (0) | 2025.01.05 |
---|---|
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด ๊ณต๋ฐฑ ์ ๊ฑฐํ๊ธฐ - trim() , replace() (0) | 2025.01.04 |
[JS] querySelector(), querySelectorAll() (0) | 2024.08.11 |
[JS] ์์ฑ ์ ํํ๊ธฐ - .value / .innerHTML / .textContent ๋น๊ต (2) | 2024.08.06 |
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ์ฐ์ฐ์ ์ฐ์ ์์ (0) | 2024.01.09 |