data engineering (API는 무엇인가?!?)

REST API의 정의와 예제들

API(Application Programming Interface)

  • 두 개의 시스템이 서로 상호 작용하기 위한 인터페이스
    • 데이터를 주고 받는 인터페이스
    • API라고 하면 보통 REST API를 지칭

Web_API

  • 웹사이트는 HTTP(S)프로토콜을 사용하는 REST API 기반으로 구축

API 접근 권한

Authentication VS Authorization

  • Authentication : Identity(정체)가 맞다는 증명
  • Authorization : API를 통한 어떠한 액션을 허용
API가 Authentication으로 하여도 어떠한 액션에 대해서는 Authorization을 혀용하지 않을 수 있음

API의 필수는 첫째도 둘째도 Security

  • 어떠한 Security 방안이 없을 경우
    • DELETE request를 통해서 다른 이용자의 정보를 지울 수도 있음
    • 제 3자에게 데이터 유출로 이어질 수 있음
    • 누가 API를 사용하는지, 어떤 정보를 가져가는지 트래킹 할 수가 없음

API Key란 무엇인가?

  • API Key란 보통 Request URL혹은 Request 헤더에 포함되는 긴 String

Basic Auth

Basic Auth

OAuth 2.0

  • 설명하자면 Web API는 우리가 직접 어떤 Action을 하는 것이기 때문에 해당 Web에만 접근 권한을 받으면 되지만, 그와는 다르게 어떤 Action을 취할 Web을 다른 앱에게 접근 권한을 주어 End User인 우리 대신 정보를 제공하게 해주는 방식이다. 예를들면 우리가 어떤 서비스를 가입하려고 할때 SNS로 가입이 가능하게 할 수 있는 접근 권한 방식이라고 할 수 있다.

OAuth2.0

Endpoints & Methods

  • Resource는 API를 통해 리턴된 정보이며, 하나의 Resource 안에 여러개의 Endpoints가 존재한다.

Endpoint_Method

Methods 정의

Parameters

  • Parameters는 Endpoint를 통해 Requests 할때 같이 전달하는 옵션들
    • Request Body안에 포함되는 Parameter들은 post 방식에서 주로 많이 사용한다.

4가지 Parameter 타입들

Spotify

  • 필자의 프로젝트의 주된 data를 제공받을 Spotify를 먼저 소개하기 전에, 왜 국내의 Melon과 Genie를 택하지 않았는지를 말하려고 한다. SK플래닛이 2012년부터 운영하던 개발자센터 내 오픈 API 서비스를 2018년 3월부터 중단한다고 발표함으로써 Melon의 API 서비스를 시기적으로 사용하지 못하게 되었으며, Genie 또한 API 서비스를 더 이상 제공하지 않고 있다. 단순히 곡명과 아티스트명, 해당 곡에 대한 댓글등 이런 것들은 Selenium이나 그냥 기본적인 requests 모듈을 통해 가능하지만, 이번 토이 프로젝트의 목표는 Spotify API를 통하여 엔터티간의 관계를 내가 직접 설계해 보고 이미 만들어 있긴 하지만 각 곡들의 특징을 수치적으로 분류해 놓은 특징들로 유사도를 계산하여 User에게 추천하는 Facebook 앱을 만들어 보고 싶어서이다.
  • 그렇다면, Spotify는 무엇인가? 스포티파이는 프리웨어이다. 본래에는 무료로 이용하면 시간 제한이 있었으나, 2014년 폐지되었다. 스포티파이는 Spotify 웹사이트에서 바로 다운받을 수 있다. 제공되는 곡들은 음반사들이 라이선스하여 합법적으로 제공한 것이다. 하지만, 사용자가 한 달 9.99 유로의 서비스 사용료를 내지 않는다면, 소프트웨어 상에 광고가 표시되며, 곡과 곡 사이에 광고가 삽입된다. 가입자가 서비스 사용료를 냈다면, 가입자는 자동적으로 “프리미엄 사용자” 상태가 된다. 프리미엄 사용자들은 특별히 뉴스나 프리뷰를 들을 수 있다. 또한 developer API를 제공함으로써, API 사용법에 대한 상세한 설명이 있다.Spotify developer앞으로 이 사이트에 있는 API 사용법을 활용하여 데이터를 crawling한 후에 RDS에 저장할 것이다.

Spotify for Developers

  • API를 사용하기 위해서는 접근 권한이 있는 Access ID와 password를 발급받아야 하므로 먼저, APP을 만들것이다. 위의 탭란에서 DashBoard를 클릭해보면 다음과 같은 페이지로 이동할 것이다. login이 필요하므로 먼저 가입을 해야 할 것이다. 옆에 있는 Sign up for free Spotify account here 버튼을 눌러

Authorization

  • 필자가 사용할 Access 방법은 위에서 언급했던 Oauth 2.0을 활용한 방식은 아니고, 그냥 Access ID와 Password를 발급받은 후 Access하는 방식을 택했다. 약간의 주의사항은 발급받은 후 1시간 경과 후에는 Password를 재발급받은 후 사용하여야 한다.

  • Client Credentials Flow 방식은 만들어 놓은 application(dash board)을 통해서 client id와 client secret을 spotify에게 주게 되는데, spotify는 다시 한번 Access Token을 반환해 주게된다. 이 Access Token을 통해 data를 가져 올 수 있게 된다.

  • Client Credentials FlowPOST https://accounts.spotify.com/api/token를 통해 request 할 수 있다.

Client Credentials Flow

Client Credentials Flow - 1

  • 아래 그림을 보면서 조금 더 자세하게 말하자면, requests를 post방식으로 얻게 되는데, request body parameter에는 client credential값을 꼭 필요로 하며, header parameter에는 Basic 다음 문자열로 을 넣어주어야한다.

Client Credentials Flow - 2

  • 그리고 받은 Access Token을 이용해서 “Authorization”: “Bearer {Access token}”형태로 headers에 넣어 request를 get 방식으로 해주면 하고싶은 메서드를 사용할 수 있다.

Client Credentials Flow - 3

Dash Board

  • 여기서 문제가 생겼다. 국제적인 서비스여서 국내에서도 이용 제한이 없을 것이라고 생각했지만, 국내에서는 서비스를 아직 하지 않고 있다한다……. 결국 방법을 찾아보다 VPN을 사용하여 우회한 후에 가입을 하면 서비스 이용이 가능하다는 사실을 알게 되었고, VPN을 이용하여 가입하였다.

국내 이용제한

  • 가입한 후에 Application을 등록해보자. App의 이름과 설명 개발 용도를 입력해주는데, App 개발 용도는 미정이므로 모른다고 설정했다.

App 등록

  • 다 만들어 졌다면, 다음과 같이 새로운 앱이 생성되었음을 확인 할 수 있다.

App 생성

  • 우리가 API에 접근할 때 필요한 ID와 password 정보를 보려면 앱을 클릭하면 확인 할 수 있다. password는 hide되어있는데 hide를 풀면 볼 수 있다. 1시간 마다 password는 reset해서 사용해야한다.

ID와 password 확인

API를 사용법을 통해 결과적으로 만들 ERD(Entity Relationship Diagram)는 다음과 같다.

ERD

  • 위의 ERD를 만들기에 앞서서 Spotify API를 통해 Access Token을 얻고 search할 수 있도록 script 파일을 만들어 본다면 다음과 같은 것이다.

  • 지속적으로 유지를 하기 위해서 status code마다 처리하는 방식을 달리 해주어야 할 것이다.특히 그 중에 status code 중 429는 너무 많은 데이터를 요청 했을 때 출력값으로 받는 status code이며, 받은 출력안에 제한시간이 같이 존재하므로 그 시간동안 python 동작으로 멈추도록 sleep을 걸어놓게끔 코드를 작성할 것이다.

Spotify의 status code

Rating limit

  • 또한, status code = 401인 경우에는 access token이 expired되었기 때문에 일어나는 경우이기 때문에 새롭게 client secret을 받아야 할 것이다.