이전 포스트를 보면 Room과 SharedPreference를 다뤘는데, 앞 2개의 특징은 local DB인 반면 Firebase는 Google의 관리되는 클라우드 서비스이며, 클라우드 기반 데이터 관리를 할 수 있는 특징이 있습니다.
Firebase는 NoSQL 데이터베이스를 기반으로 하기 때문에 Room과 SharedPreference는 다른 방식으로 데이털 관리를 하게 됩니다.
Firebase 홈페이지에 접속 후 시작하기 버튼 클릭.
프로젝트 추가 버튼 클릭.
프로젝트 이름 입력 및 Google 애널리틱스 구성(Default Account for Firebase) 선택 후 프로젝트 만들기 클릭.
생성된 프로젝트에서 Android버튼 클릭.
앱 네임, 패키지명 입력.
다음 다음 눌러서 프로젝트 생성 클릭.
왼쪽 모든 제품 클릭 후 사용하고 싶은 서비스 클릭. 이번 포스트에서는 이메일 로그인과 Realtime Database, Storage를 사용한 프로젝트 실습을 해볼것이니 Authentication, Realtime Database, Storage 을 선택해서 활성화 시키겠습니다.
서비스 활성화 할 때, 테스트 모드로 시작해야 보안 규칙을 건드리는 일이 없으므로 테스트 모드로 시작하는 것을 추천드립니다.
프로젝트 설정에서 google-services.json을 다운받는다.
build.gradle(:app)
plugins {
id 'com.google.gms.google-services'
}
implementation platform('com.google.firebase:firebase-bom:31.3.0') // firebase
implementation 'com.google.firebase:firebase-database-ktx:20.3.0' // realtime database
implementation 'com.google.firebase:firebase-storage-ktx:20.3.0' // storage
implementation 'com.google.firebase:firebase-common-ktx:20.4.2'
implementation 'com.google.firebase:firebase-auth:22.3.1' // auth
build.gradle(project)
buildscript {
repositories {
google() // Google's Maven repository
mavenCentral() // Maven Central repository
}
dependencies {
classpath 'com.google.gms:google-services:4.3.15'
// google
}
}
다음과 같이 설정하면 준비 완료입니다.
activity_main.xml
<?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"
tools:context=".MainActivity">
<EditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:hint="이메일 로그인"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintBottom_toTopOf="@id/password"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:inputType="textEmailAddress"/>
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:hint="비밀번호"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/email"
app:layout_constraintBottom_toBottomOf="parent"
android:inputType="textPassword"/>
<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/password"
app:layout_constraintEnd_toStartOf="@id/join"
android:layout_marginEnd="10dp"
android:text="로그인"
android:textStyle="bold" />
<Button
android:id="@+id/join"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/password"
app:layout_constraintEnd_toEndOf="@id/password"
android:text="회원가입"
android:textStyle="bold"/>
</androidx.constraintlayout.widget.ConstraintLayout>
activity_save.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<EditText
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="20dp"
android:hint="제목"/>
<EditText
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/text1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="20dp"
android:hint="내용"/>
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="300dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Button
android:id="@+id/selectImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/imageView"
app:layout_constraintStart_toStartOf="@id/imageView"
app:layout_constraintEnd_toEndOf="@id/imageView"
android:layout_marginTop="10dp"
android:text="이미지 가져오기"
android:textStyle="bold"/>
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_margin="20dp"
android:text="저장하기"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/my"/>
<Button
android:id="@+id/my"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="20dp"
android:text="확인하기"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@id/save"/>
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:visibility="gone"
tools:visibility="visible"/>
</androidx.constraintlayout.widget.ConstraintLayout>
activity_my.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
viewholder_my.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_margin="20dp"/>
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_margin="20dp"/>
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="150dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_margin="10dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
액티비티는 다음 포스트에서..