Spring
[Spring Boot/Kotlin] Coroutine을 이용하여 Firebase Realtime Database 관리하기 - 데이터 조회하기
댕댕비행사
2023. 1. 16. 16:18
runBlocking {
getData()
}
Firebase Admin을 이용하여 Realtime Database를 활용하면
가장 처음 맞닥뜨리게 될 문제점은 dataSnapshot을 바로 비동기식으로 처리해야 한다는 점이다.
아래 코드는 Firebase Admin을 활용하여 Realtime Database의 한개 노드를 get하는 함수의 일부분이다.
ref.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
dataSnapshot.value.toString()
}
override fun onCancelled(databaseError: DatabaseError) {}
})
addListenerForSingleValueEvent 함수 안 dataSnapshot을 건드리려면
javascript의 await가 필요할듯 하나 안타깝게도 kotlin에는 await가 존재하지 않는다.
그렇다면 어떻게 접근해야 할까?
Kotlin에는 다행히도 Corutine이라는 개념이 있다.
https://kotlinlang.org/docs/coroutines-overview.html
개념을 이해하고 넘어가기엔 글이 너무 길어지기 때문에 상세만 적자면 따라해봐야 할 단계는 다음과 같다
1. 의존성 추가
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0-RC2")
runtimeOnly("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0-RC2")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.6.0")
- 1.6.0-RC2 등의 버전 확인은 본인의 gradle내 kotlin 버전을 확인하길 바란다.
2. runBlocking 사용하기
var data : Any? = null
runBlocking {
data = getData()
}
3. suspendCoroutine 사용하기
suspend fun getData() : Any? {
var ref = FirebaseDatabase.getInstance()
val childRef : DatabaseReference = ref.getReference("경로 입력")
val data = suspendCoroutine<Any?> {
childRef.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
it.resume(dataSnapshot.value)
}
override fun onCancelled(databaseError: DatabaseError) {}
})
}
}
it.resume가 실행되며 값을 반환하게 된다