
main.jsx 구성완료


import React from 'react';
import MovieCard from '../component/MovieCard';
import movieList from '../data/movieListData.json';
const MainPage = () => {
return (
<>
<main className="grid grid-cols-1 pt-[80px] px-4 md:px-20">
<p className="text-[30px] font-bold w-full text-left">상영작</p>
<div className="col-span-1 w-full grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 justify-items-center">
{Array.isArray(movieList?.results) && movieList.results.map((movie) => (
<MovieCard
key={movie.id}
id={movie.id}
title={movie.title}
posterPath={movie.poster_path}
rating={movie.vote_average}
/>
))}
</div>
</main>
</>
);
};
export default MainPage;


const API_KEY = import.meta.env.VITE_TMDB_API_KEY;
const BASE_URL = 'https://api.themoviedb.org/3';
export const fetchPopularMovies = async () => {
try {
const response = await fetch(
`${BASE_URL}/movie/popular?api_key=${API_KEY}&language=ko-KR&page=1`
);
if (!response.ok) {
throw new Error('인기 영화를 불러오는 데 실패했습니다.');
// throw new Error()는 강제로 에러를 발생시키는 문법
}
const data = await response.json();
return data.results;
} catch (error) {
console.error('인기 영화 가져오기 오류:', error);
return [];
}
};
export const fetchMovieDetail = async (movieId) => {
try {
const response = await fetch(
`${BASE_URL}/movie/${movieId}?api_key=${API_KEY}&language=ko-KR`
);
if (!response.ok) {
throw new Error('영화 상세 정보를 불러오는 데 실패했습니다.');
}
const data = await response.json();
return data;
} catch (error) {
console.error(`영화 상세 정보 오류 (ID: ${movieId}):`, error);
return null;
}
};

Tailwind CSS 4버전

Tailwind CSS 3버전

import React, { useState, useEffect } from 'react';
import { Link } from 'react-router-dom';
import useDebounce from '../hooks/useDebounce';
const Navbar = ({ onSearch }) => {
const [searchTerm, setSearchTerm] = useState('');
const debouncedSearchTerm = useDebounce(searchTerm, 500);
useEffect(() => {
if (debouncedSearchTerm !== undefined) {
onSearch(debouncedSearchTerm);
}
}, [debouncedSearchTerm, onSearch]);
const handleInputChange = (event) => {
setSearchTerm(event.target.value);
};
return (
<>
<header className="fixed w-full bg-[#601b85] text-white p-[16px] z-10">
<div className="w-full container mx-auto flex items-center">
<Link to="/" className="text-xl font-bold mr-[20px]">Maga Movie</Link>
<div className="flex-1 mx-[16px] bg-white rounded-[6px]">
<input
className="p-[8px] w-full text-gray-600 outline-none border-none rounded-md"
type="text"
placeholder="찾고 싶은 영화를 검색하세요."
value={searchTerm} // input 값과 searchTerm 상태 연결
onChange={handleInputChange} // input 변경 이벤트 처리
/>
</div>
<nav className="flex items-center">
<Link to="/" className="ml-[16px] p-[10px] border rounded-[5px] hover:bg-white hover:text-[#601b85] transition-colors">
로그인
</Link>
<Link to="/" className="ml-[16px] p-[10px] border rounded-[5px] hover:bg-white hover:text-[#601b85] transition-colors">
회원가입
</Link>
</nav>
</div>
</header>
</>
);
}
export default Navbar;