내일배움캠프 아웃소싱 프로젝트를 진행하던 중 마무리 단계에서 다른 조가 Youtube API를 사용한 것을 보고 나도 갑자기 사용해보고 싶어져 빠르게 찾아봤다.





axios와 tanstack-quey, react-youtube를 설치한다. 물론 이 패키지들이 필수는 아니다. javascript 내장 함수만으로 충분히 구현할 수 있지만, 나는 편의를 위해 해당 패키지들을 사용했다.
참고로 react-youtube는 구글에서 만든 공식 패키지이다.
yarn add axios
yarn add react-youtube
yarn add @tanstack/react-query
react-youtube 패키지는 유튜브 영상을 보여줄 수 있는 컴포넌트가 담겨 있는 패키지이다.
<Youtube options.../>
사용법은 문서가 더 자세하니 링크만 건다.
https://www.npmjs.com/package/react-youtube
youtube API 사용법 또한 공식 문서가 훨~~~씬 잘되어있으니 링크만 건다.
https://developers.google.com/youtube/v3/getting-started?hl=ko
import axios from 'axios';
export const getRandomPlayListItem = async () => {
const {data} = await axios.get(
`https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=재생목록ID&maxResults=50&key=${process.env.REACT_APP_YOUTUBE_API_KEY}`,
);
return data.items[new Date().getSeconds() % data.items.length].snippet.resourceId.videoId;
};
먼저 나는 내 유튜브 계정에 재생목록을 먼저 만들어 놓고 그 재생목록 중 랜덤한 영상을 가져오고자 했다. 위의 링크에서 재생목록 ID만 바꿔 적어주면 된다.
재생목록 생성

링크 확인
해당 재생목록에 들어가 주소를 확인하면 list 뒤에 붙어 있는 것이 playlistId다

10초 이상 영상을 시청하면 포인트를 획득할 수 있는 컴포넌트를 만들었다.
const AdModal = ({user}) => {
const [remainTimes, setRemainTimes] = useState(10);
const intervalRef = useRef(null);
const {isPending, data: videoId} = useQuery({
queryKey: ['randomPlayListItem'],
queryFn: getRandomPlayListItem,
});
const {updatePoint} = useUpdatePoint(
user.id,
REWARD_POINT,
queryClient.invalidateQueries({
queryKey: ['user'],
}),
);
// 재생시 동작하는 함수
const onPlay = () => {
if (!intervalRef.current) {
intervalRef.current = setInterval(() => {
setRemainTimes(prev => {
if (prev === 0) {
toast.success(`${REWARD_POINT} 포인트를 획득하셨습니다!`, TOAST_OPTION.topCenter);
clearInterval(intervalRef.current);
updatePoint();
return 0;
}
return --prev;
});
}, 1000);
}
};
// 일시정지시 동작하는 함수
const onPause = () => {
clearInterval(intervalRef.current);
intervalRef.current = null;
};
const opts = {
height: '390',
width: '640',
playerVars: {
rel: 0, // 연관 영상 표시 X
autoplay: 1, // 자동 재생
mute: 1, // 자동 재생하려면 음소거가 필요함
modestbranding: 1, // youtube로고 제거
},
};
useEffect(() => {
return () => {
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
};
}, []);
return (
<StAdModalContainer>
{isPending ? (
<BarLoader color={theme.COLOR.pink} height={10} width={300} />
) : (
<>
<h1>광고를 {SECONDS_FOR_POINT}초 이상 보고 포인트를 획득해보세요!</h1>
{videoId && <YouTube videoId={videoId} opts={opts} onPlay={onPlay} onPause={onPause}></YouTube>}
{remainTimes > 0 ? (
<p>포인트 획득까지 {remainTimes}초 남았습니다.</p>
) : (
<p>{REWARD_POINT}포인트를 획득하셨습니다.</p>
)}
</>
)}
</StAdModalContainer>
);
};
export default AdModal;

생각보다 간단했고, 한 번 해봤으니 다음에는 더 잘 활용해봐야겠다.
좀....잘하셨네여🤨