[뒤끝팁] 뒤끝 랭킹, 사소한 팁 및 주의점 5선

안녕하세요, 개발자 여러분! 게임 서버 뒤끝입니다?‍♀️

뒤끝을 이용하시는 개발자님들이 가장 만족하고 있는 기능 TOP3, 무엇인지 알고 계시나요?
바로 ①게임 유저 관리, ②게임 정보 관리, ③랭킹 기능입니다.

그중에서 오늘은 랭킹 기능에 대한 ?팁과 주의점을 공유드리려고 하니,
집중해 주세요! ?


첫 번째 Tip. 랭킹에 등재되기 위해서는 먼저 게임 정보를 삽입해야 한다.

[랭킹 기능]은 독자적으로 사용이 불가하다는 사실!

뒤끝으로 게임에 랭킹을 구현하고 싶다면?
반드시 [게임 정보 관리 기능]과 연계하여 사용해야 합니다.

뒤끝 랭킹을 사용하기 위해서는 랭킹에 사용할 row를 먼저 insert 해야 합니다.

랭킹 산출의 기준이 되는 데이터는 ‘현재 삽입된 컬럼’을 통해 선택이 가능하기 때문인데요.
만약 컬럼이 비어있을 경우, 랭킹을 산출하기 위한 기준을 설정하는 것이 불가능해지기 때문입니다.

유저 데이터가 이미 준비되어 있어야 하는 이유는 또 있습니다.
기존에 있던 유저 데이터를 갱신함과 동시에 랭킹에 등록하는 방식으로 랭킹이 처리되기 때문입니다.

➡️ 게임에 랭킹을 구현하고 싶다면, 유저의 데이터를 먼저 생성하고 해당 데이터의 indate를 이용하여 랭킹을 삽입하는 로직으로 구성해 주셔야 합니다.

public void InsertRankData()
{
  string tableName = "scoreRank";

  Param param = new Param();

  param.Add("score",0);
  param.Add("nickname", Backend.UserNickName); // Backend.UserNickName = 로그인한 유저의 닉네임
  
  var insertBro = Backend.GameData.Insert(tableName, param);

  if(insertBro.IsSuccess())
  {
     Debug.Log("데이터 삽입 성공했습니다: ");

     Debug.Log("랭킹 업데이트에 사용될 indate : " + bro.GetInDate());

  }
  else
  {
     Debug.LogError("데이터 삽입에 실패했습니다 : " + insertBro.ToString());
  }
}

두 번째 Tip. 랭킹 갱신 함수는 게임 정보 업데이트 함수와 같은 기능을 수행한다.

뒤끝의 랭킹 갱신 함수는 랭킹이 갱신되기 전, 
반드시 게임 정보 업데이트가 먼저 진행되는 로직을 가지고 있습니다.

따라서 게임 정보 업데이트에 포함되는 파라미터들을 랭킹 갱신 함수에 그대로 사용하여도
정상적으로 파라미터의 모든 데이터가 수정됩니다.

? 동일한 테이블의 동일한 데이터를 게임 정보 업데이트와 랭킹 갱신 함수 양쪽에서 호출하는 로직을 갖고 있다면, 두 번 호출할 필요 없이 랭킹 갱신 함수 한 번만으로 두 가지 모두를 처리할 수 있습니다.

?하지만 그렇게 될 경우, 랭킹에서 오류가 발생하면 데이터 수정이 이루어지지 않아 양쪽 모두에서 문제가 발생할 수 있으니 주의해 주셔야 합니다.

이와 관련된 내용은 다음 단락에서 더 자세히 다루겠습니다. (세 번째 Tip을 더 중요하게 봐주세요?)


세 번째 Tip. 랭킹 보상 산출 시간에 대비해라!

랭킹의 순위 산출 기간에는 랭킹 갱신이 불가능합니다.

뒤끝의 [랭킹 기능]에는, 랭킹에 등재된 유저들의 순위를 산출하여 새벽 4시~5시 사이에 자동으로 우편 보상을 보내는 기능이 있습니다.

이때, 순위 산출 기간 동안에는 랭킹 갱신이 불가능하다는 점을 꼭 기억해야 합니다. 해당 기간에 랭킹 갱신을 호출한다면 다음과 같은 에러가 발생합니다.

한국 기준 04:00 ~ 05:00 사이에 랭킹 갱신을 시도한 경우
statusCode : 428
errorCode : Precondition Required
message : Precondition Required ranking is being counted

이때, [랭킹 테이블 설정]의 [테이블 초기화 기능]이 활성화되어 있다면? 4시~5시에 순위를 산출해 보상 지급이 완료된 후, 자동으로 해당 스코어 컬럼의 초기화가 이루어지게 됩니다.

? , 해당 시간 동안은 게임 정보 업데이트 함수를 통해 데이터를 저장했다 하더라도 초기화되기 때문에
4시~5시 사이 유저가 투자한 시간과 노력은 모두 사라지게 됩니다. 유저의 항의 메일도 엄청나겠지요? ?

위 같은 상황을 방지하기 위해서는, 두 가지 방법을 취할 수 있습니다.

① 랭킹 콘텐츠를 구성할 때, 4시~5시 사이에는 활동이 이루어지지 않도록 기획한다.
➡️ 이 방법이 가장 깔끔하고 편한 방법입니다.

② 4시~5시에 쌓인 유저 데이터를 다른 테이블에 임시로 저장한 후, 순위 산출이 완료되었을 때(=랭킹 갱신 함수가 성공할 때) 불러다 쓰는 로직을 구성한다.
➡️ 이 방법은 유저에게 더 나은 경험을 제공할 수는 있겠으나, 구현 난이도가 어렵다는 점! 참고해 주시기 바랍니다.


네 번째 Tip. 랭킹의 extra 데이터에는 너무 긴 string 형태는 사용하지 말아요!

과도하게 긴 string형은 데이터 수정 및 불러오기에 부정적인 영향을 끼칠 수 있습니다.

기본적으로 extra 데이터는, 랭킹에서 스코어 외의 정보를 별도의 작업 없이 편하게 개발할 수 있도록 만들어진 컬럼인데요!

그렇기 때문에 랭킹 불러오기 작업을 하면, SDK 함수 리턴 값과 콘솔의 랭킹 리스트에서는 랭킹 스코어뿐 만 아니라 추가적으로 설정한 extra 데이터까지 확인할 수 있습니다.

? string 혹은 int형은 길이와 형태에 관계없이 전부 extra 항목으로 만들 수 있는데요. 그렇기에 활용의 폭이 넓고 자유롭지만, 과도하게 긴 string형은 데이터 수정 및 불러오기에 좋지 않은 영향을 미칠 수 있습니다.

rowIndate나 200자 정도의 짧은 자기소개 글이라면 문제없지만, 유저가 보유하고 있는 아이템 리스트 전체를 string형으로 변경하여 사용하는 경우에는, ①아주 많은 데이터 요금?과 ②함수의 느린 호출?이 발생할 수 있으니 주의해 주시기 바랍니다.


다섯 번째 Tip. 현재 자신의 순위가 상위 몇% 내에 포함되는지 구현이 가능하다.

① 내 랭킹을 조회하면, 아래와 같이 자신의 랭킹 점수와 전체 랭커의 수가 리턴됩니다.

{
    "rows": [
        {
            ...
            // 유저의 랭킹
            "rank": {
                "N": 5
            }
						...
        }
    ],
    // 랭킹에 등록된 총 랭커의 수
    "totalCount": 1000
}

내 랭킹 / 전체 랭커의 수 * 100 을 통해, 내가 상위 몇% 인지 확인할 수 있습니다.

int myRank = 0;
int myRankPercent = 0;

public void GetRankTable()
{
     var bro = Backend.URank.User.GetMyRank("rankUuid");
     if(bro.IsSuccess())
     {
	JsonData json = bro.GetFlattenJSON();
        int totalCount = Int32.Parse(json["totalCount"].ToString();
        myRank = Int32.Parse(json["rows"][0]["rank"].ToString());
				
	myRankPercent = myRank / totalCount * 100;
     }
}

여기까지, 뒤끝 [랭킹 기능]을 십분 활용하기 위해 꼭! 필요한 5가지 팁을 공유드렸습니다?

효율적인 기능 활용으로 DB 요금도 줄이고, 더 편한 개발 환경을 만들어 보세요!

뒤끝은 언제나 개발자 여러분의 지속 가능한 게임 개발을 지원합니다.

2

댓글