Skip to content

Latest commit

 

History

History
77 lines (55 loc) · 2.54 KB

File metadata and controls

77 lines (55 loc) · 2.54 KB

moon-firestore-sync-kmp 통합 가이드

moon-sync-kmp 의 L1 RemoteStore SPI 를 구현하는 Firestore 어댑터입니다. 플랫폼별 접착 코드 없이 Firestore 컬렉션을 Kotlin Flow 로 관찰할 수 있습니다.

1. 사전 준비

  • 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.

2. 저장소 + 의존성 추가

(저장소 설정은 auth 모듈과 동일합니다. auth/ko.md §2 참고.)

composeApp/build.gradle.kts (commonMain):

implementation("io.moondeveloper:moon-firestore-sync-kmp:1.0.0")

3. 플랫폼 설정

Android

  • google-services.json 배치 + Google Services 플러그인 적용.
  • Firestore 는 FirebaseApp 초기화 시 함께 초기화됩니다 (대부분 자동).

iOS

  • Xcode 타겟에 GoogleService-Info.plist 추가.
  • AppDelegate 에서 FirebaseApp.configure() 호출.

4. Koin 초기화

import io.moondev.firestore.sync.firestoreSyncModule

startKoin {
    modules(firestoreSyncModule /*, ... */)
}

모듈 내부에서 FirestoreRemoteStoreRemoteStore 에 바인딩되므로, 기능 코드는 오직 RemoteStore 만 참조합니다.

5. ViewModel / Store (MVI) 에서 사용

class NotesStore(private val store: RemoteStore) {
    val notes: Flow<List<Note>> = store.observeCollection("notes")
}

6. Compose UI 연동

@Composable
fun NotesScreen(store: NotesStore = koinInject()) {
    val items by store.notes.collectAsState(initial = emptyList())
    LazyColumn { items(items) { n -> Text(n.title) } }
}

7. 자주 발생하는 문제

  • 빈 스트림 / PERMISSION_DENIED — Firestore 규칙이 요청을 거부합니다. 현재 사용자가 로그인되어 있는지 확인하고 (moon-firebase-auth-kmp 와 함께 사용), 경로가 규칙과 일치하는지 확인합니다.
  • iOS 의 Default FirebaseApp is not initializedAppDelegate 에서 FirebaseApp.configure() 호출을 빠뜨렸습니다.
  • 로그에 백프레셔 경고 — 스트림은 hot 이므로 ViewModel 또는 Compose LaunchedEffect 로 스코프를 제한하여 해제 시 취소되도록 합니다.

8. 다음 단계