API (Application Programming Interface), 그게 뭔가요?


API, 왜 이해해야 하나요?

Open APIApplication Program Interface, RESTful API, SDKSoftware Development Kit… 한 번쯤 들어본 적이 있는 단어인데요.

제 경험을 비추어 볼 때

  • Open API를 이용해서 브롤스타즈 게임 로그 데이터를 수집해본 적이 있고
  • Python용 AWS SDK인 boto3을 이용해서 AWS S3에 연결해본 경험이 있고
  • 회사에서도 API로 어떤 걸 요청하고 제대로 응답하는 지 확인하는 작업을 한 적이 있습니다.

이렇게 비개발자라도 데이터 분석을 하거나 업무 상에서 API를 들어본 적이 있는 분이라면 API가 무엇인지, 체계는 어떻게 되는지 알아야
어떤 방식으로 데이터를 가져오는지를 이해할 수 있습니다.

업무에서도 자꾸 API가 제대로 안 뜬다, 무엇이 문제다 이런 말들이 오고가서 이 기회에 제대로 이해해보자는 마음에 이 글을 포스팅하게 되었습니다.


API의 (사전적) 정의

APIApplication Programming Interface를 한국말로 번역하면 "응용 프로그램 프로그래밍 인터페이스"입니다.

무슨 말인지 하나도 모르겠죠. 그럴 때 우리는 위키신께서 내려주신 정의를 이해하고자 애씁니다.

위키피디아에 따르면 API는 다음과 같이 정의됩니다.

API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.

음… 저는 책을 읽고도 이 말을 이해하지 못하겠네요. 역시 개발의 세계란 험난하기만 합니다.
더 쉬운 정의가 필요해보입니다.


API, 그래서 뭔데요 ㅜㅜ

API… 사전적 정의는 (어찌됐든) 알겠으나 전혀 이해가 안됩니다.
API는 어떤 두 매체를 연결해주는 체계이기 때문에 단독으로 알기 어렵습니다.
API를 이해하기 위해서는 먼저 클라이언트서버에 대해 이해해야 합니다.



위의 그림에서 보듯이 Client에 해당하는 게 클라이언트 컴퓨터이고, Database에 해당하는 게 서버입니다.
그리고, 이를 연결해주는 체계가 바로 API입니다.

  • 클라이언트는 웹 상에서 어떤 서비스를 **요청 (Request)**하는 컴퓨터를,
  • 서버는 요청받은 서비스에 **응답 (Response)**하는 컴퓨터를 의미합니다.

예를 들어 네이버에 접속해서 로그인을 할 때

  • 제 컴퓨터는 "로그인 시켜줘"라고 요청하는 클라이언트 컴퓨터가 되고
  • 이 요청을 받고 제 아이디와 비밀번호가 맞는지 확인 후 맞으면 로그인을 시켜주는 컴퓨터가 서버 컴퓨터가 됩니다.

보통 이런 서버 컴퓨터들은 회사에서 데이터 센터에서 관리됩니다. 이렇게요!


이미지 출처 [link]
{:.figure}

근데 웹 상의 요청이 “로그인 시켜줘” 하나면 좋을텐데, 실상은 클라이언트는 매우 다양한 요청을 보냅니다.

  • 회원가입 해줘
  • 비밀번호 찾아줘
  • 회사에 메일 보내줘
  • 블로그 글 게시해줘

등 다양한 요청이 있는데, 이러한 요청들을 구분할 수 있도록 하는 체계가 바로 API입니다.

API는 "클라이언트에서 이 서버로 요청을 보내면 이런 응답을 주고, 저 서버로 요청을 보내면 저런 응답을 줄께"와 같이 규칙을 정해놓은 것을 의미합니다.

그리고 어떤 서버로 어떤 요청을 하는지 구분하기 위해서 서버주소/요청내용의 URL 형태로 요청합니다. 예를 들어 네이버 Open API에서 네이버 아이디로 로그인 인증을 요청하는 경우 https://nid.naver.com/oauth2.0/authorize로 요청합니다 (Open API에 대해서는 이후에 더 자세히 알아보겠습니다). 여기서 https://nid.naver.com/oauth2.0/가 서버주소, authorize가 요청 내용이 됩니다.

따라서, 클라이언트 컴퓨터가 https://nid.naver.com/oauth2.0/authorize로 신호를 보내면 서버에서 네이버 아이디로 로그인 인증을 수행하고 응답합니다. 잘 인증되었는지, 혹 문제가 있으면 어떤 문제가 있는지를 알려줍니다. 이러한 기능은 서버 개발자가 만들며, 그 결과물 (응답에 대한 결과)이 서버 프로그램입니다. 서버 주소 정의 역시 개발자 주도로 이루어집니다. 그리고 클라이언트 프로그램은 정해진 주소에 요청을 보냅니다.
따라서 API도 서버 개발자가 개발하고, 클라이언트 개발자는 그 API를 사용합니다.
참고로 API는 실체가 없습니다! 그냥 이 둘 간의 규칙을 Json 같은 언어로 문서화해놓았죠.

자, 그럼 이제 API를 클라이언트와 서버 관점에서 좀 더 자세히 살펴보겠습니다.


클라이언트 관점에서의 API

클라이언트에서 API를 요청할 때의 과정은 4가지 요소로 이루어져 있습니다.

  • CREATE
  • READ
  • UPDATE
  • DELETE

앞 글자만 따서 CRUD라고 불리는 이 요청은 데이터를 다룰 때 기준이 되는 요청으로, 매우 중요합니다.
예를 들어 회원 정보에 대한 CRUD를 생각한다면

  • CREATE: 회원 정보 만들어줘
  • READ: 회원 정보 읽어줘
  • UPDATE: 회원 정보 갱신해줘
  • DELETE: 회원 정보 삭제해줘

와 같은 요청을 할 수 있는 것이죠. 이러한 CRUD 요청은 각각의 주소를 가집니다.
예를 들어 회원 정보를 만드는 CREATE 요청을 서버주소/accountcreate라고 지을 수 있습니다.

그러나 요청마다 각기 다른 주소를 만든다면 관리하기도 어렵고 겹칠 수도 있기 때문에 좀 더 체계적인 API를 만들기 위해
REST(Representational State Transfer)한 API 즉, RESTful API라는 공식 체계가 만들어집니다.

RESTful API는 CRUD를 한 주소로 관리하고, 요청을 보낼 때 다음의 4가지 메소드 (method)를 이용합니다.

  • CREATE는 POST 메소드를 통해
  • READ는 GET 메소드를 통해
  • UPDATE는 전체 갱신이면 PUT, 일부 갱신이면 PATCH 메소드를 통해
  • DELETE는 그대로 DELETE 메소드를 통해

요청할 수 있습니다.
여기서 **메소드 (Method)**라는 용어는 함수처럼 어떤 요청을 보내면 특정 결과가 나오는 API의 모습에서 착안해 만들어졌다 합니다.
위의 예에서 회원 정보에 들어가는 ID, 비밀번호를 함수의 parameter로 넣으면
마치 POST(ID, 비밀번호)는 회원 정보를 갱신해주는 요청을 하게 되는 것이죠.
그래서 RESTful API는 서버주소/accountcreate대신 서버주소/account만 URL로 입력하고, POST 메소드를 사용해 회원정보를 생성하는 요청을 하게 됩니다.


서버 관점에서의 API

이제 요청을 받은 걸 서버에서 처리할 때 크게 두 가지 응답이 있을 수 있습니다.

  • 요청이 잘 됐으니 요청을 처리했다는 응답
  • 요청이 이상하니 확인해달라는 응답

회원 정보를 생성하는 요청을 보낼 경우, 모든 응답이 “그래!” 일 수는 없습니다.

  • 기존 회원 정보에 없는 회원이라면 회원 정보를 잘 생성해줬다는 응답을 주겠지만
  • 기존 회원 정보에 있는 회원이라면 이미 있는 회원이기 때문에 생성할 수 없다는 응답을 주어야 합니다.
  • 혹은 서버 오류로 확인할 수 없는 경우라면 서버 오류로 확인할 수 없다는 응답을 주어야 합니다.

이런 응답도 요청처럼 체계적으로 관리하기 위해 숫자를 통해 응답을 표현합니다.

  • 200번대 코드 (201, 202,…)는 잘 됐다
  • 400번대 코드 (401, 404,…)는 클라이언트 요청 상의 오류
  • 500번대 코드 (500, 501,…)는 서버 응답 상의 오류

를 의미합니다.

아래처럼 흔히 볼 수 있는 404 에러도 이런 응답의 한 종류입니다.

이처럼 API를 클라이언트 관점과 서버 관점에서 살펴봤습니다.
결과적으로 API를 더 쉽게 정의하자면 다음과 같습니다.

클라이언트가 특정 기능을 이용하기 위해 어떤 주소로 요청을 보내면 서버가 응답을 해주는 체계

클라이언트와 서버의 체계를 이해한다면 API도 이해됐으리라 믿습니다. ㅎㅎ


그럼 Open API는요…? SDK는요…?

Open API는 이런 API를 일반 사람들이 쓸 수 있게 공개해놓은 API입니다. 즉, 서버가 제공하는 다양한 기능을 당사가 아닌 다른 기업, 유저들이 이용할 수 있도록 하는 것입니다.

예를 들어, 대부분의 쇼핑몰에는 네이버 아이디로 가입네이버 아이디로 로그인버튼이 있습니다.

(TMI. 이를 네이버에서는 네아로서비스라고 부르네요 ㅋㅋㅋ 귀엽습니다)
이렇게 네이버 서버에 있는 정보를 이용해서 다른 쇼핑몰도 사용할 수 있도록 API 문서를 공개해놓은 것이 Open API입니다.

네이버는 이런 여러 기능들을 다른 사람들도 쓸 수 있도록 개발가이드, API 명세, 튜토리얼 등을 정리해 Naver Developers에 올려놓았습니다.
네이버 뿐만 아니라 카카오, 구글, 공공기관에서도 (심지어 브롤 스타즈)에서도 무료로 기능을 이용할 수 있도록 API를 공개해놓았습니다.

마지막으로, SDKSoftware Development Kit는 API를 제공하는 다른 소프트웨어를 의미합니다.
앞서 API는 클라이언트와 서버 간의 요청과 응답을 처리하는 체계라 말씀드렸는데, 이를 더 확장해서 소프트웨어 간의 체계도 API에 해당합니다.

예를 들어, 내 소프트웨어는 지하철 노선도 어플인데 지도 버튼을 누르면 해당 역의 구글 지도가 나오게 하는 기능을 추가하고 싶다 가정합시다.
내 소프트웨어에는 구글지도를 직접 탑재할 수 없기 때문에 구글에서 만든 소프트웨어를 이용해 구글 지도 SDK를 이용하면 내 소프트웨어에 구글 지도 기능을 넣을 수 있습니다. 이 SDK에서 제공해주는 API를 통해 구글 지도에 요청을 보내고 응답을 받을 수 있습니다.

이렇게 이번 포스팅에서는 API, 클라이언트와 서버, Open API, SDK에 대해 알아보았습니다.
비개발자이지만 업무에 항상 쓰이는만큼 자세하게 알아두는 게 좋을 것 같습니다.

더불어 비전공자를 위한 이해할 수 있는 IT 지식책도 쉽게 쉽게 되어있으니 한 번 읽어보시는 걸 추천드립니다 :>