Firebase로 안드로이드 SNS 앱 만들기 - 02 Firebase 데이터베이스

출처

하울, 『Firebase로 안드로이드 SNS 앱 만들기』, 비제이퍼블릭(2018-07-31), 74-108p


Firebase 데이터베이스

  • Push Driven 방식으로 데이터베이스가 주도권을 갖고 내용 수정 시 컨트롤러 호출
  • RealtimeDatabase가 있는데 버리고 Firestore을 배우면 됨

1. Gradle에 firestore 추가

  • implementation 'com.google.firebase:firebase-firestore:18.0.1'

2. Firebase 콘솔의 Database로 들어가 Cloud Firestore 시작

image

  • 보안규칙 재설정
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid !=null;
    }
  }
}

image

3. Firestore 선언하기

var firestore: FirebaseFirestore? = null
firestore = FirebaseFirestore.getInstance()

데이터베이스 입력하기(Create)

  • 다중 클라이언트가 데이터베이스 Document에 데이터를 저장시킬 때 다중 클라이언트가 중복된 데이터를 저장하게 하는 것을 막지 못함
  • 예를 들어 한 클라이언트가 페이스북에 좋아요를 여러 번 누르면 데이터베이스에는 한 번 좋아요 누른 것이 아닌 여러 번 누른 것으로 기록
  • 데이터베이스는 Document에 이름을 입력하는 방식과 Document에 임의의 이름을 넣는 방식이 있음

데이터베이스 입력

입력 방식 사용 목적
Set 기본적인 데이터 입력
runTransactions 여러 클라이언트의 데이터 중복 접근 방지

데이터 모델 선언

data class UserDTO(var name: String? = null, var address: String? = null)
fun createData() {
        var userDTO = UserDTO("부질", "없어")
        firestore?.collection("User")?.document("document1")?.set(userDTO)?.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Toast.makeText(this, "데이터 생성 성공", Toast.LENGTH_SHORT).show()
            }
        }
    }

Document 이름을 직접 넣는 방식

collection(Collection_name).document(Document_name).set(input_data)
.addOnCompleteListener {
  task->
}
  • addOnCompleteListner: 데이터베이스 입력에 대한 정상적인 결과 값 확인용

Document 이름을 임의적으로 생성하는 방식

collection(Collection_name).document().set(input_data).addOnCompleteListener {
  task ->
}
fun createData2() {
        var userDTO = UserDTO("진화", "한닷")
        firestore?.collection("User")?.document()?.set(userDTO)?.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Toast.makeText(this, "데이터 생성 성공", Toast.LENGTH_SHORT).show()
            }
        }
    }

runTransaction 방식

  • 경로를 클래스로 만든 뒤에 runTransaction을 호출
  • 데이터 중복을 막기 위해 사용
runTransaction {
  transaction ->
    var result = transaction.get(database_path).toObject(datamodel)
    transaction.set(database_path, result)
}

fun runTransaction() {
        var tsDoc = firestore?.collection("User")?.document(
            "document1"
        )

        firestore?.runTransaction { transaction ->
            val userDTO = transaction.get(tsDoc!!).toObject(UserDTO::class.java)
            userDTO?.name - "ming"
            transaction.set(tsDoc, userDTO!!)
        }
    }

데이터베이스 읽어오기 (Read)

Pull Driven

  • 컨트롤러가 원하는 타이밍에 데이터를 읽어오는 방식
  • addOnCompleteListener로 데이터를 읽어옴
collection(Collection_name).document(Document_name).get().addOnCompleteListener {
  task ->
}

경로 방식 데이터 읽어오기

  • 데이터의 Collection과 Document ID 경로를 알고 있을 때 사용
collection(Collection_name).document(Document_name).get().addOnCompleteListener {
  task ->
}
fun readData() {
        firestore?.collection("User")?.document("document1")?.get()?.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                var userDTO = task.result.toObject(UserDTO::class.java)
                println(userDTO.toString())
            }
        }
    }

쿼리 방식 데이터 읽어오기

  • WhererTo Query로 데이터를 읽어옴
data class UserDTO(var name: String?=null, var address: String? = null, var age:Int? = null)
firestore?.collection("User")?.document()?.set(UserDTO("캘시퍼", "부산", 5))
firestore?.collection("User")?.document()?.set(UserDTO("마르클", "대전", 9))
firestore?.collection("User")?.document()?.set(UserDTO("마녀", "목포", 70))

ㅎㄹㅇㄱ ㅇ ㅎㄷㄱ ㅎㅅ ㅇㅎ ㅅㄱ

Comments