brunch

You can make anything
by writing

C.S.Lewis

by 핑크곰 Apr 17. 2020

유튜브 API - 12. 할당량 최적화

오늘은 할당량(Quota) 이야기를 해 볼까 한다.


유튜브(Youtube) API - 3.API 살펴보기 글에서 할당량과 최적화의 필요에 대해 간단히 다룬 바 있다.


할당량이란 API 남용을 막고 자원을 관리하기 위해 구글에서 제시하고 있는 제약조건이다. 초기 학습단계에서는 크게 문제가 되지 않지만, 본격적으로 개발을 하고 실서비스를 하기 시작하면 꽤나 골칫거리가 된다. (C언어 시절부터 메모리를 관리하던 시니어 개발자에게는 너무나 당연한 일 같이 느껴 지질지도. -_ -)


당장 구글에서 "유튜브 API 할당량"으로 검색해보면 "할당량 어떻게 늘리느냐"라는 글을 많이 볼 수 있다. 글에서 개발자의 고충이 느껴지지 않는가?!


필자가 작성한 글을 포함해서 대부분의 글에서는 할당량 한도 향상을 신청받는 유튜브 페이지 링크로 답을 마무리한다. 정답이긴 하지만 이 과정이 녹록지 않다. 생각보다 작성해야 할 내용이 많고 "유튜브 API 서비스 팀"에서도 꽤나 디테일하게 체크한다. 때문에 신청서를 보내고 끝이 아니라 이후에 메일로 추가 내용들을 보완해야 하는 경우도 다반사다. (한도 상향 관련해서 별도의 글로 해당 과정을 정리하도록 하겠다.)


그렇다면 한도 상향 신청 외에 다른 방법은 없는 걸까?!




한도 향상 신청서에 보면 수많은(?) 입력 항목 중 개발자의 뼈를 때리는 질문이 있다.


지금 너가 사용하는 API 방식이 최선이야? 확실해?!
할당량 줄일 수 있는 다른 방법 없어?


"응, 없어" 라고 넘어가고 싶지만, 왠지 모를 자책감과 자신의 코드에 대한 의구심이 떠나질 않는다. 필자도 귀차니즘 때문에 과감히 "No-!"라고 외쳤지만, "유튜브 API 서비스 팀"이 보내는 재요청 메일에 회신하면서 밤마다 이불 킥을... -0-;


결론부터 말하자면, 유튜브 API를 사용해서 자신이 원하는 결과를 얻었다면 그 이후에 반드시 아래의 순서대로 한번 더 고민해 보기를 바란다.  


1. 유튜브가 제공하는 개발 문서를 살펴보고, 동일한 결과를 얻을 수 있는 API가 있는지 체크한다.

2. 기 개발에서 사용한 API와 1번 API의 할당량을 할당량 계산기를 통해 비교한다.

3. 1번 API의 할당량이 더 적다면(단, 1이라도) 주저하지 말고 다시 작성한다.(귀차니즘으로 합리화하지 말고 꼭 해라 -_ -)

4. 다시 1번부터 반복한다.


무한루프 아니냐고, 개발자를 죽일 셈이냐고 원망할 수도 있다. 하지만 나중에 할당량 부족해서 고생하는 것보다 개발할 때 제대로 하는 게 시간과 노력을 줄일 수 있는 최선의 방법이다. 혹자는 GCP에서 복수의 프로젝트를 만들어서 할당량을 늘리는 꼼수를 부리기도 한다. 잠깐은 어떻게든 버티겠지만, 어느 날 구글 AI가 보내는 중복 프로젝트 경고의 메일을 보게 될 게다. 그때쯤 되면 코드도 잘 기억 안 나고, 할당량 상향은 몇 달 걸리고... 지옥을 맛보게 될 게다.


아무쪼록 다시 보자 내 코드. 이렇게 개발하면서 경험을 쌓으면, 처음부터 최적화 API를 사용하는 노하우를 터득하게 된다. 첫술에 배부를 수 없다. 노력하자.




이렇게 단언하는 이유는 필자가 이런 문제 상황과 꼼수를 이미 경험해봤기 때문이다. -0-


특정 채널의 모든 동영상의 정보(제목, 내용, 통계정보 등)를 시간마다 조회해서 저장하는 수집 모듈을 개발했다. 필자가 처음 사용한 API는 아래의 두 가지.

Search:list 채널 아이디로 채널 내 모든 동영상의 아이디만 추출
Videos:list Search에서 얻은 아이디를 사용해서 동영상 정보 추출  


채널에는 1007개의 동영상(재생목록에 모두 들어있는 상태)이 있었기 때문에, nextPageToken을 이용해서 각 API마다 21번의 호출(한 번에 최대 50개 항목 조회)이 일어났다. 참고로, 유튜브 가이드 문서에는 언급되어있지 않지만 Videos:list도 동영상 아이디로 넘길 수 있는 최대 개수가 50개다. 


결과는, 5시간 만에 할당량 부족으로 수집 모듈 사망 ㅠ0ㅠ


일반적으로 Youtube Data API의 일간 할당량은 10,000이다. 때문에 4번을 수행하고 다섯 번째 수행할 때는 할당량 부족으로 에러가 발생한다. 아래에서 할당량 계산 정보를 살펴보자.


채널 내 동영상 정보 수집 시 소요 할당량
- 동영상 건수 : 1,007건 
- 사용 쿼터 : 2,226 / 시간 * 24 = 53,424 / 일
- 계산식 
 > Search:list(snippet) : 100  * 21 = 2,100 
 > Videos:list(snippet/statistics + id): 5 * 21 + 21 = 126


결국 매일 수집을 하기 위해서는 43,424의 일간 할당량이 추가로 필요하다. 심지어 채널 내 동영상은 점점 늘어나기 때문에 현실에서는 더 많은 할당량이 필요하다.


참고로, 할당량 한도 상향 신청서에는 추가로 필요한 할당량과 그 이유, 계산 내용을 모두 적어야 한다.(왜 한도 상향 신청이 힘든지 조금 이해가 되지 않는가?!) 나아가 일별로 추가되는 영상수를 고려해서 연간 필요한 할당량까지 계산해서 신청하는 게 좋다.


그렇다면, 필자가 위에서 언급한 대로 할당량을 줄일 수 있는 다른 API는 없는지 확인해보자.


최종 목표는 채널의 모든 동영상 정보인데, 모든 동영상이 재생목록에 포함되어있으니, 재생목록을 모두 가져와서 그 안에 있는 동영상 정보를 조회하는 건 어떨까?!

Playlists:list 채널 아이디로 채널 내 모든 재생목록 아이디 추출
PlaylistItems:list 재생목록 아이디로 재생목록 내 모든 동영상 아이디 추출

Videos:list PlaylistItems에서 얻은 아이디를 사용해서 동영상 정보 추출  


채널에는 재생목록 10개, 하나의 재생목록당 100개 ~ 101개의 동영상이 들어있다. nextPageToken을 이용해서 최대 3번의 호출(한 번에 최대 50개 항목 조회)이 일어났다. API 하나를 더 태우는 셈인데 과연 할당량이 줄어들까?! 계산해보자.


채널 내 동영상 정보 수집 시 소요 할당량
- 동영상 건수 : 1,007건 (재생목록 10개, 재생목록 내 동영상 100~101개)
- 사용 쿼터 : 246 / 시간 * 24 = 5,904 / 일
- 계산식 
 > Playlists:list(snippet) : 3 * 10 = 30 
 > PlaylistItems:list(snippet) : 3 * 10 * 3 = 90 
 > Videos:list(snippet/statistics + id): 5 * 21 + 21 = 126


API는 한 개 늘어났지만, 사용 할당량은 5,904로 1/10 가까이 줄어버렸다. 할당량 한도 상향 신청 없이 하루 동안 수집해도 4,000의 할당량이 남는다. 아아아~~ -)_( -




할당량 쿼터 한도 상향에 앞서 개발한 방식이 정말 최선인지, 쿼터를 최적화할 수 있는 방법이 없는지 반드시 고민하자. 그리고 다시 한번 조언하건대, 절대 프로젝트 여러 개 만들어서 할당량 늘리거나 하지 말자 ㅠㅠ(구글은 계속 진화하고 있고 이는 여러분이 생각하는 꼼수보다 훨씬 빠르고 강력하다.)

이전 15화 유튜브 API — 8.페이징
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari