๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JS

[JavaScript] : localStorage 'data' ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ.

by ๊ถŒ์Šพํ–„ 2023. 6. 6.

ํ•ด๋‹น ์˜ํ™”์˜ ์ƒ์„ธํŽ˜์ด์ง€์—์„œ, localStorage ์— ์ €์žฅ๋œ ๋Œ“๊ธ€์„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค.


๋กœ์ง ์ƒ๊ฐ ํ•ด๋ณด๊ธฐ.

1. ๋Œ“๊ธ€๋งˆ๋‹ค ์‚ญ์ œํ•˜๋Š” ๋ฒ„ํŠผ์ด ์žˆ์œผ๋ฉด ๋˜๊ฒ ๋‹ค.

2. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด addEventListener() ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ, ๋Œ“๊ธ€์„ ์‚ญ์ œํ•˜๋Š” ๋กœ์ง์ด ์‹คํ–‰๋˜๋ฉด ๋˜๊ฒ ๋‹ค.


์ฝ”๋“œ ๊ตฌํ˜„
1. ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฌ๋Š” html์— ์žˆ๋Š” ์‚ญ์ œํ•˜๊ธฐ button ์ถ”๊ฐ€, class๋„ ๋‹ฌ์•„์ฃผ์—ˆ๋‹ค.
return `<li class="review" data-number="${index}">
            <p class="comment-contents">${contents}</p>
            <p class="commnet-writer">์ž‘์„ฑ์ž: ${writer}</p>
            <div>
              <button class="update">์ˆ˜์ •ํ•˜๊ธฐ</button>
              <button class="delete">์‚ญ์ œํ•˜๊ธฐ</button>
            <div>
        </li>`

์œ„์™€ ๊ฐ™์ด ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜ ์ˆ˜์ •ํ•˜๊ธฐ์™€ ์‚ญ์ œํ•˜๊ธฐ ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋˜์–ด์„œ ๊ธฐ๋ก๋œ๋‹ค.

2. ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ธฐ.
const deleteBtns = document.querySelectorAll(".delete"); // ํด๋ž˜์Šค์— ์ ‘๊ทผํ• ๋•Œ๋Š” ์˜จ์ , id์— ์ ‘๊ทผํ• ๋•Œ๋Š” #์„ ์‚ฌ์šฉํ•œ๋‹ค.
  console.log(deleteBtns); // ํ•ญ์ƒ ์ฝ˜์†”๋กœ ํ™•์ธํ•ด๋ณด๋Š” ์Šต๊ด€์„ ๋“ค์ด์ž.

์ง€์ •ํ•œ ์‚ญ์ œ ๋ฒ„ํŠผ์ด ์ฝ˜์†”์— ์ž˜ ์ฐํžˆ๋Š”์ง€ ํ™•์ธ.

ํ˜„์žฌ ๋Œ“๊ธ€์— ์žˆ๋Š” ๊ฐฏ์ˆ˜๋งŒํผ ์ •ํ™•ํžˆ ๊ฐ€์ ธ์™”๋‹ค.

3. ๊ฐ ๋ฒ„ํŠผ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๋‹ฌ์•„์ฃผ๊ธฐ ์œ„ํ•ด forEach ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ.
// ๋งค๊ฐœ๋ณ€์ˆ˜์— index๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฑด ์˜ค๋Š˜ ์ฒ˜์Œ์•Œ์•˜๋‹ค.
// ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•จ. ์ด๊ฑธ ํ†ตํ•ด์„œ ์˜ค๋Š˜ ๋ณด๋‹ค ์ˆ˜์›”ํ•˜๊ฒŒ(?) ๊ธฐ๋Šฅ์„ ์‹คํ˜„์‹œํ‚จ๊ฒƒ ๊ฐ™๋‹ค.

deleteBtns.forEach((deleteBtn, index) => {
    deleteBtn.addEventListener("click", function () {
    	console.log("์ž˜ ์ž‘๋™ํ•˜๋‚˜์š”?")
  });
});

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์„œ ์‚ญ์ œํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณธ๋‹ค.

์˜ค์ผ€์ด ์ด๋ฒคํŠธ ์ž‘๋™ ํ™•์ธํ–ˆ๊ณ ,

4. toSpliced ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
// ์–ด๋–ค์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ• ์ง€ ๊ณ„์† ๊ณ ๋ฏผ์„ ํ•˜๋‹ค๊ฐ€, data ์™€ index์˜ ๊ฐ’์„ ์ฐ์–ด๋ณด์•˜๋‹ค.
// ์—ฌ๊ธฐ์„œ index๊ฐ€ ์‚ฌ์šฉ๋จ !!

deleteBtns.forEach((deleteBtn, index) => {
    deleteBtn.addEventListener("click", function () {
      console.log(data);
      console.log(index);
  });
});

๋‹ค์‹œ ์‚ญ์ œํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด,

์ œ์ผ ์ฒซ๋ฒˆ์งธ ๋ฆฌ๋ทฐ์˜ ์‚ญ์ œํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋”๋‹ˆ ์ฝ˜์†”์— ์ฐ์€ data์˜ ๊ฐ’๊ณผ, ์ฒซ๋ฒˆ์งธ ์‚ญ์ œ๋ฒ„ํŠผ์˜ index๊ฐ€ ๋‚˜์™”๋‹ค.

์—ฌ๊ธฐ์„œ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์“ฐ๋Š”๊ฒŒ ์ข‹์„๊นŒ ํ•˜๋‹ค toSpliced๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ mdn ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toSpliced

 

Array.prototype.toSpliced() - JavaScript | MDN

The toSpliced() method of Array instances is the copying version of the splice() method. It returns a new array with some elements removed and/or replaced at a given index.

developer.mozilla.org

// ์‚ฌ์šฉ๋ฒ• : ๋ฉ”์„œ๋“œ ์•ž์— ๋ฐฐ์—ด์ด ์˜ค๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ํ›„ ์ƒˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•จ.
// index ์ž๋ฆฌ์—๋Š” start index๊ฐ€ ์˜ค๊ณ , ์ˆซ์ž "1" ์ž๋ฆฌ์—๋Š” delete number ์ œ๊ฑฐํ•  ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๊ฐ€ ์˜จ๋‹ค.
// ํ•ด์„ : index์—์„œ ์‹œ์ž‘ํ•ด์„œ "1"๋งŒํผ delete ํ•˜๋Š” ๋ฉ”์„œ๋“œ

data.toSpliced(index, 1)
deleteBtns.forEach((deleteBtn, index) => {
    deleteBtn.addEventListener("click", function () {
      console.log(data.toSpliced(index, 1));
    });
  });
  
  // ์ด๋ ‡๊ฒŒ ์ฝ”๋”ฉ์„ ํ•œ ์ด์œ  : ๋‚ด๊ฐ€ ๋ˆ„๋ฅด๋Š” ๋Œ“๊ธ€์˜ index ๋ฒˆํ˜ธ๋ฅผ ์ฝ˜์†”๋กœ ํ™•์ธํ–ˆ์œผ๋‹ˆ,
  // index ์ž๋ฆฌ์—๋Š” ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๊ฐ€์ง„ index๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ๋˜๊ณ ,
  // ์‚ญ์ œ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ๋Œ“๊ธ€๋งŒ ์‚ญ์ œํ•ด์ค„ ๊ฑฐ๋‹ˆ๊นŒ, delete count ๋Š” 1๋กœ ๊ณ ์ •์‹œํ‚ค๋ฉด ๋œ๋‹ค.

์ฒซ๋ฒˆ์งธ ๋ฆฌ๋ทฐ๋ฅผ ์ง€์šฐ๊ณ ์ž ํ•  ๋•Œ ์ฝ˜์†”๋กœ ์ฐ์–ด๋ณด๋ฉด,

0๋ฒˆ์งธ index์ธ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ๋‚จ์€ data๊ฐ€ ์ฝ˜์†”์— ์ฐํžˆ๋Š”๊ฑธ ํ™•์ธํ–ˆ๋‹ค.

5. ๋ฐ์ดํ„ฐ๋ฅผ localStorage ์— ์ €์žฅ.
deleteBtns.forEach((deleteBtn, index) => {
    deleteBtn.addEventListener("click", function () {
      const deletedData = data.toSpliced(index, 1); // toSpliced ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹น.
      console.log(deletedData); // ์ฝ˜์†”๋กœ ํ™•์ธ
      const deletedArr = JSON.stringify([...deletedData]); // data๊ฐ’์„ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋ฅผ spread operator๋ฅผ ์‚ฌ์šฉํ•ด ํ’€์–ด์ฃผ๊ณ  JSON.stringify๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
      console.log(deletedArr);
    });
  });
  
  // data ๊ฐ’์„ ๊ฐ€์ง„ deletedData๋ฅผ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ๋‹ค์‹œ ํ• ๋‹นํ•˜๋Š” ์ด์œ  : ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ.

์ฝ˜์†”๋กœ ํ™•์ธํ•ด๋ณด๋ฉด,

์œ„์˜ ์ฝ˜์†” = ์Šคํ”Œ๋ผ์ด์Šค ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜์— ์ฝ˜์†” ์ฐ์€ ๊ฐ’.

์•„๋ž˜ ์ฝ˜์†” = ์œ„์˜ data ๊ฐ’์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ [] ๋ฐฐ์—ด์— spread operator๋ฅผ ์‚ฌ์šฉํ•ด ํ’€์–ด์ฃผ๊ณ , JSON.stringify๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด ์ค€ ๊ฐ’.

๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ ์ด์œ  : storage์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ๋ฌธ์ž์—ด๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, data๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ์—ˆ๋‹ค.
                                   ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋จ
https://velog.io/@bgo517/LocalStorage ์ฐธ์กฐ.
toSpliced ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ๋ฐฐ์—ด์„ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ์ด์œ ๋Š”, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆœํ™˜์ฐธ์กฐ ์ด์–ด์„œ ๊ทธ๋ ‡๋‹ค.
์ˆœํ™˜์ฐธ์กฐ๋Š” throw error -> toSpliced๊ฐ€ ์ˆœํ™˜์ฐธ์กฐ์—ฌ์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ -> ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ์–•์€๋ณต์‚ฌ
์ด ๋ถ€๋ถ„์€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…์„ ํ•˜์ง„ ๋ชปํ•ด์„œ, ์กฐ๊ธˆ ๋” ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๋ด์•ผ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค.

์ด์ œ๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์ด ๋ฌธ์ž์—ด๋กœ ์ •๋ฆฌ๋œ data๋กœ ์ฝ˜์†”์— ์ฐํžˆ๋Š” ๊ฑธ ํ™•์ธ ํ–ˆ์œผ๋‹ˆ, localStorage์— setItem๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ €์žฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  const deleteBtns = document.querySelectorAll(".delete");
  console.log(deleteBtns);
  deleteBtns.forEach((deleteBtn, index) => {
    deleteBtn.addEventListener("click", function () {
      const deletedData = data.toSpliced(index, 1);
      const deletedArr = JSON.stringify([...deletedData]);
      localStorage.setItem(`comment${movieId}`, deletedArr); // `comment${movieId}` ์ด ์ž๋ฆฌ๋Š” key๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ , deletedArr ์ด ์ž๋ฆฌ๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ value ๊ฐ’์ด ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.
      window.location.reload(); // ์ฐฝ ์ƒˆ๋กœ๊ณ ์นจ.
    });
  });

์œ„ ์ฝ”๋“œ๋Š” ์™„์„ฑ์ฝ”๋“œ๋‹ค. ์ด์ œ ์ƒ์„ธํŽ˜์ด์ง€์— ๊ฐ€์„œ ์ •์ƒ์ž‘๋™ ํ•˜๋Š”์ง€ ํ™•์ธ์„ ํ•ด๋ณด์ž !!

์ œ์ผ ์ฒซ๋ฒˆ์งธ ๋ฆฌ๋ทฐ๋ฅผ ์‚ญ์ œํ•ด ๋ณธ๋‹ค.

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‚ญ์ œ๊ฐ€ ๋˜๊ณ , ์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ์œผ๋กœ ์ฐฝ์ด ์ตœ์‹ ํ™” ๋œ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ํ˜„์žฌ localStorage์—๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” data๋งŒ ๋“ค์–ด๊ฐ€์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„์ฑ„๋กœ ๋‚จ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ €์žฅ๋˜์–ด์žˆ๋Š”๊ฑธ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋Œ“๊ธ€  ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.


์‹œ๋„ํ•ด ๋ณธ ๊ฒƒ๋“ค
์˜ค๋ฅ˜
์‹œ์ž‘์กฐ์ฐจ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ๋  ์ง€ ๋ชฐ๋ผ ๋ฌด์ž‘์ • localStorage์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ถ„์‚ญ์ œ ์‹œ๋„ํ•ด๋ณด๊ธฐ

์•„๋ž˜์˜ ์ˆซ์ž๋“ค์€ ๋งจ ์ฒ˜์Œ ์ƒ๊ฐํ•ด๋ณด์•˜๋˜ ์‚ญ์ œ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋กœ์ง ์ˆœ์„œ์ด๋‹ค.

// 1. ํ•ด๋‹น์˜ํ™”์˜ ์ƒ์„ธํŽ˜์ด์ง€์—์žˆ๋Š” local storage์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค.
const userComment = JSON.parse(localStorage.getItem("comment385687"));
console.log(userComment);
// // 2. ๊ฐ’์„ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜์— toSpliced๋ฉ”์„œ๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
console.log(typeof userComment.toSpliced(0, 1)); // data์˜ ๊ฐ’์ด ์–ด๋–ค type์ธ์ง€ ํ™•์ธํ•˜๋Š” typeof ๋ฉ”์„œ๋“œ์ด๋‹ค.
console.log(userComment.toSpliced(0, 1));
// 3. toSpliced ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ๋ฐฐ์—ด์„ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹น
const newUserComment = userComment.toSpliced(0, 1);
const arr = JSON.stringify([...newUserComment]);
console.log(newUserComment);
console.log(arr);
// 4. ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ setํ•ด์ค€๋‹ค.
// set ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์— ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ• / ์˜ค๋ฅ˜ ๋ฐœ์ƒ

// 4-1. 
console.log(localStorage.setItem("comment385687", arr));
localStorage.setItem("comment385687", arr);

// toSpliced ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ’์„ localStorage ์— set์„ ์‹œ์ผœ๋ณด๋ฉด Uncaught TypeError: JSON.stringfy is not a function
Uncaught TypeError: JSON.stringify is not a function

// ์˜ค๋ฅ˜ ๋ฐœ์ƒ,

์œ„์˜ ์˜ค๋ฅ˜์— ์ œ์ด์Šจ ์ŠคํŠธ๋ง๊ธฐํŒŒ์ด๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค๋ผ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ  ๊ทธ๋Ÿผ ํ•จ์ˆ˜์— ๋กœ์ง์— ํ• ๋‹นํ•ด์•ผ ํ•˜๋‚˜ ์‹ถ์–ด์„œ

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ตฌ์ƒํ•ด ๋ณด์•˜๋‹ค,

// 4-2. ๋กœ์ปฌ์ €์žฅ์†Œ์— [{key: comment385687, value: data}] ๊ฐ€ ์žˆ์œผ๋ฉด ๋ถˆ๋Ÿฌ์˜ค๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด [] ๋นˆ ๋ฐฐ์—ด์„ ํ• ๋‹น.

const newData = () => {
  const dataArray = JSON.parse(localStorage.getItem("comment385687")) || [];
  dataArray.push(newUserComment);
  localStorage.setItem("comment385687", JSON.stringify(dataArray));
};
newData();

// ์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์  : ๊ธฐ์กด ๋กœ์ปฌ์ €์žฅ์†Œ์— ์ €์žฅ๋œ ๊ธฐ์กด ์ •๋ณด + toSpliced ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„์ ๋จ
// (๋กœ์ปฌ์ €์žฅ์†Œ = ์‚ญ์ œ๋ฅผ ์›ํ–ˆ๋˜ ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋“ค + toSpliced ๋˜์–ด ์‚ญ์ œ ํ›„ ๋„ฃ์–ด์ค€ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ)

์œ„ ์ฝ”๋“œ๋Š” ์ˆ˜์ •ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ localStorage์— ์ €์žฅํ•˜๋Š”๋ฐ ๊นŒ์ง€๋Š” ์„ฑ๊ณตํ–ˆ์œผ๋‚˜, ๊ธฐ์กด ๋ฐ์ดํ„ฐ์˜ ๊ฒ‰์œผ๋กœ ๊ณ„์† ์Œ“์—ฌ๋‚˜๊ฐ”๋‹ค.

// 4-3. key๊ฐ€ ์•„๋‹Œ ํŠน์ • value๋งŒ ์‚ญ์ œํ•˜๊ณ  ์‹ถ์„ ๋•Œ
// ๋กœ์ปฌ์ €์žฅ์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๋ฐฐ์—ด์—์„œ
// ์‚ญ์ œํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ์˜ id ๊ฐ’์„ ๋ฐ›์•„์™€ ํ•ด๋‹น ๊ฐ’์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋“ค๋งŒ ํ•„ํ„ฐ๋งํ•˜์—ฌ leftData์— ๋‹ด๊ณ  ๊ทธ leftData๋ฅผ localStorage์— ์ƒˆ๋กญ๊ฒŒ setItem()์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
// ๋กœ์ปฌ์ €์žฅ์†Œ์— ์žˆ๋Š” value๋ฅผ ์ง์ ‘ ๊ฐ€๊ณตํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค๋ฉด, value์˜ ํƒ€์ž…์€ Object์ด๋ฏ€๋กœ object์— filterํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๋ฉด filter is not a function๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.
// ์ด๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋‹ด๊ฑฐ๋‚˜ Object.values(๊ฐ์ฒด์ด๋ฆ„).filter()๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

const deleteData = function (i) {
  const [userComment, newData] = useState([]); // const [์ƒํƒœ๊ฐ’, ์ƒํƒœํ•จ์ˆ˜] = useState(์ดˆ๊ธฐ๊ฐ’)
  const newUserComment = userComment.filter((i) => i.writer !== writer);
  localStorage.setItem("comment385687", JSON.stringify(newUserComment));
  newData(newUserComment);
};

๊ทธ๋ ‡๊ฒŒ localStorage์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ๊ธ€๋งํ•˜๋‹ค๊ฐ€ useState ๋ผ๋Š” Hook ์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์˜†์— ๋ณ€์ˆ˜ ์„ ์–ธ๋„ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์ด ๋“ค์–ด๊ฐ€๋ฉด์„œ, ๋งŽ์€ ์ •๋ณด๋ฅผ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ์œ ์ตํ•œ ์‹œ๊ฐ„์ด์—ˆ์ง€๋งŒ ์•„์‰ฝ๊ฒŒ๋„ React์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ๋ฒ•์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋‚˜์˜ ๊ณผ์ œ๋Š” ์˜ค๋กœ์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ ์‚ฌ์šฉํ•œ ๋ฐ”๋‹๋ผ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณผ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์ฐพ์•„ ๋ณด์•˜๊ณ , ๋งจ ์œ„์— ์†Œ๊ฐœํ•œ addEventListener๋ฅผ ์‚ฌ์šฉํ•œ forEach ๊ตฌ๋ฌธ์œผ๋กœ ์‚ญ์ œ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๋‚ด ์†์œผ๋กœ ์ฒ˜์Œ ๊ตฌํ˜„ํ•ด๋ณธ ์ถ”๊ฐ€๊ธฐ๋Šฅ์ด๋‹ค.

2~3์ผ์— ๊ฑธ์ณ ๊ตฌํ˜„ํ•œ ์ถ”๊ฐ€๊ธฐ๋Šฅ์ด๋‹ค. ์•„์ง ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๊นŒ์ง€์˜ ๋ฉ”์ธ๋กœ์ง์„ ๋– ์˜ฌ๋ฆฌ๋Š”๋ฐ ์žˆ์–ด์„œ, ์–ด๋ ค์›€์ด ๋งŽ๋‹ค.

task ๋ถ„์„์„ ์ข€ ๋” ์‹ ๊ฒฝ์จ์„œ ํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค. ์—ฌ๊ธฐ์ €๊ธฐ ๊ท€๋™๋ƒฅ์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์–ป์Œ์— ์žˆ์–ด ๋กœ์ง ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

ํ›„ํ›„ํ›„ํ›„ํ›„ํ›Ÿํ›„ํ›„...... ์•ž์œผ๋กœ๋„ ๋น ํƒฑ !!

 

#localStorage #setItem #toSpliced #JSON_stringify_is_not_a_function #spread_operator #addEventListener #delete_๊ธฐ๋Šฅ๊ตฌํ˜„ #์‚ญ์ œ๊ธฐ๋Šฅ์ถ”๊ฐ€ #forEach_index_๋งค๊ฐœ๋ณ€์ˆ˜_๊ธฐ๋ณธ๋‚ด์žฅ์†์„ฑ