롤백, 초기화 관련 문의

에러가 발생한 경우 아래 정보를 모두 제공해주시면 보다 정확한 답변이 가능합니다!

  • SDK 버전 : 5.0.0
  • 에러 코드 :
  • 스테이터스 코드 :
  • 에러메시지 :

안녕하세요 출시 후 몇몇 유저분들께 데이터가 초기화되거나 롤백된다는 문의를 받았습니다
정확한 상황을 설명해주지 않아서 확실히는 모르겠습니다ㅠ

문제는 몇몇 유저만 해당되는거 같고 저 같은 경우에는 테스트할 때 정상적으로 잘 작동하였습니다
데이터 저장은 보상을 획득하거나 이벤트 상황마다 각 테이블에 저장하도록 넣어두었고
코루틴으로 3분마다 자동으로 저장할 수 있게 해두었습니다

예외처리를 따로 해줘야한다는 말도 있고 해서
데이터 저장 중 손실되거나 제대로 전송이 안되는 상황이 있는지 궁금해서 질문 올립니다
코루틴으로 자동저장이 될 때 이벤트가 발생해서 롤백이 될 수 있는지도 궁금합니다.
그래봐야 길어야 몇분차인데 몇십분 전으로 돌아가고 그래서 문제가 되고 있습니다 ㅠㅠ
저장중에 게임을 종료하거나 튕기면 데이터가 초기화 될 수 있는지도 궁금합니다

안녕하세요 개발자님

뒤끝에서는 어떤 상황에서든 DB 초기화 같은 상황이 절대 발생하지 않습니다.

말씀하신 상황에서는 정황상

처음부터 데이터가 서버에 저장되고 있지 않은 상황같습니다.

ex)

A, B, C, D 시점에 저장을 시도하였는데, A만 성공하고 

B, C, D 저장을 실패했을 경우 유저는 게임을 재시작했을 때 A인 상태를 보고 롤백되었다고 생각할 수있음

3분마다 저장을 하고 계신다고 하셨는데,

저장을 하실 때 에러가 발생하셨을 때의 처리를 해주셨나요??

데이터 저장(업데이트) 중 에는 에러가 발생할 수 있고,

이 때 발생하는 에러를 개발자 문서, 커뮤니티 질문을 참고하여 처리를 해주시면 될 것 같습니다.

ex)

업데이트 실패 => 다시 업데이트 함수 호출

엑세스토큰 오류 => 엑세스토큰 갱신함수 호출 or 유저를 로그인 화면으로 되돌림

아 감사합니다
지금 5.0.0 버전을 사용중인데 업데이트는 비동기 함수를 쓰고 새로 추가된 기능으로 아직 바꾸지 않은 상태입니다
이것이 영향을 줄 수 있는건가요?

해당 사항은 SDK 버전에 관계없을 것 같습니다.

다양한 케이스에서 서버에서 에러가 발생할 수 있습니다.

다만 에러가 발생했을 때 UI로 유저가 뭔가 에러가 발생했다는 것을 인지할 수 있고,

이에 대한 적절한 처리가 이루어지면 말씀하신 상황은 처리하실 수 있을 것 같습니다.

  • param에 partition, gamer_id, inDate, updatedAt 네가지 필드가 있는 경우
    statusCode : 405
    errorCode : MethodNotAllowedParameterException
    message : MethodNotAllowed {param value}, 이용할 수 없는 {param value} 입니다
  • 퍼블릭테이블의 타인정보를 수정하고자 하였을 경우
    statusCode : 403
    errorCode : ForbiddenError
    message : Forbidden gamer, 금지된 gamer
  • 존재하지 않는 tableName인 경우
    statusCode : 404
    errorCode : NotFoundException
    message : table not found, table을(를) 찾을 수 없습니다
  • 비활성화 된 tableName인 경우
    statusCode : 412
    errorCode : PreconditionFailed
    message : inactiveTable 사전 조건을 만족하지 않습니다.
  • 하나의 row( column들의 집합 )이 400KB를 넘는 경우
    statusCode : 413
    errorCode : ServerErrorException
    message : request entity too large

개발자 페이지에는 이렇게 나와있는데
여기에 404 에러와 default 에러에서
받아온 테이블네임과 Param으로 다시 업데이트를 진행시키게 하였는데
괜찮은 방식인가요??
너무 아는게 없어서 버그는 많은데 죄송합니다 ㅠ

아닙니다! 죄송하지 않으셔도 괜찮습니다.

위의 에러는 테스트 할 때를 제외하고는 거의 발생하지 않는 에러들이고요,

일반적으로 발생하는 에러들은 아래 개발자 문서를 참고해주세요

그리고 에러 처리 방식은 말씀하신 방법대로 하시면 좋을 것 같습니다.

다만 계속해서 에러발생 시 동일한 업데이트를 실행하는 경우 무한루프에 빠질 수 있으므로,

일정횟수 (ex 3회) 까지 저장 시도 후 모두 실패하면 에러를 띄우고 메인화면에서 다시 로그인을 시도하게 하거나 게임을 종료하는 식으로 로직을 짜시면

유저들이 더욱 원활하게 플레이가 가능할 것 같습니다.

(일반적인 모바일 게임에서 서버와 통신을 실패하였습니다 메시지가 표시되면서 메인화면으로 가는 케이스가 이에 해당된다고 보시면 될 것 같습니다.)

앗 감사합니다 !!
이런식으로 작성해봤는데 default 에서 체크해주면 되는건가요??

            if(UpdateCount > 3)
            {
                HUDManager.instance.SetNotice("서버와 통신을 실패하였습니다 접속을 확인하여 주세요.");
                return;
            }
            UpdateCount++;

            switch (callback.GetStatusCode())
            {
                case "405":
                    Debug.Log("param에 partition, game_id, inDate, updatedAt 네가지 필드가 있는 경우");
                    break;
                case "403":
                    Debug.Log("퍼블릭테이블의 타인정보를 수정하고자 하였을 경우");
                    break;
                case "404":
                    Debug.Log("존재하지 않는 tableName인 경우 - TableName : " + tableName);
                    break;
                case "412":
                    Debug.Log("비활성화 된 tableName인 경우");
                    break;
                case "413":
                    Debug.Log("하나의 row( column들의 집합 )이 400KB를 넘는 경우");
                    break;

                default:
                    //Debug.Log("서버 공통 에러 발생: " + callback.GetMessage());
                    UpdateParm(tableName, param);
                    break;
            }

callback.IsSuccess() 함수를 이용하여 요청 성공/실패 여부를 확인 후
요청 실패 시 올려주신 프로세스를 따르도록 하면 좋을 것 같습니다.

개발자님 추가로

Access Token 이 올바르지 않은 경우
statusCode : 401
errorCode : BadUnauthorizedException
message : bad accessToken, 잘못된 accessToken 입니다

해당 에러의 경우 엑세스 토큰이 잘못되었거나, 로그인 정보가 만료되었거나, 로그아웃되었거나 하는 등의 상황에서 발생할 수 있습니다.

이 경우 연속으로 업데이트 요청을 보내도 모두 실패할 수 있으므로

해당 에러가 발생하는 경우 엑세스토큰 재발급 이후 다시 업데이트 요청을 보내는 것이 더 좋습니다.

엑세스토큰 재발급, 활성화 여부 확인 등의 함수는 아래 개발자문서를 참고해주세요.

넵 감사합니다~! 적용하고 업데이트 검토중입니다 ㅎㅎ