얼마 전부터 저희 번개장터에서는 유튜브 동영상을 통해 상품을 소개할 수 있는 기능을 제공하고 있습니다. 이 글에서는 저희와 마찬가지로 YouTube API를 활용한 기능을 구현하실 분들을 위한 약간의 가이드를 적어볼까 합니다.

번개장터란?
국내 1위 모바일 중고장터앱으로 누적 다운로드 170만건의 개인간거래 서비스입니다. (소개: http://quicket.kr/apps)
 
 
 
 

YouTube Data API 버전 선택


YouTube Data API에는 현재 크게 안정 버전인 v2과 개발 버전인 v3으로 나뉩니다.
저희는 아무래도 언제 바뀔지 모르는 experimental 버전을 사용하기에는 좀 위험하다는 생각에 안정 버전인 v2로 작업을 진행했습니다. 따라서 아래의 내용들도 API v2 기준으로 작성되었으며, v3의 경우는 조금(많이?) 다를 수 있습니다.
v3을 사용한다면 구글에서 제공하는 클라이언트 라이브러리를 활용하여 직접 http 통신을 해야하는 번거로움을 덜 수 있습니다. (http://code.google.com/p/google-api-java-client/wiki/APIs#YouTube_Data_API 참조)

앱 등록
API를 사용하기 위해서 Developer Key를 발급받아야 합니다. 이 키는 앞으로 API 요청을 할때마다 헤더에 포함해주어야 합니다. 아래 주소에서 개발자 등록 및 제품 등록을 하면 해당 제품에 대한 Developer Key를 발급받을 수 있습니다.

https://code.google.com/apis/youtube/dashboard

API v3의 경우 https://developers.google.com/youtube/registering_an_application 참조하시면 되겠습니다. :)

사용자 인증 (Authentication)
번개장터는 유튜브에 영상을 업로드하는데, 이러한 기능을 위해서는 유튜브에 대한 사용자 인증이 필요합니다. 인증 메커니즘은 OAuth 2.0을 사용합니다.

다행히 Google Play services client library를 이용하면 번거로운 인증 과정을 건너뛸 수 있습니다. :) SDK Manager의 Extras 항목아래에서 ‘Google Play services’를 설치후 사용하면 됩니다. 관련 문서는 아래 페이지를 확인하세요.

http://developer.android.com/google/play-services/index.html

액세스 토큰을 요청할때는 다음과 같은 식으로 합니다.

GoogleAuthUtil.getToken(context, accountName, scope);

이 때, 예외 처리가 반드시 필요한 부분이 있는데,

  1. Play services를 이용할수 없는 경우(설치 되지 않았거나 구버전?)
  2. 토큰을 처음 요청하는 경우

이렇게 두 가지 입니다. Play services가 설치되지 않았으면 설치 안내를 해 주어야 하고, 토큰 요청을 처음 하는 경우에는 사용자로 부터 권한 확인 과정을 거쳐야 합니다. 이러한 상황이라면 getToken 메소드 호출시 예외가 발생하게 되어 있으며, 이를 잡아 처리할 수 있습니다. 아래 문서에 나온 예제를 보시면 무슨 얘긴지 바로 아실겁니다. :)

http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html

YouTube 채널 개설
토큰도 받았겠다, 이제 동영상을 올려보려 하니 에러가 나는군요. 충격과 공포의 401 NoLinkedYouTubeAccount 입니다. (v3 역시 에러코드는 다를지언정, 유사한 에러가 있을 겁니다)

구글 계정이 있더라도, 유튜브를 제대로 사용하려면 채널을 개설한 상태여야 합니다. 채널을 개설하지 않은 상태에서는 위와 같은 에러가 발생하게 되며, 따로 채널 개설 과정을 거쳐야 합니다.
저희는 기존에 있던 채널 개설 API를 사용했었는데, 지금 다시 확인 해보니 불과 몇주 사이에 deprecated 처리 돼버렸군요. :( 현재 문서에서는 WebView를 통해 채널 개설 페이지를 띄워주는 방법을 권하고 있으며, 그 내용이 아래 페이지에 나와있습니다.

https://developers.google.com/youtube/create-channel

… 저희도 다시 바꿔야겠습니다.

그 밖의 난관들
채널 개설 과정까지 무사히 처리했다면 이제 API를 사용하는데 있어 직접적인 어려움은 없을 것이라 생각됩니다. 다만 이제는 앱을 만들면서 나타날수 있는 일반적인 난관들이 기다리고 있는데…

- 예외 처리
아무래도 네트워크 작업들이 많다보니 수많은 예외 상황에 대해서 신경을 써야 합니다. 일반적인 IOException 처리, 액세스 토큰이 유효하지 않을 때의 처리, status code에 따른 처리 등등이 필요합니다. 어렵다기보단 번거롭고 신경이 많이 쓰이는 과정입니다. 설령 클라이언트 라이브러리를 사용한다고 해도 결국 예외 처리는 따로 해주지 않을 수 없습니다. 이는 물론 유튜브 뿐 아니라 어떤 API라도 마찬가지구요. :)

- UI 흐름
또한 일련의 과정들이 무언가 선조건을 가지는 경우가 있고, 해당 과정을 실행해보지 않으면 선조건이 충족 되어있는지 알 수 없는 경우가 있습니다. 이런 상황에선 UI 흐름을 제어하는 것이 복잡해질 수 있습니다.
번개장터를 예로 들면, 영상을 올리기 위해서 액세스 토큰이 필요합니다. 액세스 토큰을 얻어오려면 당연히 계정을 선택해야겠죠. 그러나 해당 계정에 대한 액세스 토큰을 처음 요청하는 경우에는 사용자로부터 권한 확인을 받는 과정도 한 번 거쳐야 합니다.


여기서 토큰을 요청할 때 권한 확인을 받아야 하는지의 여부는 미리 알 수 없습니다. 그저 UserRecoverableAuthException이 발생하면 이 예외에서 Intent를 얻어와 권한 확인 화면을 띄워주고 onActivityResult로 결과가 오면 다시 토큰을 요청하는 식입니다.



이런 식으로 중간에 다른 작업을 하고 돌아와서 이전 작업을 재개해야 하는 상황이 발생할 수 있습니다. 간단히는 Runnable로 작업을 저장해두었다가 재개할 수도 있겠고, Future를 활용할 수도 있겠습니다.

맺음
오픈마켓 등에서 상품을 판매할때, 아무래도 사진만 있는 것보다는 실 제품에 대한 영상이 있으면 구매에 많은 도움이 될 수 있습니다. 
 
가령 기타를 판매할 때 기타연주 동영상을 보여주면 구매를 더 촉진할 수 있겠죠 :)
이와 같은 경우가 아니더라도 영상을 첨부함으로써 보다 다양한 정보를 사용자에게 제공할 수 있겠죠. 영상의 활용 범위는 무궁무진합니다. YouTube와 연동함으로써 별도의 서비스를 구축하지 않고도 영상을 올리거나 보여줄 수 있습니다. 지금 바로 활용해 보시는 것은 어떨까요?

번개장터도 한번 사용해 보시구요 :)
 
읽어주셔서 감사합니다~
 
- 번개장터 안드로이드 책임 개발자 이희재 <hjlee@quicket.co.kr>