ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์ด์ „ ์ƒํ™ฉ

 

10์ผ์˜ ๊ณผ์ œ

 

์–ด๋ ค์›Œํ•˜๋Š” ํ•™์ƒ๋“ค์„ ์œ„ํ•ด ํŠœํ„ฐ๋‹˜๊ป˜์„œ ํ•ต์‹ฌ ๊ตฌํ˜„ ๊ธฐ๋Šฅ๋“ค์„ ์„ค๋ช…ํ•ด์ฃผ์…จ๊ณ 

์ฃผ๋ง๋™์•ˆ ์—ด์‹ฌํžˆ ์‚ดํŽด๋ณด์•˜๋‹ค.

 

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

๊ฐœ์ธ๊ณผ์ œ tip

 

[๋ผˆ๋Œ€ ๋งŒ๋“ค๊ธฐ]

  1. ์ˆœ์„œ๊ฐ€ ์—†๋Š” ๋ฆฌ์ŠคํŠธ์ธ ulํƒœ๊ทธ์™€ ๊ทธ ๋‚ด๋ถ€์˜ liํƒœ๊ทธ ์ž‘์„ฑ -> ๋ผˆ๋Œ€ ๋งŒ๋“ค๊ธฐ
  2. DOM์—์„œ ul ํƒœ๊ทธ์— ์ ‘๊ทผํ•˜์—ฌ innerHTML์„ ์‚ฝ์ž…ํ•˜๊ธฐ

[๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ]

  1. fetch ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ
    1-1. (์–ด๋”˜๊ฐ€์— ์ •์˜๋˜์–ด์žˆ๋Š”) fetchํ•จ์ˆ˜๋Š” ‘promise’๋ผ๋Š” ๊ฐ์ฒด๋ฅผ return(๋ฐ˜ํ™˜)ํ•œ๋‹ค.
    1-2. Promise ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ์†์„ฑ, ๋ฉ”์„œ๋“œ ์ค‘์— ‘then’์„ ํฌํ•จํ•œ๋‹ค.
    1-3. Then ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ธํ’‹(์ธ์ž)์œผ๋กœ ๊ฐ–๋Š”๋‹ค.
    1-4. ์ด ํ•จ์ˆ˜์—๋Š” promise ๊ฐ์ฒด์˜ return ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
    ์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” res.json()์„ ํ†ตํ•ด์„œ JS์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒดํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
    1-5. json() ๋„ promise๋ฅผ return ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜ .then์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    1-6. ๊ฒฐ๊ตญ JS์—์„œ ํ™œ์šฉ๊ฐ€๋Šฅํ•œ array ํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

[๋ฐ์ดํ„ฐ ํ™œ์šฉํ•˜๊ธฐ]

  1. array(๋ฐฐ์—ด) ํ˜•ํƒœ๋กœ ๋ฐ›์•„์˜จ 20๊ฐœ์˜ ๊ฐ’์„ ํ™œ์šฉํ•œ๋‹ค.
    1-1. .innerHTML๋ฅผ ํ†ตํ•ด ulํƒœ๊ทธ ์•ˆ์— 20๊ฐœ์˜ liํƒœ๊ทธ๋กœ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  2. liํƒœ๊ทธ ๋นˆ ๋ฌถ์Œ์„(let emptyStr = “”) ๋งŒ๋“ค๊ณ  for๋ฌธ ๋‚ด๋ถ€์— liํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ธฐ
    +) <li>๋‚ด์˜ data-id="${res[i].id}" ๋Š” ๋‚˜์ค‘์— ๋ช‡ ๋ฒˆ์งธ id์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ๋”ฑํžˆ ํ•„์š” ์—†๊ธดํ•˜๋‹ค..!
    +) emptyStr์— ๋Œ€์ž…ํ•  li ํƒœ๊ทธ๋Š” ``์œผ๋กœ ๊ฐ์‹ธ์ค€๋‹ค.(temp_html๊ณผ ๊ฐ™์€ ๋ฐฉ์‹)
  3. emptyStr์„ ulํƒœ๊ทธ์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ
    6-1. for๋ฌธ์ด ๋๋‚˜๊ณ  .innerHTML์„ ํ†ตํ•ด ๋‚ด์šฉ์„ ๋„ฃ์–ด์ค€๋‹ค.
    (resultUl.innerHTML = emptyStr)

[๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์‹คํ˜„ํ•˜๊ธฐ]

  1. UI ๋งŒ๋“ค๊ธฐ : inputํƒœ๊ทธ์™€ buttonํƒœ๊ทธ
  2. ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ ๋ถ€์—ฌํ•˜๊ธฐ
  3. input์— ์ž…๋ ฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ => .value
  4. ๊ทธ ๊ฐ’์œผ๋กœ list๋ฅผ ํ•„ํ„ฐ๋ง
    *๊ฒ€์ƒ‰์„ ์œ„ํ•ด์„œ๋Š” 20๊ฐœ์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ ๊ณณ์— ์ ‘๊ทผ์„ ํ•ด์•ผ ํ•จ*
    => script ์ „์ฒด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๊ธฐ

+)[ํ•จ์ˆ˜ ๋‚˜๋ˆ„๊ธฐ]

1. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ํ•จ์ˆ˜

2. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฟŒ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜ (displayPosts)

 

  5. ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๊ฒ€์ƒ‰ ๋‚ด์šฉ์„ ํ•„ํ„ฐ๋งํ•˜๊ธฐ
      [filter ํ•จ์ˆ˜]
- ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค.
- ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ return์—๋Š” ์กฐ๊ฑด์„ ๋ถ€์—ฌํ•œ๋‹ค.

filter(function(์—ฌ๊ธฐ){
    return ์—ฌ๊ธฐ >=5;
});

 

 

 

๐Ÿ“ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

const moviesUl = document.querySelector("#movies");
const btn = document.querySelector(".btn");
const searchInput = document.querySelector("#searchInput");
const modal = document.querySelector(".modal");
const close = document.querySelector(".close");


let postArray = [];
console.log(postArray);

function fetchData() {
  fetch(
    "https://api.themoviedb.org/3/movie/popular?api_key=${key}&language=ko-KR&page=1"
  )
    .then(function (res) {
      return res.json();
    })
    .then(function (๊ฒฐ๊ณผ) {
      console.log(๊ฒฐ๊ณผ);
      let postArray = ๊ฒฐ๊ณผ.results;
      displayPost(๊ฒฐ๊ณผ);
    });
}
fetchData();


function displayPost(posts) {
  emptyStr = "";
  for (let i = 0; i < posts.results.length; i++) {
    emptyStr += `<li class="item" data-id="${posts.results[i].id}">${posts.results[i].title}</li>`;
  }
  moviesUl.innerHTML = emptyStr;
}


btn.addEventListener("click", function () {
  const keyword = searchInput.value;
  const filterPosts = postArray.filter(function (์˜ํ™”) {
    return ์˜ํ™”.title.includes(keyword);
  });
  console.log(filterPosts);
  displayPost(filterPosts);
});


moviesUl.addEventListener("click", function (e) {
  console.log(e.target);
  // ์ƒˆ๋กญ๊ฒŒ fetching ํ•˜๋Š” ๋กœ์ง(item ํ•˜๋‚˜์— ๋Œ€ํ•ด์„œ)
  modal.style.display = "block";
});
close.addEventListener("click", function () {
  modal.style.display = "none";
});

 

ํฌ๊ฒŒ fetchData() / displayPost() / btn.addEvent / moviesUl.addEvent
๋กœ ๋‚˜๋‰˜์–ด์„œ ๋ณด๋ฉด ๋œ๋‹ค.

 

๋ฌธ์ œ ์ƒํ™ฉ ๋ฐ ์ถ”๋ก 

 

โ“๋ฌธ์ œ 1. Filter ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ -> postArray ๊ฐ€ ๋ฐฐ์—ด์ด ์•„๋‹Œ๊ฐ€?

โ“๋ฌธ์ œ 2.postArray = []; ๊ฐ€ ์ „์—ญ๋ณ€์ˆ˜๋กœ์„œ ์„ ์–ธ์ด ์•ˆ ๋˜๋Š” ๋“ฏ ํ•จ

โ“๋ฌธ์ œ 3. console.log(postArray); ๋ฅผ ํ–ˆ์œผ๋‚˜ ๋นˆ ๋ฐฐ์—ด์ด ์ฐํž˜

โ“๋ฌธ์ œ 4. displayPost ๋‚ด๋ถ€์˜ for๋ฌธ์—์„œ .results๋ฅผ ์ œ๊ฑฐ์‹œ ํ™”๋ฉด์— ๋ฆฌ์ŠคํŠธ๊ฐ€ ์‚ฌ๋ผ์ง

 

๋ฌธ์ œ ํ•ด์„

ํŠœํ„ฐ๋‹˜๊ป˜์„œ ๊ตฌํ˜„ํ•˜์‹œ๋Š” API ๋งํฌ์™€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ณ€ํ˜•ํ–ˆ์ง€๋งŒ,

์—ฌ๋Ÿฌ ๋ฒˆ ์‹œ๋„ํ•ด๋„ ์•ˆ ํ’€๋ฆฌ๋Š” ๋ถ€๋ถ„์„ ์—ฌ์ญค๋ดค๋‹ค.

 

๊ทธ ๋‹ต์€,

๐Ÿ“Œ๋ฌธ์ œ 2.

=> postArray์— ๋ฐฐ์—ด ๊ฐ’์„ ํ™•์ธํ•˜๋ ค๋ฉด ์ง€๊ธˆ ์ˆ˜์ค€์—์„œ๋Š” ์–ด๋ ค์›€.

๋งฅ๋ฝ์„ ์‚ดํŽด๋ณด๊ณ  ๋‹ด๊ฒจ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ์ง„ํ–‰ํ•ด์•ผ ํ•จ.

 

๐Ÿ“Œ๋ฌธ์ œ 3.

=> fetchData()์˜ ์ธํ’‹์œผ๋กœ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ‘postArray’ ์ฆ‰, ๊ฐ์ฒด๊ฒฐ๊ณผ์ค‘ results์˜ ๊ฐ’์„ ๋„ฃ์–ด ํ™”๋ฉด์— ์ œ๋ชฉ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋„์šด๋‹ค.
&
difplayPost์˜ ์ธํ’‹(posts)๋Š” ๊ฒฐ๊ณผ์˜ results๋งŒ ๋‹ด์€ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ for๋ฌธ์—์„œ .results๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•จ.

 

๐Ÿ“Œ๋ฌธ์ œ 4.

=> postArray =  ๊ฒฐ๊ณผ.results ๋กœ ์žฌ์„ ์–ธํ–ˆ๊ธฐ์— ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ™”๋ฉด์— ์ž˜ ๋œธ.

 

์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๊ณณ์ €๊ณณ์—์„œ ์‚ฌ์šฉ๋œ displayPost์— ์ง‘์ค‘ํ•˜์—ฌ 

์–ด๋А ๊ณณ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€, ์ธํ’‹์œผ๋กœ ์–ด๋–ค ๊ฒƒ์ด ๋“ค์–ด์˜ค๊ณ  ์•„์›ƒํ’‹์œผ๋กœ ์–ด๋–ค ๊ฒƒ์ด ๋‚˜๊ฐ€๋Š” ์ง€์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ฌธ์ œ ํ•ด๊ฒฐ

 

๐Ÿ“Œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ

๋‹ค์Œ ๋‹จ๊ณ„์ธ '๋ชจ๋‹ฌ' ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ง์ „!

//main2.js : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋กœ์ง์ž„.

const btn = document.querySelector(".btn");
const searchInput = document.querySelector("#searchInput");
const modal = document.querySelector(".modal");
const close = document.querySelector(".close");
const baseImgUrl = "https://image.tmdb.org/t/p/w500";
const cardSection = document.querySelector(".cards");

let postArray = [];
console.log(postArray); // ๋นˆ ๋ฐฐ์—ด์ธ ๊ฒŒ ๋งž์œผ๋ฉฐ, ์ง€๊ธˆ ์ˆ˜์ค€์—์„œ๋Š” ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์›€

function fetchData() {
  fetch(
    "https://api.themoviedb.org/3/movie/popular?api_key=${key}&language=ko-KR&page=1"
  )
    .then(function (res) {
      return res.json();
    })
    .then(function (๊ฒฐ๊ณผ) {
      console.log(๊ฒฐ๊ณผ);

      postArray = ๊ฒฐ๊ณผ.results;
      // input : ๊ฐ์ฒด '๊ฒฐ๊ณผ' ์ค‘ results์˜ ๊ฐ’ (๋ฐฐ์—ด)
      displayPost(postArray);
    });
}
fetchData();

// input : ๊ฒฐ๊ณผ์˜ results๋งŒ ๋‹ด์€ ๋ฐฐ์—ด
function displayPost(posts) {
  temp_html = "";

  for (let i = 0; i < posts.length; i++) {
    temp_html += `
    <div data-id="${posts[i].id}" class="mvCard">
         <img id="poster" src="${
           baseImgUrl + posts[i].poster_path
         } class="card-img-top alt="poster">
         <p>${posts[i].title}</p>
         <p>ํ‰์ : ${posts[i].vote_average}<span id="mvaver"></span></p>
    </div>`;
  }
  cardSection.innerHTML = temp_html;
}

btn.addEventListener("click", function () {
  const keyword = searchInput.value;

  const filterPosts = postArray.filter(function (์˜ํ™”) {
    return ์˜ํ™”.title.includes(keyword);
  });
  console.log(filterPosts);
  displayPost(filterPosts);
});

cardSection.addEventListener("click", function (e) {
  console.log(e.target.closest(".mvCard"));

  modal.style.display = "block";
});

close.addEventListener("click", function () {
  modal.style.display = "none";
});

closest(".mvCard");

 

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ