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

etc-image-0

 

 

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

 


목표

 

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

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

 

 

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

 

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

https://console.firebase.google.com

 

로그인 - Google 계정

이메일 또는 휴대전화

accounts.google.com

 

 

 

프로젝트를 만든다.

 

etc-image-1

 

 

프로젝트 이름 지정

 

etc-image-2

 

 

계속 진행

 

etc-image-3

 

 

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

 

etc-image-4

 

 

프로젝트 생성 중

 

etc-image-5

 

 

 

2. 앱 추가

 

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

 

etc-image-6

 

 

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

 

etc-image-7
패키지 이름

 

etc-image-8

 

 

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

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

 

etc-image-9
etc-image-10

 

 

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

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

 

etc-image-11

 

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

 

 

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

 

etc-image-13

 

etc-image-14
앱 수준 Gradle 파일에서 플러그인 추가

 

etc-image-15
앱 수준 Gradle에서 파이어베이스 SDK 추가

 

 

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

 

etc-image-16
Sync Now 눌러 적용하기

 

 

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

 

etc-image-17

 

 

 

 

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(인증) 기능을 사용한다.

etc-image-18

 

 

시작하기를 누른다.

 

etc-image-19

 

 

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

 

etc-image-20

 

 

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

 

etc-image-21

 

 

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

 

etc-image-22

 

 

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

 

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 파일에 해당 내용을 추가한다.

etc-image-23

 

etc-image-24
앱수준 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>

 

etc-image-25

 

 

 

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 값이 없으므로 비회원 인증이 되도록 한다.

 

etc-image-26
비회원 로그인 성공 (익명 인증)

 

 

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

 

etc-image-27
비회원 로그인 됨