코틀린 안드로이드 앱개발 강좌, 클라우드 파이어스토어

안드로이드 앱 개발에 있어 데이터 저장은 필수적인 요소입니다. 클라우드 파이어스토어(Cloud Firestore)는 Google의 Firebase 플랫폼의 일부로, NoSQL 데이터베이스로서 실시간 데이터 저장, 동기화 및 관리가 가능하게 해줍니다. 이번 강좌에서는 코틀린을 활용하여 안드로이드 앱에서 클라우드 파이어스토어를 사용하는 방법에 대해 자세히 살펴보겠습니다.

1. Firebase 및 Firestore 소개

Firebase는 모바일 및 웹 애플리케이션 개발을 위한 종합 플랫폼으로, 인증, 데이터 저장, 호스팅, 클라우드 기능 등을 제공합니다. Firestore는 Firebase의 데이터베이스 서비스로, 구조화된 데이터 저장이 가능하며, 실시간 데이터베이스와 같은 기능을 제공합니다.

1.1 Firestore의 주요 기능

  • 실시간 데이터 동기화
  • 스케일링 가능
  • 데이터의 비정형 저장
  • 모바일 및 웹 애플리케이션에서 접근 가능

2. 프로젝트 설정

안드로이드 스튜디오에서 새로운 프로젝트를 생성한 후, Firebase 및 Firestore를 설정해보겠습니다.

2.1 Firebase에 프로젝트 생성

  1. Firebase 콘솔에 접속하여 새 프로젝트를 생성합니다.
  2. 안드로이드 애플리케이션을 추가하고, 패키지 이름 및 SHA-1 키를 입력합니다.
  3. google-services.json 파일을 다운로드하여 프로젝트의 app 폴더에 추가합니다.

2.2 Gradle 파일 수정

프로젝트의 build.gradle 파일에 Firebase 및 Firestore 관련 의존성을 추가합니다:

dependencies {
        implementation platform('com.google.firebase:firebase-bom:31.0.2')
        implementation 'com.google.firebase:firebase-firestore-ktx'
        implementation 'com.google.firebase:firebase-auth-ktx'
    }
    

2.3 Firebase 초기화

애플리케이션의 시작점인 MainActivity에서 Firebase를 초기화합니다:

import com.google.firebase.FirebaseApp
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            FirebaseApp.initializeApp(this)  // Firebase 초기화
        }
    }
    

3. Firestore 데이터 구조

Firestore는 문서(document)와 컬렉션(collection)의 형태로 데이터를 저장합니다. 문서는 키-값 쌍으로 구성되어 있으며, 컬렉션은 문서의 그룹입니다.

3.1 데이터 저장 예제

Firestore에 데이터를 저장하는 방법을 예제로 살펴보겠습니다. 예를 들어, 사용자의 정보를 저장하는 경우 다음과 같은 코드를 사용할 수 있습니다:

import com.google.firebase.firestore.FirebaseFirestore
    
    class MainActivity : AppCompatActivity() {
        private lateinit var db: FirebaseFirestore
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            db = FirebaseFirestore.getInstance()
            saveUser()
        }
    
        private fun saveUser() {
            val user = hashMapOf(
                "first" to "Jane",
                "last" to "Doe",
                "born" to 1990
            )
    
            db.collection("users")
                .add(user)
                .addOnSuccessListener { documentReference ->
                    Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}")
                }
                .addOnFailureListener { e ->
                    Log.w(TAG, "Error adding document", e)
                }
        }
    }
    

4. 데이터 읽기 및 실시간 업데이트

Firestore는 데이터의 변경사항을 실시간으로 감지할 수 있는 기능을 제공합니다. 이를 통해 데이터의 변화를 쉽게 수신하고 UI를 업데이트할 수 있습니다.

4.1 데이터 읽기 예제

Firestore에서 데이터를 읽어오는 기본적인 예제는 다음과 같습니다:

private fun getUser() {
        db.collection("users")
            .get()
            .addOnSuccessListener { documents ->
                for (document in documents) {
                    Log.d(TAG, "${document.id} => ${document.data}")
                }
            }
            .addOnFailureListener { exception ->
                Log.w(TAG, "Error getting documents: ", exception)
            }
    }
    

4.2 실시간 업데이트 예제

실시간으로 데이터의 변화를 감지하려면 addSnapshotListener 메서드를 사용할 수 있습니다:

private fun listenToUsers() {
        db.collection("users")
            .addSnapshotListener { snapshots, e ->
                if (e != null) {
                    Log.w(TAG, "Listen failed.", e)
                    return@addSnapshotListener
                }

                if (snapshots != null) {
                    for (doc in snapshots.documentChanges) {
                        if (doc.type == DocumentChange.Type.ADDED) {
                            Log.d(TAG, "New city: ${doc.document.data}")
                        }
                        // 다른 타입도 처리 가능 (MODIFIED, REMOVED 등)
                    }
                }
            }
    }
    

5. 데이터 수정 및 삭제

Firestore에서는 데이터를 수정하고 삭제하는 것도 매우 간단합니다. 다음은 데이터를 수정하고 삭제하는 방법을 설명합니다.

5.1 데이터 수정 예제

특정 문서를 수정하는 방법은 다음과 같습니다:

private fun updateUser(userId: String) {
        val userUpdates = hashMapOf(
            "last" to "Smith",  // Last name 변경
        )

        db.collection("users").document(userId)
            .update(userUpdates)
            .addOnSuccessListener {
                Log.d(TAG, "User successfully updated!")
            }
            .addOnFailureListener { e ->
                Log.w(TAG, "Error updating document", e)
            }
    }
    

5.2 데이터 삭제 예제

데이터를 삭제하는 방법은 다음과 같습니다:

private fun deleteUser(userId: String) {
        db.collection("users").document(userId)
            .delete()
            .addOnSuccessListener {
                Log.d(TAG, "User successfully deleted!")
            }
            .addOnFailureListener { e ->
                Log.w(TAG, "Error deleting document", e)
            }
    }
    

6. 보안 규칙 설정

Firestore를 사용할 때 가장 중요한 부분 중 하나는 보안입니다. Firebase 콘솔에서 보안 규칙을 설정하여 데이터의 접근 권한을 관리할 수 있습니다.

6.1 기본 보안 규칙

rules_version = '2';
    service cloud.firestore {
        match /databases/{database}/documents {
            match /users/{userId} {
                allow read, write: if request.auth != null;
            }
        }
    }
    

7. 결론

이번 강좌에서는 코틀린을 활용하여 안드로이드 앱에서 Firebase와 Firestore를 사용하는 방법에 대해 알아보았습니다. 클라우드 파이어스토어를 활용하면 실시간으로 데이터를 관리할 수 있으며, 다양한 기능을 통해 앱의 성능을 극대화할 수 있습니다. 실제 프로젝트에 적용해 보면서 더 많은 경험을 쌓아보시기 바랍니다.

참고 자료

© 2023 안드로이드 개발 블로그. 모든 권리 보유.