일부 데이터 초기화 현상에 대한 질문

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

  • 뒤끝 SDK 버전 : 5.7.1
  • 프로젝트명 : 미스테리 큐브
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

최근 유저들의 데이터 초기화 현상이 있어서 이것저것 알아보다보니…

[공지] 게임 데이터 유실(초기화/롤백) 방지, 대응 가이드

글을 보게 되었습니다.

해당 글에 따르면 rows 카운트가 0으로 반환된다고 하셨는데…

저같은 경우 해당 컬럼이 존재하는지 확인후 없으면 만들고, 있으면 데이터를 가져오는 방식으로 코드를 짰습니다.(Contains 이용)

문제없이 잘 돌아갔구요.

그런데 최근들어 데이터 초기화 현상이 있었고…일단 해당 글대로 바꾸긴 했습니다만…

추가로 컬럼을 만들고 싶을때는 어떻게 해야 하나요?
가져올 컬럼이 없으면 에러나면서 아무것도 안되는듯하던데…

===기존코드===
if (result.GetReturnValuetoJSON()[“row”].ContainsKey(“StageLevel”) == false)
{
param.Add(“StageLevel”, StageLevel.ToString());
}
else
{
returnValue = BackendReturnObject.Flatten(result.GetReturnValuetoJSON())[“row”][“StageLevel”];
StageLevel = Int32.Parse((string)returnValue);
}

이게 기존코드입니다. 위처럼 불러온 테이블에서 해당 키가 있는지 여부 확인 후

해당 키가 없으면 새로 쓰고, 해당 키가 있으면 값을 가져오는 방식이었습니다.

그런데 해당 칼럼의 일부값만 가져오니…그 일부값은 데이터가 그대로 유지되는 반면
가져오지 못한 칼럼값은 그대로 초기화가 되어버렸습니다.

======신규코드========
if (result.GetReturnValuetoJSON()[“row”].Count <= 10)
{
param.Add(“SafeMode”, Ability.SafeMode.ToString());
}
else
{
returnValue = BackendReturnObject.Flatten(result.GetReturnValuetoJSON())[“row”][“SafeMode”];
Ability.SafeMode= Convert.ToBoolean((string)returnValue);
}

이런식으로 해야 하더군요…
실제 신규 유저일 경우 반환되는 result.GetReturnValuetoJSON()[“row”].Count 의 값은 7이었습니다만
혹시 몰라서 10이하일경우로 해놨습니다.(indate값 등등때문에 7이 반환되더군요)

그런데 이렇게 할 경우…
데이터의 일부 칼럼만 가져와서 Count 값이 10을 넘어가버리면
else 구문에서 해당 칼럼이 존재하지 않는다며 에러가 나오고…그 뒤로는 데이터가 쓰여지지 않을게 자명합니다.

결론적으로 질문을 드리자면…

  1. 다 가져오든지, 아니면 안가져오든지…둘중 하나만 해야 하는데
    일부만 가져오는 이런 현상은 대체 어떻게 대응해야 하나요?

  2. 그리고 신규 코드의 경우 칼럼 추가를 할 경우는 어떻게 해야하나요?

※ 기존코드/신규코드 모두 불러오기 성공했을때의 코드입니다.

  1. 만약 기존 유저의 로딩이 성공하고 리턴되는 row의 값이 0으로 반환될 경우…에는
    공지해주신 방법으로 처리해도 무조건 데이터 초기화되는거 아닌가요?

안녕하세요 개발자님.

앞서 공지에도 있듯이 게임이 초기화가 되는 가장 대표적인 케이스는 Backend.GameData.GetMyData(“Player”,new Where()); 등 에러가 발생할 이유가 없는 함수에 대해서는 에러처리가 없기 때문에 이후 에러 발생 시 json 파싱에서 예외가 발생해 그 이후로 로직이 작동하지 않는 케이스입니다.
따라서 해당 글에서는 무조건 성공하는 로직일지라도 에러케이스 처리가 되야한다는 내용이 서술되어있습니다.

  1. 읽기에 성공했지만 일부 데이터는 누락된 채로 불러오는 에러는 발생하지 않습니다.

  2. 만약 클라이언트 업데이트를 통해 추가 컬럼이 생긴다면 게임 시작시 테이블을 불러오고 기존코드처럼 해당 컬럼이 존재하지 않으면 추가하는 식으로 구현하는 것을 추천드립니다.

  3. Backend.GameData.GetMyData(“Player”, new Where()) 함수에서 내 데이터가 정말로 존재하지 않는 경우는 호출이 200으로 성공을 했지만 rows의 Count가 0인 경우밖에 없으며, 이부분일 때는 정말로 해당 유저가 테이블에 대한 정보가 없기에 0으로 발생되는 것입니다.

해당 부분 관련해서는 공지와 연관된 글로 뒤끝 블로그에 자세히 설명된 글이 있으니 해당 글을 참고해주시면 감사하겠습니다.