본문 바로가기
개발/Unity

Unity)Firebase) Database 설정 및 읽고 쓰기

by 테샤르 2020. 9. 24.

Firebase Database 설정 및 읽고 쓰기

Firebase에서 지원하는 많은 기능 중 Database를 사용하고자 한다. 간략하게 Firebase는 실시간 데이터베이스를 지원하는데 간단한 게임의 Database를 대신해서 사용하기에 꽤나 쓸만하다고 생각한다.

Firebase를 이용해서 실제 서비스도 해봤는데,

무료로 쓰다가 패킷이 많으면 유료로 전환이 가능해서 처음 구축해서 쓰기에는 좋다.

 

NoSql 기반으로 JSON 형태로 데이터를 읽고 쓸수 있다.

 

반응형

Firebase 에서 Realtime Database를 선택한다.

여기에서 규칙을 설정해야한다. 규칙이라는 건 간단히 말하면 권한이다. 해당 경로에 접근할 수 있는 권한을 부여하는 항목이다. 기본적으로 모두 다 접근 가능한 형태로 작업을 진행한다.

규칙에 대한 설명 URL : https://firebase.google.com/docs/database/security?authuser=0

 

Firebase 실시간 데이터베이스 규칙 이해

Firebase 실시간 데이터베이스 보안 규칙은 데이터베이스에 대한 읽기 및 쓰기 권한, 데이터의 구조 및 색인 생성 여부를 결정합니다. 이 규칙은 Firebase 서버에 적용되며 항상 자동으로 적용됩니다

firebase.google.com

로그인 이후에 User의 데이터를 쌓기 위해서는 규칙을 수정해야할 필요가 있다.

간단히 보면 config에는 read는 누구든지 가능/write는 불가능 인 상태이고

users에는 인증된 유저(로그인한 자신의 uid가 일치한 유저만 접근 가능)로 설정했다.

 

<Firebase RealTimeDatabase 규칙>

{
  "rules": {
     "users": {
      "$user_id": {
        ".read": true,
    		".write": "auth !==null && auth.uid == $user_id"
      },
       "config":{
         ".read": true,
    			".write": false
			}
    }
  }
}
반응형

 

공식문서에 내용을 보면 다음과 같다.

(선택사항) 제한된 액세스를 위한 편집기 설정

공개 액세스를 금지하는 규칙을 사용하려면 Unity 편집기에서 서비스 계정을 사용하도록 SDK를 구성해야 합니다. 이렇게 하면 테스트하는 동안 최종 사용자로 가장하는 것도 가능합니다. 이와 같이 하려면 우선 다음 주소에서 새 p12 파일을 만듭니다.

https://console.cloud.google.com/iam-admin/serviceaccounts/project?project=YOUR-FIREBASE-APP

 

여기에서 YOUR-FIREBASE_APP은 [프로젝트 설정]-[프로젝트 ID]이다. 나의 경우는 

https://console.cloud.google.com/iam-admin/serviceaccounts/project?project=test-6cbb5가 된다.

Google Cloud Platform에 들어가서 계정에 키만들기를 진행한다.

키를 생성하고 생성된 키를 다운하는데 이것을 위에 경로에 넣어야한다. 고정된 데이터 경로이기 때문이다.

Assets-Editor Default Resources에 넣어준다.

Firebase 의 Database의 주소는 다음과 같다.

 

이제 코드를 작성하자

쓰는 코드는 다음과 같다.

 private FirebaseDatabase database = null;
 
 public class FirebaseDbInfo 
{

    public string name ="";
    public int gold = 0;

}



 
 
 private void InitializeFirebase(){
 
 //Auth 이후
 
 FirebaseApp.DefaultInstance.SetEditorDatabaseUrl(https://test-6cbb5.firebaseio.com/);
  this.database = FirebaseDatabase.DefaultInstance;
  
   database.RootReference.GetValueAsync().ContinueWith(task =>{
            if(task.IsCompleted){
                DataSnapshot snapshot = task.Result;
                // 데이터를 출력하고자 할때는 Snapshot 객체 사용함
 
                foreach(DataSnapshot data in snapshot.Children){
                    //IDictionary info = (IDictionary)data.Value;
                  
                    Debug.LogFormat("[Database] key : {0}, value :{1}",data.Key,data.Value);
                }
            }
        });
   }
   
       public void UpdateDbUserInfo(){
       
        Debug.LogFormat("[Database] Insert !");
        FirebaseDbInfo info = new FirebaseDbInfo();
        info.name="테스트!";
        info.gold = 1234;

        string json = JsonUtility.ToJson(info);

        string key = user.UserId;
        this.database.GetReference("users").Child(key).SetRawJsonValueAsync(json);
        
        }
반응형

 

해당 코드를 쓰게 되고 Button으로 동작 처리를 하게 되면 다음과 같이 정상적으로 값이 써지는 것을 알 수 있다.

여기에 실제 User의 정보를 저장하고 읽고 쓰면된다. NoSql이라서 JSON 형태로 파싱을 해야 하는 게 조건이고 

네트워크가 안되는 상태일 때도 데이터를 기본적으로 저장하고 네트워크가 연결이 되는 순간 데이터를 다 밀어 넣는다. 기본적으로 데이터를 보장해주는 것과 쉽게 접근이 가능한 장점이 있다.

계정을 기반이라서 최초 계정 생성하는과정에서는 네트워크가 필요하다.

 

읽는 코드는 다음과 같다.

 DatabaseReference database = FirebaseDatabase.DefaultInstance.RootReference;
        database.Child(_loadPath).GetValueAsync().ContinueWith(task =>
        {
              if (task.IsFaulted)
              {
                  Logger.LogError("Error Database");
              }
              else if (task.IsCompleted)
              {
                  DataSnapshot snapshot = task.Result;
                  object value = snapshot.Value;
                  if (null != (value as IDictionary))
                  {
                      dic = (IDictionary<string, object>)snapshot.Value;
                  }
                  else
                  {
                      dic = new Dictionary<string, object>();
                      if (null != snapshot.Value)
                      {
                          dic.Add(snapshot.Key, snapshot.Value);
                      }
                  }
              }
        });

 

 

 

반응형

댓글