이 가이드는 KMP + Compose Multiplatform 앱에서 moon-firebase-auth-kmp 를
사용하는 방법을 단계별로 설명합니다. 이 모듈은 moon-auth-kmp 가 제공하는
L1 AuthProvider SPI 의 Firebase 구현체이므로, 기능 코드는 SPI 에만
의존하고 테스트에서는 Fake 로 교체할 수 있습니다.
- Kotlin 2.0.20, Compose Multiplatform 1.7.x, AGP 8.6.x, Gradle 8.10, Java 21.
- 이메일/비밀번호 로그인이 활성화된 Firebase 프로젝트.
- 유효한 MoonDeveloper 라이선스 키 (
moonLicenseKeyGradle 프로퍼티). - 앱에 Koin 4.1.0 설정.
settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url = uri("https://moon-server-production.up.railway.app/maven/releases")
credentials {
username = "license"
password = providers.gradleProperty("moonLicenseKey").getOrElse("")
}
content { includeGroup("io.moondeveloper") }
}
}
}composeApp/build.gradle.kts (commonMain):
implementation("io.moondeveloper:moon-firebase-auth-kmp:1.0.0")google-services.json을composeApp/src/androidMain/또는 Android 앱 모듈에 배치합니다.- Firebase 문서에 따라 Google Services 플러그인을 적용합니다.
INTERNET권한이 부여되어 있는지 확인합니다 (기본 부여).
- Xcode 타겟에
GoogleService-Info.plist를 추가합니다. AppDelegate에서KoinKt.doInitKoin()호출 이전에FirebaseApp.configure()를 호출합니다.
import io.moondev.auth.AuthProvider
import io.moondev.firebase.auth.FirebaseAuthProvider
import io.moondev.firebase.auth.firebaseAuthModule
import org.koin.dsl.bind
import org.koin.dsl.module
val appModule = module {
single<AuthProvider> { get<FirebaseAuthProvider>() } bind AuthProvider::class
}
startKoin {
modules(firebaseAuthModule, appModule)
}class AuthStore(private val auth: AuthProvider) {
val state: StateFlow<AuthUser?> = auth.currentUser
suspend fun signIn(email: String, pw: String) {
auth.signInWithEmailPassword(email, pw)
}
suspend fun signOut() {
auth.signOut()
}
}Store 는 AuthProvider 에만 의존하므로 테스트에서는 Firebase 를 로드하지 않고
Fake 로 교체할 수 있습니다.
@Composable
fun AuthScreen(store: AuthStore = koinInject()) {
val user by store.state.collectAsState()
// ... 로그인 폼을 렌더링하고 `user` 를 관찰합니다.
}- 의존성 해결 시
401/ 인증 실패 —moonLicenseKey가 없거나 만료되었습니다. https://moondeveloper.com/trial 에서 재발급하세요. - Firebase "default app not initialized" — iOS 에서 Koin 시작 이전에
FirebaseApp.configure()를 반드시 호출해야 합니다. - Koin "No definition found for AuthProvider" — 4단계의
bind구문을 빠뜨렸습니다.
- 사용자별 데이터를 위해 moon-firestore-sync-kmp 와 함께 사용합니다.
- 샘플을 확인하세요:
samples/full-demo-app/.../AuthScreen.kt.