파이어베이스 인증과 실시간 데이터베이스 사용하기 (1)

 

 

* 이 글은 인프런 강의 <[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린>을 보고 정리한 글입니다.

 


목표

 

파이어베이스의 인증(비회원 로그인), 실시간 데이터베이스를 사용하여

나만의 운동 메모장을 만들어보자.

 

 

1. 파이어베이스 프로젝트 생성

 

파이어베이스 콘솔에 접속한다.

https://console.firebase.google.com

 

로그인 - Google 계정

이메일 또는 휴대전화

accounts.google.com

 

 

 

프로젝트를 만든다.

 

 

 

프로젝트 이름 지정

 

 

 

계속 진행

 

 

 

계정을 선택한다. 계정이 없다면 새 계정을 만들면 된다.

 

 

 

프로젝트 생성 중

 

 

 

 

2. 앱 추가

 

안드로이드를 추가하여 시작한다.

 

 

 

안드로이드 앱의 패키지 이름을 적고서 앱을 등록한다.

 

패키지 이름

 

 

 

google-services.json을 다운로드하여

안드로이드 프로젝트의 app 폴더에 붙여 넣는다.

 

 

 

파이어베이스 SDK를 추가한다.

프로젝트 수준 Gradle 파일에 플러그인 추가

 

 

프로젝트 수준 Gradle 파일에서 플러그인 추가

 

 

앱 수준 Gradle 파일에 플러그인, SDK 추가

 

 

앱 수준 Gradle 파일에서 플러그인 추가

 

앱 수준 Gradle에서 파이어베이스 SDK 추가

 

 

다 추가하였다면 Sync Now를 눌러 적용을 한다.

 

Sync Now 눌러 적용하기

 

 

설정이 모두 완료되었다. 콘솔로 이동한다.

 

 

 

 

 

3. SplashActivity

 

앱이 본격적으로 실행되기 전에 3초 동안 SplashActivity 화면이 띄워지게 하자.

그리고 SplashActivity가 실행되는 동안 비회원(익명) 인증을 시키자.

 

 

3.1 AndroidManifest.xml

 

SplashActivity부터 화면이 실행되도록 설정을 바꾼다.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Diet_memo2"
        tools:targetApi="31">
        <activity
            android:name=".SplashActivity"
            android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">

        </activity>
    </application>

</manifest>

 

<intent-filter> 태그를 SplashActivity의 <activity> 태그에 위치시킨다.

그리고 SplsashActivity의 android:exported를 "false"에서 "true"로 변경시킨다.

 

 

3.2 파이어베이스 익명 로그인 설정

 

파이어베이스 프로젝트에서 Authentication(인증) 기능을 사용한다.

 

 

시작하기를 누른다.

 

 

 

비회원(익명) 로그인을 방법을 사용하도록 한다.

 

 

 

사용 설정을 체크하고 저장하면 된다.

 

 

 

비회원(익명) 로그인 인증이 사용 설정됨을 볼 수 있다.

 

 

 

파이어베이스 공식 문서에서 익명으로 인증하도록 하는 방법에 대한 문서를 본다.

 

https://firebase.google.com/docs/auth/android/anonymous-auth?hl=ko

 

Android에서 익명으로 Firebase에 인증  |  Firebase Authentication

Google I/O 2023에서 Firebase의 주요 소식을 확인하세요. 자세히 알아보기 의견 보내기 Android에서 익명으로 Firebase에 인증 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류

firebase.google.com

 

 

문서에서 앱 수준 Gradle 파일에 해당 내용을 추가한다.

 

앱수준 Gradle에서 추가

 

 

 

3.3 activity_splash.xml

 

3초 동안 보일 SplashActivity의 화면을 만든다.

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context=".SplashActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="다이어트는 내일부터\n하는거 아닙니까"
        android:textColor="@color/white"
        android:textSize="40sp"
        android:gravity="center"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

 

3.4 SplashActivity

 

class SplashActivity : AppCompatActivity() {
    private lateinit var auth: FirebaseAuth
    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        auth = Firebase.auth

        try {
            Log.d("SPLASH", auth.currentUser!!.uid)
            Toast.makeText(this, "비회원 로그인 됨", Toast.LENGTH_LONG).show()
            Handler().postDelayed({
                startActivity(Intent(this, MainActivity::class.java))
                finish()
            }, 3000)
        } catch (e : Exception){
            Log.d("SPLASH", "인증 되어야 함")
            auth.signInAnonymously()
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                       Toast.makeText(this, "비회원 로그인 성공", Toast.LENGTH_LONG).show()
                        Handler().postDelayed({
                            startActivity(Intent(this, MainActivity::class.java))
                            finish()
                        }, 3000)
                    } else {
                       Toast.makeText(this, "비회원 로그인 실패", Toast.LENGTH_LONG).show()
                    }
                }
        }
    }
}

 

private lateinit var auth: FirebaseAuth

auth = Firebase.auth

파이어베이스 인증을 위한 인스턴스를 생성한다.

(공식문서를 보면 코드가 있다)

 

try {
       Log.d("SPLASH", auth.currentUser!!.uid)

처음에 현재 접속하는 uid 정보를 로그캣에 찍어보려고 하지만 NullPointerException 오류가 생긴다.

따라서 try-catch 구문을 사용하였다.

 

Toast.makeText(this, "비회원 로그인 됨", Toast.LENGTH_LONG).show()

uid 정보를 찍는데 오류가 안 생겼다면 이미 로그인이 된 상태임을 의미한다.

그러므로 토스트 메시지로 "비회원 로그인 됨"이 띄워지게 하였다.

 

Handler().postDelayed({
                startActivity(Intent(this, MainActivity::class.java))
                finish()
            }, 3000)

3초 동안 SplashActivity가 머물도록 한다.

 

auth.signInAnonymously()
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        Toast.makeText(this, "비회원 로그인 성공", Toast.LENGTH_LONG).show()
                        Handler().postDelayed({
                            startActivity(Intent(this, MainActivity::class.java))
                            finish()
                        }, 3000)

uid 정보가 없어서 에러가 났을 경우 익명으로 인증이 되도록 한다.

또한, 로그인이 성공되었을 때 토스트 메시지를 띄우고 3초 동안 머물도록 한다.

(로그인 처리 코드는 공식문서에 있다)

 

else {

     Toast.makeText(this, "비회원 로그인 실패", Toast.LENGTH_LONG).show()
}

로그인이 실패했을 때 토스트 메시지를 띄운다.

 

 

 

처음엔 uid 값이 없으므로 비회원 인증이 되도록 한다.

 

비회원 로그인 성공 (익명 인증)

 

 

다시 앱을 실행시키면 비회원 로그인이 되었다고 토스트 메시지가 띄워진다.

 

비회원 로그인 됨