21. [파이어스토어, 스토리지, FCM]

728x90

[21. 파이어스토어, 스토리지, FCM]

[21-1. 파이어스토어 데이터베이스]

 

[파이어베이스 제공. 클라우드 기반 데이터베이스]

파이어스토어 데이터베이스
실시간 데이터베이스

[파이어스토어 사용 설정]

-모듈 수준의 build.gradle 파일에 파이어스토어 라이브러리 등록

implementation ‘com.google.firebase:firebase-firestore-ktx:21.2.1’

 

[파이어스토어 데이터 모델]

-파이어스토어는 NoSQL DB이므로 테이블/X

-컬렉션 안에 문서 단위로 데이터 저장됨

-각 문서에 키-값 쌍의 데이터 저장됨

[파이어스토어 보안 규칙]

-match 구문으로 데이터베이스 문서 식별

-allow 구문으로 접근 권한 작성

   1) 모든 문서 읽기/쓰기 거부

rules_version = ‘2’;
service cloud.firestore {
   match/databases/{database} /documents {
      match / {document =**} {     //모든 문서에 대하여
        allow read, wirte = if false; //읽기/쓰기 거부
     }
  }
}

   2) 모든 문서 읽기/쓰기 허용

rules_version = ‘2’;
service cloud.firestore {
   match/databases/{database} /documents {
      match / {document =**} {     //모든 문서에 대하여
        allow read, wirte = if true; //읽기/쓰기 허용
     }
  }
}

   3) 인증된 사용자에게만 모든 문서 허용

rules_version = ‘2’;
service cloud.firestore {
   match/databases/{database} /documents {
      match / {document =**} {     //모든 문서에 대하여
        allow read, wirte = if request.auth.uid != null; //인증된 사용자에게 허용
     }
  }
}

   4) 자신의 데이터만 읽기/쓰기 허용

rules_version = ‘2’;
service cloud.firestore {
   match/databases/{database} /documents {
     match /users/{userId}
        allow read, update, delete : if request.auth.uid == userId;
        allow create : if request.auth.uid != null;
     }
  }
}

   5) 문서에 저장된 데이터 활용

rules_version = ‘2’;
service cloud.firestore {
   match/databases/{database} /documents {
      match / cities/{city}
         allow read: if resource.data.visibility == ‘public’;
     }
  }
}

   6) 사용자 데이터 VS 데이터베이스의 데이터 비교

rules_version = ‘2’;
service cloud.firestore {
   match/databases/{database} /documents { {
      allow update: if request.resource.data.population > 0
                   && request.resource.data.name == resource.data.name; 
     }
  }
}

[‘파이어스토어에 데이터 저장하기]

-안드로이드 앱에서 파이어스토어 이용하여 데이터 저장 O

-파이어스토어 객체 얻기 : FirebaseFirestore 객체

-FirebaseFirestore 객체로 컬렉션선택하고 문서 추가 or 가져오는 작업

 <파이어스토어 객체 얻기>

   1) db.collection()으로 컬렉션 선택과 동시에 문서작업용 CollectionReference 객체 얻기

   2) 반환받은 CollectionReference 객체의 add()/set()/get() 등의 함수로 문서 작업

var db: FirebaseFirestore = FirebaseFirestore.getInstance()

 

[데이터 저장]

[ add() 함수 ] : 데이터 저장 함수

[ set() 함수 ] : ‘문서 전체 덮어쓰기함수

    - 신규 데이터 저장 + 기존 데이터 변경

    - document() 함수로 작업 대상 문서 지정 후, set() 으로 데이터 처리

[특정 데이터 업데이트/삭제]

[update() 함수 ] : 문서의 특정필드 업데이트

    - document() 함수로 작업 대상 문서 지정 후, update() 함수로 데이터 처리

[delete() 함수 ] : 문서 데이터 삭제

    1) 특정 필드값 삭제 : update()로 필드값 지정 -> FieldValue.delete() 함수 호출

    2) 문서 전체 삭제 : document()로 문서 지정 -> delete() 함수 호출

[데이터 불러오기]

[ get() 함수 ]

    1) 컬렉션의 전체 문서 가져오기

     - db.collection()으로 컬렉션 지정 후, get() 호출

    2) 컬렉션의 단일 문서 가져오기

     - document() 에 식별값으로 문서 지정 후, get() 호출

     - 가져온 문서를 객체에 담아서 사용 시, toObject() 이용

    3) 조건에 맞는 문서만 가져오기

     - whereXXX() 함수로 조건 설정하기

     - 이 함수로 조건 지정한 Query 객체 만들고 Query 객체의 get() 호출

whereEqualTo() / whereGreaterThan() / whereIn() / whereArrayContains() /whereLessThan() / whereNotEqual To()
/ whereNotIn()

[21-2. 파이어베이스 스토리지] : Firebase Storage

[스토리지 사용 설정]

-파이어베이스 콘솔에서 스토리지 시작

-앱의 build.gradle 파일에 라이브러리 등록

implementation ‘com.google.firebase:firebase-storage-ktx’

[파일 올리기]

-스토리지 사용을 위해서는 FirbaseStorage 객체 얻어야 함

 <FirebaseStorage 객체 얻기>

val storage: FirebaseStorage=Firebase.storage

 <스토리지 참조 만들기>

- storage.reference StorageReference 객체 얻기

- child() 함수로 파일 경로가 담긴 StorageReference 객체를 다시 만들기

- 이 객체 이용해서 파일 내려받거나 올리기 가능


[스토리지에 파일 올리기]

[putBytes() 함수] : 바이트값 저장

[putStream() 함수] : 파일 스트림으로 업로드

[putFile() 함수] : 파일 경로로 업로드

[delete() 함수] : 업로드된 파일 삭제


[파일 내려받기]

[스토리지에 저장된 파일 내려받기]

[getBytes() 함수] : 바이트값 가져오기

[getFile() 함수] : 로컬 저장소에 파일 내려받기

[downloadUrl() 함수] : 스토리지 파일의 URL 얻기

[firebase-ui-storage 라이브러리 이용]


[21-3. 이미지 공유 앱 만들기] : 실습


[21-4. 파이어베이스 클라우드 메시징] : FCM

[클라우드 메시징의 원리]

-파이어베이스 클라우드 메시징 (Firebase Cloud messaging) : 서버에서 특정 상황이나 데이터 발생 시 앱에 알림 전달 기능 (서버 푸시)

-서버 데이터를 앱에 직접 전달 X

-FCM 서버를 거쳐서 앱에 전달 O

-연결 지속 유지하지 않아도, 앱이 포그라운드 상황이 아니어도 데이터 받을 수 O

[클라우드 메시징에서 데이터가 앱에 전달되는 과정]

1단계 : 토큰 발급

-FCM 서버에 전달된 데이터를 특정 기기 앱에 전달하려면 앱 구분 식별값 = ‘토큰필요

<토큰 발급 절차>

   1) 클라우드 메시징 이용 앱이 폰에 설치되면 자동으로 안드로이드 시스템이 FCM 서버에 토큰 발급 요청함
   2) FCM 서버에서 앱 식별 토큰 발급해서 폰에 전달
   3) 앱에 전달된 토큰은 FCM 서버에서 메시지 발생할 때 서버에 전달
   4) 서버에서 전달받은 토큰을 DB(데이터베이스)에 저장

2단계 : 서버에서 앱으로 데이터 전송

<데이터 전달 흐름>

   1) 서버에서 특정 상황 발생 시, DB에 저장했던 토큰 추출하여 앱 식별
   2) 서버에서 사용자에게 전달할 메시지와 토큰을 FCM 서버에 전달
   3) FCM 서버에서 토큰 분석하여 해당 폰에 메시지 전달

               -> 두 단계 모두 서비스 컴포넌트작성 필요


[클라우드 메시징 설정]

  1) build.gradle 파일에 관련 라이브러리 등록

  2) 매니페스트 설정

       -FCM 서버에 전달하는 정보: 토큰/알림/데이터 구분

       -<meta-data>로 알림 자동 발생 설정

  3) 서비스 컴포넌트 작성

       -FCM 토큰, 메시지 받는 서비스 작성

       -FirebaseMessagingService 상속받는 클래스 작성

       -내부에 onNewToken() 재정의 시, FCM 서버로부터 토큰 전달될 때 자동 호출됨

       -내부에 onMessageReceived() 함수 재정의 시FCM 서버에서 메시지 전달될 때 자동 호출됨


[21-5. 서버에서 보내는 알림 받기] : 실습


[참고] : Do It 안드로이드 앱 프로그래밍 with 코틀린 

728x90