-
안드로이드 코틀린 : Firebase Firestore 데이터 저장프로그래밍/Android(Kotlin) 2020. 7. 10. 12:00반응형
안녕하세요, 랴파파입니다.
오늘은 파이어베이스 파이어스토어 ( Firebase Firestore ) 기능을 사용해서
아래와 같이 구글 또는 페이스북 로그인 시 해당 유저에 대한 정보를 데이터로 저장하고
앨범에서 선택한 이미지에 대한 정보도 데이터로 저장하여 Firestore 데이터베이스에 데이터를
업로드하는 예제프로그램을 만들어 볼 예정입니다.
Firebase Firestore를 적용한 예제 프로그램 화면 시작 전에, 구글 & 페이스북 로그인 그리고 앨범에서 이미지를 불러오기에 대한 자세한 내용을
확인하시고 싶으신 분께서는 아래의 포스팅을 읽고 시작하세요!
2020/06/30 - [프로그래밍/Android(Kotlin)] - 안드로이드 코틀린 : 파이어베이스 구글 로그인 ( Firebase Google Login )
2020/07/09 - [프로그래밍/Android(Kotlin)] - 안드로이드 코틀린 : Firebase Storage 이미지 저장
1. 라이브러리 ( Library ) 추가
dependencies { ... implementation 'com.google.firebase:firebase-firestore:19.0.0' ... }
Firebase Firestore에 유저와 사진에 대한 정보를 저장하기 위해 < build.gradle(Module:app) >에서 위와 같이 < implementation 'com.google.firebase:firebase-firestore:19.0.0' >을 입력하시고 오른쪽 상단에 표시되는 < Sync Now >를 눌러서 Firebase Firestore 기능을 사용할 수 있도록 설정해주시기 바랍니다.
2. 코틀린 소스코드 ( Kotlin Source Code ) 구성
A. ModelFriends.kt
package ... data class ModelFriends(var strName : String? = null, var strPhoneNo : String? = null, var uid : String? = null, var userId : String? = null, var imageUrl : String? = null) { }
먼저 유저와 사진에 대한 정보를 저장하는 data class를 하나 만듭니다. 오늘 Firestore에 올릴 정보는 uid, userId, imageUrl이 되겠습니다. uid는 해당 유저에 대한 고유 코드라고 보시면 됩니다. userId는 해당 유저의 email 주소이고, imageUrl은 앨범에서 선택한 사진의 다운로드 경로 즉, Url이 되겠습니다.
B. MainActivity.kt
var fbAuth : FirebaseAuth? = null var fbFirestore : FirebaseFirestore? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) fbAuth = FirebaseAuth.getInstance() fbFirestore = FirebaseFirestore.getInstance() if(true) { var userInfo = ModelFriends() userInfo.uid = fbAuth?.uid userInfo.userId = fbAuth?.currentUser?.email fbFirestore?.collection("users")?.document(fbAuth?.uid.toString())?.set(userInfo) } ... }
저의 예제 프로그램에서 여기 포스팅에서는 생략된 LoginActivity.kt이 있는데, 그 부분에 Google & Facebook 로그인에 대해 구성되어 있습니다. LoginActivity.kt에서 인증된 계정으로 성공적으로 로그인이 되면 MainActivity로 넘어오게 됩니다. 이때 해당 유저에 대한 정보를 fbAuth 변수를 통해서 가져오고, fbFirestore 변수의 set함수를 통해서 Firestore 데이터베이스에 업로드합니다. 위의 코드에서는 유저의 uid와 email 주소에 대한 데이터가 저장되는 것을 볼 수 있습니다.
로그인된 유저의 uid, userId 정보가 업데이트 된 Firestore 데이터베이스 이후 Firebase Console에서 확인을 하시면 위와 같이 uid, userId에 대한 값이 업로드되어 있는 것을 확인하실 수 있습니다.
C. FragmentMainProfile.kt
var fbAuth : FirebaseAuth? = null var fbFirestore : FirebaseFirestore? = null var fbStorage : FirebaseStorage? = null private var viewProfile : View? = null var pickImageFromAlbum = 0 var uriPhoto : Uri? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment viewProfile = inflater.inflate(R.layout.fragment_main_profile, container, false) //Initialize Firebase Storage fbStorage = FirebaseStorage.getInstance() fbAuth = FirebaseAuth.getInstance() fbFirestore = FirebaseFirestore.getInstance() viewProfile!!.xml_frg_prf_btn_upload.setOnClickListener { //Open Album var photoPickerIntent = Intent(Intent.ACTION_PICK) photoPickerIntent.type = "image/*" startActivityForResult(photoPickerIntent, pickImageFromAlbum) } return viewProfile }
위의 코드에서 일전의 포스팅 " Firebase Storage 이미지 저장 "과 달라진 점이 있다면 fbAuth, fbFirestore 변수를 통해 FirebaseAuth(계정), FirebaseFirestore(데이터베이스)에 대한 초기화 부분입니다.
private fun funImageUpload(view : View){ var timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date()) var imgFileName = "IMAGE_" + timeStamp + "_.png" var storageRef = fbStorage?.reference?.child("images")?.child(imgFileName) storageRef?.putFile(uriPhoto!!)?.addOnSuccessListener { storageRef.downloadUrl.addOnSuccessListener { uri -> var userInfo = ModelFriends() userInfo.imageUrl = uri.toString() fbFirestore?.collection("users")?.document(fbAuth?.uid.toString())?.update("imageUrl",userInfo.imageUrl.toString()) } } }
위의 funImageUpload 함수에서는 앨범에서 사진을 선택할 시 storageRef 변수의 putFile 함수를 통해서 해당 사진을 Storage에 업로드를 합니다. 이후 해당 사진을 Storage에서 다운로드할 수 있는 Url 경로를 받아옵니다. 이후 그 Url 경로를 fbFirestore 변수의 update 함수를 사용하여 기존의 document 내부에 존재하는 imageUrl에 대한 값만 업데이트를 해줍니다. 만일 update 함수 대신에 그 전의 위의 예제처럼 set 함수를 사용하는 경우는 기존에 존재하던 uid, userId에 대한 값이 초기화되니 주의하시기 바랍니다. 따라서 기존에 존재하는 document 내부에서 일부의 값만 수정하고 싶은 경우 update 함수가 사용되어야 합니다.
이후 Firebase Console에서 확인을 하시면 위와 같이 imageUrl에 대한 값만 수정되어 있는 것을 확인하실 수 있습니다. 추가로 위에 표시된 imageUrl에 대한 정보를 인터넷 주소창에 입력하시면 바로 업로드된 이미지를 다운로드하실 수 있습니다.
앨범에서 선택되어 Storage에 업로드된 사진의 액세스 토큰이 Firestore 데이터베이스에 저장된 imageUrl 정보와 동일 이것으로 오늘은 Firebase Firestore 기능을 활용해서 예제 프로그램을 구성해봤습니다.
오늘 글도 여러분께 많은 도움이 됐기를 희망합니다.
감사합니다!
반응형'프로그래밍 > Android(Kotlin)' 카테고리의 다른 글
안드로이드 코틀린 : 애드몹(AbMob) 광고 넣기 (0) 2020.07.14 안드로이드 코틀린 : Firebase Storage 이미지 저장 (0) 2020.07.09 안드로이드 코틀린 : SharedPreferences (1) 2020.07.03 안드로이드 코틀린 : 파이어베이스 페이스북 로그인 ( Firebase Authentication : Facebook Login ) (1) 2020.07.01 안드로이드 코틀린 : 파이어베이스 구글 로그인 ( Firebase Google Login ) (1) 2020.06.30