유니티 네트워크 데이터베이스 연동

JHO·2024년 12월 9일
0

유니티 3D

목록 보기
10/14

1. 파이어베이스 데이터베이스 생성 및 연동


1-1. 기본 설정

  • SDk 경우 기존에 이미 다운한 상태이므로, 새로운 Json만 다운.

1-2. 유니티 설정

  • Import

2. 주요 기능


2-1. DatabaseReference

2-2. BackEndManager

using Firebase;
using Firebase.Auth;
using Firebase.Database;
using Firebase.Extensions;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BackendManager : MonoBehaviour
{
    public static BackendManager Instance { get; private set; }
    private FirebaseApp app;
    public static FirebaseApp App => Instance.app;
    private FirebaseAuth auth;
    public static FirebaseAuth Auth => Instance.auth;
    private FirebaseDatabase database;
    public static FirebaseDatabase Database => Instance.database;
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
            return;
        }
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => 
        {
            if (task.Result == DependencyStatus.Available)
            {
                // Create and hold a reference to your FirebaseApp,
                // where app is a Firebase.FirebaseApp property of your application class.
                app = FirebaseApp.DefaultInstance;
                auth = FirebaseAuth.DefaultInstance;
                database = FirebaseDatabase.DefaultInstance;
                database.SetPersistenceEnabled(false);
                // Set a flag here to indicate whether Firebase is ready to use by your app.
                Debug.Log("Firebase dependencies check success");
            }
            else
            {
                Debug.LogError($"Could not resolve all Firebase dependencies: {task.Result}");
                // Firebase Unity SDK is not safe to use here.
                app = null;
                auth = null;
                database = null;
            }
        });
    }
}
  • using Firebase.Database 추가 및 FirebaseDataBase 변수 추가.
  • Firebase는 알아서 LocalPC쪽에 최근에 불러온 data를 caching을 해둠.
    -> database.SetPersistenceEnabled(false)를 해주어야, caching한 정보를 가져오지 않고, db에서 가져옴.

2-3. 데이터 한번 쓰기

DatabaseReference root = BackendManager.Database.RootReference;
// 기본 자료형을 통한 저장
root.Child("string").SetValueAsync("텍스트");
root.Child("long").SetValueAsync(10);
root.Child("double").SetValueAsync(3.14);
root.Child("bool").SetValueAsync(true);
// List 자료구조를 통한 순차 저장
List<string> list = new List<string>() { "첫번째", "두번째", "세번째" };
root.Child("List").SetValueAsync(list);
// Dictionary 자료구조를 통한 키&값 저장
Dictionary<string, object> dictionary = new Dictionary<string, object>()
{
    { "stringKey", "텍스트" },
    { "longKey", 10 },
    { "doubleKey", 3.14 },
    { "boolKey", true },
};
root.Child("Dictionary").SetValueAsync(dictionary);

  • DatabaseReference 위치에 데이터를 저장하고 해당 경로의 기존 데이터를 교체 가능.
  • 쓰기 작업으로 저장이 가능한 데이터 자료형은 string, long , double, bool 이 사용 가능하며, List<자료형>, Dictionary<string, 자료형>과 같이 사용이 가능한 자료형의 자료구조 또한 사용 가능.

2-4.데이터 모두 쓰기

[System.Serializable]
public class UserData
{
    public string name;
    public string email;
    public SubData subData = new SubData();
}
[System.Serializable]
public class SubData
{
    public int value1;
    public int value2;
}
DatabaseReference root = BackendManager.Database.RootReference;
UserData userData = new UserData();
userData.name = "Name";
userData.email = "Test@gmail.com";
userData.subData.value1 = 1;
userData.subData.value2 = 2;
// Json 포멧을 통한 저장
string json = JsonUtility.ToJson(userData);
root.SetRawJsonValueAsync(json);

  • DatabaseReference 위치에 데이터를 저장하고 해당 경로의 기존 데이터를 교체 가능.
  • 쓰기 작업으로 저장하는 데이터는 json형태의 데이터를 지원.
  • [System.Serializable]은 테스트해보니 없어도 db에 Write 가능.

2-5. 데이터 일부 쓰기

DatabaseReference root = BackendManager.Database.RootReference;
Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary["/name"] = "변경 이름";
dictionary["/subData/value2"] = 99;
// 특정 하위 노드 변경
root.UpdateChildrenAsync(dictionary);

  • DatabaseReference 위치에 다른 하위 데이터를 덮어쓰지 않고 특정 하위 노드에만 데이터 쓰기 가능.
  • dictionary.Add("name", "변경 이름");
    dictionary.Add("subData/value2", 99);
    -> 이런식으로도 가능.

2-6. 데이터 읽어 오기

 DatabaseReference root =  BackendManager.Database.RootReference;
 DatabaseReference data = root.Child("Data");
 data.KeepSynced(true);
 data.GetValueAsync().ContinueWithOnMainThread(task =>
 {
     if (task.IsFaulted)
     {
         Debug.Log("GetValueAsync encountered an error: " + task.Exception);
         return;
     } 
     DataSnapshot snapshot = task.Result; 
     // 하위 자식 값 불러오기
     Debug.Log(snapshot.Child("Version").Value);   // "1.0.1"
     // 하위 자식들 값 불러오기
     foreach (DataSnapshot child in snapshot.Child("User").Children)
     {
         Debug.Log(child.Value);     // User1, User2, User3
     }     
     // Json 포멧을 통한 불러오기
     string json = snapshot.GetRawJsonValue();
     Data data = JsonUtility.FromJson<Data>(json);
 });

  • DatabaseReference 위치에 데이터를 읽기 위해 파이어베이스는 DataSnapShot을 사용.
  • 작업 결과의 하위 데이터 등 해당 위치등의 모든 데이터를 포함하는 데이터.
  • 특정 값 가져올때, level=int.Parse(snapshot.Child("level").Value.ToString()); 이런식으로 가능.
  • 또는, 파이어베이스의 실시간 데이터베이스는 기본자료형을 long, double, string, bool을 사용하므로,
    -> long level = (long)snapshot.Child("level").Value; 사용가능.
  • JsonUtility의 경우 Serializable 및 monobehaviour를 상속받지 않은 class만 가능!
    - data.KeepSynced(true);을해주면 db에서 최근 update를 알아서 계속 가져옴. -> 다만 사용시 트래픽문제가 더 복잡할순있음, 하지만 확실하게 캐싱된값이 아닌 db에서 data를 가져오기 가능.
    (또다른 예시1)

    (또다른 예시2)
  • 주의사항: Dictionary의 경우 JsonUtility를 사용불가능하기때문에 따로 불러오거나 작성해야함!

2-7. 데이터 트랜잭션

  • 이렇게 Dictionary 형태로 저장도 가능.
    -> firebase로 보면
    UserData
    ㄴ ID
    ---ㄴ_gift
    ------ㄴId : 3

2-8. 데이터 이벤트

  • ValueChanged : 경로의 전체 내용에 대한 변경 확인
  • ChildAdded : 경로의 하위 항목 추가 확인
  • ChildChanged : 경로의 하위 항목 변경 사항을 확인
  • ChildRemoved : 경로의 하위 항목 삭제를 확인
  • ChildMoved : 경로의 하위 항목 순서 변경을 확인

2-9. 데이터 정렬

  • OrderByChild : 지정된 하위 키의 값에 따라 결과를 정렬.
  • OrderByKey() : 하위 키에 따라 결과를 정렬.
  • OrderByValue() : 하위 값에 따라 결과를 정렬.

2-10. 보안 규칙

  • 위에서부터 조건 체크.
    -> rules의 .read와 .write가 true라면, 아래의 data들의 read write 여부상관없이 모두 읽고 쓰기가 가능.
  • GameData의 경우 write권한은 불가능.
  • UserData의 경우 Write권한은 다른사람이 아닌 본인의 Data는 write권한 가능.

2. 또다른 Db 사용 예시들


2-1.

  • var userChildren = snapShot.Children.ToList();
  • userChildren[i].Key.ToString() -> 아이디값들 가져옴.
profile
개발노트

0개의 댓글