본문 바로가기

개인프로젝트

Riot API 를 사용하여 전적 검색 사이트 구현 ( OP.GG, Fow )

공부했던 기술들을 직접 적용해보기위해 개인프로젝트를 고민하던 중

 

많은 트래픽과 데이터 그리고 다양한 아키텍처를 구현해 볼 수 있는 전적 검색 사이트를 만들어 보기로 했다.

 

처음 시작할때는 단순히 데이터를 저장해서 사용자에게 보여주면 그만이겠구나 라고 생각했었는데,

 

API의 제한과 많은 양의 데이터로 인해 OP.GG 나 FOW 와 같은 성능을 내기란 쉽지 않았다.

 

하지만 조금씩 수정해 나가면서 API 병렬처리, API Rate Limit 관리, Redis (캐시 및 랭킹), Jdbc RestTemplate, Kafka 등을 사용하면서 조금씩 속도 개선을 해나갔다.

 

아직 추가적으로 작업할 부분이 남아있다.

 

여기서 부터는 개선할 부분과 개선방법에 대해서 꾸준히 작성하면서 공부해 나갈 계획이다.

 

https://mmrtr.store/

 

MMRTR

 

mmrtr.store

 


사용 기술 스택

Back-end                              Front-end                         CI / CD

Java JDK 17,                                    Vue JS                                        Jenkins

Spring Boot 3.2.0, 

Postgresql,                                                                                               

Redis,

Kafka (사용 예정), 

Gradle

 

서버 구성

Docker, docker-compose,

Linux (Ubuntu): aws 를 사용하고 싶었으나 비용 문제로 집에 노는 노트북 사용 

 

형상관리                             기타

Git hub                                            Slack. Notion

 


프로젝트 설명

 

메인

유저(소환사)를 검색할 수 있다.

 

추가 구현할 항목

- 유저 검색시, 이미 데이터베이스에 저장된 유저의 경우 자동완성을 통해 쉽게 유저를 조회할 수 있도록 한다. 

 

조회

- 검색시 등록된 유저 리스트를 출력한다.

 

추가 구현할 항목

- UI 변경

 

 

 

유저 정보

- 조회한 유저의 게임 정보를 볼 수 있다.

- 전적갱신을 통해 새로운 정보를 갱신할 수 있다.

 

 

추가 구현할 항목

- 인게임

- 전체 챔피언 플레이 수 리스트 (현재 상위 7개만 보임)

- 아레나 게임 (현재 데이터는 쌓고 있지만 UI를 만들지 않았음)

- ai-score (구상해봐야함)

 

 

 

 

게임 디테일 정보

- 게임 상세정보를 볼 수 있다.

 

추가 구현할 항목

- 피해량 시각화

 

 

랭킹

- 전체 소환사 수와 랭킹 정보를 볼 수 있다.

 

추가 구현할 항목

- 자유랭크 추가

- 승률 시각화

 

 

 

 

전체적으로 추가해야할 항목들

- 챔피언 통계

- 멀티서치

- 장인랭킹

- 아이템 분석

- 아이템 데미지 계산기 (친구의 요청)


 

느낀점

 

프로젝트를 구현하기 전 Riot API 에 원하는 데이터를 호출하여 저장하고 보여주는 단순한 사이트라고 생각했다.

 

하지만 처음부터 난관에 부딪히게 되었다.

 

바로 API Rate Limit 이다.

 

Riot 이 제공하는 기본 API 는


20 requests every 1 seconds
100 requests every 2 minutes 이라는 Rate Limit 이 걸려있다.

 

그렇기 때문에, 만약 유저가 300판을 플레이한 유저이고 이 유저의 모든 데이터를 보여주기 위해서는 최소한 6분 이상이 걸리게 된다.

 

그래서 Production API Key 를 받기 위해 어느정도 사이트를 구현해둔 후 Riot 에 요청하였다.

 

그래서 얻은 키의 성능은 


500 requests every 10 seconds
30000 requests every 10 minutes 이정도 였다.

 

여기서 op.gg 나 fow 등 다른 사이트들은 대략 3초이내에 전적 갱신을 마치고 사용자에서 화면을 새로 보여준다.

 

하지만 나의 경우 500판 이상 플레이한 유저의 경우 바로 429 Many requests 에 걸리게 된다.

 

이러한 문제를 해결하기 위해 redis 를 도입하였고, bucket4j 라이브러리를 사용하여 API Rate Limit 을 관리하며

 

나중에 요청해도 되는 API 요청을 redis 에 넣어두었다가 요청 가능할 때 꺼내어 API 요청한 후 데이터를 저장하였다.

 

 

 

다음으로 해야할 문제는

 

현재 하나의 서비스에서 요청과 저장을 하고 있는데,

 

처리해야할 데이터 양이 많다 보니 조회용 서비스와 저장용 서비스를 나눠야 겠다는 생각이 들었다.

 

그래서 kafka 를 도입하여 이 문제를 해결할 계획이다.

 

 

이번 개인 프로젝트는 아직도 해야할 일이 산더미 처럼 많이 남아있다.

하지만 문제를 만났을때 하나하나 해결해 나가는 재미가 굉장히 쏠쏠하다.

 

특히 Fow 관리자 님께 메일을 보내 이것저것 물어본적도 있었는데

평소에 내가 하지 않았던 행동들이라서 생소하기도 했다.

 

이제 남은 항목들을 처리해나가면서 조금더 디테일 쪽에 신경쓰며 탄탄한 개발자가 되도록 나아가야겠다.