brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jul 20. 2016

Firebase #03

Realtime Database

Firebase Realtime Database


Store and sync data with our NoSQL cloud database. 

(우리의 NoSQL 클라우드 데이터베이스에 데이터를 저장하고 동기화할 수 있습니다.)


Data is synced across all clients in realtime, and remains available when your app goes offline.

(실시간으로 모든 클라이언트에서 데이터를 동기화되고, 앱이 오프라인 상태가 되어도 계속 사용할 수 있습니다.)


The Firebase Realtime Database is a cloud-hosted database.

(Firebase Realtime Database은 cloud-hosted 데이터베이스입니다.)


Data is stored as JSON and synchronized in realtime to every connected client. 

(데이터는 JSON으로 저장되고 실시간으로 모든 연결된 클라이언트에 동기화됩니다.)


When you build cross-platform apps with our iOS, Android, and JavaScript SDKs, all of your clients share one Realtime Database instance and automatically receive updates with the newest data.

(iOS, Android, JavaScript SDK를 통해 cross-platform 앱으로 빌드할 때, 모든 클라이언트들은 하나의 Realtime Database 인스턴스로 공유하고 자동으로 최신 데이터로 업데이트를 받을 수 있습니다.)


https://firebase.google.com/docs/database/

https://www.youtube.com/watch?list=PLl-K7zZEsYLmOF_07IayrTntevxtbUxDL&v=U5aeM5dvUpA




Key functions

Realtime
일반적인 HTTP 요청대신, Firebase Realtime Database는 데이터 동기화를 이용한다.
— 데이터가 변경될 때, 연결된 디바이스는 밀리 세컨드 이내에 업데이트를 받는다.
네트워킹 코드를 생각하지 않고도 collaborative (공동? 협업?)하고 immersive (실감? 몰입?)한 경험을 제공합니다.

Offline
Firebase 앱들은 Firebase Realtime Database SDK가 디스크에 데이터들을 계속 저장하기 때문에 오프라인 상태에서도 응답들을 남긴다. 연결이 설정되면, 클라이언트 디바이스는 현재의 서버 상태와 함께 동기화가 놓친 변경을 수신한다.

Accessible from Client Devices
The Firebase Realtime Database는 어플리케이션 서버가 없어도 모바일 디바이스나 웹 브라우져에 직접 접속할 수 있다. Firebase Realtime Database 보안 규칙들과 데이터를 쓰고 읽힐 때 실행되어 지는 expression-base 규칙들을 보안과 데이터 검증이 가능하다.




Realtime Database 시작



https://firebase.google.com/docs/database/android/start/

https://firebase.google.com/docs/reference/android/com/google/firebase/database/package-summary



1. google-service.json 추가

#01 구성 파일 복사

Android studio에서 프로젝트 보기로 전환하여 프로젝트 루트 디렉터리를 표시하세요.

다운로드한 google-service.json 파일을 Android 앱 모듈 루트 디렉터리로 이동하세요.


2. plugin 추가

#02 Project build.gradle에 추가
buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.gms:google-services:3.0.0'
    }
}
#03 app build.gradle에 추가
apply plugin: 'com.android.application'

...

dependencies {
    ...
    compile 'com.google.firebase:firebase-core:9.2.1'
    compile 'com.google.firebase:firebase-database:9.2.1'
}

apply plugin: 'com.google.gms.google-services'

"firebase-core:9.2.1" 이 컴파일되지 않을 때는 아래와 같이 Google Play service 31 버전으로 업데이트해주세요.

https://brunch.co.kr/@oemilk/26


3. Firebase Analytics Object 생성, Reference Object 생성


Database Object 생성, Reference Object 생성

mFirebaseDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mFirebaseDatabase.getReference(REFERENCE_NAME);


4. Configure Firebase Database Rules


Realtime Database는 데이터가 구성되는 방법, 인덱싱되는 방법, 언제 데이터를 읽고 쓸 수 있는지를 정의하도록  declarative(선언형) 규직 언어를 제공한다.

기본적으로 데이터베이스에 읽고 쓰는 접근은 오직 인증된 사용자로 제한되어 있다.

Authentication 없이 시작하려면 configure your rule for public access을 구성할 수 있습니다.

이는 모두에게 데이터베이스를 오픈하고, 이 앱을 사용하지 않는 사람들에게도 오픈합니다, 그래서 인증을 설정할때 다시 데이터베이스를 제한해야 합니다.


5. Write to your database


https://firebase.google.com/docs/database/android/save-data


Java 객체를 포함한 데이터베이스에 저장하는 데이터 타입의 범위를 저장할 수 있습니다.

mDatabaseReference.setValue("Test 1");      // String

다음과 같이 JSON 타입에 해당하는 타입을들 전달합니다.

String, Long, Double, Boolean, Map<String, Object>, List<Object>

매개변수가 없는 Default 생성자를 가지고 할당된 속성을 얻기위한 public getter를 가진 custom Java Object를 전달합니다.

@IgnoreExtraProperties
public class RealtimeDatabaseDataClass {

   public String code;
   public String title;
   public String text;

   public RealtimeDatabaseDataClass() {
      // Default constructor required for calls to DataSnapshot.getValue(TestClass.class)
   }

   public RealtimeDatabaseDataClass(String code, String title, String text) {
      this.code = code;
      this.title = title;
      this.text = text;
   }

}
RealtimeDatabaseDataClass testClass = new RealtimeDatabaseDataClass("code", "title", "text");
mDatabaseReferenceForJavaObject.setValue(testClass);


6. Read from your database


https://firebase.google.com/docs/database/android/retrieve-data


실시간으로 앱 데이터를 업데이트하려면, ValueEventListener에 reference에 추가해야 합니다.

listener가 부착되고 데이터가 변할 때마다 이 클래스의 onDataChange() 함수는 한번 실행됩니다.

mDatabaseReference.addValueEventListener(new ValueEventListener() {            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               String value = dataSnapshot.getValue(String.class);
            }            

           @Override
           public void onCancelled(DatabaseError error) {
               // error
            }
});
mDatabaseReferenceForJavaObject.addValueEventListener(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
      RealtimeDatabaseDataClass testClass = dataSnapshot.getValue(RealtimeDatabaseDataClass.class);
   }

   @Override
   public void onCancelled(DatabaseError error) {
      // error
   }
});


7. Configure ProGuard (Option)


앱에서 Firebase Realtime Database를 ProGuard와 함께 이용할 때 난독화 후, 모델 객체가 어떻게 직렬화, 역직렬화되는지 고려해야 합니다.

데이터를 읽고 쓰기 위해 DataSnapshot.getValue(Class) 또는  DatabaseReference.setValue(Object)를 이용한다면 proguard-rules.pro에 규칙을 추가할 필요가 있습니다.

# Add this global rule
-keepattributes Signature

# This rule will properly ProGuard all the model classes in
# the package com.yourcompany.models. Modify to fit the structure
# of your app.
-keepclassmembers class com.yourcompany.models.** {
  *;
}




Firebase Console - Database


Data 페이지는 Firebase Database에 포함된 데이터의 개요를 제공합니다. 이는 데이터베이스 구조를 처음 세팅할 때 도움이 될 수 있습니다. 이 페이지에서 데이터베이스 데이터를 JSON 포맷으로 import 또는 export 할 수 있고, 웹 인터페이스에서 수동적으로 데이터를 수정할 수 있습니다. 


#01 Firebase Realtime Database
#02 Data

모든 Firebase Realtime Database 데이터는 JSON 객체형태로 저장됩니다. 데이터베이스는 cloud-hosted JSON tree 형태라 생각할 수 있다.

SQL database와 달리, table이나 record가 없다.

데이터를 JSON tree에 추가할 때,  associated(연관) key와 함께 존재하는 JSON 구조에 node가 된다.

유저 ID나 의미있는 이름을 key name으로 제공할 수 있고, push() 를 이용하여 다른이들로부터 제공 받을 수 있다.

만약 key를 생성할 때는 반드시 UTF-8 인코딩이 되어 있어야 하고, 최대 768 bytes, 그리고 ., $, #, [, ], /, 또는 ASCII control characters 0-31 or 127는 포함할 수 없다.


#03 규칙


https://firebase.google.com/docs/database/security/quickstart#sample-rules


기본적으로, 데이터베이스 규칙은 Firebase Authentication을 요구하고 인증된 유저에게 읽고 쓰는 권한을 부여합니다.

규칙을 새로 정의하여 접근 권한을 설정할 수 있습니다.


// 누구나 데이터베이스에 접근해 인증 없이 읽고 쓸 수 있도록 "true"로 설정
{
  "rules": {
    ".read": true,
    ".write": true
  }
}


#04 시뮬레이터
#05 시뮬레이터 읽기 실행
#06 시뮬레이터 쓰기 실행




Sample


https://github.com/oemilk/firebase




브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari