[Info] API란 무엇인가.
나다.
이 글이 뭐 하는 글이냐면
여러분은 "Open API"라는 말을 들어본 적이 있는가?
아마 많은 곳에서 API라는 말을 들어본 적이 있을 것이다.
그만큼 API는 대중적으로 활용되고 있으며 그 성능 또한 우수하다.
이 글에서는 API가 무엇인지와 어떤 역할을 하는지에 대해 설명한다.
API란?
우리는 API라고 한다면 감을 잡기 어려워하는 경향이 있다.
그 이유를 생각해 본 결과 아마 설명이 추상적이기 때문이라는 생각에 도달했다.
API란 두 애플리케이션이 서로 질문과 응답을 하기 위한 "통신 규격의 정의"를 이야기하기 때문이다.
예전 어느 글에서 아마 언급한 적이 있다.
API는 중국집에 배달을 시키기 위한 메뉴판이라고.
이렇듯 API는 요청하는 쪽과 응답하는 쪽의 통신을 하기 위한 "그들만의 약속"이라고 생각하면 된다.
우리가 중국집에 음식을 시키는 과정은 간단하다.
나 : (메뉴판 보고)짜장면 주셈.
중국집 : ㅇㅋ.
위의 경우를 API를 사용하는 경우로 바꾼다면
Client : (document를 보고) 미세먼지 수치 함 줘보셈.
Server : ㅇㅋ.
중국집의 경우 "짜장면 주셈." 이라는 요청에 짜장면을 보내주는 것으로 응답하도록 구성되어 있다.
중국집과 같이 API 또한 "미세먼지 수치 함 줘보셈." 이라는 요청에 미세먼지 수치를 보내주는 것으로
응답하도록 구성되어 있다는 뜻이다.
우리는 이 요청하는 방식을 "API" 라고 부른다.
이는 미세먼지 수치에 국한되지 않고 당사가 제공하는 어떠한 정보든 API를 통해 요청하여 응답받을 수 있다는
뜻을 의미한다.
물론, 당사의 API 스펙이 그것을 제공해야 하지만 말이다.
이러한 API를 사용하기 위한 문서인 "API Document"에는 개발자가 제공자와 어떠한 정보를 주고받기 위한
그들만의 약속된 규칙을 담아놓는다.
참고로, API 요청에 의한 응답은 데이터만 넘어온다.
페이지를 렌더링 하는 것이 아니라는 말이다.
중국집 배달부는 짜장면을 가져다주는 것만 하지 우리 집에 들어와서 밥상을 차려주고 가지는 않는다.
마찬가지로 서버에서 받은 정보를 페이지에 렌더링 하는것은 클라이언트 쪽의 일이란 말이다.
급하게 네오플 Open API에서 뭐 하나 찍어와봤다.
던전앤파이터 라는 게임을 해봤다면 경매장에 대해 알고 있을 것이다.
그냥 물건 사고파는 곳인데
그곳에 올라온 "무색 큐브 조각" 이라는 아이템의 기록들이다.
이처럼 JSON 타입의 데이터로 클라이언트에게 자료를 전달한다.
웹사이트에서 뿌리고 싶으면 클라이언트 서버 백엔드에서 요청한 다음 프론트로 던지면 됨.
REST API
Rest
1.명사 (어떤 것의) 나머지
2.명사 나머지 (사람들·것들), 다른 사람들[것들]
3.동사 쉬다, 휴식을 취하다, 자다; (몸의 피로한 부분을 편하게) 쉬다 (→rested)
4.동사 (어떤 것에) 받치다[기대다], 받쳐지다[기대지다]
통상 Rest라 하면 쉬는 것을 생각한다.
만약 REST API가 뭔지 알고 있어야 회사에서 오래오래 살아남을 수 있고
면접에서 광탈을 면할 수 있다.
"REST API"는 현시점에서 가장 많이 쓰이는 웹 API 중 하나이다.
REST API의 작동 원리는 클라이언트(사용자)의 입력 값에 따라 서버의 내부 함수를 동작시켜
나온 결과를 다시 클라이언트에게 반환하게 된다.
REST API에서 REST란 "Representational State Transfer" 의 약자로
당사가 제공하는 데이터에 접근하기 위한 GET, POST, PUT, DELETE 등의 메소드에
함수 집합의 의미를 가리킨다.
클라이언트(사용자 측 애플리케이션)와 서버(제공자 측 애플리케이션)는 HTTP 프로토콜을 통해 통신하게 되며
주로 JSON 타입의 통신을 많이 사용한다.
이 함수 집합으로 인해 서로 다른 플랫폼에서도 동일한 결과의 개발이 가능해지는 것이다.
PC, 안드로이드, IOS 가릴 것 없이 데이터를 뿌리는 것은 그들의 몫이 되고 동일한 요청으로 동일한 정보를받게 된다는 뜻이다.
API Endpoint 란
API Endpoint란 API의 내부 함수가 작동할 수 있도록 하는 URL을 가리키는 말이다.
예를 들어,
https://api.neople.co.kr/df/auction?itemName=무색 큐브 조각&wordType=<wordType>&wordShort=<wordShort>&q=minLevel:<minLevel>,maxLevel:<maxLevel>,rarity:<rarity>,reinforceTypeId:<reinforceTypeId>,minReinforce:<minReinforce>,maxReinforce:<maxReinforce>,minRefine:<minRefine>,maxRefine:<maxRefine>,minAdventureFame:<minAdventureFame>,maxAdventureFame:<maxAdventureFame>&sort=unitPrice:<unitPrice>,reinforce:<reinforce>,auctionNo:<auctionNo>&limit=<limit>&apikey={apikey}
다음은 네오플 API에서 던전앤파이터라는 게임의 경매장에 무슨 아이템이 올라와 있는지 검색할 수 있는 API Endpoint다.
해당 Endpoint의 사용 규격은
다음과 같은데 이처럼 Endpoint를 통해 API에 요청할 수 있도록 API가 제공하는 Endpoint를 모두 담아둔 게
위에서 말한 API Document임.
1. 클라이언트 ㅡ> 엔드포인드 ㅡ> 서버 (요청)
2. 클라이언트 <ㅡ 서버 (응답)
이런 방식이라고 생각하시면 된다.
위 예시로 든 Endpoint를 보면 "apikey"라는 것을 볼 수있다.
Open API의 경우 사용자에게 apikey라는 것을 발급하는데
기본적으로 API는 요청과 응답으로 이루어지기 때문에 공격에 취약하다.
아무나 요청할 수 있다면 그냥 따발총 마냥 요청 드르륵 긁어버리면 서버 터진다.
심지어 누가 요청한지 알 방법도 없다.
알고 싶어도 X 같이 힘들게 알아내야 함.
그렇기 때문에 사용자를 특정할 수 있는 API키를 발급하고
이용내역을 감시하게 된다.
드르륵 긁으면 바로 정지먹음 . ㄹㅇㅋㅋ
내가 이 말을 하는 이유는 API 키를 간수하지 못해 악용되거나 정지되는 일이
있기 때문이다.
API는 js 파일을 통해 Ajax 통신으로 자료를 가져오는 것 또한 가능하다.
대부분 http를 사용하는 경우 cors에 의해 막히긴 한다만 js 파일이나 스크립트 태그 내에서
요청할 경우 개발자 도구에서 API 키가 그대로 노출되기 때문에
타인 또한 악용할 수 있는 상태에 놓이게 된다.
혼자 그냥 실험하는 용도라면 Ajax로 쪼물딱거려도 상관없지만
배포하고 싶다면 꼭 백엔드에서 요청한 후 받은 값을
던지는 방식을 사용하도록 하자.
API의 사용처
API가 통신을 위해 만들어진 그들만의 특정한 규격이라는 것을 알았으나
이걸 어디다 써먹을지는 사실 감이 잘 안 올 확률이 높다.
한 번 생각해 보자.
우리가 어떤 웹사이트를 운영하고 있다고 가정한다.
그런데 우리 사이트가 꽤나 괜찮았는지 사용자가 많아졌다.
"대세는 모바일이야. 안드로이드, IOS까지 진행시켜"
씨X.
하지만 이럴 줄 알고 미리 서버를 API로 만들어놨다.
안드로이드로 개발하던 IOS로 개발하던 데이터를 API 서버에서 받아오기 때문에
신속하게 클라이언트만 개발하면 되는 것이다.
혹여나 잘못되더라도 API 스펙에 변화가 없다는 것은 곧 클라이언트 쪽에서
잘못 구현되었을 확률이 높아지니 문제를 탐지하기도 쉬워진다.
API의 궁극적인 이용목적은 다양한 환경에서 동일한 정보를 사용할 수 있다는 것에
있다고 보는게 내 생각이다.
그렇게 되면 어떤 방식으로 자료를 가져와야 하는지 이미 정립되어 있는 상태로
더 클라이언트의 기능에 중심을 맞춰 개발이 가능하기 때문이다.
이 글은 API를 소개하는 글이기 때문에
"그래서 이거 어떻게 쓰는거임?"
이라고 묻지말기 바란다.
사용법은 사용하고자 하는 API Document 읽어보시기 바람.
굉장히 친절함.
혹여나 글에 틀린 점이 있다면 그건 내가 허접이라 그런 것이니 너그럽게 용서해 주시기 바란다.
그럼 컴파일 오류 없는 개발하시길 :)