최근 짧은 시간 동안 재미와 정보를 제공하는 숏폼 콘텐츠(Short-form Content)가 큰 인기를 끌고 있습니다. 높은 접근성과 직관성을 바탕으로 1~3분 내외의 짧은 숏폼 영상을 제공하는 다양한 플랫폼들이 생겼고, 이를 활용한 서비스나 애플리케이션 개발도 증가하는 추세를 보이고 있습니다. 인스타그램 릴스, 틱톡 등 다양한 매체들이 존재하지만 가장 대중적인 플랫폼인 YouTube의 쇼츠를 예시로 매체 API를 연동하는 과정과 숏폼 메타데이터를 활용하는 방법에 대해 소개해 드리겠습니다.
이전 포스팅에서는 YouTube Player API를 통해 JavaScript로 유튜브 영상을 제어하는 방법에 대해 소개해 드렸는데요, 이번 포스팅에서는 YouTube Data API를 이용하여 쇼츠의 메타데이터를 활용하는 방법에 대해 소개해 드리겠습니다.
메타데이터란?
– 데이터를 설명하거나 정의하는 추가적인 정보를 의미합니다.
– 동영상을 설명하는 제목, 게시일, 작성자, 조회수 등 동영상의 모든 부가정보를 의미합니다.
우선 이전에 설명드린 Player API와 Data API의 차이점을 알아보겠습니다.
- YouTube Player API는 동영상 플레이어를 웹 또는 모바일 애플리케이션에 임베드 하여 재생, 일시정지, 볼륨 제어 등의 기능을 제공합니다.
- 반면, YouTube Data API는 YouTube의 메타데이터(예: 동영상 제목, 설명, 조회수, 썸네일 등)에 접근할 수 있게 해주는 API로, 검색 및 데이터 분석에 특화되어 있습니다.
이처럼 영상을 직접적으로 다루는 경우라면 Player API를, 영상과 관련된 정보만 다루는 경우라면 Data API를 활용하시는 것을 추천 드립니다.
API KEY 발급
사용 목적에 따라 API를 선택하셨다면, 연동 전 API KEY를 발급받아야 합니다. API KEY는 애플리케이션에서 API 요청을 제출할 수 있도록 인증된 사용자 인증 정보를 가져오는 역할을 합니다. 발급 순서는 다음과 같습니다.
- Google Cloud Console에서 프로젝트를 생성합니다. → 프로젝트 이름과 상위 조직, 폴더를 설정합니다.
- Google Cloud 상단 검색창에 YouTube Data API 검색 → [사용] 버튼을 눌러서 YouTube Data API 를 활성화 시킵니다.
- 다시 Google Cloud 대시보드로 돌아와서 [생성한 프로젝트] → [사용자 인증 정보] → [사용자 인증 정보 만들기] → [API KEY]를 선택합니다.
- 위 과정을 거치면 API KEY가 생성됩니다. 해당 API KEY는 복사 후 안전하게 보관해야 합니다.
API 연동하기
이제 본격적으로 API 연동 방법에 대해서 소개해 드리겠습니다. 공식 문서에서는 리소스 유형별로 API 연동 가이드를 제공하고 있습니다. 리소스별로 제공되는 메서드를 통해 쇼츠의 메타데이터를 활용할 수 있습니다.
API 호출 시 요구사항은 다음과 같습니다.
- 모든 요청은 API 키를 지정하거나 OAuth 2.0 토큰을 제공해야 합니다.
- 모든 삽입, 업데이트, 삭제 요청에 대해 승인 토큰을 전송해야 합니다.
- 인증된 사용자의 비공개 데이터를 검색하는 모든 요청에 대해 인증 토큰을 전송해야 합니다.
- API는 OAuth 2.0 인증 프로토콜을 지원합니다. 토큰 제공 방식은 다음과 같습니다.
- access_token 쿼리 매개변수 사용 →
?access_token=oauth2-token
- HTTP Authorization 헤더 사용 →
Authorization: Bearer
oauth2-token
- access_token 쿼리 매개변수 사용 →
리소스 유형
대표적인 리소스 유형은 다음과 같습니다.
- activity(활동): 특정 채널이나 사용자가 YouTube에서 실행한 작업에 대한 정보가 포함되어 있습니다.
ex) 동영상 평가, 동영상 공유, 동영상 업로드 등 - caption(자막): YouTube 자막 트랙을 나타냅니다.
- channel(채널): YouTube 채널에 대한 정보가 포함되어 있습니다.
- comment(설명): 동영상이나 채널에 대한 댓글을 나타냅니다.
- playlist(재생목록): YouTube 재생목록을 나타냅니다. 최대 200개의 동영상을 포함할 수 있습니다. 비공개 설정이 가능합니다.
- video(동영상): YouTube 동영상을 나타냅니다.
shorts는 별개의 리소스로 구분되지 않고, 동영상 카테고리에 합쳐져 있어서 video 리소스를 포함한 HTTP 요청을 통해 메타데이터를 조회할 수 있습니다. video 리소스의 메서드는 다음과 같습니다.
videos의 매개변수에 대한 내용은 다음 경로에서 확인하실 수 있습니다.
공식 문서의 [리소스 표현] 및 [속성] 목록에 들어가 보시면, API 요청 후 전달받는 리소스의 형식과 관련된 속성에 대한 정보를 확인하실 수 있습니다.
{
"kind": "youtube#video",
"etag": etag,
"id": string,
"snippet": {
"publishedAt": datetime,
"channelId": string,
"title": string,
"description": string,
"thumbnails": {
(key): {
"url": string,
"width": unsigned integer,
"height": unsigned integer
}
},
"channelTitle": string,
"tags": [
string
],
"categoryId": string,
"liveBroadcastContent": string,
"defaultLanguage": string,
"localized": {
"title": string,
"description": string
},
"defaultAudioLanguage": string
},
......
}
API TEST
쇼츠 아이디와 API KEY를 이용해서 쇼츠 메타데이터를 추출하는 테스트를 진행했습니다. React로 로컬 서버를 구축한 후, 브라우저에서 API 호출 결과를 확인했습니다.
- 환경 변수 파일에 API KEY를 작성합니다.
2. fetch 요청의 url을 설정합니다.
https://www.googleapis.com/youtube/v3/videos?part=snippet&id=${videoId}&key=${apiKey}
- https://www.googleapis.com/youtube/v3/videos: 리소스의 엔드포인트입니다.
- ?part=snippet: API에서 반환할 데이터의 범위를 snippet으로 지정합니다.
- &id=${videoId}: YouTube 동영상의 고유 식별자(ID)를 사용하여 특정 동영상을 조회합니다.
- &key=${apiKey}: 발급받은 API KEY를 입력합니다.
3. 컴포넌트 내부에서 fetch 메소드로 GET 요청을 전송합니다.
const fetchYoutubeData = async (videoId) => {
const apiKey = process.env.REACT_APP_YOUTUBE_API_KEY;
const apiUrl = `https://www.googleapis.com/youtube/v3/videos?part=snippet&id=${videoId}&key=${apiKey}`;
try {
const response = await fetch(apiUrl);
if (!response.ok) {
throw new Error(`YouTube API 호출 실패: ${response.status}`);
}
const data = await response.json(); // JSON 파싱
if (data.items && data.items.length > 0) {
const snippet = data.items[0].snippet;
return {
title: snippet.title,
description: snippet.description,
thumbnail: snippet.thumbnails?.high?.url || '',
};
} else {
throw new Error('데이터 오류');
}
} catch (error) {
console.error('YouTube API 호출 중 오류 발생:', error);
message.error('유튜브 데이터를 불러오는 데 실패했습니다.');
return null;
}
};
- 환경 변수로 설정한 API KEY를 참조합니다.
- 응답 데이터를 JSON 형식으로 변환합니다.
- 데이터 유효성 검사를 진행하고 snippet 객체에서 쇼츠 메타데이터를 추출합니다.
응답
{
"kind": "youtube#videoListResponse",
"etag": "RMfappW2iZuy2L4tyxkAcI6KqSs",
"items": [
{
"kind": "youtube#video",
"etag": "vCnedocsGGuOqCX7nXw3od5TR6o",
"id": "yVQInDkUWZU",
"snippet": {
"publishedAt": "2024-11-27T21:04:16Z",
"channelId": "UCtm_QoN2SIxwCE-59shX7Qg",
"title": "[24/25 UCL] 뮌헨 센터백 주전으로 '챔스 1호골' 기록하는 김민재",
"description": "👇 24-25 PL, UCL 시청하기 👇\n\nSPOTV PRIME 📺👀 ☞ https://www.spotvprime.co.kr/channel\n\nSPOTV NOW 💻📱 ☞ https://www.spotvnow.co.kr/football/",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/yVQInDkUWZU/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/yVQInDkUWZU/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/yVQInDkUWZU/hqdefault.jpg",
"width": 480,
"height": 360
},
"standard": {
"url": "https://i.ytimg.com/vi/yVQInDkUWZU/sddefault.jpg",
"width": 640,
"height": 480
},
"maxres": {
"url": "https://i.ytimg.com/vi/yVQInDkUWZU/maxresdefault.jpg",
"width": 1280,
"height": 720
}
},
"channelTitle": "SPOTV",
"tags": [
"SPOTV",
"스포티비"
],
"categoryId": "17",
"liveBroadcastContent": "none",
"defaultLanguage": "ko",
"localized": {
"title": "[24/25 UCL] 뮌헨 센터백 주전으로 '챔스 1호골' 기록하는 김민재 (11.27)",
"description": "👇 24-25 PL, UCL 시청하기 👇\n\nSPOTV PRIME 📺👀 ☞https://www.spotvprime.co.kr/channel\n\nSPOTV NOW 💻📱 ☞ https://www.spotvnow.co.kr/football/"
},
"defaultAudioLanguage": "zxx"
}
}
],
"pageInfo": {
"totalResults": 1,
"resultsPerPage": 1
}
}
- 각 속성의 정의는 다음 경로에서 확인하실 수 있습니다.
- 해당 응답을 통해 쇼츠 메타데이터를 활용할 수 있습니다.
할당량
주의할 점으로 YouTube Data API는 서비스 품질 유지를 위해 할당량 정책을 가지고 있습니다. 프로젝트별 하루 10,000유닛의 할당량을 무료로 제공하고, 각 요청마다 소진되는 유닛 할당량에 차이를 두는 것이 특징입니다. 따라서 API 요청 설계 시 유닛 소진량에 대한 계산이 선행되어야 합니다.
이번 포스팅을 통해 YouTube Data API를 이용해서 쇼츠의 메타데이터를 추출하는 방법을 알아봤습니다. 예시에서는 단순히 쇼츠의 제목과 설명을 도출했지만, 추가적인 리소스를 활용한다면 동영상의 조회수, 좋아요, 댓글 수 등 시장 트렌드 분석과 전략적 의사결정에 도움이 되는 인사이트를 얻을 수 있습니다.
(reference)
https://developers.google.com/youtube/v3/getting-started?hl=ko
https://developers.google.com/youtube/v3/docs?hl=ko
https://developers.google.com/youtube/v3/docs/videos?hl=ko#resource