Skip to content

Latest commit

 

History

History
111 lines (85 loc) · 3.52 KB

File metadata and controls

111 lines (85 loc) · 3.52 KB

moon-firebase-auth-kmp 통합 가이드

이 가이드는 KMP + Compose Multiplatform 앱에서 moon-firebase-auth-kmp 를 사용하는 방법을 단계별로 설명합니다. 이 모듈은 moon-auth-kmp 가 제공하는 L1 AuthProvider SPI 의 Firebase 구현체이므로, 기능 코드는 SPI 에만 의존하고 테스트에서는 Fake 로 교체할 수 있습니다.

1. 사전 준비

  • Kotlin 2.0.20, Compose Multiplatform 1.7.x, AGP 8.6.x, Gradle 8.10, Java 21.
  • 이메일/비밀번호 로그인이 활성화된 Firebase 프로젝트.
  • 유효한 MoonDeveloper 라이선스 키 (moonLicenseKey Gradle 프로퍼티).
  • 앱에 Koin 4.1.0 설정.

2. 저장소 + 의존성 추가

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")

3. 플랫폼 설정

Android

  • google-services.jsoncomposeApp/src/androidMain/ 또는 Android 앱 모듈에 배치합니다.
  • Firebase 문서에 따라 Google Services 플러그인을 적용합니다.
  • INTERNET 권한이 부여되어 있는지 확인합니다 (기본 부여).

iOS

  • Xcode 타겟에 GoogleService-Info.plist 를 추가합니다.
  • AppDelegate 에서 KoinKt.doInitKoin() 호출 이전에 FirebaseApp.configure() 를 호출합니다.

4. Koin 초기화

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)
}

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

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 로 교체할 수 있습니다.

6. Compose UI 연동

@Composable
fun AuthScreen(store: AuthStore = koinInject()) {
    val user by store.state.collectAsState()
    // ... 로그인 폼을 렌더링하고 `user` 를 관찰합니다.
}

7. 자주 발생하는 문제

  • 의존성 해결 시 401 / 인증 실패moonLicenseKey 가 없거나 만료되었습니다. https://moondeveloper.com/trial 에서 재발급하세요.
  • Firebase "default app not initialized" — iOS 에서 Koin 시작 이전에 FirebaseApp.configure() 를 반드시 호출해야 합니다.
  • Koin "No definition found for AuthProvider" — 4단계의 bind 구문을 빠뜨렸습니다.

8. 다음 단계