본문 바로가기
Old/프로젝트 자료조사

Crescendor - Ranking System

by onenewkong 2024. 2. 2.

우리 시스템은 사용자가 시간과 공간에 제약을 받지 않고 피아노를 학습할 수 있게 하고, 피아노 학습 과정에서 중도 포기하지 않도록 재미를 주는 것이 목적이다. 그래서 랭킹 시스템을 넣기로 했고, 실력이 높은 사람, 플레이 횟수가 많은 사람일수록 랭킹 점수를 높게 산정하여 콘텐츠 내의 경쟁을 유의미하게 한다.

만약 랭킹 시스템을 구현하는데 DBMS를 사용한다면, DB에 데이터를 저장하고 저장된 데이터를 정렬하여 다시 읽어오는 과정에서 디스크에 직접 접근해야 하므로 오래 걸릴 것이다. 그래서 보통 많이 사용하는 것이 Redis이다. Redis는 모든 데이터를 메모리에 저장하고 조회하는 인메모리 데이터베이스이며, DBMS와의 차이점은 다양한 자료구조를 제공한다는 것이다.

Redis

고성능 키 - 값 저장소로서 문자열, 리스트, 해시, set, 정렬된 set 형식의 데이터를 지원하는 NoSQL

특징

  • 영속성을 지원하는 인메모리 데이터 저장소
  • 읽기 성능 증대를 위한 서버 측 복제 지원
  • 쓰기 성능 증대를 위한 클라이언트 측 샤딩 지원
  • 다양한 서비스에 사용되며 검증된 기술
  • 문자열, 리스트, 해시, set, 정렬된 set과 같은 다양한 데이터형 지원
  • 메모리 저장소임에도 불구하고 많은 데이터형을 지원하므로 다양한 기능 구현이 가능

Sorted Set

랭킹 구현 시 Sorted Set을 많이 활용한다. 이는 Set의 특성 상 중복을 제거해주고, Score를 비교하는 로직이 따로 필요하지 않고 Set 내부에서 알아서 정렬해주기 때문에 데이터를 그대로 가져오기만 하면 되기 때문이다. 

 

랭킹 점수 산정 지표

다시 정리하자면, 이 Crescendor의 랭킹 시스템은 사용자의 피아노 학습 과정에서 반복적으로 학습을 하는 동기를 제공하기 위한 것이다. 실력(정확도)만 반영한다면 몇 번의 연주 이후부터는 랭킹 변동이 없어 금방 흥미를 잃을 것이다. 연주 횟수만 반영한다면 그저 횟수만 채우려고 할 것이다. 어렸을 때 피아노 학원에서 사과 두개씩 색칠했던 것처럼... 따라서, 랭킹 점수에는 정확도와 연주 횟수, 점수 이동률 등의 지표를 포함해야 한다. 이 데이터를 어떻게 조합하여 유의미하고 정확한 점수를 산정할 지가 지금부터의 과제인 듯하다.