[업데이트 소식] 자동 리프레시 & 자동 재호출 기능을 통한 에러 처리 방법

안녕하세요!
개발이 필요 없는 게임 서버, 뒤끝입니다.🙋‍♀️

뒤끝 SDK 5.8.0 이상의 버전에 새로운 편의 기능이 추가되었다는 사실을 알고 계신가요?
바로 ‘자동 에러 처리’ 기능입니다!

 *더 정확히 말씀드리자면 공통 에러 케이스 자동 처리 로직입니다.

사용법은 아주 간단한데요, 지금 바로 공유드리겠습니다.

① 유니티에서 뒤끝 Inspector 열기 (상단 메뉴 > The Backend > Edit Settings)
② 새로 추가된 Error Handling 목록에서 필요한 부분을 체크하기
③ 별도의 코딩은 필요 없으니 안심해 주세요.

크게 두 개 카테고리의 기능이 추가되었으며, 내용은 아래와 같습니다.

유니티 뒤끝 Inspector 자동 처리 목록

지금부터 정확히 어떤 기능이 추가되었는지, 아래 목차에 따라 코드와 함께 알아보겠습니다.

⚓ 목차

1. 자동 리프레시 기능 (Auto Refresh Token)

Auto Refresh Token은 체크만으로 bad accesstoken 에러를 자동 확인하는 기능입니다.

뒤끝 함수가 호출되고 응답이 돌아와 BackendReturnObject에 할당되기 직전, SDK에서 직접 ‘bad accesstoken 에러의 발생 여부’를 체크하고, 에러가 발생했다면 토큰 재발급(Backend.BMember.RefreshTheBackendToken())을 실행합니다.

로직은 다음과 같습니다.

				
					// 1) GameData.Get()을 통해 불러오기 함수 호출
var bro = Backend.GameData.Get("tableName", new Where());
// 2), 3) 로직을 실행한 후
if (bro.IsSusccess()) {
    // 4) 토큰 재발급 성공
    Debug.Log("성공했습니다!");
}
else {
     if(bro.IsBadAccessTokenError()) {
        // 5) 토큰 재발급 실패
        Debug.LogError("게임 진행이 불가능합니다. 로비로 돌아옵니다.");
     }
  }
}
				
			

1) GameData.Get()을 통해 불러오기 함수 호출
2) 함수 호출 결과로 bad accesstoken 에러 발생!
3) bro가 bad accesstoken 에러로 할당되기 전, SDK 내부에서 토큰 재발급 요청(2번 줄로 넘어가지 않습니다.)
4) 토큰 재발급이 성공할 경우, 1번에서 호출했던 요청을 다시 요청하여 bro에 할당
5) 토큰 재발급이 실패할 경우, 2번 bad accesstoken 에러를 bro에 할당

SDK 내부에서 자동으로 에러를 체크한 뒤 토큰 재발급을 진행하기 때문에,
별도의 로직 추가가 필요하지 않습니다.

이 💡Auto Refresh Token 기능을 사용할 때 가장 중요한 점은 다음의 경우에 대비해 주시는 것입니다. 바로 유저가 새로운 기기로 로그인했을 때, 디바이스가 차단되었을 때 등의 외부 요인으로 토큰 재발급이 지속적으로 실패할 경우인데요. 

이 부분은 아래 코드와 같이, 뒤끝 공통 에러 핸들러를 활용하시면 대응하실 수 있습니다.

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

if (bro.IsSusccess()) {
    Debug.Log("성공했습니다");
}
else {
    //문제가 발생했습니다.
    // 에러 핸들러에서 로직 처리
}


Backend.ErrorHandler.OnOtherDeviceLoginDetectedError = () => {
  Debug.LogError("게임 진행이 불가능합니다. 로비로 돌아옵니다.");
};
				
			

만약 공통 에러 핸들러를 호출하지 않는 경우에는, 반드시 아래와 같이  BackendReturnObject의 IsBadAccessTokenError() 함수를 체크해, 게임 진행을 중단시켜주시기 바랍니다.

(단 이 방법은 함수가 100개라면 100개의 함수에 모두 로직을 추가해 주셔야 합니다)

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

if (bro.IsSusccess()) {
    Debug.Log("성공했습니다");
}
else {
    // 모든 뒤끝 함수에서 이 로직을 추가해야함
    if(bro.IsBadAccessTokenError()) {
      Debug.LogError("게임 진행이 불가능합니다. 로비로 돌아옵니다.");
    }
}
				
			

2. 자동 재호출 기능 (Retry When ~ Error)

새롭게 추가된 자동 재호출 기능 3가지는 무엇일까요?
바로 아래의 원인으로 에러가 발생하였을 때, 자동으로 요청을 세 번까지 재시도하는 기능입니다.

1) Retry When Client Request Fail Error
2) Retry When Server Error
3) Retry When Bad Signature Error

이 기능을 사용하면 아래와 같이 에러가 발생하였을 때 동일한 요청을 자동으로 세 번 보내고 응답을 리턴합니다.

자동 재호출 기능 종류

위 에러들은 로직에는 문제가 없지만 유저 기기의 데이터 통신 상태가 좋지 않을 때, 지하철을 타면서 와이파이가 바뀔 때, 서버에 일시적 문제가 발생했을 때 나타나게 됩니다. 즉 찰나에 발생하는 것이기 때문에, 동일한 요청을 여러 번 보내는 것으로 해결이 될 수 있습니다.

바로 여기서 자동 재호출 기능의 편의성이 잘 나타나게 되는데요.
위 상황을 해결하기 위해서, 기존에는 아래와 같이 비동기 함수를 동일한 요청으로 반복 호출해야 했습니다. 번거롭기도 하고, 구현하고 나면 가독성이 크게 떨어지는 단점이 있습니다.

				
					// 해당 함수는 로그인 이후 모든 게임 정보를 불러오는 함수입니다.
void GetDataAll(){
   GetData("UserInfo", 3);
}

// repeatCount는 재귀함수를 시도할 횟수입니다. 재귀를 돌수록 하나씩 감소합니다.
void GetData(string tableName, int repeatCount = 3) {
    if(repeatCount <= 0) {
        Debug.LogError("3번을 시도해보았지만 전부 실패했습니다.");
    }

    Backend.GameData.Get(tableName, new Where(), callback => {
      
      // 500, 502등의 서버 에러가 발생할 경우 한번 더 호출하도록 재귀함수를 호출합니다.
      if(callback.IsServerError() || callback.IsClientRequestFailError() || callback.GetMessage().Contains("signature")) {
          GetData(repeatCount - 1);
      }
    });
}
				
			

반면에 이번에 추가된 자동 재호출 기능은, 세 번의 호출을 한 번에 처리하기 때문에 로직을 짜실 때 한 번만 호출하는 것으로 구현이 가능합니다. 아래 코드를 참고해 주세요.

				
					
    Backend.GameData.Get(tableName, new Where(), callback => {
      // 한번만 호출한 것 처럼 보이지만 내부 로직에서 2번 더 호출한 이후, 결과를 리턴합니다.
      if(callback.IsServerError() || callback.IsClientRequestFailError() || callback.GetMessage().Contains("signature")) {
          Debug.LogError("3번을 시도해보았지만 전부 실패했습니다.");
      }
    });
}
				
			

🚨잠깐🚨 자동 재호출 기능 사용 시, 명확히 해야 할 부분이 있습니다.

자동 재호출 기능의 역할은 ‘에러를 해결하는 것’이 아니라, 유저에게 노출되는 ‘에러의 빈도 수를 줄이는 것’입니다. 근본적으로 와이파이가 끊어져 있거나 앱 자체에 문제가 발생한 경우는, 재호출로 해결될 수 없는 부분이기 때문입니다.

따라서 오늘 소개드린 세 가지의 공통 에러케이스(Client Request Error, Server Error, Bad Signature Error) 이외에 다른 에러 케이스도 꼭 대비를 해주셔야 합니다. 예를 들어, 내 랭킹 불러오기 기능에서 랭킹 정보를 찾지 못할 경우에는 내 랭킹 데이터를 삽입하는 로직을 추가해 주세요!

오늘은 SDK 5.8.0 버전부터 새로 추가된 편의 기능을 소개 드렸는데, 어떠셨나요?

이번 업데이트를 통해 조금 더 편한 에러처리와, 조금 더 깔끔한 코드 작성이 가능해지실 것으로 기대합니다. 혹시 아직 SDK 업데이트를 진행하지 않으셨다면 신규 버전을 잘 활용해 보시기를 추천 드립니다.

궁금한 부분은 언제든 댓글로 남겨 주시기 바라며, 앞으로도 개발자 여러분의 지속 가능한 개발을 함께 고민하고 실천하는 뒤끝이 되겠다는 약속을 드리면서 이만 마치겠습니다.

감사합니다!

2

댓글