YouTube API 검색이 느린 이유: search.list와 videos.list 차이점 완전 정리

 유튜브 쇼츠 트렌드 수집 시스템을 만들면서 YouTube Data API 쿼터가 예상보다 훨씬 빠르게 소진됐다.

하루 10,000유닛이면 충분하다고 생각했는데 글로벌 AI 키워드 수집을 추가하자마자 쿼터 부족 오류가 발생했다. 로그를 분석해보니 원인은 명확했다. search.list를 과도하게 사용하고 있었다.

search.listvideos.list는 같은 YouTube Data API지만 유닛 비용이 100배 차이난다. 이 차이를 이해하기 전까지는 왜 쿼터가 사라지는지 전혀 감이 오지 않았다.

정확히는 검색 속도 문제가 아니라 API 쿼터 비용 문제였다.

search.list 호출 비용이 videos.list보다 100배 높아 예상보다 빠르게 할당량이 소진되고 있었다.


search.list와 videos.list 차이

두 API의 핵심 차이는 용도와 비용이다.

API용도유닛 비용
search.list키워드로 영상 검색100 유닛
videos.list영상 ID로 상세 조회1 유닛
channels.list채널 정보 조회1 유닛

search.list 1회 호출 = videos.list 100회 호출과 같은 비용이다.

하루 쿼터 10,000유닛 기준:

search.list만 사용: 최대 100번 호출 가능
videos.list만 사용: 최대 10,000번 호출 가능

왜 search.list가 비싼가

search.list는 단순 데이터 조회가 아니다. 호출할 때마다 내부적으로 복잡한 작업이 실행된다.

키워드 수신
↓
검색 인덱스 조회
↓
관련성 계산
↓
랭킹 정렬
↓
필터링 적용
↓
결과 반환

반면 videos.list는 영상 ID를 기반으로 데이터베이스에서 직접 조회한다. 훨씬 단순한 작업이라 비용이 낮다.


잘못된 사용 패턴

가장 흔한 실수는 이미 수집한 영상이 있는데도 매번 같은 키워드로 search.list를 반복 호출하는 것이다. 

신규 영상이 없어도 실행할 때마다 100유닛이 소비된다. 30분 주기로 돌리면 하루에만 수천 유닛이 낭비된다.

python

# 잘못된 패턴 - 쿼터 낭비
keywords = ["ChatGPT", "Claude AI", "n8n", "NAS"]

while True:
    for keyword in keywords:
        # 30분마다 같은 키워드를 반복 검색
        # 이미 수집한 영상도 다시 search.list로 검색
        results = youtube.search().list(
            q=keyword,
            part="snippet",
            maxResults=50
        ).execute()
        # 100유닛 * 키워드 수 * 실행 횟수
        # 키워드 4개 * 30분 주기 = 하루 400 * 48 = 19,200유닛

키워드 4개만 해도 400유닛 소비. 하루 25번만 실행해도 쿼터가 바닥난다.


올바른 사용 패턴

search.list는 최초 검색에만 사용하고 상세 조회는 videos.list로 전환한다.

python
# 올바른 패턴 - 쿼터 절약
keywords = ["ChatGPT", "Claude AI", "n8n", "NAS"]

video_ids = []

for keyword in keywords:
    # 1단계: search.list로 영상 ID만 수집 (100유닛)
    results = youtube.search().list(
        q=keyword,
        type="video",
        maxResults=50,
        part="id"  # id만 가져오면 됨
    ).execute()
    
    for item in results["items"]:
        video_ids.append(item["id"]["videoId"])

# 2단계: videos.list로 상세 정보 일괄 조회
# 50개씩 배치 처리 = 1유닛
for i in range(0, len(video_ids), 50):
    batch = video_ids[i:i+50]
    details = youtube.videos().list(
        id=",".join(batch),
        part="snippet,statistics,contentDetails"
    ).execute()

키워드 4개 기준:

잘못된 패턴: 400유닛 + 추가 조회 비용
올바른 패턴: 400유닛 (검색) + 약 2유닛 (상세 조회)

실제 경험: 격번 실행으로 해결

쇼츠 자동화 시스템에서 글로벌 키워드 수집을 추가했을 때 쿼터 소진 문제가 발생했다. 30분마다 실행되는 수집기에서 매번 search.list를 호출하고 있었다.

해결 방법은 수집 주기를 두 단계로 분리하는 것이었다.

python
from datetime import datetime

# 30분마다 실행
# 매시 0~29분: 신규 영상 검색 (search.list 사용)
# 매시 30~59분: 기존 영상 갱신 (videos.list만 사용)

run_global = datetime.now().minute < 30

if run_global:
    # search.list로 신규 영상 검색
    new_videos = await collect_global_keywords(AI_KEYWORDS)
else:
    # videos.list로 기존 영상 조회수만 갱신
    await refresh_existing_snapshots()
    print("[collector] search.list 스킵 (쿼터 절약)")

실제 운영 중인 수집기 로그 글로벌 키워드별 search.list 호출 결과(ChatGPT, Claude AI, n8n 등 키워드당 8개씩 수집)

개선 결과:

개선 전: 하루 8,000~9,000유닛 소비 (쿼터 부족 오류 발생)
개선 후: 하루 4,000~5,000유닛 소비 (할당량 50% 이하)

search.list를 써야 할 때 vs 쓰지 말아야 할 때

써야 할 때:

- 키워드로 새로운 영상을 찾을 때
- 특정 채널의 최신 영상을 탐색할 때
- 카테고리별 인기 영상을 검색할 때

쓰지 말아야 할 때:

- 이미 알고 있는 영상 ID의 상세 정보 조회
- 기존 수집 영상의 조회수/좋아요 갱신
- videos.list로 처리 가능한 모든 경우

핵심 원칙:

신규 발견 → search.list
기존 조회 → videos.list

마무리

search.listvideos.list의 차이는 단순하다.

search.list = 검색 (100유닛)
videos.list = 조회 (1유닛)

모든 작업을 search.list로 처리하면 쿼터가 순식간에 소진된다. 신규 영상 탐색에만 search.list를 사용하고, 상세 정보 조회와 기존 영상 갱신은 videos.list로 전환하면 쿼터 사용량을 50% 이상 줄일 수 있다.


관련 글

댓글

이 블로그의 인기 게시물

UGREEN DXP4800PLUS NAS로 유튜브 쇼츠 자동화 시스템 구축기 (Docker · FastAPI · PostgreSQL · Edge-TTS)

YouTube Data API 쿼터 초과를 피하는 방법 (700개 쇼츠 수집 사례)

FastAPI app.mount 사용 후 API가 404가 되는 이유와 해결 방법