코틀린 안드로이드 앱개발 강좌, 파이어베이스 연동하기

안녕하세요! 이번 포스트에서는 코틀린을 활용한 안드로이드 앱 개발에서 Firebase를 어떻게 연동할 수 있는지에 대해 자세히 알아보겠습니다. Firebase는 구글에서 제공하는 모바일 플랫폼으로, 다양한 기능을 통해 개발자들이 앱을 보다 쉽게 개발할 수 있도록 돕습니다. 데이터베이스, 인증, 클라우드 스토리지, 호스팅 등 여러 서비스를 제공하며, 이 모든 것을 간편하게 통합하여 사용할 수 있습니다.

1. Firebase란?

Firebase는 모바일 및 웹 애플리케이션 개발을 위한 백엔드 플랫폼입니다. Firebase의 주요 기능은 다음과 같습니다:

  • Realtime Database: 실시간 데이터베이스로, JSON 형식의 데이터를 저장하고 실시간으로 동기화할 수 있습니다.
  • Authentication: 소셜 로그인 및 이메일/비밀번호 인증을 지원하여 사용자 인증을 간편하게 처리할 수 있습니다.
  • Cloud Firestore: 구조화된 데이터를 위해 사용할 수 있는 매우 유연한 NoSQL 데이터베이스입니다.
  • Cloud Storage: 이미지 및 파일을 저장할 수 있는 서비스입니다.
  • Hosting: 웹 애플리케이션을 호스팅하고 배포하는 서비스입니다.
  • Crashlytics: 앱의 크래시를 모니터링할 수 있는 도구입니다.

2. Firebase 연동 준비하기

Firebase를 안드로이드 앱에 연동하기 위해서는 우선 Firebase Console에서 프로젝트를 생성하고, 이를 앱에 추가해야 합니다. 아래의 단계에 따라 진행해 보겠습니다:

2.1 Firebase Console에서 프로젝트 생성

  1. Firebase Console에 로그인합니다.
  2. 새로운 프로젝트를 클릭하고 프로젝트 이름을 설정합니다.
  3. Firebase Analytics를 사용할 것인지 선택하고, 계속 진행합니다.
  4. 프로젝트가 생성되면, “프로젝트 설정”으로 이동합니다.

2.2 Android 애플리케이션 추가

  1. “앱 추가” 버튼을 클릭하고 Android를 선택합니다.
  2. 패키지 이름을 입력하고 앱의 닉네임을 설정합니다.
  3. “앱 등록” 버튼을 클릭하고 google-services.json 파일을 다운로드합니다.
  4. 이 파일을 Android 프로젝트의 app/ 디렉토리에 복사합니다.

2.3 Gradle 설정

이제 각종 Gradle 파일을 설정해야 합니다. 다음과 같은 작업을 수행합니다:

  • 프로젝트 수준 build.gradle:
buildscript {
    dependencies {
        // Add this line
        classpath 'com.google.gms:google-services:4.3.10' // 최신 버전을 사용하세요.
    }
}
  • 앱 수준 build.gradle:
plugins {
    id 'com.android.application'
    id 'com.google.gms.google-services' // 추가된 부분
}

android {
    compileSdk 31

    defaultConfig {
        applicationId "com.example.myapp"
        minSdk 21
        targetSdk 31
        versionCode 1
        versionName "1.0"
    }
}

dependencies {
    implementation platform('com.google.firebase:firebase-bom:29.0.0') // 최신 버전 사용
    implementation 'com.google.firebase:firebase-auth'
    implementation 'com.google.firebase:firebase-database'
}

이렇게 Gradle 설정을 완료하면 Firebase SDK를 사용할 준비가 완료됩니다.

3. Firebase 인증 구현

이번 섹션에서는 Firebase를 사용하여 사용자 인증 기능을 구현해 보겠습니다. 이메일과 비밀번호를 통한 인증을 예제로 사용하겠습니다.

3.1 사용자 등록 (Sign Up)

class SignUpActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_up)

        auth = FirebaseAuth.getInstance()

        val signUpButton: Button = findViewById(R.id.signUpButton)
        signUpButton.setOnClickListener {
            val email = findViewById(R.id.emailEditText).text.toString()
            val password = findViewById(R.id.passwordEditText).text.toString()

            signUp(email, password)
        }
    }

    private fun signUp(email: String, password: String) {
        auth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Registration successful
                    val user = auth.currentUser
                    Toast.makeText(this, "Registration successful: ${user?.email}", Toast.LENGTH_SHORT).show()
                } else {
                    // Registration failed
                    Toast.makeText(this, "Registration failed: ${task.exception?.message}", Toast.LENGTH_SHORT).show()
                }
            }
    }
}

3.2 사용자 로그인 (Sign In)

class SignInActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_in)

        auth = FirebaseAuth.getInstance()

        val signInButton: Button = findViewById(R.id.signInButton)
        signInButton.setOnClickListener {
            val email = findViewById(R.id.emailEditText).text.toString()
            val password = findViewById(R.id.passwordEditText).text.toString()

            signIn(email, password)
        }
    }

    private fun signIn(email: String, password: String) {
        auth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Login successful
                    val user = auth.currentUser
                    Toast.makeText(this, "Login successful: ${user?.email}", Toast.LENGTH_SHORT).show()
                } else {
                    // Login failed
                    Toast.makeText(this, "Login failed: ${task.exception?.message}", Toast.LENGTH_SHORT).show()
                }
            }
    }
}

위의 코드를 통해 사용자는 이메일과 비밀번호로 앱에 등록하고 로그인 할 수 있습니다.

4. Firebase Realtime Database 연동

이번 섹션에서는 사용자가 입력한 데이터를 Firebase Realtime Database에 저장하는 방법을 알아보겠습니다.

4.1 데이터 모델 만들기

data class User(
    val id: String? = "",
    val name: String? = "",
    val email: String? = ""
)

4.2 데이터 저장하기

private fun saveUserToDatabase(user: User) {
    val database = FirebaseDatabase.getInstance().getReference("users")
    val userId = database.push().key

    if (userId != null) {
        database.child(userId).setValue(user)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    Toast.makeText(this, "User saved successfully", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this, "User save failed: ${task.exception?.message}", Toast.LENGTH_SHORT).show()
                }
            }
    }
}

4.3 데이터 읽기

private fun loadUsersFromDatabase() {
    val database = FirebaseDatabase.getInstance().getReference("users")

    database.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            for (userSnapshot in snapshot.children) {
                val user = userSnapshot.getValue(User::class.java)
                Log.d("User", "User Name: ${user?.name}, Email: ${user?.email}")
            }
        }

        override fun onCancelled(error: DatabaseError) {
            Toast.makeText(this@MainActivity, "Load failed: ${error.message}", Toast.LENGTH_SHORT).show()
        }
    })
}

5. 마치며

이번 포스트에서는 Kotlin을 사용하여 Android 앱에서 Firebase 인증 및 Realtime Database를 연동하는 방법에 대해 알아보았습니다. Firebase는 배경 작업을 쉽게 처리하고, 사용자 데이터를 안전하게 관리할 수 있도록 하는 다양한 기능을 제공합니다. 실제 앱을 개발할 때는 Firebase의 다른 기능들과 통합해 보세요.

앞으로도 더 많은 내용과 함께 다양한 주제를 다룰 예정이니, 많은 관심 부탁드립니다! 감사합니다!