구글 유튜브 링크 - gugeul yutyubeu lingkeu

소개

이 문서는 YouTube와 상호작용할 수 있는 애플리케이션을 개발하려는 개발자를 위해 작성되었습니다. 여기에서는 YouTube 및 API의 기본 개념에 대해 설명합니다. 또한 API가 지원하는 다양한 기능에 대한 개요를 제공합니다.

시작하기 전에

  1. Google API 콘솔에 액세스하고 API 키를 요청하며 애플리케이션을 등록하려면 Google 계정이 필요합니다.

  2. API 요청을 제출할 수 있도록 Google에 애플리케이션을 등록합니다.

  3. 애플리케이션을 등록한 후 다음과 같이 애플리케이션에서 사용할 서비스 중 하나로 YouTube Data API를 선택합니다.

    1. APIs Console로 이동하고 앞에서 등록한 프로젝트를 선택합니다.
    2. Services 창을 클릭합니다.
    3. API 목록에서 YouTube Data API를 찾아 상태를 ON으로 변경합니다.
  4. JSON(JavaScript Object Notation) 데이터 형식의 주요 개념을 익힙니다. JSON은 임의의 데이터 구조를 간단한 텍스트로 표현하는, 언어에 독립적인 일반적인 데이터 형식입니다. 자세한 내용은 json.org를 참조하세요.

리소스 및 리소스 유형

리소스는 고유한 식별자를 가진 개별 데이터 항목입니다. 아래 표는 API를 사용하여 상호작용할 수 있는 다양한 리소스 유형에 대해 설명합니다.

리소스 유형
activity 특정 사용자가 YouTube 사이트에서 실행한 작업의 정보를 포함합니다. 활동 피드에 보고되는 사용자 작업에는 동영상 평가, 동영상 공유, 동영상을 즐겨찾기에 추가, 채널 게시판에 게시 등이 포함됩니다.
channel 단일 YouTube 채널에 대한 정보를 포함합니다.
channelBanner 새로 업로드한 이미지를 채널의 배너 이미지로 설정하는 데 사용할 URL을 식별합니다.
guideCategory YouTube가 채널의 콘텐츠 또는 기타 지표(예: 인기도)를 기반으로 채널에 연결하는 카테고리를 식별합니다. 가이드 카테고리는 YouTube 사용자가 원하는 콘텐츠를 더 쉽게 찾을 수 있는 방법으로 채널을 구성하기 위한 방법을 모색합니다. 채널은 한 개 이상의 가이드 카테고리에 연결될 수 있지만 가이드 카테고리에 모두 포함된다고는 할 수 없습니다.
playlist 단일 YouTube 재생목록을 표시합니다. 재생목록은 순서대로 감상하거나 다른 사용자와 공유할 수 있는 동영상의 모음입니다.
playlistItem 재생목록에 포함된 동영상과 같은 리소스를 식별합니다. playlistItem 리소스에는 포함된 리소스가 재생목록에서 사용되는 방식을 설명하는 세부정보도 포함되어 있습니다.
search result API 요청에 지정된 검색 매개변수와 일치하는 YouTube 동영상, 채널 또는 재생목록의 정보를 포함합니다. 검색 결과는 동영상과 같이 고유하게 식별할 수 있는 리소스를 보여주지만, 자체적으로는 영구적인 데이터를 가지지 않습니다.
subscription YouTube 사용자의 구독 정보를 포함합니다. 구독정보는 채널에 새 동영상이 추가되거나 다른 사용자가 YouTube에서 동영상 업로드, 동영상 평가 또는 동영상 추천 등의 작업 중 하나를 수행할 때 이를 알려줍니다.
thumbnail 하나의 리소스에 연결된 미리보기 이미지를 식별합니다.
video 단일 YouTube 동영상을 표시합니다.
videoCategory 업로드된 동영상과 연결되었거나 연결할 수 있는 카테고리를 식별합니다.

대부분의 경우 리소스는 다른 리소스에 대한 참조를 포함합니다. 예를 들어 playlistItem 리소스의 snippet.resourceId.videoId 속성은 결과적으로 동영상과 관련된 전체 정보를 포함하는 동영상 리소스를 식별합니다. 다른 예로 검색결과는 특정 동영상, 재생목록, 채널 리소스를 식별하는 videoId, playlistId, channelId 속성을 포함합니다.

지원되는 작업

아래 표는 API가 지원하는 가장 일반적인 메소드를 보여줍니다. 일부 리소스는 이러한 리소스에 보다 구체적인 작업을 수행하는 다른 메소드를 지원하기도 합니다. 예를 들어 videos.rate 메소드는 사용자의 평가를 동영상에 연결하고 thumbnails.set 메소드는 YouTube에 미리보기 이미지를 업로드하여 동영상에 연결합니다.

작업
list 0개 이상의 리소스 목록을 검색(GET)합니다.
insert 새 리소스를 만듭니다(POST).
update 요청에 포함된 데이터를 반영하도록 기존 리소스를 수정(PUT)합니다.
delete 특정 리소스를 삭제(DELETE)합니다.

현재 API는 지원되는 각각의 리소스 유형을 나열하는 메소드를 지원하며 여러 리소스에 대한 쓰기 작업도 지원합니다.

아래 표는 다양한 유형의 리소스에서 지원되는 작업을 표시합니다. 리소스를 삽입, 업데이트, 삭제하는 작업에는 항상 사용자 인증이 필요합니다. 경우에 따라 list 메소드가 인증 및 인증되지 않은 요청을 모두 지원하며 인증된 요청은 현재 인증된 사용자에 대한 정보를 검색하거나 이들에게만 정보를 공개할 수 있는 반면 인증되지 않은 요청은 공개 데이터만 검색할 수 있습니다.

지원되는 작업
list insert update delete
activity
caption
channel
channelBanner
channelSection
comment
commentThread
guideCategory
i18nLanguage
i18nRegion
playlist
playlistItem
search result
subscription
thumbnail
video
videoCategory
watermark

할당량 사용

YouTube Data API은(는) 할당량을 사용하여 개발자가 의도한대로 서비스를 사용하고 서비스 품질을 부당하게 낮추거나 다른 사용자의 액세스를 제한하는 애플리케이션을 만들지 않도록 합니다. API console's Quotas 창에서 애플리케이션이 사용할 수 있는 할당량을 확인할 수 있습니다.

Google은 각 요청에 비용을 할당하여 할당량 사용을 계산하지만 비용은 요청별로 모두 다릅니다. 요청의 할당량 비용에 영향을 주는 2가지 기본 요소는 다음과 같습니다.

  1. 작업 유형이 다르면 할당량 비용도 다릅니다.

    • 각 반환된 리소스의 ID만 검색하는 간단한 읽기 작업의 비용은 약 1단위입니다.
    • 쓰기 작업의 비용은 약 50단위입니다.
    • 동영상 업로드의 비용은 약 1600단위입니다.
  2. 읽기 및 쓰기 작업은 각 요청에서 검색하는 리소스 수에 따라 다양한 할당량을 사용합니다. insertupdate 작업도 데이터를 작성하며 리소스를 반환합니다. 그러므로 예를 들어 재생목록을 삽입하면 쓰기 작업에 대한 할당량 비용 50단위에 반환된 재생목록 리소스 비용이 더해집니다.

    다음 섹션에서 설명하겠지만 각 API 리소스는 부분으로 구분됩니다. 예를 들어 playlist 리소스는 snippetstatus의 2개 부분이 있고 channel 리소스는 6개 부분이 있으며 video 리소스는 10개 부분이 있습니다. 각 부분에는 관련 속성 그룹이 포함되어 있고 그룹이 설계되어 있으므로 애플리케이션은 실제로 사용하는 유형의 데이터만 검색하면 됩니다.

    리소스 데이터를 반환하는 API 요청은 요청에서 검색하는 리소스 부분을 지정해야 합니다. 그러면 각 부분은 요청의 할당량 비용에 약 2단위를 추가합니다. 마찬가지로 각 동영상에 대해 snippet 부분만 검색하는 videos.list 요청의 경우 3단위의 비용을 가질 수 있습니다. 하지만 각 리소스의 모든 부분을 검색하는 videos.list 요청은 약 21할당량 단위의 비용을 가질 수 있습니다.

이러한 규칙을 이해하면 애플리케이션에서 할당량을 초과하지 않고 매일 전송할 수 있는 읽기, 쓰기, 업로드 요청 수를 예상할 수 있습니다. 예를 들어 일일 할당량이 5,000,000단위일 경우 애플리케이션에 대략 다음과 같은 한도가 적용될 수 있습니다.

  • 각 2개의 리소스 부분을 검색하는 읽기 작업 1,000,000개
  • 각 2개의 리소스 부분을 검색하는 쓰기 작업 50,000개 및 추가 읽기 작업 450,000개
  • 각 3개의 리소스 부분을 검색하는 동영상 업로드 2,000개, 쓰기 작업 7,000개, 읽기 작업 200,000개

중요: 애플리케이션에서 필요한 리소스 부분만 검색하면 일일 할당량을 절약하고 전체 시스템을 더 효율적으로 운영할 수 있습니다.

부분 리소스

API는 애플리케이션이 불필요한 데이터를 전송, 파싱, 저장하지 않도록 부분 리소스 검색을 허용하며 실제 이를 필요로 합니다. 이 방법을 통해 API가 네트워크, CPU, 메모리 리소스를 더 효율적으로 사용할 수도 있습니다.

API는 2개의 요청 매개변수를 지원하며(다음 섹션에서 설명) 이를 통해 API 응답에 포함되어야 하는 리소스 속성을 식별할 수 있습니다.

  • part 매개변수는 리소스에 대해 반환되어야 하는 속성 그룹을 식별합니다.
  • fields 매개변수는 요청된 리소스 부분 내에 특정 속성만 반환하기 위해서만 API 응답을 필터링합니다.

part 매개변수 이해

part 매개변수는 리소스를 검색하거나 반환하는 모든 API 요청에 필요한 매개변수입니다. 이 매개변수는 API 응답에 포함되어야 하는 1개 이상의 최상위 수준(비중첩) 리소스 속성을 식별합니다. 예를 들어 video 리소스에는 다음과 같은 부분이 있습니다.

  • snippet
  • contentDetails
  • fileDetails
  • player
  • processingDetails
  • recordingDetails
  • statistics
  • status
  • suggestions
  • topicDetails

이러한 모든 부분은 중첩된 속성을 포함한 개체이며 이와 같은 개체는 API 서버에서 검색하거나 검색하지 않을 수 있는 메타데이터 필드의 그룹으로 생각할 수 있습니다. 이에 따라 part 매개변수와 관련해 애플리케이션에서 실제로 사용할 리소스 요소를 선택해야 합니다. 이유는 다음과 같습니다.

  • API 할당량 사용을 관리할 수 있도록 해줍니다. API 응답에서 검색하는 부분의 수를 늘리면 이에 따라 API 사용량도 증가하며 사용 가능한 할당량은 줄어듭니다.
  • API가 애플리케이션에서 사용하지 않는 메타데이터 필드를 검색하는 데 시간을 소비하지 않도록 함으로써 지연 시간을 줄여줍니다.
  • 애플리케이션에서 검색할 수 있는 불필요한 데이터양을 줄이거나 없앰으로써 대역폭 사용량을 감소시킵니다.

리소스가 더 많은 부분을 추가함에 따라 애플리케이션에서 지원하지 않는 새로 정의된 속성을 요청하지 않으므로 이와 같은 장점은 더 늘어날 것입니다.

fields 매개변수 이해

fields 매개변수는 part 매개변수 값에서 식별된 리소스 부분만 포함한 API 응답을 필터링하여 응답이 특정 필드 집합만 포함하도록 합니다. fields 매개변수를 사용하면 API 응답에서 중첩된 속성을 삭제할 수 있으므로 대역폭 사용량을 대폭 절감할 수 있습니다. (part 매개변수를 사용하여 응답의 중첩된 속성을 필터링할 수 없습니다.)

다음 규칙은fields 매개변수 값에 대해 지원되는 구문을 설명합니다(대략 XPath 구문에 기반함)

  • 여러 필드를 선택하려면 쉼표로 구분된 목록(fields=a,b)을 사용합니다.
  • 별표(fields=*)를 모든 필드를 구분하는 와일드 카드로 사용합니다.
  • API 응답에 포함될 중첩된 속성 그룹을 지정하려면 괄호(fields=a(b,c))를 사용합니다.
  • 중첩된 속성을 식별하려면 슬래시(fields=a/b)를 사용합니다.

실제로 이러한 규칙을 사용하면 몇 가지의 다른 fields 매개변수 값을 사용하여 같은 API 응답을 검색할 수 있는 경우가 많습니다. 예를 들어 재생목록 항목 ID, 제목, 재생목록에 있는 모든 항목의 위치를 검색하려는 경우 다음 값 중 하나를 사용할 수 있습니다.

  • fields=items/id,playlistItems/snippet/title,playlistItems/snippet/position
  • fields=items(id,snippet/title,snippet/position)
  • fields=items(id,snippet(title,position))

참고: 모든 쿼리 매개변수 값과 마찬가지로 fields 매개변수 값은 URL로 인코딩되어야 합니다. 더 읽기 쉽도록 이 문서의 예에서는 인코딩을 생략했습니다.

부분 요청 샘플

아래 예는 API 응답이 애플리케이션에서 사용하는 데이터만 포함하도록 partfields 매개변수를 사용하는 방법을 보여줍니다.

  1. 예 1은 kindetag 속성과 4개의 부분을 포함하는 동영상 리소스를 반환합니다.
  2. 예 2는 kindetag 속성과 2개의 부분을 포함하는 동영상 리소스를 반환합니다.
  3. 예 3은 2개의 부분을 포함하지만 kindetag 속성을 제외하는 동영상 리소스를 반환합니다.
  4. 예 4는 2개의 부분을 포함하지만 kindetag 속성과 리소스의 snippet 개체에 있는 일부 중첩된 속성을 제외하는 동영상 리소스를 반환합니다.
예 1
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,contentDetails,statistics,status
설명: 이 예에서는 video 리소스를 검색하며 API 응답에 포함되어야 하는 몇 가지 리소스 부분을 식별합니다. API 응답:

{ "kind": "youtube#videoListResponse", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\"", "videos": [ { "id": "7lCDEYXw3mM", "kind": "youtube#video", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\"", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "contentDetails": { "duration": "PT15M51S", "aspectRatio": "RATIO_16_9" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" }, "status": { "uploadStatus": "STATUS_PROCESSED", "privacyStatus": "PRIVACY_PUBLIC" } } ] }

예 2
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,statistics
설명: 이 예에서는 part 매개변수 값을 수정하여 contentDetailsstatus 속성이 응답에 포함되지 않도록 합니다. API 응답:

{ "kind": "youtube#videoListResponse", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\"", "videos": [ { "id": "7lCDEYXw3mM", "kind": "youtube#video", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\"", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }

예 3
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,statistics&fields=items(id,snippet,statistics)
설명: 이 예에서는 fields 매개변수를 추가하여 API 응답에서 kindetag 속성을 모두 삭제합니다. API 응답:

{ "videos": [ { "id": "7lCDEYXw3mM", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }

예 4
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&fields=items(id,snippet(channelId,title,categoryId),statistics)&part=snippet,statistics
설명: 이 예에서는 예 3의 fields 매개변수를 수정하여 API 응답에서 각 동영상 리소스의 snippet 개체가 channelId, title, categoryId 속성만 포함합니다. 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" } } ] }

실적 최적화

ETags 사용

ETags는 HTTP 프로토콜의 기본 부분으로 애플리케이션이 특정 API 리소스의 지정된 버전을 참조하도록 합니다. 리소스는 전체 피드 또는 해당 피드의 항목이 될 수 있습니다. 이 기능은 다음과 같은 경우에 사용할 수 있습니다.

  • 캐싱 및 조건부 검색 – 애플리케이션에서 API 리소스 및 ETags를 캐시할 수 있습니다. 그런 다음 애플리케이션이 저장된 리소스를 다시 요청할 때 이 리소스와 연결된 ETag를 지정합니다. 리소스가 변경되는 경우 API는 수정된 리소스 및 해당 리소스 버전에 연결된 ETag를 반환합니다. 리소스가 변경되지 않은 경우 API는 리소스가 변경되지 않았음을 나타내는 HTTP 304 응답(Not Modified)을 반환합니다. 애플리케이션에서 이와 같은 방법으로 캐시된 리소스를 제공함으로써 지연 시간 및 대역폭 사용량을 줄일 수 있습니다.

    Google API 클라이언트 라이브러리는 ETags 지원 여부에 따라 다릅니다. 예를 들어 JavaScript 클라이언트 라이브러리는 If-MatchIf-None-Match를 포함하는 허용된 요청 헤더에 대한 허용목록을 통해 ETags를 지원합니다. 허용목록은 정상적인 브라우저 캐싱이 발생하도록 허용하기 때문에 리소스의 ETag가 변경되지 않은 경우 브라우저 캐시에서 리소스를 사용할 수 있습니다. 반면 Obj-C 클라이언트는 ETags를 지원하지 않습니다.

  • 의도하지 않은 변경사항 덮어쓰기 방지 – ETags는 여러 API 클라이언트가 실수로 서로의 변경사항을 덮어쓰지 않도록 해줍니다. 리소스를 업데이트하거나 삭제할 때 애플리케이션에서 리소스의 ETag를 지정할 수 있습니다. ETag가 리소스의 가장 최신 버전과 일치하지 않는 경우 API 요청은 실패합니다.

애플리케이션에 ETags를 사용함으로써 얻을 수 있는 장점은 다음과 같습니다.

  • API가 캐시되었지만 변경되지 않은 리소스 요청에 더 빨리 응답하기 때문에 지연 시간이 줄어들고 대역폭 사용량이 감소합니다.
  • 애플리케이션에서 실수로 다른 API 클라이언트에서 만들어진 리소스에 변경사항을 덮어쓰는 일이 발생하지 않습니다.

Google APIs Client Library for JavaScript는 If-MatchIf-None-Match HTTP 요청 헤더를 지원하며 이에 따라 정상적인 브라우저 캐싱의 컨텍스트 내에서 ETags가 작동하도록 설정합니다.

gzip 사용

gzip 압축 사용을 설정하여 각 API 응답에 필요한 대역폭을 줄일 수도 있습니다. 애플리케이션에서 API 응답의 압축을 풀기 위해 추가 CPU 시간이 필요하지만 일반적으로 보다 적은 네트워크 리소스를 사용함으로써 얻는 장점이 CPU 시간 추가로 인한 비용을 능가합니다.

gzip으로 인코딩된 응답을 받으려면 다음 두 작업을 수행해야 합니다.

  • gzipAccept-Encoding HTTP 요청 헤더를 설정합니다.
  • 사용자 에이전트가 gzip 문자열을 포함하도록 수정합니다.

아래 샘플 HTTP 헤더에서 gzip 압축 사용 설정에 필요한 이러한 요구사항을 확인할 수 있습니다.

Accept-Encoding: gzip
User-Agent: my program (gzip)