스파르타코딩클럽/과제

[JavaScript 개인과제_기초 주차] 3일차: 영화 검색 기능 구현

myinfo7091 2024. 10. 18. 21:04

오늘의 학습내용 :  영화 검색 기능 구현하기

 

3일차 목표
HTML, CSS 사용하여 검색창 만들기
실시간으로 검색창에 입력한 영화 검색기능 만들기

 

◆ HTML, CSS 사용하여 검색창 만들기

 

사용자가 입력한 검색어로 영화 목록을 필터링하는 검색 기능을 구현한다. 우선 검색을 위한 Search bar를 html로 header 영역에 만들었다. CSS는 매번 원하는 이펙트를 구현할 수 있는 방법을 일일이 구글링하는데, 내 디자인 감각이 그다지 좋은 편이 아님을 다시금 깨닫는다. 

나중에 검색창에 따로 아이콘을 만들어도 괜찮을 듯

 

<body>
    <!-- searchbar -->
    <header>
        <input type="text" class="searchInput" placeholder="영화를 검색하세요">
    </header>
    <div class="movieList">
        <!-- 카드 생성되는 영역 -->
    </div>
    <script src="script3.js"></script>
</body>
header {
    display: flex;
    align-items: center;
    position: relative;
    background-color: #58db9a;
    padding: 10px;
}

.searchInput {
    width: 100%;
    height: 35px;
    padding-left: 40px;
    border-radius: 26px;
    letter-spacing: inherit;
    font-size: 1rem;
    background: rgba(0, 0, 0, 0.4);
    color: white;
    border: 1px solid white;
    outline: none;
}

.searchInput::placeholder {
    color: white;
}

 

◆ 검색 기능 구현하기

// 검색 기능 추가
const searchInput = document.querySelector('.searchInput');

searchInput.addEventListener("input", () => {
    const searchKeyword = searchInput.value.toLowerCase(); // 대소문자 관계 없이 검색
    const searchURL = `https://api.themoviedb.org/3/search/movie?api_key=
    ${apiKey}&includeadult=false&query=${searchKeyword}&language=ko-KR&page=1`;

    if (searchKeyword) {
        fetchMovies(searchURL); // 검색어가 있으면 검색 결과 가져오기
    } else {
        fetchMovies(popURL); // 검색어가 없으면 인기 영화 목록 가져오기
    }
});

// 인기 영화 가져오는 함수
fetchMovies(popURL);

 

과제에 제시된 조건에서는 ① 검색어 입력 후 버튼 클릭 / Enter 키 ② 검색창 입력 결과에 따라 실시간 중 방법을 택해 검색 기능을 만들도록 했다. html로 작성한 input text 영역에 입력한 결과에 따라 실시간으로 영화 검색 결과를 보여주기로 결정하고, 검색어와 관련된 영화만 화면에 나타날 수 있도록 구현한다. tmdb에서 받아오는 데이터에 영화 영제도 포함되어 있어서, 영문으로 검색할 때 대소문자와 관계 없이 검색될 수 있도록 toLowerCase 를 사용했다. 

 

◆ 발생한 문제 해결

 

검색 결과가 표시될 때 기존에 생성한 인기 영화 목록 카드들이 사라지지 않고 남아 있는 문제가 있다. 뒤에 키워드 검색 결과로 나온 영화 카드들이 따라붙었다(...) 해결 방법은 몇 번의 구글링을 통해 어렵지 않게 찾을 수 있었는데, 기존의 영화 목록을 초기화해주는 코드를 넣는다.

function movieContainer(results) {
    movieList.innerHTML = ''; // 기존 영화 목록 초기화
    results.forEach(movie => { // 각 영화 데이터를 movie로 처리
        const movieCard = document.createElement('div');
        movieCard.classList.add('card');

        movieCard.innerHTML = `
        <img src="https://media.themoviedb.org/t/p/w220_and_h330_face
        ${movie.poster_path}" alt="noimage" class="movieimg">
        <h3>${movie.title}</h3>
        <p>평점 ${movie.vote_average}점</p>
    `;

        movieList.appendChild(movieCard); // movieCard를 movieList에 추가
    });
}

 

이제 검색 결과에 해당하는 영화만 정확하게 찾을 수 있다