포스팅에 앞서.... 그라운드 플립은 스토어에서 다운 받을 수 있습니다!!🔥🔥
[iOS] : 앱스토어
[Android] : Play 스토어
그라운드 플립은 월요일 자정, 사용자가 차지한 픽셀들이 전부 초기화된다.
따라서 일요일에 가까워질 수록 랭킹 상위권에 들기 위해 더 많은 픽셀을 차지하고 있어야한다.
하지만 사용자가 점점 늘어날 수록 단시간에 많은 픽셀을 차지 유저들이 늘어났다.
화요일 오전에 이미 픽셀 600개를 차지한 사용자도 있었다.
단순 산술로만 따지자면, 픽셀의 한 변의 길이가 80m이니 80m * 600 = 48000m(48km)
인데...
아무리 생각해도 별도의 이동수단 (자동차, 기차, 오토바이)를 쓰지 않는 한 불가능하다고 생각됐지만 '그라운드 플립'엔 이미 어뷰징 방지 로직이 적용되어 있었다.
따라서 우선 "이상 행동"을 한 유저들에 대해 이동 경로를 파악해보기로 했다.
현재 그라운드 플립에선 사용자의 픽셀 방문 기록을 저장하기 위해 총 3개의 테이블을 사용한다.
pixel
테이블user
테이블pixel_user
테이블 그렇다면 "특정 유저가 특정 기간동안 방문한 픽셀들의 위경도"는 아래와 같은 쿼리로 가져올 수 있다.
SELECT
ST_Latitude(p.coordinate) AS latitude,
ST_Longitude(p.coordinate) AS longitude
FROM
pixel_user pu
JOIN
pixel p ON pu.pixel_id = p.pixel_id
WHERE
pu.user_id = 사용자_아이디
AND pu.created_at BETWEEN 시작일 AND 종료일
그치만... 이런 위경도 값만으로는 의미가 없다.
우리는 사람이기에 이런 소수점 아래 6자리 이상이 꽉 채워져있는 실수들은 유의미한 정보를 추출하거나 이해하기 매우 어렵다.
즉, 유저의 이상 행동 분석을 위해선 시각화가 꼭 필요했다.
가장 빠르고 편한 방법을 찾기 위해 구글링을 하던 중 이 글을 통해서 kepler.gl을 알게됐다.
Kepler는 Uber에서 개발한 오픈 소스 데이터 시각화 도구이다. 위치 기반 데이터를 다루고 쉽게 시각화 할 수 있는 것이 장점이다. 서버 백엔드가 없는 클라이언트 측 애플리케이션으로, 시각화하는데 사용하는 데이터가 브라우저에만 존재하며 어떤 서버로도 전송되지 않는다.
위에서 사용한 쿼리 결과를 csv로 export하고 kepler에서 import하는 방식으로 사용할 수 있었다.
준비된 csv 파일을 업로드한다.
해당 데이터에 대해 layer를 추가하고, 적절한 값을 세팅해준다.
클릭 몇 번만으로 데이터 시각화가 완료된 것을 볼 수 있다.
UI도 매우 깔끔하고 웹으로 제공되는 툴이기에 편리성도 매우 뛰어나다.
하지만 치명적인 단점이 있다.
다른 사용자나 다른 시간대를 보려면 쿼리를 다시 실행하고 결과를 export하는 등의 과정을 거쳐야 한다.
따라서 다른 방법을 찾아보기로 했다..
현재 그라운드 플립은 프로메테우스와 그라파나를 사용해서 서버 인프라를 모니터링 하고 있다.
보통 그라파나는 이런 시계열 데이터를 시각화하여 모니터링에 사용하지만, 놀랍게도 GeoMap 기능도 제공하고 있다.
또한, 쿼리에 들어가는 변수를 대시보드에서 입력하여 우리가 원하는 대로 다양한 유저, 시간대에 대한 시각화를 진행할 수 있다.
대시보드 설정으로 이동하여 변수를 추가하자.
대시보드 화면으로 돌아와 변수를 입력하면 시각화가 완료된 것을 볼 수 있다.
여기서 몇 가지 개선을 더해보자.
한결 더 보기 쉬워진 것을 확인할 수 있다.
이상 행동 사용자 중 한 명을 조회해본 결과, 약 두 시간동안 고속도로를 타고 이동한 것을 볼 수 있다.
즉...어뷰징 방지가 뚫렸다....
팀원과 함께 여러 실험을 해봤지만 원인도 찾지 못하였다.
하지만 시각화를 진행했기에 빠른 상황 파악이 가능했다.
추후 더 견고한 어뷰징 방지 시스템과, 다양한 시각화를 경험해 볼 예정이다.
또한 팀원과 그라운드 플립을 진행하며, GIS 데이터를 다루는 것에 흥미를 느꼈고 현재 관련한 오픈 소스를 만들고 있다 ㅎㅎ