Data API 살펴보기
앞선 글에서,
유튜브 API가 어떻게 구성되어 있는지, API를 사용하기 위한 사전 작업은 어떤 게 필요한지 알아봤다.
이번 글에서는 유튜브 API - 시작하기 글에서 설명했던 3종류의 유튜브 API 중 가장 많은 내용을 포함하고 있는 Data API를 기준으로 어떤 데이터를 가져올 수 있는지, 제약사항은 어떤 것들이 있으며 이를 해결하는 방법은 무엇인지 살펴보자.
리소스 및 리소스 유형
유튜브 Data API를 통해서 어떤 것들을 할 수 있는 걸까? API에서 다루고 있는 데이터 항목(리소스)들이 뭐가 있는지 살펴보면 무엇을 할 수 있는지가 보인다.
뭐 예상은 했다만 참 많다. 각 리소스들은 서로 상호작용이 가능하기 때문에 다른 리소스에 대한 참조를 포함하고 있다. 또한 리소스들마다 기본 메서드가 존재하며 특성에 맞는 별도의 메서드도 가지고 있다.
이중 CUD관련 내용들은 이전 유튜브 API - 사전작업 글에서 말한 사용자 인증이 반드시 필요한 메서드인 것도 잊지 말자.
정리해보면 유튜브 Data API는 유튜의 기본적인 리소스(채널, 재생목록, 동영상 등)의 기본적인 기능(등록, 수정, 삭제 등)을 제공한다. 즉, 유튜브와 관련된 기능을 애플리케이션에 추가하려면 Data API가 필수인 셈이다.
할당량
그런데,
예전에도 말했지만 동영상 플랫폼 API를 오픈한다는 건 꽤나 위험한 발상이다. 동영상과 같은 무거운 리소스에 대한 API는 비용 크기 때문에, 함부로 오픈했다간 빚더미(?)에 앉을 가능성이 농후하기 때문이다.(그게 아니라면 욕을 먹거나;;) 가령, 해커가 핸드폰에 있는 모든 영상과 이미지를 특정 유튜브 채널에 올려 버리는 코드가 숨어있는 앱을 만들어서 스토어에 올린다고 생각해보자. 앱의 사용자도 문제지만, 유튜브도 그 많은 비용을 어떻게 감당하겠는가.
때문에 유튜브 API는 ‘할당량(Quotas)’이라는 개념을 사용한다. 쉽게 이야기해서 ‘API 한번 쓸 때마다 얼마 드는 거니까 아껴서 잘 써~’ 뭐 이런 개념이다. 리소스 ID 읽기는 1, 쓰기는 50, 동영상 업로드는 1600 등 사전에 정의가 되어있다. GCP 콘솔에서 사용자별 할당량을 확인할 수 있고, 추가로 할당량 계산기까지 제공하니 자세한 설명은 개발자 가이드를 참고 하자.
참고로, 한도 할당량이 많아 보이지만 운영하다 보면 생각보다 부족하다. 가령 재생목록(playlist)을 추가(insert)한다고 가정했을 때, 쓰기에 해당하는 50 쿼터만 사용될 것 같지만 그렇지 않다. 재생목록이 추가된 이후 재생목록 리소스를 반환하므로 읽기 쿼터가 추가로 든다.(이.. 이런 날강도들 -0-;;) 게다가 조회하는 리소스의 다양한 정보들에 따라 쿼터가 천차만별이므로 정말 필요로 하는 리소스의 속성만 지정해서 읽어야 한다.
결국 사용 할당량을 최소화하기 위한 방법으로 API 활용 방안을 모색해야 하며, 이를 위해 부분 리소스라는 개념이 존재한다.
만약 할당량을 넘으면 어떻게 하냐고?!(쿼터가 부족하다고 에러 메시지를 뱉음) GCP의 "IAM 및 관리자 - 할당량" 메뉴를 통해 요청을 하면 된다고 나와있다. (필자도 요청을 해보지 않았기 때문에 얼마나 정확히 반영되는지는 모르겠다. -0-;;)
부분 리소스
리소스는 부분으로 구분된다. 예를 들어 playlist 리소스는 snippet과 status라는 2개의 부분이 있고 channel 리소스는 6개 부분이 있으며 video 리소스는 10개의 부분이 있다. 각 부분에는 관련된 속성의 그룹이 있고 사용하려는 유형의 데이터만 검색하면 된다. 즉, 리소스 데이터를 반환하는 API는 검색하려는 리소스의 부분을 지정하고 필터를 설정하여 원하는 속성 값만 반환해야 한다. 이를 위해 2개의 매개변수가 있고, 이를 통해 리소스 속성을 식별할 수 있다.
part : 반환 리소스의 속성 그룹(부분)을 식별
fields : 특정 속성을 반환하기 위한 필터링
뭔가 난해한 설명이지만, 아래 샘플을 보면 어떤 방식으로 요청하고 응답을 받는지 쉽게 이해가 된다.
요청 내용 : 2개의 부분을 포함하지만 kind 및 etag 속성과 리소스의 snippet 개체에 있는 일부 중첩된 속성을 제외하는 동영상 리소스를 반환
API 응답 :
{
"videos": [{
"id": "7lCDEYXw3mM",
"snippet": {
"channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
"title": "Google I/O 101: Q&A On Using Google APIs",
"categoryId": "28"
},
"statistics": {
"viewCount": "3057",
"likeCount": "25",
"dislikeCount": "0",
"favoriteCount": "17",
"commentCount": "12"
}
}]
}
할당량 사용을 관리할 뿐 아니라 API 지연을 줄이고 네트워크 대역폭을 최소화할 수 있기 때문에 부분 리소스의 사용은 반드시 필요하다. 경험상, 처음에는 API를 사용해서 결과만 나오면 성공한 기분이 들지만, 최적화하지 않을 경우 운영환경에서 할당량 문제를 반드시 대면하게 된다. 중첩되는 속성 값을 최소화하고 꼭 필요한 데이터만 얻어올 수 있도록 API를 사용하자.
클라이언트 라이브러리
유튜브 API를 보다 쉽게 사용할 수 있도록 구글에서 다양한 언어로 클라이언트 라이브러리를 제공한다. (뭔가 이 언어들은 죄다 해봐야 할 것 같은 기분이;;)
REST API를 통해서 날코딩을 해도 되지만, 인증을 비롯해서 업로드 기능 등 보다 쉽게 API를 사용할 수 있도록 라이브러리를 제공하니 시간 낭비하지 말고 그냥 이거 쓰자 -_ -;;; 친절하게도 문서와 샘플까지 제공한다.
지금까지 유튜브 Data API를 기준으로 어떤 데이터를 가져올 수 있는지, 제약사항은 어떤 것들이 있으며 이를 해결하는 방법은 무엇인지 알아보았다. 이제 모든 준비는 끝났다. 다음 글에서는 클라이언트 라이브러리를 통해서 API를 활용해보자. It's~~~~~~~~ time!