[뒤끝팁] NEW! 랜덤 조회 기능으로 친구 추천 만들기

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

오늘은 새로운 랜덤 조회 기능으로 만드는 ‘친구 추천 기능’을 구현하는 법을 다루어 보려고 합니다.

💡새로운 랜덤 조회 기능이란?
원하는 데이터만 활용하기 때문에 DB 사용량이 적고, 응답 속도까지 빨라진 기존 랜덤 조회 기능의
단점을 보완한 신기능입니다.
아래 개발자 문서를 통해 구버전과 신버전의 차이를 크게 확인하실 수 있습니다.😊

새로운 랜덤 조회 기능은 두 가지 데이터를 제공합니다. 바로 유저의 inDate와 score입니다.

(이하, 신버전 함수 Backend.RandomInfo.GetRandomData의 리턴값)

				
					{
    "rows": [
        {
            "gamerInDate": "2022-06-30T10:06:32.327Z",
            "score": "13"
        },
        {
            "gamerInDate": "2022-06-30T10:06:34.024Z",
            "score": "19"
        },
        ...
    ]
}
				
			

반면에 유저 프로필을 구성하기 위해서는 레벨이나 전투력, 프로필 이미지 등 여러 데이터가 필요할 수 있는데요. 대부분의 뒤끝 기능들은 user의 inDate 만으로 더 풍부한 활용이 가능하기 때문에, 걱정하지 않으셔도 좋습니다.

그런 의미에서, 오늘은 GetRandomData에서 얻은 inDate를 통해 트랜잭션을 이용하여 랜덤으로 추천된 유저의 프로필 데이터를 한 번에 읽어와 적용하는 방법까지 안내하고자 합니다.

✍️ 사전 준비 안내

이번 예제에서는 아래 두 가지 기능을 활용합니다.

① 게임 정보 기능
② 랜덤 조회 기능

우선 본격적으로 게임 로직을 구현하기 전에, 초기에 세팅해야 할 몇 가지를 짚어보겠습니다.

1. 프로필을 등록할 게임 정보 테이블 생성
게임 정보 테이블 생성 화면

[게임 정보 관리] 메뉴에서 프로필을 보여줄 Public 테이블을 생성합니다.
프로필은 게임 내에서 타인에게 노출되는 부분이므로, Private가 아닌 Public으로 설정합니다.

2. 친구 추천용 랜덤 테이블 생성

아래 메뉴를 통해, ‘랜덤 조회 생성’ 버튼을 눌러 랜덤 조회를 생성합니다.
💡 [뒤끝 콘솔] > [뒤끝베이스] > [랜덤 조회]

랜덤 조회 생성 팝업
생성된 UUID

여기서 생성된 UUID는 이후에 데이터를 등록하거나 불러올 때 사용됩니다.

✅ 게임 로직

모두 준비가 되셨다면, 이제 유니티에서 다음과 같이 리스트 형태로 친구가 추천되도록
구현해 보겠습니다.

유니티 친구 리스트 구현 예시
1. 프로필에 등록할 게임 정보 데이터 생성
유니티 친구 추천 오브젝트

위 이미지는 유니티에서 친구 추천 창에 띄워 줄 오브젝트입니다.
이 프로필에는 다음 정보들을 보여주려고 합니다.

  • 프로필 사진
  • 유저 레벨
  • 닉네임
  • 자기소개 글

그리고 이 데이터를 PROFILE 테이블에 저장하도록 하겠습니다. 추가로 데이터 등록이 완료되었으면 level의 값을 랜덤 테이블에도 저장합니다.

아래 로직으로 회원 가입 시 해당 데이터가 등록되도록 한다면, 모든 유저가 추가되겠죠?

				
					int level = 1;

// 프로필 아이디는 로컬에 저장된 프로필 이미지 도감의 번호에 맞게 이미지를 가져오는 값입니다.
// 해당 예제에서는 이미지가 부족하여 숫자에 맞게 프로필 이미지의 색이 변하는 로직으로 대체했습니다.
int profile_id = rand.Next(0, 3);

Param param = new Param();
param.Add("profile_id", profile_id);
param.Add("level", level);
param.Add("content", $"안녕하세요. {Backend.UserNickName}입니다. 잘부탁드립니다.");
param.Add("nickName", Backend.UserNickName);

var bro = Backend.GameData.Insert("PROFILE", param);

if (bro.IsSuccess() == false) {
	Debug.LogError("데이터 등록 중 에러가 발생했습니다. " + bro);
	return;
}

// 랜덤 데이터 등록
bro = Backend.RandomInfo.SetRandomData(RandomType.User, "b24d7f40-7437-11ed-8567-b5ba2f1d82d9", level);

if (bro.IsSuccess() == false) {
	Debug.LogError("랜덤 데이터 등록 중 에러가 발생했습니다. : " + bro);
}
				
			
2. 추천 친구 리스트 불러오기

이제 처음에 등록했던 두 데이터를 이용해서, 추천 친구 리스트 UI를 만들어 보겠습니다.
로직은 다음과 같습니다.

  1. 랜덤 테이블 조회를 통해 랜덤 유저 inDate 가져오기
  2. 트랜잭션 리스트에 where.Equal(”owner_inDate”, 유저 inDate)를 가진 Get 트랜잭션 추가
  3. 트랜잭션 읽기 실행
  4. 트랜잭션의 리턴 값으로 나온 데이터들 친구 추천 오브젝트에 적용
				
					int myLevel = 1; // 내 레벨

// 1. 랜덤 테이블 조회를 통해 랜덤 유저 inDate 가져오기
var bro = Backend.RandomInfo.GetRandomData(RandomType.User, "b24d7f40-7437-11ed-8567-b5ba2f1d82d9" , myLevel, 5, 10);

if (bro.IsSuccess() == false) {
    Debug.LogError("랜덤 조회중 에러가 발생했습니다. : " + bro);
}

List<TransactionValue> transactionValues = new List<TransactionValue>();

for (int i = 0; i < bro.Rows().Count; i++) {
    Where where = new Where();
    
//2. 트랜잭션 리스트에 where.Equal(”owner_inDate”, 유저 inDate)를 가진 Get 트랜잭션 추가
where.Equal("owner_inDate", bro.Rows()[i]["gamerInDate"].ToString());

    transactionValues.Add(TransactionValue.SetGet("PROFILE", where));

    if (transactionValues.Count > 10) {
        break;
    }
}

// 3. 트랜잭션 읽기 실행
bro = Backend.GameData.TransactionReadV2(transactionValues);

if (bro.IsSuccess()) {
    //트랜잭션의 리턴값으로 나온 데이터들 친구 추천 오브젝트에 적용
    foreach (JsonData gameDataJson in bro.GetFlattenJSON()["Responses"]) {
        var friendObject = Instantiate(_friendItemObject, _userListGameObject.transform, true);
        if (friendObject.GetComponent<ItemObject>().Initialize(gameDataJson) == false) {
            Destroy(friendObject);
        }
    }
}
else {
    Debug.LogError("트랜잭션 읽어오기 도중 에러가 발생했습니다." + bro);
}


Debug.Log("랜덤 유저 불러오기가 완료되었습니다.");
				
			

그리고 프로필을 나타내는 오브젝트의 스크립트는 다음과 같습니다.

				
					public class ItemObject : MonoBehaviour {

    [SerializeField] private Image _userProfile;
    [SerializeField] private Text _userName;
    [SerializeField] private Text _userContent;
    [SerializeField] private Text _userLevel;
    [SerializeField] private Button _requestFriendButton;
    
    
    string _userInDate = String.Empty;

    public bool Initialize(JsonData userDataJson) {
        try {
            
            int profileId = int.Parse(userDataJson["profile_id"].ToString());
            _userLevel.text = userDataJson["level"].ToString();
            _userContent.text = userDataJson["content"].ToString();

            _userName.text = userDataJson["nickName"].ToString();
            _userInDate = userDataJson["owner_inDate"].ToString();

            switch (profileId) {
                case 0:
                    _userProfile.color = Color.blue;
                    break;
                case 1:
                    _userProfile.color = Color.yellow;
                    break;
                case 2:
                    _userProfile.color = Color.green;
                    break;
                
            }
            
            
            _requestFriendButton.onClick.AddListener( () => {
                var bro = Backend.Friend. RequestFriend(_userInDate);
                if (bro.IsSuccess()) {
                    Debug.Log("친구 요청을 보냈습니다");
                }
                else {
                    Debug.LogError("친구 요청을 보내지 못했습니다.");
                }

                _requestFriendButton.enabled = true;
                _requestFriendButton.name = "요청됨";
            });
            
            return true;
        }
        catch (Exception e) {
            Debug.LogError("데이터 파싱중 에러가 발생하였습니다. : " + e);
            return false;
        }
    }
}
				
			
3. 결과

오늘 안내드린 순서로 작업을 해 보시면, 아래와 같은 결과 화면을 확인하실 수 있습니다.

친구추천 인게임 UI

랜덤 테이블에서 검색된 유저 수만큼 트랜잭션을 불러오고, 그 데이터를 친구 추천 오브젝트에 적용시켜 보여주게 되는 것입니다.😊

어쩌면 오늘 내용을 보시고, 이렇게 생각하시는 분이 계실 수 있겠다는 생각이 듭니다.

🙋 : 구버전 랜덤 함수를 사용하면 한 번의 호출로 다 구현할 수 있는 거 아닌가요?

그러나 기존 구버전 방식은 10명의 유저를 랜덤으로 불러오기 위해 
1
0명보다 훨씬 많은 데이터를 비교하는 작업이 필요했습니다. 이 경우, 데이터가 많아질수록
속도는 느려지고 
가져오는 리소스 비용이 라이브에서는 치명적인 단점이 될 수 있습니다.

오늘 소개 드린 신버전 랜덤 조회 기능을 활용하면
더 낮은 비용으로, 더 빠르게 작동하는 친구 추천 기능을 구현할 수 있을 것으로 기대합니다.

관련하여 궁금한 부분이 있으시다면 언제든 댓글 남겨주시기 바랍니다.
감사합니다! 😊

2

댓글