뒤끝 데이터베이스 UpdateMyDataAndRefreshLeaderboard 함수 관련 문제

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.18.3
  • 프로젝트명 : DubaiJjondukCookie
  • 스테이터스 코드 : 400
  • 에러 코드 : 400
  • 에러 메시지 : bad table, 잘못된 table 입니다

안녕하세요!
이번에 새로나온 뒤끝 데이터베이스를 사용하여 랭킹을 구현하려고 유저가 게임이 끝나고, 최고 기록일 때 bestscore를 UpdateMyDataAndRefreshLeaderboard 함수를 이용하여 리더보드에 등록하려고 합니다.

    public async UniTask UpdateMeterRanking()
    {
        try
        {
            Param param = new Param();
            param.Add("bestscore", UserData.Instance.CurrentUserdata.BestScore);
            
            var rankingBRO = new UniTaskCompletionSource<BackendReturnObject>();
            Backend.Leaderboard.User.UpdateMyDataAndRefreshLeaderboard("019c28c6-1660-72b4-9aca-0a0be4fb1c33","MeterRanking", UserData.Instance.CurrentUserdata.Playerid, param, (callback =>
            {
                if (callback.IsSuccess())
                {
                    rankingBRO.TrySetResult(callback);
                }
                else
                {
                    rankingBRO.TrySetException(new Exception(callback.GetMessage()));
                }
            }));
            await rankingBRO.Task;
        }
        catch (Exception e)
        {
            Debug.LogError("랭킹 업데이트 실패: " + e.Message);
        }
    }

여기서 “bad table, 잘못된 table 입니다” 문제가 발생합니다.
데이터베이스에서는 rowIndate 대신 GetPrimaryKey() 메서드를 통해 rowIndate를 추출할 수 있다고 했는데 제 코드에서 GetPrimaryKey() 출력해보니 제가 데이터베이스에서 설정한 playerid가 출력되더라구요 그래서 rowIndate 매개변수 부분에UserData.Instance.CurrentUserdata.Playerid 를 넣었는데도 오류가 발생하고 있습니다. 확인 부탁드립니다!
(모든 변수들은 null 값이 아님은 debug log 를 통해 확인했습니다)

안녕하세요 개발자님,
코드상 리더보드 갱신에 사용되는 테이블 명이 MeterRanking 로 확인됩니다.
하지만 프로젝트 내 해당 명칭의 데이터베이스 테이블이 확인되지 않고 있으니 확인해주시기 바랍니다.

리더보드 이름이 아니라 테이블명이었네요ㅠ 감사합니다
그런데 테이블명을 바꾸어도 똑같은 오류가 발생합니다.

        Backend.Leaderboard.User.UpdateMyDataAndRefreshLeaderboard("019c28c6-1660-72b4-9aca-0a0be4fb1c33","userdata", row.GetPrimaryKey(), param, (callback =>
        {
            if (callback.IsSuccess())
            {
                rankingBRO.TrySetResult(callback);
            }
            else
            {
                rankingBRO.TrySetException(new Exception(callback.GetMessage()));
            }
        }));
        await rankingBRO.Task;

table not found, table을(를) 찾을 수 없습니다

해당 테이블에 대한 데이터 모델링(C# 클래스 정의)도 모두 진행하시고 재확인해주신게 맞으실까요?

넵 맞습니다 정의하여 데이터베이스 기능 잘 쓰고있었고 Load Create Update 다 잘 되고있는 상황입니다

리더보드에 쓰일 row_inDate 값으로 인해 발생하는 에러로 확인됩니다.
데이터베이스의 경우 게임정보의 row_inDate의 역할을 Primary 컬럼값이 대신하게되며,
그 형태는 게임정보의 row_inDate 형태(예:2025-11-07T07:25:54.634Z)와 달리 자유로운 형태일 수 있습니다.

Primary 컬럼은 각 행(Row)을 고유하게 식별하기 위한 설정입니다.
Primary 컬럼은 중복될 수 없고 NULL 값을 허용하지 않습니다.
하나의 테이블에는 최소 1개 이상의 Primary 컬럼이 필요합니다.

예제 코드를 통해 안내된바와 같이 GetPrimaryKey() 를 적용해주시는게 맞으며,
말씀해주신 바와 같이 현재 테이블의 Primary 인 playerid 가 적용되는것이 맞습니다.

리더보드용으로 보다 편리하게 이용하시고자 하는 경우
Primary 컬럼의 타입을 int32, int64 또는 date을 선택하여
기본값으로 제공되는 AUTO_INCREMENT 또는 NOW 로 설정 후 이용하시는 것을 권장드립니다.

만약 계속해서 에러가 발생된다면
테이블 정의를 비롯한 리더보드 갱신관련 코드 전문을 요청드립니다.

아직 안되는 것 같아서 데이터베이스의 Where()과 Count() 를 이용해서 랭킹을 구현하려고합니다.
그런데 Count()의 문제가 있는 것 같습니다.
Where 이후 Count를 쓰면 0으로만 리턴되고
Where 이후 ToList한다음 리스트의 개수를 이용하면 제대로 작동합니다.

나의 랭킹(순서)를 확인하는 코드입니다

        // 작동 됨
        var higherUsers = await GameManager.DBClient.From<UserData.Userdata>()
            .Where(x => x.BestScore > UserData.Instance.CurrentUserdata.BestScore)
            .ToList();
        var myRank = higherUsers.Count + 1;
        
        // 작동 안됨
        var higherUsersTest = await GameManager.DBClient.From<UserData.Userdata>()
            .Where(x => x.BestScore > UserData.Instance.CurrentUserdata.BestScore)
            .Count();
        int myRankTest = higherUsersTest + 1;

말씀해주신 내용과 관련하여 버그가 확인되어 픽스버전이 업데이트되었습니다.
패키지 매니저에서 새로고침 후 최신버전으로 업데이트하시고 다시 확인해주시면 감사하겠습니다.
불편드려 죄송합니다.

좋아요 1

왔다갔다 해서 죄송합니다. 위의 Count는 확인했습니다 감사합니다.

아직 리더보드 갱신 부분의 오류가 발생합니다.

코드 첨부드리겠습니다!


    [Table("userdata", TableType.UserTable, ClientAccess = true, ReadPermissions = new[] { TablePermission.SELF, TablePermission.OTHERS }, WritePermissions = new[] { TablePermission.SELF, TablePermission.OTHERS })]
    public class Userdata : BaseModel
    {
        [PrimaryKey(AutoIncrement = true)]
        [Column("userid", DatabaseType.Int32, NotNull = true)]
        public int Userid { get; set; }
        
        [Column("playertoken", DatabaseType.String, NotNull = true, DefaultValue = "-")]
        public string Playertoken { get; set; } = "-";
        
        [Column("nickname", DatabaseType.String, NotNull = true, DefaultValue = "-")]
        public string UserNickName { get; set; } = "-";

        [Column("shield", DatabaseType.UInt64, NotNull = true, DefaultValue = "0")]
        public ulong Shield { get; set; } = 0;

        [Column("angel", DatabaseType.UInt64, NotNull = true, DefaultValue = "0")]
        public ulong Angel { get; set; } = 0;
        
        [Column("removead", DatabaseType.Bool, NotNull = true, DefaultValue = "false")]
        public bool RemoveAd { get; set; } = false;
        
        [Column("bestscore", DatabaseType.Float, NotNull = true, DefaultValue = "0")]
        public float BestScore { get; set; } = 0;
        
        [Column("cookiecollection", DatabaseType.Json, NotNull = true, DefaultValue = "{}")]
        public Dictionary<GameManager.CookieType, bool> CookieCollection { get; set; } = new Dictionary<GameManager.CookieType, bool>();
    }

아래는 랭킹 갱신 관련 부분입니다.

    public async UniTask UpdateMeterRanking()
    {
        try
        {
            var row = await DBClient.From<UserData.Userdata>()
                .Where(x => x.Userid == UserData.Instance.CurrentUserdata.Userid)
                .FirstOrDefault();
            
            Param param = new Param();
            param.Add("bestscore", UserData.Instance.CurrentUserdata.BestScore);
            
            var rankingBRO = new UniTaskCompletionSource<BackendReturnObject>();
            Backend.Leaderboard.User.UpdateMyDataAndRefreshLeaderboard("019c28c6-1660-72b4-9aca-0a0be4fb1c33","userdata", row.GetPrimaryKey(), param, callback =>
            {
                if (callback.IsSuccess())
                {
                    rankingBRO.TrySetResult(callback);
                }
                else
                {
                    rankingBRO.TrySetException(new Exception(callback.GetMessage()));
                }
            });
            await rankingBRO.Task;
        }
        catch (Exception e)
        {
            Debug.LogError("랭킹 업데이트 실패: " + e.Message);
        }
    }

오류 내용
400
bad table, 잘못된 table 입니다

공유해주신 코드를 확인하여 내부 테스트를 진행하였으나 이상없이 리더보드가 갱신됨을 확인하였습니다.
안내드리는 코드와 같이 각 단계별로 디버깅을 하여 정확히 어떠한 단계에서 문제가 발생하는지 확인 부탁드리겠습니다.

public async UniTask UpdateMeterRanking()
{
    Debug.Log("===== UpdateMeterRanking 시작 =====");
    try
    {
        // 1. CurrentUserdata null 체크
        if (UserData.Instance.CurrentUserdata == null)
        {
            Debug.LogError("[디버그] CurrentUserdata가 null입니다!");
            return;
        }
        Debug.Log($"[디버그] CurrentUserdata 확인 완료: Userid={UserData.Instance.CurrentUserdata.Userid}, BestScore={UserData.Instance.CurrentUserdata.BestScore}");
        
        // 2. DB에서 row 조회
        Debug.Log("[디버그] DB 조회 시작...");
        var row = await DBClient.From<UserData.Userdata>()
            .Where(x => x.Userid == UserData.Instance.CurrentUserdata.Userid)
            .FirstOrDefault();
        
        if (row == null)
        {
            Debug.LogError("[디버그] DB에서 유저 데이터를 찾을 수 없습니다!");
            return;
        }
        Debug.Log($"[디버그] DB 조회 성공: row.Userid={row.Userid}, PrimaryKey={row.GetPrimaryKey()}");
        
        // 3. Param 생성
        Param param = new Param();
        param.Add("bestscore", UserData.Instance.CurrentUserdata.BestScore);
        Debug.Log($"[디버그] Param 생성 완료: bestscore={UserData.Instance.CurrentUserdata.BestScore}");
        
        // 4. 랭킹 업데이트 요청
        Debug.Log("[디버그] 랭킹 업데이트 API 호출 시작...");
        var rankingBRO = new UniTaskCompletionSource<BackendReturnObject>();
        Backend.Leaderboard.User.UpdateMyDataAndRefreshLeaderboard(
            "019c28c6-1660-72b4-9aca-0a0be4fb1c33",
            "userdata", 
            row.GetPrimaryKey(), 
            param, 
            callback =>
            {
                Debug.Log($"[디버그] 콜백 수신: IsSuccess={callback.IsSuccess()}");
                if (callback.IsSuccess())
                {
                    Debug.Log("[디버그] 랭킹 업데이트 성공!");
                    Debug.Log($"[디버그] 응답 내용: {callback.GetReturnValuetoJSON()}");
                    rankingBRO.TrySetResult(callback);
                }
                else
                {
                    Debug.LogError($"[디버그] 랭킹 업데이트 실패: {callback.GetMessage()}");
                    Debug.LogError($"[디버그] 에러 상태 코드: {callback.GetStatusCode()}");
                    rankingBRO.TrySetException(new Exception(callback.GetMessage()));
                }
            });
        
        Debug.Log("[디버그] await 시작...");
        await rankingBRO.Task;
        Debug.Log("[디버그] await 완료!");
    }
    catch (Exception e)
    {
        Debug.LogError($"[디버그] 예외 발생: {e.Message}");
        Debug.LogError($"[디버그] 스택 트레이스: {e.StackTrace}");
    }
    Debug.Log("===== UpdateMeterRanking 종료 =====");
}

감사합니다 해당 코드 정확히 붙여넣기 하여 실행한 결과입니다.
019c28c6-1660-72b4-9aca-0a0be4fb1c33와 userdata가 콘솔에 있는것과 다른지, 공백이 있는지 재차 확인했습니다

확인 시 BASE SDK를 데이터베이스 리더보드 미지원 버전으로 사용하고 계셔 발생한 에러로 확인됩니다.
BASE SDK 5.18.5 버전부터 데이터베이스를 통한 리더보드 기능의 사용이 가능합니다.

5.18.4 이하 버전의 경우 리더보드 함수 상 데이터베이스의 사용이 준비되어있지 않았기에 사용이 불가한 상황인 점 참고하시어 BASE SDK를 5.18.5 이상 버전으로 업데이트 하신 후 사용해 주시면 감사하겠습니다.

해결했습니다 감사합니다!!