Youtube 검색 API 효율적으로 사용하기

4차 프로젝트 트러블슈팅
트러블 슈팅프로젝트
avatar
2025.03.13
·
4 min read

기존의 CD 검색 결과로 나온 데이터들의 videoId와 재생시간을 가져오는 순서에대해서 설명하자면,

검색 ->Spotify 검색 API에서 결과 반환 -> 반환된 제목,가수명으로 Yotube 검색 API

-> 반환 값중 videoId, duration 가져오기

3988

🚨 문제 배경

유튜브 API 검색 하루 제공 포인트는 10000포인트입니다. 한번 검색할때 100포인트씩 차감됩니다.

검색결과로 나온 결과값(ex. 10개) 각각에 유튜브 검색 API를 호출하는 방식은 유튜브 API에서 제공하는 무료 할당량을 금방 채워버린다는 문제가 있습니다.

즉, 현재 한번 검색할때마다 100*10 포인트씩 차감됩니다.

한개의 유튜브 API 키 기준으로 하루 10번밖에 검색하지 못하는 치명적인 문제입니다.

🔥 시도했던 방법(들)

유튜브 검색 API 호출을 최소화하기 위해 API 호출을 특정 CD를 추가하는 순간에만 하도록 하였습니다. 또한 유튜브 API 키를 로테이션하여 하나의 API 키의 할당량이 소진되었을 때, 다른 API 키를 사용하여 연속적인 요청을 처리하도록 하였습니다.

export const getYoutubeUrl = async (trackTitle: string, artistName: string) => {
  const encodedQuery = encodeURIComponent(
    `${trackTitle} ${artistName} "official audio" OR "lyrics" `,
  );
  let apiKeyIndex = 0; //  API 키 인덱스 관리


  while (apiKeyIndex < YOUTUBE_API_KEYS.length) {
    const currentApiKey = YOUTUBE_API_KEYS[apiKeyIndex];
    try {
      const response = await axios.get(
        `https://www.googleapis.com/youtube/v3/search?part=snippet&q=${encodedQuery}&type=video&videoCategoryId=10&key=${currentApiKey}`,
      );
      const videos = response.data.items;
      .
      .
      .
   
    } catch (error) {
      console.error(`🚨 ${apiKeyIndex}번째 API키 실패:`, error);
      apiKeyIndex++; // 다음 API 키로 변경
    }
  }
  console.error('🚨 모든 YouTube API 키가 실패했습니다.');
  return { youtubeUrl: '', duration: 0 }; // 에러 시 기본값 반환
};

👀 이전 코드와 비교

이전 코드는 모든 검색 결과 데이터에 Youtube 검색 API를 적용시켜

평균적으로 20분 내외로 할당량이 채워지는 문제가 발생했습니다.

하지만 CD를 추가할때만 유튜브 검색 API를 호출하도록 수정해 할당량 차감을 최소화 하였고,

API 로테이션을 적용시켜 API 할당량이 제한되는것을 최대한 지연시켜

평균적으로 API 키 하나당 2시간 유지시킬 수 있게 되었습니다.

🤩 알게된 점

유튜브 API 호출뿐 만 아니라 다른 외부 API를 사용할때 할당량의 개념에 대해 찾아보고 존재한다면

효율적인 API 호출을 해야한다는 점에 대해 알게되었습니다.







- 컬렉션 아티클