[Clone] 인스타그램 클론 프로젝트(5) - 컨텐츠 데이터 모델

minnie·2022년 3월 15일
0

클론프로젝트

목록 보기
6/8
post-thumbnail

인프런 하울스타그램 컨텐츠 데이터 모델 강의로 업로드한 사진을 데이터로 관리할 수 있도록 데이터 모델 만드는 내용이다.

1. 의존성 추가

먼저 firebase의 fireStore 의존성을 추가해준다.

implementation 'com.google.firebase:firebase-firestore-ktx:24.0.2'

2. 데이터 클래스 생성

ContentDTO 데이터 클래스를 생성한다.


data class ContentDTO(
    var explain: String? = null, // 컨텐츠 설명 관리
    var imageUrl: String? = null, // 이미지 주소 관리
    var uid: String? = null, // 어느 유저가 올렸는지 관리
    var userId: String? = null, // 올린 유저의 이미지를 관리
    var timestamp: Long? = null, // 몇시 몇분에 컨텐츠를 올렸는지
    var favoriteCount: Int = 0, // 좋아요를 몇 개 눌렀는지
    var favorites: Map<String, Boolean> = HashMap() // 중복 좋아요 방지할 수 있는 유저 확인
) {
    data class Comment( // 댓글 관리
        var uid: String? = null, // uid 관리
        var userId: String? = null, // 이메일 관리
        var comment: String? = null, // 댓글 관리
        var timestamp: Long? = null // 시간
    )
}

3. AddphotoActivity에서 데이터베이스 사용

AddPhotoActivity.kt에서 유저 정보를 가져올 수 있도록 auth변수를 선언하고 데이터베이스를 사용할 수 있도록 firebaseStore변수를 선언한다.

var auth : FirebaseAuth? = null
var firebaseStore : FirebaseFirestore? = null

onCreate내부에서 auth와 firebaseStore를 초기화 해준다.

auth = FirebaseAuth.getInstance()
firebaseStore = FirebaseFirestore.getInstance()

contentUpload 메서드 안에서 데이터베이스를 입력해주는 코드를 작성해준다.
방식에는 Callback 방식과 Promise 방식 2가지 방식이 있지만 구글에서는 Promise방식을 권장한다고 한다.

    @SuppressLint("SimpleDateFormat")
    private fun contentUpload(){
        //파일 이름 생성
        val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val imageFileName = "IMAGE_"+ timestamp + "_.png"

        val storageRef = storage?.reference?.child("images")?.child(imageFileName)

        //파일 업로드 1. 콜백방식
/*        storageRef?.putFile(photoUri!!)?.addOnSuccessListener {
            storageRef.downloadUrl.addOnSuccessListener { uri->
                var contentDTO = ContentDTO()
                contentDTO.imageUrl = uri.toString()

                contentDTO.uid = auth?.currentUser?.uid
                contentDTO.userId = auth?.currentUser?.email
                contentDTO.explain = binding.addphotoEditExplain.text.toString()
                contentDTO.timestamp= System.currentTimeMillis()

                firebaseStore?.collection("images")?.document()?.set(contentDTO)
                setResult(Activity.RESULT_OK)
                finish()
            }
            //Toast.makeText(this,getString(R.string.upload_success),Toast.LENGTH_LONG).shw()
        }*/

        //파일 업로드 2. 프라미스 방식
        storageRef?.putFile(photoUri!!)?.continueWithTask { task: Task<UploadTask.TaskSnapshot>->
            return@continueWithTask storageRef.downloadUrl
        }?.addOnSuccessListener { uri->
            var contentDTO = ContentDTO()
            contentDTO.imageUrl = uri.toString()

            contentDTO.uid = auth?.currentUser?.uid
            contentDTO.userId = auth?.currentUser?.email
            contentDTO.explain = binding.addphotoEditExplain.text.toString()
            contentDTO.timestamp= System.currentTimeMillis()

            firebaseStore?.collection("images")?.document()?.set(contentDTO)
            setResult(Activity.RESULT_OK)
            finish()
        }

    }

이미지 업로드가 완료되면 이미지 주소를 받아오는 코드를 addOnSuccessListener에 작성해준다. 이미지 주소를 받아오자마자 데이터 모델 ContentDTO를 만들어 주고 데이터 값을 넣어준다.
setResult는 업로드가 완료되면 finish로 창을 닫아주고 정상적으로 창이 닫혔다는 플래그 값을 넘겨주기 위해 RESULT_OK를 사용해준다.

4. Firebase에서 데이터 베이스를 생성하고 설정

allow read, write: if request.time < timestamp.date(2022, 4, 14); 이러한 규칙을

allow read, write: if request.auth.uid !=null; 다음과 같이 수정해준다.

이후 이미지를 업로드 하고 Firebase의 데이터베이스에서 확인해보면 이미지가 저장된것을 확인할 수 있다.

출처 : https://hyeals.tistory.com/41

profile
Android Developer

0개의 댓글