[뒤끝팁] 방치형 게임 만들기 주의점! – 2탄🔥

이런 경험 있으신가요? ?‍♂️

유저 1:1 문의 예시 이미지

유저의 계정에 왜 이런 일이 발생했을까요?

서버의 롤백··· 유저의 잘못된 게임 플레이···. 원인은 여러 가지일 수 있지만, 대부분의 경우는 아래의 원인으로 발생하는 문제입니다.

? 데이터를 불러오지 못하고 초기화 값으로 시작한 상태에서 저장이 되어버렸기 때문이에요.


Q. 데이터를 불러오지 못한 상태로 게임이 진행될 수도 있나요?

네, 가능합니다. 테스트를 아무리 꼼꼼히 해도, 테스트할 때는 원하는 대로 실행이 되었어도, 실제로 게임을 서비스할 때 이러한 에러가 발생하는 경우가 종종 있는데요.

코드를 짤 때, 다양한 에러 케이스에 대해서 충분히 고려하지 않으면 문제는 얼마든지 발생할 수 있습니다.

현재 뒤끝은 개발자 여러분의 원활한 게임 운영을 위해, [개발 문서]를 통해 다음 에러 케이스들을 안내드리고 있는데요!

① 기능별로 발생할 수 있는 에러 케이스
② 서버 공통 에러 케이스

지금부터 뒤끝으로 방치형 만들기 2탄, ⚠️에러 케이스에 대비하는 법을 공유드리겠습니다.

A. 다양한 에러 케이스에 모두 대비해 주세요!

?방법

STEP 1. 기능별로 발생할 수 있는 에러 케이스에 대비하기
STEP 2. 공통 에러 케이스에도 꼭! 대비하기

※ 지금부터, 예시를 통해 에러 케이스에 대비하는 과정을 따라가 보겠습니다.

STEP 1.
뒤끝베이스의 [게임 정보 관리]는 Where 절을 이용한 데이터 불러오기 시에, 다음과 같은 리턴 케이스가 발생할 수 있습니다.

Success cases

● 조회에 성공한 경우
    statusCode : 200
    message : Success
    returnValue : GetReturnValuetoJSON 참조

 조회에 성공했으나, 해당 where 검색 조건에 해당하는 데이터가 존재하지 않는 경우
    statusCode : 200
    message : Success
    returnValue : {"serverTime":"2021-03-23T07:07:01.235Z","rows":[],"firstKey":null}
Error cases

 비활성화된 tableName에 불러오기를 시도한 경우
    statusCode : 412
    errorCode : PreconditionFailed
    message : inactiveTable 사전 조건을 만족하지 않습니다.

 존재하지 않는 테이블에 Get을 시도한 경우
    statusCode : 404
    errorCode : NotFoundException
    message : table not found, table을(를) 찾을 수 없습니다

*참고 : 관련 뒤끝베이스 SDK 문서 바로가기

개발 문서에서 위 내용을 확인하신 개발자님께서는 위 4가지 케이스에 대해, 아래와 같이 대비하게 됩니다.

① 테이블을 비활성화할 일은 없으니, 비활성화된 tableName에 불러오기를 시도한 경우에 대한 에러 케이스 처리는 필요 없겠네.
② 테이블 이름을 수정할 일도 없으니, 존재하지 않는 테이블에 Get을 시도한 경우에 대한 처리도 필요가 없겠군.
③ 그렇다면! 데이터 조회에 성공한 경우와, 데이터가 존재하지 않는 경우에 대해서만 케이스를 작성하면 되겠네?

그리고 위와 같은 생각의 경로를 통해, 코드를 아래와 같이 구성합니다.

int level = 0;
int money = 0;

public void GetMyData()
{
    var bro = Backend.GameData.GetMyData("PlayerInfo", new Where());

    JsonData gameDataListJson = bro.FlattenRows();

    if (gameDataListJson.Count <= 0)
    {
        Debug.Log("데이터가 존재하지 않습니다. 회원가입으로 간주합니다.");
        Backend.GameData.Insert("PlayerInfo");
        return;
    }
    level = Int32.Parse(gameDataListJson[0]["level"].ToString());
    money = Int32.Parse(gameDataListJson[0]["money"].ToString());
}

하지만 여기서 끝나는 것이 아닙니다. 개발 중 쉽게 간과하고 지나칠 수 있는 에러 케이스들이 있는데요.
바로 ‘서버 공통 에러 케이스’ 입니다.

서버 공통 에러 케이스는 말 그대로 어떤 기능을 사용하더라도 발생할 수 있는, 공통적으로 대비해야 하는 에러 케이스로 지금부터 함께 알아보겠습니다.

STEP 2.
뒤끝에는 기능별 에러케이스 이외에 발생할 수 있는 공통 에러케이스가 존재합니다.

*참고 : 관련 서버 공통 Error Cases 개발 문서 바로가기

그중에서도 아래 두 가지가 서버 에러를 발생시키는 주요한 원인입니다.

① 네트워크가 일시적으로 끊어졌거나 불안정할 경우
② 서버가 일시적 과부하 상태일 경우

발생 확률이 현저히 낮기는 하지만, 게임이 잘 되고 유저가 많아지면 발생하지 않는다는 보장이 없기 때문에 사전에 대비해 주시는 것이 좋은데요.

발생 확률이 낮다고 해서 대비해 주지 않았을 때, 최악의 경우 다음과 같은 문제 상황이 발생합니다.

?
(1) 서버 점검 후, 대거 유입된 유저들로 인한 서버 과부하로 에러 발생
(2) returnValue 값의 부재로, FlattemRows()나 GetTeturnValueToJSON()에서 필요한 JsonData를 불러오지 못함
(3) Exception이 발생하면서, 이후 로직이 실행되지 않음
(4) level과 money의 값을 받아오는 로직이 실행되지 않으므로, 초깃값인 0으로 게임이 시작

위 같은 최악의 시나리오를 막기 위해서는 ‘단단한 예외 처리‘가 되어있어야 하는데요?

아래와 같이 실패/성공 처리만 확실히 해 주어도, 간단하게 대비할 수 있으니 꼭 챙겨주시기 바랍니다.

int level = 0;
int money = 0;

void Start()
{
  if(GetPlayerInfoData() == false)
  {
    SceneManager.ChangeScene("처음씬");
  }
}

public bool GetPlayerInfoData()
{
    try
    {
        var bro = Backend.GameData.GetMyData("PlayerInfo", new Where());
        if (bro.IsSuccess())
        {
            JsonData gameDataListJson = bro.FlattenRows();
            if (gameDataListJson.Count <= 0)
            {
                Debug.Log("데이터가 존재하지 않습니다.");
                var bro2 = Backend.GameData.Insert("PlayerInfo");
                if(!bro2.IsSuccess())
                {
                   //Insert 또한 실패할 가능성이 있다!
                   return ExecuteErrorCase(bro2.ToString());
                }
            }
            else
            {
                level = Int32.Parse(gameDataListJson[0]["level"].ToString());
                money = Int32.Parse(gameDataListJson[0]["money"].ToString());

                return true;
            }
        }
        else
        {
            return ExecuteErrorCase(bro.ToString());
        }
    }
    catch (Exception e)
    {
      return ExecuteErrorCase(e.ToString());
    }
}

public bool ExecuteErrorCase(string error)
{
    Debug.LogError(error);
    Debug.LogError("데이터 읽기 도중 에러가 발생했습니다. 다시 시도해주세요");
    Param param = new Param();
    param.Add("Error", error);
    Backend.GameLog.InsertLog("로딩씬", param);

    return false;
}

위와 같이 예외 처리를 해 주었을 때 에러가 발생하면, GetPlayerInfoData()가 false로 리턴되면서
게임이 초깃값으로 시작되는 최악의 상황은 면할 수 있겠죠??


오늘은 예외처리의 중요성에 대한 이야기를 다루어 보았습니다.

유저들에게 보다 원활한 플레이 경험을 제공하기 위해서, 단단한 예외 처리가 반드시 필요한데요!
이 작업은 생각했던 것보다 번거로울 수 있습니다.

하지만 뒤끝 개발 문서에서 서버 공통 에러 케이스를 일괄 안내하고 있으니,
개발에 참고해 주시면 좋겠습니다?

언제나 개발자 여러분과 함께하는 뒤끝이 되겠습니다.
감사합니다.

4

댓글