👉 바탕화면에 폴더 생성하기
npx creact-react-app ./
https://www.themoviedb.org/
👉 드라마, 영화들의 정보를 전달해줌 ( 회원 가입 하고 로그인 하기👤 )
로그인 후 상단 오른쪽 프로필 클릭하고 Settings 들어가기

앱 이름, URL, 설명 이런 거(기타 등등)를 넣어주면 됨
이 단계 거치면 key 받을 수 있음🙆♀️👊여기에서 이미 정해놨음➡어떠한 요청 보내고
이런식으로 요청 보내면 우리가 이러한 데이터를 줄 거야여기다 요청 보내면 최신 무비에 대한 데이터 줄거고
어떤 무비 하나에 대해서 자세한 정보 원해서
두번째 처럼 요청 보내면 그 영화에 대한 디테일한 정보 줄거야
이렇게 다 이미 만들어 놓았음
우리는 알맞은 방법으로 요청 보내기만 하면 됨📢👉 이렇게 같은 부분을 인스턴스로 하나 만들어서 사용하면 훨~씬 좋음👍
만들 때 도움 주는 'Axios 라이브러리'가 있음 ( 비동기 요청 보낼 때 많이 사용하는 것 )
⬆ 이렇게 ❗❗브라우저, Node.js를 위한 Promise API를 활용하는 HTTP 비동기 통신 라이브러리📚
쉽게 말해 백엔드랑 프론트엔드랑 통신을 쉽게하기 위해 AJAX와 더불어 사용🙆♀️
📁api 폴더 만들기
axios에서 인스턴스 만들기 위해 제공해주는 메서드➡create
👉 인스턴스 만들 때 넣어주고 싶은 옵션들 ({ 안에 넣어 주면 됨 })
공통된 URL➡baseURL❗
🔑키 값 받은 거 붙여넣기
다른 컴포넌트에서도 쓸거라서 export 해주기
1 ) 현재 상영중인 영화 가져올 때는 movie/nowplaying의 경로
네비게이션 바 - 로고, 검색창 / 배너 / 카테고리
카테고리 들어가면 영화들이 나열되어 있음

👉 'refce'로 각각 함수형 컴포넌트로 만들기Css-in-JS라고 하는 JS 파일 안에서 CSS 처리할 수 있게 해주는 대표적인 라이브러리📚
📥설치 : npm install styled-components

⬇
public>images & videos 압축풀고 끌어다 넣기

useEffect


⬇



✅inset➡left,right,bottom 다 0을 주는 것 ( 포지션 )
이렇게 적용 됨
이부분도 넣어주기
코드 넣어주면 이렇게 됨
useEffect 안에서 요청 보내기
⬆ axios가 fetch를 대신함✅➡axiosInstance 이용해서 비동기 요청 보낼 것🔥
🙆♀️데이터 받아올 땐 Get Get Get 사용❗
요청 경로는 이미 requests.js에다 써놨음
💡async await : 요청 보낸 다음에 응답이 올 때까지 기다리는 것
🤩가져와야 요청 보낼 수 있음
요청 잘 보내졌음
🎬20개의 영화 데이터가 있음
👉 영화 id
The Movie DB API에서 { append_to_response: "videos" } 이런식으로
response2 : 콘솔에 출력되었고 Network에 들어가면
{ append_to_response: "videos" } 이부분이 들어간 것을 확인할 수 있음🙆♀️
⬆ 저 두부분은 instance에서 넣어준 것들
여기 있는 데이터들을 접근하고 싶으면➡구조 분해 할당 문법

setMoive(movieDetail) 넣어주면 movie라는 상태에
이 객체의 데이터들이 다 들어가게 됨😎// ...
return (
<div className='banner'
style={{
// 이미지 경로, 사이즈는 original로, 유니크한 이미지 이름
backgroundImage: `url("https://image.tmdb.org/t/p/original/${movie.backdrop_path})`,
backgroundPosition: 'top center',
backgroundSize: 'cover'
}}
>
<div className='banner__contents'>
<h1 className='banner__title'>
{movie.title || movie.original_title}
</h1>
<div className='banner__buttons'>
{movie.videos.results[0].key ?
<button>
Play
</button>
: null
}
</div>
<p className='banner__description'>
{movie.overview}
</p>
</div>
<div className='banner__fadeBottom' />
</div>
// ...
bannerfedeBottom 부분은 배너의 가장 밑 ( 자세히 보면 뿌옇게 보임 )
✅이미지 가져올 때 경로 체크하기➡백그라운드 이미지 넣을 시 중요
title 우선 순위로 가져올 건데 영화마다 없는 것도 있어서
여기까지 나왔음
유튜브 비디오를 보여주는 버튼
videos에 데이터가 있으면 유튜브 안에 이 영화에 대한 트레일러가 있는거고
result에 첫 번째 객체에 id가 있으면 Play 버튼 보여주게 할 거임
🔑key 있으면 Play 버튼 보여주고 없으면 null 처리 해줌
쟤가 없으면 videos results 값이 없을 수 있음
❓ 집어넣으면 해결됨❗

{movie.overview} 넣어주면 영화 줄거리가 잘 불려와짐
처음에 클릭 안 되어 있게 false로 초기화
클릭 되지 않았을 땐 현재 UI 나오게 하고
Play 버튼 클릭되었을 땐 새로운 UI를 보여줄 것 ( 영상 )
이렇게 임베드 할 수 있게 해놨음
유튜브에서 Share 누르고
⬆ Iframe 태그 사용하고 있고 width&height 알아서 지정하고// styled-components 라이브러리 사용해
// iframe 스타일 설정하는 컴포넌트 만듦
const Iframe = style.iframe`
// iframe의 너비를 부모 요소의 전체 너비로 설정
width: 100%;
// iframe의 높이를 부모 요소의 전체 높이로 설정
height: 100%;
// iframe의 z-index를 -1로 설정하여 다른 요소 뒤에 배치
z-index: -1;
// iframe의 불투명도를 0.65로 설정하여 약간 투명하게 만듦
opacity: 0.65;
// iframe의 테두리 제거하여 깔끔한 외관을 만듦
border: none;
// iframe 위에 겹쳐질 가상 요소 (::after)를 추가
&::after {
// 가상 요소의 콘텐츠를 비워둠
content: "";
// 가상 요소의 위치를 iframe 내에서 절대 위치로 설정
position: absolute;
// 가상 요소의 위쪽을 iframe의 위쪽과 맞춤
top: 0;
// 가상 요소의 왼쪽을 iframe의 왼쪽과 맞춤
left: 0;
// 가상 요소가 iframe의 전체 너비를 차지하도록 설정
width: 100%;
// 가상 요소가 iframe의 전체 높이를 차지하도록 설정
height: 100%;
}
`

key}? 뒤에 옵션 추가 작성 할 것
배너에서 Play 버튼 누르면
🎥영상 잘 나오는 것을 볼 수 있음👀유튜브 비디오 가져오기 위해 사용❗
아이프레임➡HTML Inline Frame 요소이며 'inline frame'의 약자
효과적으로 다른 HTML 페이지를 현재 페이지에 포함시키는
중첩된 브라우저로 iframe 요소 이용하면 해당 웹 페이지 안에
어떠한 제한 없이 다른 페이지 불러와서 삽입할 수 있음😎


App.js에 Category 컴포넌트 가져오기
첨엔 이미지 hover 하면 비디오







아직까진 비디오 안 움직일 것🙅♀️
<img 안에 src & alt 작성하기🖍// ...
<Wrap>
<img src="/images/viewers-disney.png" alt='disney' />
<video>
<source src="/videos/disney.mp4" type="video/mp4" />
</video>
</Wrap>
// ...


이제 적용 됨👍


⬆ 실행하면 위처럼 됨🙆♀️





















handleClick(movie) 이렇게만 하면 계속 함수가 호출됨,,😬
클릭했을 때만 모달을 오픈하게 할 거라
첨엔 모달을 오픈하고 있지 않으니까 false로 초기값 주기

Row.js에서 isModalOpen이 true이면 Modal 컴포넌트를, 아니면 null
실행해서 이미지 클릭하면 true니까 밑에 Modal이 뜨는 걸 확인 할 수 있음👀

const [movieSelected, setMovieSelected] = useState({});

movieSelected={movieSelected} 이렇게 말고
movieSelected={movieSelected}로 했을 땐 console.log로 출력해보면
객체 데이터 받아와짐
이건 movieSelected 안에 있다면
바로 저런 식으로 가져올 수 있는 것

return (
<div className='presentation' role="presentation">
<div className='wrapper-modal'>
<div className='modal'>
<span
onClick={() => setIsModalOpen(false)}
className='modal-close'
>
X
</span>
<img
className='modal__poster-img'
src={`https://image.tmdb.org/t/p/original${backdrop_path}`}
alt='modal__poster-img'
/>
<div className='modal__contents'>
<p
className='modal__details'
>
<span>
100% for you
</span>{" "}
{release_date ? release_date : first_air_date}
</p>
<h2 className='modal__title'>
{title ? title : name}
</h2>
<p className='modal__overview'>
평점: {vote_average}
</p>
<p className='modal__overview'>
{overview}
</p>
</di v>
</div>
</div>
</div>






