brunch

You can make anything
by writing

C.S.Lewis

by Jieon Mar 13. 2022

OP.GG를 만든 일등공신, Riot API

[코드스테이츠 PMB 10기]  API, OpenAPI, RestAPI

개발자와 소통하기 위한
API의 모든 것







1. 알 것 같으면서도 모르겠는 API



이전에 첫 오브젝트가 롤의 승패에 어떤 영향을 줄 수 있을 지 살펴보는 글을 작성하면서 API에 대해서 간략히 설명한 적이 있다.


(*롤의 승패와 오브젝트 간의 관계는 위의 포스팅에서 확인해주세요)


이때는 단순히 API가 무엇인지에 대해 간략하게 소개를 했었는데, 이번 몰입학습에서 더 상세히 알 기회가 생겨 API의 종류에는 어떤 것이 있고 어떤 과정을 가지고 있는 지 작성해보고자 한다.




What is API?


사람 말로 해줘22


그렇다면 API란 무엇일까.

API는 Application Programing Interface의 약자로 프로그램과 프로그램이 서로 데이터를 주고 받기 위해 사전에 정한 요청·응답 방식을 말한다. 즉, 각자의 프로그램끼리 서로 일하는 방법을 약속한 것이라 보면 된다.


(이 부분에서 살짝 새로 알았던 지식이 나는 이전까지는 API라는 것이 한 프로그램에서 다른 프로그램의 정보에 접근하기 위한 하나의 징검다리라 생각을 했는데, 방식이라는 점에서 조금 놀랐다.)


그렇다면 일상적으로 볼 수 있는, 레스토랑에서 주문하는 과정을 이용하여 좀 더 쉽게 이해해보자. (참고)



위 그림에서 손님을 User 및 Client, 점원을 API, 그리고 쉐프을 Application이라 가정하자. 이때 손님은 점원에서 요리를 주문할 것이다. 이때, 주문한 것을 API Request로 클라이언트에서 애플리케이션에 무언가를 가져다 달라고 요청을 한 것이다.


그리고 여기에서 또 눈여겨 봐야 할 점은 15번이라는 고객의 번호이다. 이는 곧 API Key로 해당 고객을 알아보기 위한 고유식별 값이라 볼 수 있다. 보통 referrer (요청도메인)과 key값을 매칭하여 정상 이용자인지 판단하고 해당 API를 사용 허가 여부를 결정한다고 한다.


그러면 점원은 쉐프에게 고객의 주문을 전달하고, 쉐프가 고객이 주문한 음식들을 다 만들면 이를 다시 고객에게 가져다준다. 이때 음식이 곧 API response로, 고객이 요청한 것에 대한 응답을 주는 것이다.


즉, 점원(API)은 고객(User, Client)과 쉐프(Application, Server)를 서로 연결해주는 창구라 볼 수 있다.




Open API



그리고 이런 API들 중 자신이 가진 기능을 모든 이들이 사용할 수 있도록 공개한 API들이 있다. 앞선 글에서 설명하였던 라이엇게임즈의 LoL API가 그 중 하나의 예시이고, 여러 공공데이터 API, 카카오 또는 네이버 등의 로그인 API도 Open API의 일종이다.


그렇다면 여기에서 잘 설계한 API를 왜 오픈하여 제공하는 것일까? 에 대한 의문이 생길 것이다.


그 이유는 자사의 서비스의 기능을 다양한 서비스에서 활용할 수 있도록 하여 서비스의 저변을 넓히는 목적이 있기 때문이다. 메타 서비스를 제공하는 대기업들의 경우에는 시장 확대를 목적으로 Open API를 운영하기도 하고, 비영리기관에서는 공공의 목적으로 Open API를 제공하기도 한다. 특히, 2020년에 한번 정부에서 대규모로 공공데이터 인턴을 뽑은 적이 있었는데 이는 Open API를 만들기 위한 데이터를 구축하기 위해서였다.




RESTful API


하지만 API를 아무리 잘 설계했다 하더라도 각자 필요한 방식에 맞게 다양하게 설계를 한다면 유지보수를 하는데 어려움이 있을 수 있다. 이를 해결하기 위해 REST(REpresentational State Transfer)의 개념을 담은 RESTful API가 등장하였다.



REST의 개념을 간략히 정리를 해보자면, HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method로 표현하여 특정한 형태로 전달하는 방식이다.


이를 좀 더 쉽게 설명하자면 다음과 같다.


HTTP URI (Uniform Resource Identifier)를 통해 자원을 명시하고

HTTP Method (POST, GET, PUT, DELETE) 를 통해 해당 자원에 대한 CRUD (Create, Read, Update, Delete) 연산을 수행하며

그 요청에 대한 자원은 JSON/XML/HTML과 같은 특정한 형태로 표현되는 것


그리고 이러한 REST의 원리를 따르는 API가 Restful API이다. 쉽게 생각을 하면 정해진 방식대로 requset를 보내고, response를 받기 때문에  의도하는 바를 쉽게 파악할 수 있다고 이해하면 될 듯 하다.







2. Riot Games API 살펴보기


API에 대한 대략적인 이해가 되었다면 그럼 이제 실제 예시를 살펴보면서 API의 속내부를 샅샅이 살펴보도록 하겠다. 그리고 이번에도! 내가 최근 너무나 푹 빠져있는 LoL의 API, Riot Games의 API를 가져왔다.


해당 API는 Riot Devleoper Portal에서 API 키를 다운로드 받으면 LoL의 여러 정보들에 접근할 수 있다. 그렇다면 라이엇게임즈의 API, A부터 Z까지 모두 찬찬히 알아보도록 하자.

(*How To Use Riot API With Python 을 참고하여 작성하였음을 밝힙니다.)




Riot Games API란?



Riot Games API는 자체 애플리케이션이나 웹사이트를 구축하는데 사용할 수 있도록 개발자에게 제공되는 REST API이다. 현재 모든 League of Legends API는 버전 4 (2020년 3월 19일 업데이트)라고 한다.



라이엇의 개발 문서에 따르면 더이상 API 경로에 부버전이 포함되지 않는다고 하는데, 부버전이란 기존 버전과 호환되면서 바꾸거나 추가한 경우라고 한다. 아마 변화가 있을 때는 따로 부버전을 올리지 않고, 주버전을 다시 올린다는 뜻이 아닐까 예상해본다.


Riot Games API에서는 수많은 게임데이터들을 얻을 수 있는데 그 중 일부는 다음과 같다. (참고)


서비스 상태

소환사 정보 : 이름, 레벨, 프로필 아이콘, 계정 ID

소환사 이름별 경기 기록 및 경기 세부 정보 및 타임라인

누군가가 게임에 있늩 경우 그 당사자의 현재 게임 정보

기타 정보




Riot Games API Key


본격적으로 API에 접근하기 위해서 먼저 API Key를 발급받았다. 해당 Key는 Riot Developer Portal에 게임 계정으로 로그인을 하면 얻을 수 있다.



Key는 24시간 만에 만료되며, 누구와도 공유하지 말라고 안내되어 있다. 나의 경우, 원래 3월 11일에 키를 받았었지만 만료되어서 3월 13일에 재발급 받았다. Expires: Sun, Mar 13th, 2022 @ 9:21pm (PT) in 22 hours and 13 minutes 이 글에서 지속적으로 만료되기까지 얼마나 시간이 남았는지 확인할 수 있다.


개인 Riot 제품을 등록하면 24시간마다 Key를 새로 고칠 필요가 없다고 하는데, 데일리 과제를 하기 위해서는 24시간으로 충분하기도 하고 해당 신청서는 검토되는 데 2주가 걸린다고 하니 참고사항으로만 알아두었다.


또한 개인 Key로는 1초마다 20개가 요청 가능하며 2분마다 100개를 요청할 수 있다는 한도가 정해져있었다. 어찌되었든, Key를 받았으니 이를 활용하여 테스트를 해보았다. 테스트를 하기 위해서는 다음과 같이 url을 생성하여 확인하였다.

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/hideonbush?api_key=RGAPI-YOUR-API-KEY


그러자 아래와 같은 결과값을 얻을 수 있었다.


위의 코드를 정리해보자면, 한국에서 hideonebush(T1 Faker)라는 이름을 가진 소환사의 정보를 얻을 수 있게 해주세요. 라는 의미이다. 코드 구성에서도 볼 수 있듯이, Riot Games에서는 response에 대한 응답을 JSON파일로 돌려주고 있다.


이때, 소환사 값 및 계정 id는 지역별로 고유하지만 puuid는 전세계적으로 고유하다고 한다. 그래서 Riot API를 올바르게 쓰기 위해서는 무조건 지역을 선택해야 한다.




Riot Games API 의 구조


그러면 구조를 좀 더 살펴보는 게 어떨까, 하여 개발자 포털을 좀 더 뜯어보았다. REST API의 구조를 가졌으니 HTTP Method (POST, GET, PUT, DELETE)를 사용할텐데 어떤 명령어가 주로 쓰이고 있을까?



좌측의 모든 분류를 클릭해보았을 때도 Read(GET) 방식밖에 존재하지 않았다. 이는 아마 클라이언트가 서버에 요청하는 API가 주로 데이터 열람을 목적으로 하기에 해당 데이터를 읽는 Method만 있는 것 같았다.



그리고 응답코드를 확인해보니, Riot Games API는 모든 데이터를 유효한 JSON으로 반환한다고 명시되어 있었다. JSON은 JavaScript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷으로 키-값 쌍으로 표시된다.


https://에서도 확인했었을 때도 JSON의 포맷으로 따라서 [id 속성값 : id 키값] 등 쌍으로 표시된 것을 확인할 수 있었다.


 응답코드는 크게 2XX, 4XX, 5XX 로 나뉘어졌는데 각각에 대한 이유를 분류해보면 다음과 같았다.


2XX Response Code


② 4XX Response Code


4XX 클래스의 오류 코드는 클라이언트가 유효한 요청을 제공하지 못했을 때 나타나는 응답코드라 한다. 일반적인 오류 코드 유형으로는 다음과 같다.




③ 5XX Response Code


5XX 오류 코드는 서버에 오류가 발생했거나 요청을 수행할 수 없을 때 그에 대한 인식을 하고 있음을 나타내기 위한 코드라 한다. 일반적인 유형은 다음과 같이 알아볼 수 있다.







3. 실제 사용해보기!


이제 API에 대한 구조도, 어떤 형식으로 나타나는지도 확실히 알아보았다. 그렇다면 이번에는 실제 API를 사용하면 어떤 식으로 나타나는지를 확인해보도록 하자.



Riot Games Developer 페이지에서의 간단 TEST


먼저, 라이엇 게임즈의 개발자 페이지에서는 원하는 API를 간편하게 테스트해볼 수 있다. 그래서 이번에는 한번 페이커선수의 소환사 리그 정보를 조회해보도록 하겠다. 소환사리그 정보에는 티어나 승률에 대한 정보를 얻을 수 있다.


[LEAGUE-V4] - [by-summoner]


그러면 아래와 같은 Value들을 얻을 수 있다고 표시된다.



저기의 miniSeriesDTO의 경우에는 다음과 같은 정보를 포함하고 있다.



만일 정보를 찾을 수 없다면?
앞서 notion으로 정리를 해보았던 오류코드가 다음과 같이 뜬다고 표시되어 있다.



자, 그럼 이제 실제로 Path Parameters 탭에서 파라미터 값을 입력하고 Execute Request를 클릭해보자. 이번에도 나는 페이커선수의 솔랭계정인 hide on bush의 summonerId를 파라미터 값으로 선택하였다.



그러자 Response Code는 200으로 정상적인 값이 출력이 되었고, 해당 Id 속에서 찾을 수 있던 정보는 다음과 같았다.





Python을 활용해서 API Key를 활용해볼까?


마지막으로, 한번 개발자의 모드가 되어서 하나의 프로젝트를 실행할 때에는 어떤 식으로 API가 활용되는 지 알아보도록 하자! JSON파일의 응답은 단순히 웹페이지 url로만 하는 것이 아닌 여러 다양한 언어 플랫폼에서도 사용이 가능하다.


그래서 이번에는 Python을 활용하여 API Key를 사용해보기로 하였다! (잘 안되어서 던져버릴뻔..ㅋㅋ)


이번 과제를 수행하면서 많이 참고한 How to Use Riot API With Python에 따르면 riotwatcher라는 Python 라이브러리를 또 따로 사용하였길래 나 역시 따라서 다운로드하였다.


잘 안되어서 던져버릴 뻔했기 때문에 already satisfied 된 화면밖에 없었다..(ㅠ)


그 후, python에는 다음과 같은 코드를 사용한다. 나는 한국의 소환사를 보고 싶은 것이었으므로 my_region은 kr로 설정해주고, 페이커 선수의 아이디인 hideonbush를 살펴보고자 하였다. 해당 계정의 정보를 찾고 싶을 때는 다음과 같은 형식으로 코드를 작성하면 된다.



그러자 결과는 다음과 같이 나왔다!


그리고 이에 더해 아까와 같이 랭크에대한 정보를 얻기 위해서는 다음과 같은 소스코드를 하나 더 추가하였다. 이전의 코드에 더하여 run 시키는 것이기 때문에 my_region은 그대로 kr 그리고 id는 me의 결과값에서 나왔던 id인 'MeV8tzGDg2m1ISi5_WHDad09hns5oxtXQ4-nYP4TehyQZw'가 자동으로 들어간다.


이에 대한 결과는 또 다음과 같았다.


위의 코드를 이전에 개발자 페이지에서 얻어낸 결과값, Response Body와 비교를 해본다면 완전 동일한 결과인 것을 확인할 수 있다. 이처럼 API Key를 활용하면 해당 선수의 계정 정보에 접근가능하며, 랭크, 현재 게임 정보 등을 알 수 있다.


그리고 이것을 이용하여 만든 프로덕트가 모다? 바로, Op.gg!

한창 미드 카이사에 빠져있는 페이커선수의 전적을 확인할 수 있다. (ㅋㅋ) T1 vs 광동전 수고하셨습니다!



참고자료.


매거진의 이전글 앱(App)의 세계를 탐험하다
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari