moon-sync-kmp 의 L1 RemoteStore SPI 를 구현하는 Firestore 어댑터입니다.
플랫폼별 접착 코드 없이 Firestore 컬렉션을 Kotlin Flow 로 관찰할 수 있습니다.
- Kotlin 2.0.20, Compose Multiplatform 1.7.x, AGP 8.6.x, Gradle 8.10, Java 21.
- Firestore 가 활성화된 Firebase 프로젝트 (보안 규칙 설정 완료).
- 유효한
moonLicenseKey. - Koin 4.1.0.
(저장소 설정은 auth 모듈과 동일합니다. auth/ko.md §2 참고.)
composeApp/build.gradle.kts (commonMain):
implementation("io.moondeveloper:moon-firestore-sync-kmp:1.0.0")google-services.json배치 + Google Services 플러그인 적용.- Firestore 는 FirebaseApp 초기화 시 함께 초기화됩니다 (대부분 자동).
- Xcode 타겟에
GoogleService-Info.plist추가. AppDelegate에서FirebaseApp.configure()호출.
import io.moondev.firestore.sync.firestoreSyncModule
startKoin {
modules(firestoreSyncModule /*, ... */)
}모듈 내부에서 FirestoreRemoteStore 가 RemoteStore 에 바인딩되므로, 기능 코드는
오직 RemoteStore 만 참조합니다.
class NotesStore(private val store: RemoteStore) {
val notes: Flow<List<Note>> = store.observeCollection("notes")
}@Composable
fun NotesScreen(store: NotesStore = koinInject()) {
val items by store.notes.collectAsState(initial = emptyList())
LazyColumn { items(items) { n -> Text(n.title) } }
}- 빈 스트림 /
PERMISSION_DENIED— Firestore 규칙이 요청을 거부합니다. 현재 사용자가 로그인되어 있는지 확인하고 (moon-firebase-auth-kmp와 함께 사용), 경로가 규칙과 일치하는지 확인합니다. - iOS 의
Default FirebaseApp is not initialized—AppDelegate에서FirebaseApp.configure()호출을 빠뜨렸습니다. - 로그에 백프레셔 경고 — 스트림은 hot 이므로
ViewModel또는 ComposeLaunchedEffect로 스코프를 제한하여 해제 시 취소되도록 합니다.
- moon-firebase-auth-kmp 와 결합하여
uid스코프 경로를 사용합니다. - 샘플 참조:
SyncDemoScreen.kt.