ํ์์ด localstorage์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ ํ์ผ์ ๋ฐ์๋ค.
์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์นด๋์ ๋์์ผํ๋ค.
// 1 -----------------------------------------------------------------
class Board {
constructor(name, rating, reviewContent, password) {
this._name = name;
this._rating = rating;
this._reviewContent = reviewContent;
this._password = password;
}
set name(vlaue) {
if (vlaue.length === 0) throw new Error("์์ฑ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์");
this._name = vlaue;
}
set reviewContent(vlaue) {
if (vlaue.length === 0) throw new Error("์์ฑ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์");
this._reviewContent = vlaue;
}
set password(vlaue) {
if (vlaue.length === 0) throw new Error("์์ฑ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์");
this._password = password;
}
}
let boardStr = localStorage.getItem("boards");
// 2 -----------------------------------------------------------------
if (boardStr === null) {
const listStr = JSON.stringify([]);
localStorage.setItem("boards", listStr);
boardStr = listStr;
}
// 3 -----------------------------------------------------------------
form.addEventListener("submit", (e) => {
e.preventDefault();
name = name.value;
rating = rating.value;
reviewContent = reviewContent.value;
password = password.value;
// 4 -----------------------------------------------------------------
try {
const boardsObj = JSON.parse(localStorage.getItem("boards"));
const instance = new Board(name, rating, reviewContent, password);
boardsObj.push(instance);
const boardStr = JSON.stringify(boardsObj);
localStorage.setItem("boards", boardStr);
window.location.reload();
} catch (e) {
alert(e.message);
console.error(e);
}
});
1 ----------------------------------------------------------------------------
๊ฐ๋จํ ์ดํด๋ณด๋ฉด class Borad
์ ํ์ ์์์ธ 4๊ฐ์ง๋ฅผ ๊ฐ์ง ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑธ ๋ณผ ์ ์๋ค.
๊ฐ ๊ฐ์ฒด์ ์์ฑ์ ํ ๋น(set)ํ ๋ ์ ๋ ฅ๊ฐ์ด 0์ด๋ฉด ์ค๋ฅ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅ๋๊ฒ ํด์ฃผ์๊ณ , ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ boardStr ์ ํ ๋นํ๋ค.
2----------------------------------------------------------------------------
๋ฐ์ดํฐ๋ค์ด null์ด๋ผ๋ฉด ๋น ๋ฐฐ์ด์ JSON ํํ์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ listStr์ ๋ฃ์ด์ฃผ๊ณ "boards"๋ผ๋ ํค์ listStr ๊ฐ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๋ฃ์ด์ฃผ์๋ค.
3----------------------------------------------------------------------------
form์์์ summit์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฉ์ถ๋ preventDefault๋ก ์๋ก๊ณ ์นจ์ ๋ง์๊ณ ๊ฐ ์์์ ์
๋ ฅ๋ ๊ฐ๋ค์ ํ ๋นํด์ฃผ์๋ค.
4----------------------------------------------------------------------------
borads์ ๊ฐ์ ๊ฐ์ง๊ณ ์ฌ ๋ JSON์ ๋ฌธ์์ด์ javascript ๊ฐ์ผ๋ก ๋ณํํด์ฃผ์ด ์ ์ฅํด์ฃผ๊ณ , classBoard
์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ฃผ์๋ค. ๊ฐ ๊ฐ๋ค์ push๋ก ์ฐจ๋ก๋ก ๋งจ ๋์ ์ถ๊ฐํด์ค๊ฑธ ๋ณผ ์ ์๋ค.
boardsObj
์ json๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ์ฌboardStr
์ ํ ๋น ํ๊ณ ๊ทธ ๊ฐ๋ค์ localstorage์ setํด์ฃผ์๋ค. ์ฌ๊ธฐ์ ์๋ก๊ณ ์นจ ํ ๋ฒ ๋ก๊ฒจ์ ์ ๋ณด ์
๋ฐ์ดํธ๋ฅผ ํด์ฃผ๊ณ , ์๋ฌ๊ฐ ๋ ์ ๋ฉ์ธ์ง๋ฅผ ์
๋ ฅํด์ฃผ๋ ์ฝ๋์ด๋ค.
let cardContainer = document.querySelector(".cardContainer");
let boardsObj = JSON.parse(localStorage.getItem("boards");
์ฐ์ cardContainer
์์ ์นด๋๋ค์ ์ถ๊ฐํ ์์ ์ด๊ธฐ ๋๋ฌธ์ ์นด๋ ์ถ๊ฐ์ ํ์ํ ํ๊ทธ๋ค์ dom ์ ํ์๋ฅผ ์ด์ฉํ์ฌ ๋ณ์์ ์ ์ฅํด์ค.
์์ ํ๋ํ๋๋ฅผ ๋์์ผํ๊ธฐ์ JSON.parse๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด๋ค์ JavaScript ๊ฐ์ฒด๋ก ๋ณํํด์ฃผ์์.
// ์ ์ฅ๋ ๋ฐ์ดํฐ๋ค์ ์ํํ๋ฉฐ ๊ฐ ๋ณ์์ ์ ์ฅ ํ, ์ถ๊ฐํ๊ธฐ
let boardsValue = function () {
for (i = 0; i < boardsObj.length; i++) {
let boardsName = boardsObj[i]._name;
let boardsRating = boardsObj[i]._rating;
let boardsReviewContent = boardsObj[i]._reviewContent;
let boardsPassword = boardsObj[i]._password;
let starRating = "โญ".repeat(boardsRating);
//์นด๋ ์ถ๊ฐ
let review = `<div class="card">
<div class="cardHeader">
<span class="spanName">${boardsName}</span>
<span class="rating">${starRating}</span>
<hr />
<p>${boardsReviewContent}</p>
<button class="likeButton">์ข์์๐</button>
<span class="likeCount">0</span>
</div>
</div>`;
cardContainer.innerHTML += review;
// console.log(boardsName, boardsRating, boardsReviewContent, boardsPassword);
}
};
boardsValue();
๊ฐ ์
๋ ฅ ๊ฐ๋ค์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ฐ์ ธ์ ์๋ก์ด ๋ณ์์ ํ ๋นํด์ฃผ๊ณ review
๋ผ๋ ๋ณ์์ ์นด๋ ์์์ ๊ฐ์ ๋ง๋ ๋ณ์๋ค์ ${}๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃ์ด์ฃผ์๋ค.
๊ทธ ๋ค ์นด๋ ์ปจํ
์ด๋ ์์ ๋ฌธ์๋ฅผ review
๋ฅผ += ํ์ฌ ์์ ์ฃผ์๋ค.
ํ์ด์ง๋ง๋ค ํ๋ํ๋ html์ ์ฐ๋๊ฒ ์๋๋ ์์ธํ์ด์ง์์ id๋ฅผ ์ด์ฉํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์ด
import { movieId } from "./detail.js";
const boardStr = JSON.stringify(boardsObj);
localStorage.setItem("boards_" + movieId, boardStr);
window.location.reload();
์์ธํ์ด์ง์ movieId์ ์ํฌํธํด์ค๊ณ try๋ถ๋ถ๋ ์์ ํด์ฃผ์๋ค.
// 1. ๋๋ฅผ ์ ์๊ฒ ํ๊ธฐ
// 2. ๋๋ฅผ ๋ ๋ง๋ค ์นด์ดํ
๋๊ฒ ํ๊ธฐ
// 3. ๋ ๊ฐ์ ์ ์ฅํ์ฌ ๋๊ธฐ
// 4. ๊ฐ์ ธ์ค๊ธฐ
// 1 : ๋๋ฅผ ์ ์๊ฒ ํ๊ธฐ
let likeButtons = document.querySelectorAll(".likeButton");
let likeCounts = document.querySelectorAll(".likeCount");
// ๊ฐ์ด ์์ผ๋ฉด ๋น๋ฐฐ์ด๋ก ์ด๊ธฐํ
boardsObj = JSON.parse(localStorage.getItem("boards")) || [];
// 2 : ๋๋ฅผ ๋๋ง๋ค ์นด์ดํ
let likeCounting = function (index) {
let count = parseInt(likeCounts[index].innerText);
likeCounts[index].innerText = count + 1;
// 3: local storage์ ์ ์ฅ
let cardLikeCountKey = "likeCounting_" + movieId + "_" + index;
localStorage.setItem(cardLikeCountKey, likeCounts[index].innerText);
};
์ข์์ ๋ฒํผ๊ณผ ์นด์ดํ
์ ์ํด ๊ฐ๊ฐ ๋ณ์๋ฅผ ์ง์ ํด์ฃผ์๋ค.
๋ฒํผ์ ๋๋ฅด๋ฉด ์นด์ดํ
์ด ๋๋ ํจ์๋ฅผ ๋ง๋ค์ด ์ฃผ์๊ณ , ๊ฐ ์นด๋์์ ์ข์์ ์๋ฅผ ๋ํด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
์คํ ๋ฆฌ์ง์ ๊ตฌ๋ถ์ ์ ํ ์ ์๋๋ก "likeCounting_" + movieId + "_" + index
ํ์์ key์ ์นด์ดํ
๋ ์ซ์๋ฅผ value๋ก ๋ฃ์ด์ฃผ์๋ค
function getLikeCountKey(index) {
return "likeCounting_" + movieId + "_" + index;
}
// 2: ๋ฒํผ ๋๋ฅผ ๋ ๋ง๋ค ์นด์ดํ
likeButtons.forEach((button, index) => {
button.addEventListener("click", () => likeCounting(index));
});
// 4: ์ข์์ ์์ ์ธ๋ฑ์ค ๊ฐ์ง๊ณ ์ค๊ธฐ
let updateLikeCounts = function () {
likeCounts.forEach((count, index) => {
let cardLikeCountKey = getLikeCountKey(index);
let storedLikeCount = localStorage.getItem(cardLikeCountKey);
// ui ๊ฐ์๋ผ์์ฃผ๊ธฐ
if (storedLikeCount !== null) {
count.innerText = storedLikeCount;
}
});
};
window.onload = updateLikeCounts;
์๋ฒ์์ key๊ฐ์ ๊ฐ์ง๊ณ ์ ๋น๊ฐ์ด ์๋๋ผ๋ฉด ๋ฐ๋ก ์นด์ดํ
๋ ์๋ฅผ ๋ณผ ์ ์๊ฒ ํด์ฃผ์๋ค.
id์ ์ฐ๋์ด ์ ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
๋, ๋ชจ๋ฌ์ฐฝ์ ๋๋ฅด๋ฉด ํฌ๋ช
๋๋ฅผ ์ฃผ์ด ๊ตฌ๋ถ๊ฐ์ ์ฃผ์๋ค.
for๋ฌธ๊ณผ class ์ ๊ทผ, localstorage์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ด ํต์ฌ์ด์์
JSON.parse()
: JSON ๋ฌธ์์ด์ ๊ตฌ๋ฌธ์ ๋ถ์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ์์ JavaScript ๊ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํจ.
localstorage๋ฅผ ์ด์ฉํ ๋๋ ๋ง์ฐํ ์ด๋ฆ,๋ฆฌ๋ทฐ๋ด์ฉ์ ํ์ด๋ก ์ ์ฅํ ์๊ฐ์ ํ๋ค. ํ์์ด ์ค class๋ฅผ ๋ณด๋ฉด์ ์ด๋ ๊ฒ ์ ๊ทผํ๋ฉด ๋๋๊ตฌ๋ ํ๊ณ ๋์ ๋ฌด์งํจ์ ๊ฐํํ๋ค.
๊ฒฐ๊ตญ์ localstorage์ class๋ฅผ ์ ๋ชฉํด์ ๋ฆฌ๋ทฐ์ฐฝ์ ๊ตฌํํ์๋๋ฐ ์กฐ๊ธ ๋ ์ต์ํด์ ธ์ผํ ๊ฑฐ ๊ฐ์ ์ฃผ๋ง์ ๊ฐ๋ณ์ ์ผ๋ก ํ ๋ฒ ๊ธฐ์ด๋ถํฐ ํด๋ด์ผ๊ฒ ๋ค.
ํญ์ TIL์ ์ ๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ์ง๊ณ ์จ๋ด๋ ค๊ฐ๋ค๋ณด๋ ๊ณ ๋ฏผ ์์ด ๋ฐ๋ก ๋๋ฑ ๋์จ ๊ฑฐ ๊ฐ์ง๋ง ๊ผฌ๋ฐ 3์ผ์ ๋ฐ์ณ ๋์จ ๊ฒฐ๊ณผ๋ฌผ์ด๋ค..
ํท๊ฐ๋ฆฌ๋ ๋ฌธ์ ๋ค์ ์ง๋ฉดํ๊ณ ์ด๋ ดํ์ด ์์๊ฐ๋ฉด์ ๋ฌธ์ ํด๊ฒฐ์ ํด๊ฐ๋ ๊ณผ์ ์ด ๋๋ฌด ์ฌ๋ฏธ์๋ค.
์ฐ์ ์ฒ์ํ๋ ํ์
์ด๋ผ ๊ฑฑ์ ์ด ์์ฐ๋ค. ์๋ฌธ์ i์ธ ๋๋ ํ์ฅ์ผ๋ก์ ๋ฌด์ธ๊ฐ ์ด๋์ด์ผํ๋ค๋ ์ค์๊ฐ๋ ์ด๋์ ๋ ์์๋ค.
๊ฐ์ธํ๋ก์ ํธ ๋๋ ์จ์ ํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ด๊ฐ ์๊ณ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ถ๋ด์ด ๋ํ๋ค๋ฉด ํ ํ๋ก์ ํธ๋ ์กฐ๊ธ ๋ ์๋ฒฝํ๊ฒ ํ๋ ค๊ณ ์์ฌ์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฑฑ์ ๊ณผ ๋ค๋ฅด๊ฒ ์์ฌ์ํต์ ์์ํ๊ณ ํ์๋ถ๋ค๊ป์ ์๊ฒฌ ์์ฉ๋ ์ ํด์ฃผ์
์ ํ๋ก์ ํธ๊ฐ ์๋งํ๊ฒ ๋๋ ๊ฑฐ ๊ฐ๋ค.
์์ฌ์ด ์ ์ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ๊น์ง ์์ฌ ๋์ผ๋ ํ์ง ๋ชปํ๋ค๋ ์ ์ ๋์ธ ๊ฑฐ ๊ฐ๋ค.
ํ ๊ณผ์ ๋ฅผ ์งํํ๋ฉด์ guithub๋ฅผ ์ด๋์ ๋ ๋ค๋ฃฐ ์ ์๊ฒ ๋์ด ์ข์๊ณ , ๊นจ๋ถํ๋ฉด์ ํ์
์ด๋๊ฑธ ๊ฒฝํํ๊ฒ ๋์ด์ ์ข์๋ค.
๊ฐ ์ฝ๋๋ค์ ๋ํ ์ค๋ช ๊น๋ํ๊ณ ์ข์ต๋๋ค!
๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์ด์ฉํด์ ์ข์์ ์ซ์๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ ๋ฐฑ์๋ API๊ฐ ์๊ธฐ๋ฉด ์ด๋ป๊ฒ ๋ฐ๋ ์ ์์๊น์?
ํด๋ฆญํ ๋๋ง๋ค PUT API ์์ฒญ์ ๋ณด๋ด์ DB๋ฅผ updateํด์ผํ ๊น์?
์์ ์ด ๋ง์ ๋ฐ์ดํฐ์ ๋ํด์๋ DB๋ฅผ ์ด๋ป๊ฒ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์๊น์?
๊ณ ๋ฏผํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!