[Android/kotlin]Firebase(1)

최지원·2024년 2월 3일
0

[Android/Kotlin]

목록 보기
7/9
post-thumbnail

Firebase가 뭘까?

이전 포스트를 보면 Room과 SharedPreference를 다뤘는데, 앞 2개의 특징은 local DB인 반면 Firebase는 Google의 관리되는 클라우드 서비스이며, 클라우드 기반 데이터 관리를 할 수 있는 특징이 있습니다.
Firebase는 NoSQL 데이터베이스를 기반으로 하기 때문에 Room과 SharedPreference는 다른 방식으로 데이털 관리를 하게 됩니다.

Firebase사용법

📌 Firebase 시작하기

  1. Firebase 홈페이지에 접속 후 시작하기 버튼 클릭.

  2. 프로젝트 추가 버튼 클릭.

  3. 프로젝트 이름 입력 및 Google 애널리틱스 구성(Default Account for Firebase) 선택 후 프로젝트 만들기 클릭.

  4. 생성된 프로젝트에서 Android버튼 클릭.

  5. 앱 네임, 패키지명 입력.

  6. 다음 다음 눌러서 프로젝트 생성 클릭.

  7. 왼쪽 모든 제품 클릭 후 사용하고 싶은 서비스 클릭. 이번 포스트에서는 이메일 로그인과 Realtime Database, Storage를 사용한 프로젝트 실습을 해볼것이니 Authentication, Realtime Database, Storage 을 선택해서 활성화 시키겠습니다.

  8. 서비스 활성화 할 때, 테스트 모드로 시작해야 보안 규칙을 건드리는 일이 없으므로 테스트 모드로 시작하는 것을 추천드립니다.

  9. 프로젝트 설정에서 google-services.json을 다운받는다.

📌 Firebase 사용하기

  1. 다운받은 google-services.json를 Project -> app에 넣는다.
  2. 의존성 추가

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
    }
}

다음과 같이 설정하면 준비 완료입니다.

  1. 레이아웃 구성

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>
  • activity_main : 이메일, 패스워드로 간단한 로그인 화면
  • activity_save : 텍스트 2개와 갤러리에서 이미지 하나 선택, 파이어베이스에 저장
  • activity_my : 저장된 것들을 리사이클러뷰로 확인
  • viewholder_my : 리사이클러뷰 뷰홀더

액티비티는 다음 포스트에서..

profile
안드로이드, 플러터 주니어입니다

0개의 댓글