본문 바로가기

활동들~

Pob Build Cost 프로젝트

진행 배경

사람들이 사용해주는 서비스를 만들고 싶었다. 이전에 프로젝트들을 진행할 때면 시간이 지날수록 '이걸 완성하면 사람들이 사용할까?'라는 물음에 대한 답이 희미해져 갔다. 점점 의미없는 프로젝트를 하는 것 같았다. 그래서, 이번 프로젝트를 진행할 때는 사람들이 사용해주는, 실제 사용자가 있을 서비스를 만들고 싶었다. 실제 사용자를 확보하기 위해선 나름 고민해 본 결과 아래와 같이 정리되었다.

  1. 비슷한 서비스가 없고, 특정 사람들에게 필요해야 할 것.
  2. 매니악한 주제와 관련이 있으면, 확고한 사용자 층이 확보하기 쉬울 것 같다.

따라서, 기존에 비슷한 서비스가 없으며, 매니아들이 많은 서비스를 고민하다가 예전에 즐겨했던 PoE란 게임이 생각이 났고, 그때 당시 불편했던 것을 도와줄 수 있는 서비스를 만들게 되었다.

프로젝트 소개

카카오에서 POE(Path of Exile)라는 게임을 서비스하고 있는 데, 이 게임에서는 Base64로 인코딩된 PoB(Path of Build) 코드라는 것으로 유저들끼리 다양한 빌드를 공유한다. 이 PoB 코드를 PoB라는 프로그램에 입력하면, 빌드에 필요한 아이템들이 나오고 이 아이템들을 구해 빌드를 따라할 수 있다. 이때, 빌드에 필요한 아이템을 구매하기 전 내가 가진 예산으로 구할 수 있는 지 파악하기 위해서는 각 아이템들을 옵션과 함께 거래소에서 검색을 해야 한다. 이렇게 검색하는 과정이 매우 번거롭다. Poe Build Cost 프로젝트는 이러한 과정을 돕기 위해, PoB 코드를 입력하면 각 아이템별 비용과 전체 비용을 알려주는 웹 서비스 프로젝트이다.  

 

1. PobCode 입력

PobCode 입력

위 PobCode에 원하는 빌드의 PobCode를 넣고 Submit 버튼을 클릭한다.

 

2. 옵션 선택 후 계산하기 

아이템 카드들

그러면 위 사진과 같이 아이템들이 나온다. 아이템들의 옵션을 훑어보면서, 필요 없을 만한 옵션을 클릭해 제외시켜 준다.

계산하기 클릭

기간 옵션과 판매자 온/오프라인 옵션을 선택해 준 뒤, 가장 오른쪽 Calculate Cost 버튼을 클릭한다.

 

3. 결과 보기

가격 검색 결과

10초 간격으로 각 아이템들의 최저가가 업데이트되며, 매물이 없을 경우엔 Fail 배지가 붙는다.

- 10초의 간격을 가지는 이유는 PoE 거래소에 연속적으로 API 요청을 보내는 데 시간 제한이 있기 때문이다. 전 세계적으로 이용자가 많기 때문에 너무 짧은 시간동안 연속적으로 요청을 보내면, 요청에 제한을 받게 된다.

가격을 업데이트할 때마다 최하단 Total cost 칸에 총 비용도 함께 업데이트 된다.

개발 환경 및 구조

백엔드

Java와 Spring Boot를 기반으로 개발하였다. 초기에는 각 옵션에 대한 고유 ID값을 Poe에서 제공하는 Json 데이터와 Google의 Gson을 이용해 얻었으며, 이후에는 성능을 향상하고자 Json의 데이터들을 MongoDB에 정리하여 이용하였다. 몇몇 Option 값들은 자주 사용되는데, Cache를 이용해 좀 더 빠르게 가져오도록 하였다. AWS의 LightSeil에서 운영되고 있으며, GitHub Action과 연결하여 자동으로 배포할 수 있도록 하였다. 또한 각 기능을 추가/개선하며 nGrinder를 활용해 수치적으로 성능을 테스트하였다. 

MongoDB를 선택한 이유

MongoDB를 선택한 이유는 아래와 같다. 아래에서 말하는 Json 파일은 Poe에서 제공하는 각 Option 별 고유 ID값에 대한 데이터이며, Poe의 거래소에 API로 조회할 때 고유 ID값을 이용해 요청을 보낸다. Json 파일에 담긴 Data 수는 7만 건 정도 있다.

  1. 이전에 사용하던 Json 파일의 데이터들은 데이터간 관계가 없음.
  2. 기존 Json 파알의 역할은 각 Option 값의 고유 ID값을 얻기 위한 것이며, 최대한 빠른 속도로 데이터를 가져와야 한다.

위 이유에 따라, 조회 속도가 빠른 NoSQL을 선택했다. 또한, Json 형식의 데이터를 다루기 수월한 MongoDB를 선택했다.