테이블 불러오기는 되는데 쓰기가 안 되는 상황

  • 뒤끝 SDK 버전 : 5.6.0
  • 프로젝트명 : SunlessCity
  • 스테이터스 코드 : 404
  • 에러 코드 : NotFoundException
  • 에러 메시지 : gameInfo not found, gameInfo을(를) 찾을 수 없습니다.

기존에 테이블에 첫 row를 넣을 때만 Insert를 하고
그 이후로는 Update를 사용하여 잘 사용하고 있었습니다.

그러다가 위의 정보와 같은 오류가 발생하면서 저장이 안 된다고 하는 “복귀 유저” 가 나타나고 있는데요.
유저의 데이터를 확인해보니 row는 분명히 존재하는데 일부 column이 빠져 있는 것을 확인했습니다.

그러나 지금까지 뒤끝 서버 기능을 이용하면서 column이 나중에 추가되더라도
row가 존재하고 Indate가 일치한다면 Update를 할 때 문제없이 column을 추가해주는 것으로 알고 있었는데요.

문제가 발생하길래 유저와 비슷한 상황이 되어보고자
기존의 row를 삭제하고, 뒤끝 콘솔을 통해 row를 생성하면서 column 중 일부만 추가하고 값을 넣어줘 봤는데요.


(level1 컬럼의 [99, 99, 99, 99 ,99]을 불러와서 만렙이 되어 있는 모습)

이처럼 데이터 불러오기는 되는데 Update하려고 하면 404 오류가 발생하였습니다.

당장은 정보들을 따로 복사해두었다가 삭제하고 유저가 row를 다시 삽입하면
수동으로 데이터를 덮어주는 방식으로 해결할 수 있지만
어쩌다 이렇게 되었는지, 예방할 수 있는지 알고 싶습니다.

안녕하세요 개발자님.

혹시 5.6.0 SDK에서 추가된 owner_inDate를 이용한 GameData.UpdateV2()를 사용하고 계신 경우라면 owner_inDate가 존재하지 않아 해당 에러가 발생할 수 있습니다.

만약 콘솔로 데이터를 생성하였을 경우, 해당 값이 공백일 수 있으니 해당 유저의 데이터 또한 owner_inDate가 비워져 있는지 확인해주시면 감사하겠습니다.

그렇네요.

생성한 것과 예전 유저는 owner_inDate 컬럼이 없네요.

현재 테이블에 owner_indate가 없는 유저들의 대상으로는 어떤 조치를 해줘야 하나요?
빌드 내에서 owner_indate 항목이 없다고 확인되면 Delete 후 새로 Insert 하도록 패치를 해야하나요?

해당 경우는 콘솔에서 데이터를 생성한 경우에만 보이며,
개발자님 말씀대로 읽어온 데이터에 owner_inDate가 포함되어있지 않을 경우 같은 정보로 새롭게 데이터를 삽입하는 것을 추천드립니다.

이후 업데이트에 콘솔에서 데이터를 생성할 경우에도 owner_inDate를 생성하도록 하겠습니다.
감사합니다.

조언해 주신 대로
유저가 자신의 데이터를 받아왔을 때 owner_inDate가 없는 경우
새로 기존 것은 삭제하고 새로 Insert 하도록 처리하였습니다.
그런데 owner_inDate를 안 쓰는 Delete(v1) 같은 경우 지금 deprecated인데
이후 버전 업데이트로 v2만 쓰게되면 owner_inData가 없는 v1 row를 삭제할 수 없게 되지는 않나요?

네, owner_inDate가 없어 데이터 수정에 실패하는 데이터는 삭제도 실패하기에,
해당 데이터는 V1버전으로 삭제해야합니다.

위에 대해 상세히 설명못드린점 죄송하며 아래 코드를 통해 로직만 간단히 파악해주시면 감사하겠습니다.

  1. 데이터 읽기
  2. 해당 데이터에 owner_inDate없으면 다음 로직 실행
  3. 읽어온 데이터 파싱하여 param으로 변경
  4. param을 이용하여 데이터 삽입
    4-a. 같은 내용의 param으로 sendLog
  5. 데이터 삽입 성공 시, 해당 데이터 삭제(혹은 이후 원활한 복원을 위해 남겨두었다가 콘솔에서 수동 삭제)
Param param = new Param();

var bro = Backend.GameData.Get("tableName",new Where());


if(bro.FlattenRows()[0].ContainsKey("owner_inDate") == false)
{
   itemInventory.LoadData(bro); // (예시)읽어온 데이터를 게임 내 변수에 적용

   //owner_inDate가 없는 경우
   Param param = Param.Parse(itemInventory); // (예시)기존 정보를 그대로 param에 다시 넣음
   var bro2 = Backend.GameData.Insert("table",param);

   Backend.GameLog.InsertLog("data_backup",param); // 혹시 모르니 데이터 백업 및 owner_indate없는 유저 조사
   if(bro2.IsSuccess())
   {
       Backend.GameData.Delete("table", "inDate");
  
       Backend.GameLog.InsertLog()// 데이터 변경 완료되었다는 로그 삽입
   }
}