시배's Android
Android | Firebase Realtime Database를 더 쉽게 사용하기 본문
Firebase Realtime Database를 더 쉽게 사용하기: flowList() 함수로 오픈소스 기여 이야기
GitHub - skydoves/firebase-android-ktx: 🔥 Kotlin & Compose-friendly Firebase extensions designed to help you focus on your bu
🔥 Kotlin & Compose-friendly Firebase extensions designed to help you focus on your business logic. - skydoves/firebase-android-ktx
github.com
안녕하세요! 이번 글에서는 제가 최근에 firebase-android-ktx 오픈소스 프로젝트에 기여한 경험을 공유하고자 합니다. 이 글에서는 제가 추가한 flowList() 함수의 동작 원리, 작성 배경, 그리고 오픈소스에 기여하면서 느낀 점을 다뤄보겠습니다.
🛠️ 기여한 내용: flowList() 함수
문제 상황
Firebase Realtime Database를 사용하다 보면 리스트 형식으로 데이터를 저장하고 이를 읽어오는 경우가 많습니다. 하지만 기존의 API는 데이터 변화를 비동기적으로 감지하기 어렵고, 이를 간편하게 처리하기 위한 유틸리티 함수가 부족했습니다.
저는 이러한 필요성을 느끼고, 데이터를 Flow<Result<List<T?>>> 타입으로 반환하는 flowList() 함수를 추가했습니다. 이 함수는 데이터를 실시간으로 구독할 수 있고, Result를 통해 성공과 실패를 명확히 구분합니다.
🧑💻 추가한 코드: flowList()
public fun <T : Any> DatabaseReference.flowList(
path: (DataSnapshot) -> DataSnapshot,
decodeProvider: (String) -> T
): Flow<Result<List<T?>>> = callbackFlow {
val listener = object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val children = path.invoke(snapshot).children
val result = mutableListOf<T?>()
for (data in children) {
result.add(data.serializedValue(decodeProvider))
}
trySend(Result.success(result))
}
override fun onCancelled(error: DatabaseError) {
trySend(Result.failure(error.toException()))
}
}
addValueEventListener(listener)
awaitClose { removeEventListener(listener) }
}
코드 설명
- callbackFlow를 사용한 Flow 생성
이 함수는 callbackFlow를 활용해 Firebase의 ValueEventListener 이벤트를 Flow로 변환합니다. - path를 통한 데이터 경로 설정
path는 DataSnapshot에서 필요한 하위 데이터를 선택할 수 있도록 제공합니다. - decodeProvider를 통한 데이터 디코딩
각 데이터 항목을 디코딩하는 방법을 decodeProvider로 정의할 수 있어 다양한 타입의 데이터를 처리할 수 있습니다. - Result를 활용한 상태 관리
데이터를 성공적으로 가져오거나 실패 시 예외를 반환하는 구조로 안정성과 가독성을 높였습니다.
🌟 동기: 왜 이 기능이 필요했는가?
이 기능은 제가 진행하던 Server-Driven UI 프로젝트에서 필요성을 느껴 기여하게 되었습니다. 해당 프로젝트는 UI와 데이터를 서버에서 받아 동적으로 렌더링해야 했고, 리스트 데이터를 실시간으로 구독해야 했습니다. 기존 API로는 비효율적이라 이를 더 간결하게 처리할 수 있는 유틸리티 함수가 필요했죠.
✨ 결론
이번 기여는 Firebase Realtime Database를 더 쉽게 사용할 수 있도록 돕기 위한 작은 발걸음이었지만, 저에게는 큰 의미가 있었습니다. 앞으로도 다양한 오픈소스 프로젝트에 기여하며 개발자로서 성장해 나가고 싶습니다.
'Android > Android' 카테고리의 다른 글
Android | Server Driven UI 구현하기 with Custom KSerializer (0) | 2024.12.12 |
---|---|
Android | Build Optimization (1) (1) | 2024.10.02 |
Android | Compose에서 Custom View Cache 하기 (0) | 2024.01.31 |
Android | Mavericks 사용할 때 MavericksState 초기값 설정하기 (0) | 2024.01.06 |
Android | The Real Modularization in Android (0) | 2023.09.23 |