๐Ÿ”ฅ Trouble Shooting - ์˜ํ™” ์•ฑ ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ ์‚ฝ์งˆ๊ธฐ ๐ŸŽฌ

์Š˜ยท2025๋…„ 1์›” 16์ผ

๐Ÿ”ฅ Trouble Shooting

๋ชฉ๋ก ๋ณด๊ธฐ
1/23

๐Ÿ˜ฑ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ

์—ด์‹ฌํžˆ infinite scroll์„ ๊ตฌํ˜„์„ ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ...!
๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ด์ƒํ•œ ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ์–ด์š”:

  1. ๋ถ๋งˆํฌ ๋ฒ„ํŠผ ํด๋ฆญ โ†’ ๋ถ๋งˆํฌํ•œ ์˜ํ™”๋“ค์ด ์ž˜ ๋ณด์ž„
  2. ๋ถ๋งˆํฌ ํ•ด์ œ ํ›„ ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
  3. ๋‹ค์‹œ ๋ถ๋งˆํฌ ๋ฒ„ํŠผ ํด๋ฆญ โ†’ ํ—‰! ๋ถ๋งˆํฌํ•œ ์˜ํ™”๋“ค์ด ๋ณด์ด๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ API๋กœ ๋ฐ›์•„์˜จ ์ผ๋ฐ˜ ์˜ํ™”๋“ค์ด ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚จ! ๐Ÿ˜ฑ

๐Ÿ‘€ ์ฒ˜์Œ ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ

๋ถ๋งˆํฌ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ (app.js)

$btnBookmark.addEventListener("click", () => {
    isBookmarkChecked = !isBookmarkChecked;
    if (isBookmarkChecked) {
        $btnBookmark.classList.add("active");
        $header.classList.add("collapsed");
        $header.style.display = "none";
        $mainSubTit.style.display = "block";
        const data = getMovieListStore;
        movieList.setMovies(data, "replace");
    } else {
        $btnBookmark.classList.remove("active");
        $header.classList.remove("collapsed");
        $header.style.display = "flex";
        $mainSubTit.style.display = "none";
        movieList.init();
    }
});

MovieList ํด๋ž˜์Šค (MovieList.js)

export class MovieList {
    constructor(selector) {
        this.$movieList = document.querySelector(selector);
        this.data = [];
        this.loading = false;
        this.currentPage = 1;
    }

    init() {
        this.loadMovie();
        this.setupInfiniteScroll();
    }

    setupInfiniteScroll() {
        window.addEventListener("scroll", () => {
            if (this.isNearBottom() && !this.loading && this.data.length < 101) {
                this.loadMovie();
            }
        });
    }

    setMovies(movies, type = "append") {
        if (type === "replace") {
            this.data = [];
            this.currentPage = 1;
            this.data = movies;
        } else {
            this.data.push(...movies);
        }
        this.render();
    }
}

๐Ÿ” ๋ฌธ์ œ ์›์ธ ๋ถ„์„

์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ์–ด์š”:

  1. ๋ฌดํ•œ์Šคํฌ๋กค์ด ๊ณ„์† ๋™์ž‘ ์ค‘! ๐Ÿ”„

    • ๋ถ๋งˆํฌ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•ด๋„ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๊ณ„์† ์‚ด์•„์žˆ์Œ
    • ์Šคํฌ๋กคํ•  ๋•Œ๋งˆ๋‹ค loadMovie()๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ผ๋ฐ˜ ์˜ํ™” ๋ชฉ๋ก์„ ๋ถˆ๋Ÿฌ์˜ด
  2. ๋ชจ๋“œ ๊ตฌ๋ถ„์ด ์—†์Œ ๐Ÿค”

    • ์ง€๊ธˆ์ด ๋ถ๋งˆํฌ ๋ชจ๋“œ์ธ์ง€ ์ผ๋ฐ˜ ๋ชจ๋“œ์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Œ
    • ๊ทธ๋ž˜์„œ ๋ถ๋งˆํฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋‹ค๊ฐ€๋„ ๋ฌดํ•œ์Šคํฌ๋กค์ด ๋™์ž‘ํ•˜๋ฉด ์ผ๋ฐ˜ ์˜ํ™”๊ฐ€ ์ถ”๊ฐ€๋จ
  3. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ด€๋ฆฌ ๋ถ€์žฌ โš ๏ธ

    • ๋ฌดํ•œ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ์ค‘๋ณต์œผ๋กœ ๋“ฑ๋ก๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ
    • ๋ถ๋งˆํฌ ๋ชจ๋“œ์—์„œ๋Š” ํ•„์š” ์—†๋Š” ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๊ณ„์† ๋™์ž‘

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. ๋ถ๋งˆํฌ ๋ชจ๋“œ ํ”Œ๋ž˜๊ทธ ์ถ”๊ฐ€

class MovieList {
    constructor(selector) {
        // ... ๊ธฐ์กด ์ฝ”๋“œ ...
        this.isBookmarkMode = false; // ๐Ÿ‘ˆ ๋ถ๋งˆํฌ ๋ชจ๋“œ ์ฒดํฌ ํ”Œ๋ž˜๊ทธ ์ถ”๊ฐ€
    }
}

2. ๋ฌดํ•œ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๊ด€๋ฆฌ ๊ฐœ์„ 

class MovieList {
    removeInfiniteScroll() {
        // ์ด์ „์— ๋“ฑ๋ก๋œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ ์ œ๊ฑฐ
        window.removeEventListener("scroll", this.handleScroll);
    }

    setupInfiniteScroll() {
        this.removeInfiniteScroll(); // ์ด์ „ ์ด๋ฒคํŠธ ์ •๋ฆฌ
        this.handleScroll = () => {
            // ๋ถ๋งˆํฌ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ ๋•Œ๋งŒ ์ถ”๊ฐ€ ๋กœ๋”ฉ
            if (this.isNearBottom() && !this.loading && !this.isBookmarkMode) {
                this.loadMovie();
            }
        };
        window.addEventListener("scroll", this.handleScroll);
    }
}

3. ๋ชจ๋“œ ์ „ํ™˜ ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

setBookmarkMode(isBookmark) {
    this.isBookmarkMode = isBookmark;
    if (isBookmark) {
        this.removeInfiniteScroll(); // ๋ถ๋งˆํฌ ๋ชจ๋“œ๋ฉด ๋ฌดํ•œ์Šคํฌ๋กค ์ค‘์ง€
    } else {
        this.setupInfiniteScroll(); // ์ผ๋ฐ˜ ๋ชจ๋“œ๋ฉด ๋ฌดํ•œ์Šคํฌ๋กค ํ™œ์„ฑํ™”
    }
}

๐ŸŽ“ ๋ฐฐ์šด ์ ๋“ค

1. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ!

// ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ• (์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ค‘๋ณต ๋“ฑ๋ก)
setupInfiniteScroll() {
    window.addEventListener("scroll", () => {
        // ... 
    });
}

// ๊ฐœ์„ ๋œ ๋ฐฉ๋ฒ• (์ด์ „ ์ด๋ฒคํŠธ ์ œ๊ฑฐ ํ›„ ๋“ฑ๋ก)
setupInfiniteScroll() {
    this.removeInfiniteScroll();
    this.handleScroll = () => {
        // ...
    };
    window.addEventListener("scroll", this.handleScroll);
}

2. ์ƒํƒœ(๋ชจ๋“œ) ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ

  • ๋ถ๋งˆํฌ ๋ชจ๋“œ์ธ์ง€ ์•„๋‹Œ์ง€ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„
  • ๊ฐ ๋ชจ๋“œ์— ๋งž๋Š” ๋™์ž‘๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ œ์–ด

3. ํด๋ฆฐ์—… ํ•จ์ˆ˜์˜ ํ•„์š”์„ฑ

  • ๋ชจ๋“œ ์ „ํ™˜ ์‹œ ์ด์ „ ์ƒํƒœ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ
  • ๋ถˆํ•„์š”ํ•œ ์ด๋ฒคํŠธ๋‚˜ ๋™์ž‘ ๋ฐฉ์ง€

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ํ†ตํ•ด์„œ ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ(๋ถ๋งˆํฌ)์ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ(๋ฌดํ•œ์Šคํฌ๋กค)์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๋ฐฐ์› ์–ด์š”. ํŠนํžˆ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ด€๋ฆฌ์™€ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์‹ค๊ฐํ–ˆ๋„ค์š”!

"์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ?" ํ•˜๊ณ  ๋„˜์–ด๊ฐ”๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Ÿฐ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ข€ ๋” ๊ผผ๊ผผํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿ˜Š

๐Ÿ’ญ ๋‹ค์Œ์— ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ๋•Œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  1. ํ˜„์žฌ ๋™์ž‘ ์ค‘์ธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๋Š”๊ฐ€?
  2. ๋ชจ๋“œ๋‚˜ ์ƒํƒœ ์ „ํ™˜์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ธ๊ฐ€?
  3. ์ „ํ™˜ ์‹œ ์ •๋ฆฌํ•ด์•ผ ํ•  ๊ฒƒ๋“ค์ด ์žˆ๋Š”๊ฐ€?
  4. ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์ถฉ๋Œํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์—†๋Š”๊ฐ€?
profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

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