Firebase Firestore에 데이터 저장하기

KEH·2021년 7월 21일
0
post-thumbnail

Data class 생성하기

Firestore에 데이터를 저장하기 위해 데이터 클래스를 생성한다.
model이란 패키지를 하나 만들고, 그 안에 ContentDTO.kt 파일을 추가한다.

data class ContentDTO(var exaplain: String? = null,     //게시글
                      var imageUrl: String? = null,     //이미지 url
                      var uid: String? = null,      //글 작성자 식별자
                      var userEmail: String? = null,    //글 작성자 이메일
                      var timestamp: Long? = null,      //작성일
                      var favoriteCount: Int = 0,       //좋아요 수
                      var favorites: Map<String, Boolean> = HashMap()) {    //좋아요를 누른 사람들
    data class Comment(var uid: String? = null,     //댓글 작성자 식별자
                       var userEmail: String? = null,   //댓글 작성자 이메일
                       var comment: String? = null,     //댓글
                       var timestamp: Long? = null)     //댓글 작성일
}

위와 같이 데이터 클래스를 작성해준다.

Firestore 준비하기

build.gradle(module)에 firestore 사용을 위한 라이브러리를 설치한다.

dependencies {
	implementation 'com.google.firebase:firebase-firestore-ktx'
}

Firestore에 데이터 저장하기

게시글 업로드를 누르면 해당 데이터가 firestore에 저장되고 홈 화면으로 이동하는 동작을 구현해 볼 것이다.
class GalleryFragment(uri: Uri): Fragment() {
    private lateinit var mBinding: FragmentGalleryBinding
    private var uri: Uri = uri
    private var auth: FirebaseAuth? = null
    private var store: FirebaseFirestore? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        mBinding = FragmentGalleryBinding.inflate(inflater, container, false)

        //firebase 서비스 초기화
        auth = FirebaseAuth.getInstance()
        store = FirebaseFirestore.getInstance()

        mBinding.postPhotoIV.setImageURI(uri)   //갤러리에서 선택한 이미지를 해당 이미지뷰에서 보여줌.
        //게시글 업로드 버튼을 누르면 Firebase Storage에 이미지를 업로드 하는 함수 실행.
        mBinding.postButton.setOnClickListener {
            uploadImageTOFirebase(uri!!)
        }

        return mBinding.root
    }
}

store 변수에 FirebaseFirestore 클래스를 getInstance()를 통해 인스턴스를 생성하고, postButton(게시글 업로드 버튼)을 눌렀을 때 firestore에 데이터가 저장되는 uploadImageTOFirebase() 메서드를 호출한다.

//Firebase Storage에 이미지를 업로드 하는 함수.
    fun uploadImageTOFirebase(uri: Uri) {
        var storage: FirebaseStorage? = FirebaseStorage.getInstance()   //FirebaseStorage 인스턴스 생성
        //파일 이름 생성.
        var fileName = "IMAGE_${SimpleDateFormat("yyyymmdd_HHmmss").format(Date())}_.png"
        //파일 업로드, 다운로드, 삭제, 메타데이터 가져오기 또는 업데이트를 하기 위해 참조를 생성.
        //참조는 클라우드 파일을 가리키는 포인터라고 할 수 있음.
        var imagesRef = storage!!.reference.child("images/").child(fileName)    //기본 참조 위치/images/${fileName}
        //이미지 파일 업로드
        imagesRef.putFile(uri!!).continueWithTask { task: Task<UploadTask.TaskSnapshot>->
            //Firebase Storage에 업로드된 이미지의 downloadUrl을 리턴한다.
            return@continueWithTask imagesRef.downloadUrl
        }.addOnSuccessListener {
            //ContentDTO 데이터 클래스 생성.
            var contentDTO: ContentDTO = ContentDTO()
            contentDTO.exaplain = mBinding.postTextView.text.toString()
            contentDTO.imageUrl = it.toString()
            contentDTO.uid = auth!!.currentUser!!.uid
            contentDTO.userEmail = auth!!.currentUser!!.email
            contentDTO.timestamp = System.currentTimeMillis()

            //db에 데이터 저장.
            store!!.collection("posts").document().set(contentDTO)
            //저장 후 홈 프래그먼트로 이동.
            (activity as MainActivity).changeFragment(HomeFragment())
            (activity as MainActivity).changeNavigation()
        }.addOnFailureListener {
            println(it)
            Toast.makeText(activity, getString(R.string.upload_fail), Toast.LENGTH_SHORT).show()
        }
    }

이미지 파일이 firebase storage에 성공적으로 업로드 되면(.addOnSuccessListener) ContentDTO 클래스를 생성해 데이터를 저장하고, store!!.collection("posts").document().set(contentDTO) 코드를 통해 posts라는 컬렉션에 contentDTO를 저장하고 HomeFragment로 이동한다. 만약 실패하면 토스트 메세지를 출력한다.

profile
개발을 즐기고 잘하고 싶은 안드로이드 개발자입니다 :P

0개의 댓글