[TIL] teamProject 02

์ตœํ•˜์˜จยท2024๋…„ 1์›” 15์ผ
1

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
21/71
post-thumbnail

๐ŸšจIssue occuring


ํŒ€์›์ด localstorage์— ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•œ ํŒŒ์ผ์„ ๋ฐ›์•˜๋‹ค.
์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์นด๋“œ์— ๋„์›Œ์•ผํ•œ๋‹ค.

๐Ÿ’ฆWhat I tried


ํฐ ํ‹€

  1. ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ
  2. ์ ‘๊ทผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ
  3. ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ธฐ
// 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์™€ ์—ฐ๋™์ด ์ž˜ ๋œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋˜, ๋ชจ๋‹ฌ์ฐฝ์„ ๋ˆ„๋ฅด๋ฉด ํˆฌ๋ช…๋„๋ฅผ ์ฃผ์–ด ๊ตฌ๋ถ„๊ฐ์„ ์ฃผ์—ˆ๋‹ค.

๐Ÿ’กHow solve issue


for๋ฌธ๊ณผ class ์ ‘๊ทผ, localstorage์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•ต์‹ฌ์ด์—ˆ์Œ

๐Ÿ“ƒWhat I learned new


JSON.parse() : JSON ๋ฌธ์ž์—ด์˜ ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ์—์„œ JavaScript ๊ฐ’์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ.
localstorage๋ฅผ ์ด์šฉํ•  ๋•Œ๋Š” ๋ง‰์—ฐํžˆ ์ด๋ฆ„,๋ฆฌ๋ทฐ๋‚ด์šฉ์˜ ํŽ˜์–ด๋กœ ์ €์žฅํ•  ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. ํŒ€์›์ด ์ค€ class๋ฅผ ๋ณด๋ฉด์„œ ์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•˜๋ฉด ๋˜๋Š”๊ตฌ๋‚˜ ํ•˜๊ณ  ๋‚˜์˜ ๋ฌด์ง€ํ•จ์— ๊ฐํƒ„ํ–ˆ๋‹ค.
๊ฒฐ๊ตญ์—” localstorage์™€ class๋ฅผ ์ ‘๋ชฉํ•ด์„œ ๋ฆฌ๋ทฐ์ฐฝ์„ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ ์กฐ๊ธˆ ๋” ์ต์ˆ™ํ•ด์ ธ์•ผํ•  ๊ฑฐ ๊ฐ™์•„ ์ฃผ๋ง์— ๊ฐœ๋ณ„์ ์œผ๋กœ ํ•œ ๋ฒˆ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

๐Ÿค”Realization


ํ•ญ์ƒ TIL์ ์„ ๋•Œ๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฐ€์ง€๊ณ  ์จ๋‚ด๋ ค๊ฐ€๋‹ค๋ณด๋‹ˆ ๊ณ ๋ฏผ ์—†์ด ๋ฐ”๋กœ ๋š๋”ฑ ๋‚˜์˜จ ๊ฑฐ ๊ฐ™์ง€๋งŒ ๊ผฌ๋ฐ• 3์ผ์„ ๋ฐ”์ณ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฌผ์ด๋‹ค..
ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ฌธ์ œ๋“ค์„ ์ง๋ฉดํ•˜๊ณ  ์–ด๋ ดํ’‹์ด ์•Œ์•„๊ฐ€๋ฉด์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ํ•ด๊ฐ€๋Š” ๊ณผ์ •์ด ๋„ˆ๋ฌด ์žฌ๋ฏธ์žˆ๋‹ค.

์šฐ์„  ์ฒ˜์Œํ•˜๋Š” ํ˜‘์—…์ด๋ผ ๊ฑฑ์ •์ด ์•ž์„ฐ๋‹ค. ์†Œ๋ฌธ์ž i์ธ ๋‚˜๋Š” ํŒ€์žฅ์œผ๋กœ์„œ ๋ฌด์–ธ๊ฐ€ ์ด๋Œ์–ด์•ผํ•œ๋‹ค๋Š” ์ค‘์••๊ฐ๋„ ์–ด๋Š์ •๋„ ์žˆ์—ˆ๋‹ค.
๊ฐœ์ธํ”„๋กœ์ ํŠธ ๋•Œ๋Š” ์˜จ์ „ํžˆ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚ด๊ฐ€ ์•ˆ๊ณ  ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋‹ด์ด ๋œํ–ˆ๋‹ค๋ฉด ํŒ€ ํ”„๋กœ์ ํŠธ๋Š” ์กฐ๊ธˆ ๋” ์™„๋ฒฝํ•˜๊ฒŒ ํ•˜๋ ค๊ณ  ์š•์‹ฌ์„ ๋ƒˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋ก  ๊ฑฑ์ •๊ณผ ๋‹ค๋ฅด๊ฒŒ ์˜์‚ฌ์†Œํ†ต์€ ์ˆ˜์›”ํ–ˆ๊ณ  ํŒ€์›๋ถ„๋“ค๊ป˜์„œ ์˜๊ฒฌ ์ˆ˜์šฉ๋„ ์ž˜ ํ•ด์ฃผ์…”์„œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์›๋งŒํ•˜๊ฒŒ ๋๋‚œ ๊ฑฐ ๊ฐ™๋‹ค.
์•„์‰ฌ์šด ์ ์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„๊นŒ์ง€ ์š•์‹ฌ ๋ƒˆ์œผ๋‚˜ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์  ์ •๋„์ธ ๊ฑฐ ๊ฐ™๋‹ค.
ํŒ€ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ guithub๋ฅผ ์–ด๋Š์ •๋„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์ข‹์•˜๊ณ , ๊นจ๋ถ€ํ•˜๋ฉด์„œ ํ˜‘์—…์ด๋ž€๊ฑธ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋˜์–ด์„œ ์ข‹์•˜๋‹ค.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 2์›” 5์ผ

๊ฐ ์ฝ”๋“œ๋“ค์— ๋Œ€ํ•œ ์„ค๋ช… ๊น”๋”ํ•˜๊ณ  ์ข‹์Šต๋‹ˆ๋‹ค!
๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ด์šฉํ•ด์„œ ์ข‹์•„์š” ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ๋ฐฑ์—”๋“œ API๊ฐ€ ์ƒ๊ธฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€” ์ˆ˜ ์žˆ์„๊นŒ์š”?
ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค PUT API ์š”์ฒญ์„ ๋ณด๋‚ด์„œ DB๋ฅผ updateํ•ด์•ผํ• ๊นŒ์š”?
์ˆ˜์ •์ด ๋งŽ์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” DB๋ฅผ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
๊ณ ๋ฏผํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€