본문 바로가기

Spring

[Spring Boot/Kotlin] Coroutine을 이용하여 Firebase Realtime Database 관리하기 - 데이터 조회하기

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가 실행되며 값을 반환하게 된다