파이어베이스 (Firebase)

2021. 6. 2. 15:18기술/네트워크

반응형

뭐든 책 보고 익히는 것이 최고인거 같네요. 누구든 할 수 있습니다. 다음은 회사에서 구매해준 고마운 책 ㅋ

책에는 다양한 정보가 있습니다만 참조만 하고 필요한 기능과 요점 부분을 익히면 될것 같습니다.

책은 Android Studio 기반으로 작성되었습니다. 그리고 정리가 잘 되어있고 웹에서 공부하는거 보다 조금 더 편안한 느낌이랄까..

 왜 파이어베이스를 사용할까?

 데이터를 스마트 기기에 저장할 것인가? 아니면 인터넷에 저장할 것인가?

게임에서 랭킹이나 길드같은 콘텐츠를 구현하기 위해서는 인터넷에 데이터가 저장되어 있어야 한다.

그러므로 파이어베이스를 살펴보도록 한다.

 데이터베이스(DB)에 대해서도 공부가 필요하긴 한데, 웹 상에 엑셀처럼 저장되는 데이터 정도로 생각하도록 하자.

 또는 c#의 Dictionary같은 자료구조로 생각해도 될거 같다. 메모리에 저장되는가 서버디스크에 저장되는가와 데이터 설계구조가 다른. 물론 데이터 추가하거나 가져오는 API도 다른.

 

 실시간 데이터베이스 (Realtime Database)

1. 파이어베이스에 대해서 다양한 정보와 소개등이 있는데 대략 살펴보고 빠르게 접근해 보도록 하자.

 구글로그인을 하고 파이어베이스 사이트에 들어가서 콘솔로 이동한다. 테스트 프로젝트 하나 만들어보도록 하자.

 

2. 만들어진 테스트 프로젝트를 클릭하면 Realtime Database에 들어갈 수 있다. 데이터베이스를 만들자.

(책에 읽어보면 실시간 데이터베이스 보다 클라우드 파이어스토어가 더 좋다고 나와있다. 비용도 더 저렴)

 

+버튼을 클릭해서 트리구조를 잘 만들어 보자.

3. 유니티 파이어베이스 SDK 다운로드 Unity 프로젝트에 Firebase 추가 (google.com)

4. 유니티 새 프로젝트 생성 (Android SwitchPlatform)

5. dotnet4/FirebaseDatabase.unitypackage Import

6. 파이어베이스 웹에서 패키지 명으로 Android 프로젝트 추가

   다운로드 받은 google-services.json은 설정 정보 파일인데 유니티 Assets/Plugins 폴더에 복사

7. TestFirebase.cs 스크립트 만들고 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    public class FBRank
    {
        public FBRank(string id, uint stage)
        {
            ID = id;
            Stage = stage;
        }
        public string ID = "";
        public uint Stage = 0;
    }
  
    void Start()
    {
        FirebaseApp.DefaultInstance.Options.DatabaseUrl = new Uri("https://testfirebase-4c914.firebaseio.com/");
        m_DB = FirebaseDatabase.DefaultInstance.RootReference;
        AddNewRank();
    }
    
    void AddNewRank()
    {
        FBRank rank = new FBRank("google_id_d"4);
        string json = JsonUtility.ToJson(rank);
 
        m_DB.Child("rank").Child("3").SetRawJsonValueAsync(json);
    }
    
    void GetRank()
    {
        DatabaseReference rank = FirebaseDatabase.DefaultInstance.GetReference("rank");
        rank.GetValueAsync().ContinueWith(task =>
        {
            if (task.IsCompleted)
            {
                DataSnapshot snapshot = task.Result;
 
                foreach (DataSnapshot data in snapshot.Children)
                {
                    IDictionary rankInfo = (IDictionary)data.Value;
                    Debug.LogFormat("id : {0} stage : {1}", rankInfo["ID"], rankInfo["Stage"]);
                }
            }
        });
    }
cs

 

 

8. 데이터베이스를 만들 때 보안 모드를 잠금 모드로 하고 만들었더니 데이터를 거부한다.

 일단은 이 부분을 true로 해두면 다시 테스트 모드 처럼 데이터를 허용하기는 하는데 실제 상용화 했을 경우 다시 false로 바꾸고 인증된 유저만 DB에 접근 가능하도록 해야한다. 

 본인은 아직 상용화에 사용을 안해봤는데, 다른 상용화 프로젝트 살펴보니 그냥 true, true로 해두고 상용화 해도 되는거 같다.

9. 데이터 추가된 것 확인 유니티에서 데이터 얻기 확인하고 보안 모드 다시 false로 한 다음 데이터 접근 방법 생각

10. 만약에 유저가 500만명이라면 json rank가 많아질 것이므로 위와같이 처리하는건 옳지 않은것 같고 빠르게 개발해야 하면 구글 리더보드 사용해야 하고 아니면 다른 방법을 생각해야 하겠다. 길드 정보도 수백개가 있다면 처리하는 방식 이런걸 생각해야겠네..

 -> https://firebase.google.com/docs/database/unity/retrieve-data?hl=ko
 데이터 검색/데이터 정렬 및 필터링 부분을 보면 score로 정렬해서 원하는 수 만큼의 데이터를 가져올 수 있는 것 같다.

한 10개 정도의 데이터를 가지고 3개정도 가져오는 테스트를 해보자.

 

 참조 : Unity용 Firebase 실시간 데이터베이스 시작하기 (google.com)

 

Unity용 Firebase 실시간 데이터베이스 시작하기

Firebase 실시간 데이터베이스는 NoSQL 클라우드 데이터베이스를 사용하여 데이터를 저장하고 동기화합니다. 모든 클라이언트에서 실시간으로 데이터가 동기화되고 앱이 오프라인일 때도 데이터

firebase.google.com

 참조 블로그 : 파이어베이스(Firebase) 실시간 데이터베.. : 네이버블로그 (naver.com)

 

파이어베이스(Firebase) 실시간 데이터베이스 사용하기

파이어베이스는 실시간 데이터베이스(Runtime Database)도 제공해주고 있습니다. 복잡한 서버 설정이나 ...

blog.naver.com

 

 스토리지 (Storage)

 파이어베이스 클라우드 스토리지는 유니티 에셋 올려두고 다운로드 해서 게임 플레이 하는데에 사용할 수 있는거 같다.

사실 서버 요금 문제와 리소스와 에셋 관리하는거만 해도 문제가 복잡하긴 하다. 예전에 에셋 다운로드 관리하는 부분에 대해 구현한 적이 있었는데 조금 큰 규모의 게임에 사용되는 기능이라 다음에 필요할 때 연구해봐야겠다.

 길드 아이콘이라든가 그런 서비스를 제공한다면(?) 이미지 파일을 업로드 하고 다운로드 할 수 있을거 같다는 생각이다. 깊이있게 들어가면 복잡하다..

 

 파이어스토어 데이터베이스 (Firestore Database)

1. 파이어베이스 콘솔에서 유니티 앱을 추가해 주어야 한다. 그래야 유니티와 파이어스토어가 연결된다.

Unity 프로젝트에 Firebase 추가  |  Firebase Documentation (google.com)

 

Unity 프로젝트에 Firebase 추가  |  Firebase Documentation

Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register 의견 보내기 Unity 프로젝트에 Firebase 추가 plat_ios plat_android pla

firebase.google.com

 

2. 클라우드 파이어스토어를 테스트 해보자.

Cloud Firestore 시작하기  |  Firebase Documentation (google.com)

 

Cloud Firestore 시작하기  |  Firebase Documentation

Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register 의견 보내기 Cloud Firestore 시작하기 이 빠른 시작에서는 Cloud F

firebase.google.com

 

위 사항대로 하면 되지만 <노트>

1. 유니티 프로젝트를 생성 했을 때 회사이름과 패키지명을 제대로 써줘야 한다.

2. dotnet3에서 임포트 하였더니 Task 네임스페이스 관련 에러가 나서 dotnet4에서 임포트 

3. google-services-desktop 파일이 없어서 나는 에러는 유니티 프로젝트를 껐다가 다시 키면 생성된다.

 

데이터 넣기 예제코드를 실행하면 다음과 같이 users 컬렉션에 alovelace 문서가 추가되고 문서 안에 필드들이 추가된 것을 확인할 수 있다.

 

예제코드는 공개되어 있으니 함수 정리와 이 자료를 어떻게 설계하고 구성하는지가 중요한거 같다.

컬렉션으로 Users, Guilds, ... 등등 구성하고

문서에는 Users > Characters, Users > Items, ...

필드에는 CharacterData, ItemData, ... 이렇게 구성하면 될거 같은데 이론만 그렇고 실습을 해 봐야한다.

어렵지 않다. 하다보면 다 된다. ㅋ

 

예제 코드를 참고하여 코드 정리 및 함수화

제너릭 사용 하여 클래스를 Dictionary로 만들어서 일일이 Key, Value를 대입해서 만들지 않고 편리하게 사용가능하도록

[해당 코드는 일단 비공개, 구글링 하다보면 나옴]

 

함수 사용 방법

public class FireStore : MonoBehaviour
{
    FirebaseFirestore m_db;
    
    void Start()
    {
        m_db = FirebaseFirestore.DefaultInstance;
        AddUser(new UserData("닉네임8글자", "user1@gmail.com"));
    }

    public void AddUser(UserData userData)
    {
        DocumentReference docRef = m_db.Collection("유저").Document(userData.NickName);
        docRef.SetAsync(userData.ToDictionay()).ContinueWithOnMainThread(task =>
        {
            Debug.Log("Added data to the alovelace document in the users collection.");
        });
    }
}

위와 같은 방법으로 필요한 정보를 DB에 저장할 수 있다.

필요한 유저데이터 클래스에 변수를 추가하면 DB 필드에 저장 가능.

정보 갱신 (레벨업 했을 때, 아이템 구입 등등)

2 레벨인 유저를 10명 가져오는 함수 (정렬은 .OrderBy를 하면된다.)

이 Query 클래스를 통해 랭크 정보를 정렬해서 가져올 수 있는데,

 

예를 들어 랭크 시스템에서 쓰자면

1 ~ 20위 그럼 21 ~ 30위는 WhereEqualTo 대신에 WhereGreaterThan, StartAt(minRank = 21), EndAt(maxRank = 30) 함수를 쓰면된다.

    public void GetUserByLevel(uint level)
    {
        Query userQuery = m_db.Collection("유저").
            WhereEqualTo("Level", level).
            Limit(10);
        userQuery.GetSnapshotAsync().ContinueWithOnMainThread(task =>
        {
            QuerySnapshot userQuerySnapshot = task.Result;

            foreach (DocumentSnapshot document in userQuerySnapshot.Documents)
            {
                Dictionary<string, object> documentDictionary = document.ToDictionary();
                Debug.Log(string.Format("LevelBy 닉네임: {0}, Mail: {1}, Level: {2}", document.Id, documentDictionary["Mail"], documentDictionary["Level"]));
            }
        });
    }
    
    public void GetUserByLevelGreater(uint iLevelGreater, int userCount)
    {
        Query userQuery = m_db.Collection("유저").
            WhereGreaterThan("Level", iLevelGreater).
            Limit(userCount);
        userQuery.GetSnapshotAsync().ContinueWithOnMainThread(task =>
        {
            QuerySnapshot userQuerySnapshot = task.Result;

            foreach (DocumentSnapshot document in userQuerySnapshot.Documents)
            {
                Dictionary<string, object> documentDictionary = document.ToDictionary();
                Debug.Log(string.Format("LevelGreater 닉네임: {0}, Mail: {1}, Level: {2}", document.Id, documentDictionary["Mail"], documentDictionary["Level"]));
            }
        });
    }

일단 파이어베이스는 여기까지! 실무 적용만 남음 -> 일단 간단하게 앱 버전 확인용도로 사용

 

 iOS 빌드 시 Firebase 관련 에러

 Undefined symbol: firebase::firestore::core::ParseContext::FieldDescription() 등등 100개 에러

 -> 빌드한 디렉토리에 Podfile을 열어보면 pod Firebase/Core 등 적혀있는 것을 볼 수 있다.

 

터미널을 열고 빌드한 폴더로 간 다음

sudo gem install cocoapods // (필요시) cocoapods 업데이트

pod install (시간이 좀 걸린다) 

 

 

Firebase 를 쓰실 건가요? (brunch.co.kr)

 

Firebase 를 쓰실 건가요?

2017년 2월 3일. 지금은 이래요. | "앱을 출시하다" 라는 글을 쓰고, 과거 회사 생활을 정리하는 연재(?)를 마치고... 간만에 다시 "출시한 앱" 소식으로 돌아왔다. 재미와 감동이 있는 그런 글은 아니

brunch.co.kr

 


 

반응형