
TMDB 오픈 API 사이트 방문하셔서 가입하면 API키를 발급받을 수 있습니다.
https://api.themoviedb.org/3/search/movie?api_key=발급받은 키 &query=검색어
https://api.themoviedb.org/3/movie/영화ID/videos?api_key=발급받은 키
react-youtube 컴포넌트 이용 ➡️ https://www.npmjs.com/package/react-youtube
📦 프로젝트 디렉터리에 react-youtube 패키지 설치
npm install axios react-youtube
영화 목록 컴포넌트
검색어와 일치하는 영화 목록을 가져와서 포스터 이미지, 영화 제목, 시놉시스를 출력
📍 검색어(영화제목) 관리하는 상태변수 title

출력할 영화 변수 추가 movies
검색 여부를 상태 변수에 추가 isSearch
const [movies, setMovies] = useState([]);
const [isSearch, setIsSearch] = useState(false);
const searchMovie = () => {
setIsSearch(true);
const endpoint = `https://api.themoviedb.org/3/search/movie?api_key=API키&query=${title}`
axios
.get(endpoint)
.then(res => {console.log(res)
setMovies(res.data.results);
})
.catch(err => console.log(err));
};
1️⃣ 검색했으나 결과 없을 때 "일치하는 영화가 존재하지 않습니다." 출력
2️⃣ 검색하지 않았을 때 "검색할 영화 제목을 입력하세요" 출력
3️⃣ 검색 ⭕️, 결과 ⭕️ map 이용해서 영화 리스트 출력
{isSearch && movies.length === 0 && (
<div>일치하는 영화가 존재하지 않습니다.</div>
)}
{!isSearch && <div>검색할 영화 제목을 입력하세요</div>}
{movies.length !== 0 && movies.map((m) => (
<div>
<div>
<img src={`https://image.tmdb.org/t/p/w500${m.poster_path}`} />
</div>
<div>
<h1>{m.title}</h1>
<p>{m.overview}</p>
</div>
</div>
))}

영화 검색 결과에서 제목을 누르면 비디오 클립 목록을 출력하는 컴포넌트

📍useParams로 파라미터에서 영화 id를 가져옴
// http://localhost:3000/movieDetail/:movieid
const MovieDetail=()=>{
const params = useParams();
const movieid = params.movieid;
📍 useEffect로 컴포넌트가 마운트 되었을 때 비디오 클립을 조회하도록 함
//컴포넌트 화면이 보이고 (마운트되고) 자동으로 데이터를 가져옴
useEffect(() => {
const endpoint = `https://api.themoviedb.org/3/movie/${movieid}/videos?api_key=키`;
axios
.get(endpoint)
.then((res) =>console.log(res));
.catch((err) => console.log(err));
}, []);
출력할 비디오 변수 추가 videos
데이터 로딩 상태 변수에 추가 isLoading
const [videos, setVideos] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
const endpoint = `https://api.themoviedb.org/3/movie/${movieId}/videos?api_key=키`;
axios
.get(endpoint)
.then((res) => {
console.log(res);
setVideos(res.data.results);
setIsLoading(false);
})
.catch((err) => console.log(err));
}, []);
1️⃣ 데이터 로딩 중이면 "데이터를 가져오고 있습니다." 출력
2️⃣ 로딩 중 ❌ 비디오 없으면 "등록된 비디오 클립이 존재하지 않습니다." 출력
3️⃣ 로딩 중 ❌, 결과 ⭕️ map 이용해서 비디오 클립 리스트 출력
{
isLoading && <h1>데이터를 가져오고 있습니다.</h1>
}
{
!isLoading && videos.length === 0 && <h1>등록된 비디오 클립이 존재하지 않습니다.</h1>
}
{
!isLoading && videos.length !== 0 && videos.map(v => (
<div style={{ fontSize: 20 }}>
{v.name} (출시일: {v.published_at.substring(0, 10)})
</div>
))
}
video 아이디를 키로 넘겨줘야함 ➡️ 키 상태변수가 필요
const [key, setKey] = useState("");
...
...
<div style={{ fontSize: 20 }} onClick={() => setKey(v.key)}>
{v.name} (출시일:{v.published_at.substring(0, 10)})
</div>
비디오 제목을 누르면 setKey(v.key) 키 설정
{
key && <YouTube videoId={key} />
}
