이번에 Firebase가 필요한 상황이 생기면서 기본적인 기능을 구현해보았다.
작업은 크게 3가지로 나뉜다.
// build.gradle(Project)
dependencies {
...
classpath 'com.google.gms:google-services:4.3.10'
}
// build.gradle(Module)
plugin{
...
id 'com.google.gms.google-services'
}
dependencies {
...
// firebase
implementation platform('com.google.firebase:firebase-bom:29.0.0')
implementation 'com.google.firebase:firebase-database-ktx'
}
object FirebaseDB{
// Firebase DB 객체 생성
// 이렇게 하면 mDatabase는 Firebase의 내 프로젝트를 가르키게 된다.
private var mDatabase: DatabaseReference = FirebaseDatabase.getInstance().reference
fun write(){
mDatabase.child(하위 객체).setValue(넣을 값)
.addOnSuccessListener {
// 저장 성공 시
}
.addOnFailureListener { e ->
// 저장 실패 시
}
}
/**
* addValueEventListener 경로의 전체 내용에 대한 변경 사항을 읽고 수신 대기한다. - 값이 바뀔 때 마다 onDataChange 호출
*
* addListenerForSingleValueEvent : 한 번 호출된 후 다시 호출 되지 않는다. - 1회성
* 한 번만 호출되고 즉시 삭제되는 콜백이 필요한 경우에 사용한다.
* 한 번 로드된 후 자주 변경되지 않거나 능동적으로 수신 대기할 필요가 없는 데이터에 유용하다.
*
* addChildEventListener : 데이터베이스의 특정한 노드에 대한 변경을 수신 대기하는데 유용하다.
* 목록을 다루는 앱은 단일 개체에 사용되는 값 이벤트보다는 하위 이벤트를 수신 대기해야한다.
* 하위 하목에 push() 메소드를 통해 새로 추가되거나 updateChildren() 메소드를 통해 업데이트 되는 경우가 그 예이다.
*
* DB 읽기 동작의 오버헤드를 줄이고 성능을 높이기 위해서 용도에 맞게 구현해야한다.
*/
fun read(){
mDatabase.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
// snapshot.children 을 통해 내부 데이터를 확인할 수 있다.
// addValueEventListener 을 사용하였기에 데이터가 변경될 때 마다 이곳이 호출된다.
}
override fun onCancelled(error: DatabaseError) {
// onCandelled 시 콜백
}
})
}
}