-
Notifications
You must be signed in to change notification settings - Fork 0
✅ [기술 결정] 데이터 별 UID 생성
각 타입 별 데이터는 다른 데이터의 ID값을 참조하기 때문에 완벽하게 데이터 별로 식별이 가능한 고유한 ID값이 필요했다. 원격 저장소로 사용중인 Firestore
에서는 document라는 타입을 통해 Key-Value
로 이루어진 데이터들을 저장하는데, document의 이름을 직접 지정하지 않을 경우 자동으로 고유한 ID값을 생성하기 때문에 이를 활용해 식별자를 지정했다.
val uploadResult = Collection.add(uploadData).await() // DocumentReference 반환
val uid = uploadResult.id
.add()
를 사용해 collection에 데이터를 업로드하게 되면 document가 생성되며, 업로드가 완료되었을 때 DocumentReference
값을 반환한다. DocumentReference
의 id를 통해 생성된 document의 고유ID값을 가져올 수 있다.
DocumentReference는 Firestore에서 document의 위치를 참조하고 있기 때문에 해당 값을 사용해 document의 값을 읽거나 쓰는게 가능하다.
document의 ID를 통해DocumentReference를 가져올 수 있으며,
.add()
를 통해 데이터를 추가한 경우에도 DocumentReference가 반환되기 때문에 바로 해당 document에 접근이 가능하다.
이를 활용해 고유하게 생성된 document의 ID값을 기반으로 데이터의 ID값을 지정할 수 있게 했다.
(각 데이터별로 식별이 용이하고, 중복이 없도록 앞쪽에 데이터를 나타내는 식별자를 추가했다.)
postCollection.add(upload).await().let { documentReference ->
documentReference.update("postId", "post-${documentReference.id}")
}
.update(key, value)
메소드를 사용하면 key필드의 값을 value로 변경할 수 있으며, 만약 key이름으로 생성된 필드가 없을 시에는 필드를 새롭게 생성한다.
Firebase
의 Storage에 파일을 업로드 하려면 파일의 이름을 지정해야 하는데, 만약 파일의 이름이 같을 경우 이전의 파일을 덮어쓰게 된다.
따라서 사용자의 이미지가 저장 될 때는 각 파일의 이름이 고유해야 다른 이미지를 덮어쓰는 불상사를 막을 수 있다.
사용자가 업로드를 하는 순간의 경우 각각의 시간이 고유한 값이기 때문에 TimeStamp
를 사용해 이름을 지정해 준다.
val timeStamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))
만약 유저가 많을 경우에는 정말 엄청난 확률이지만 동시간에 업로드를 진행할 수 있기 때문에 이름이 겹칠 가능성이 존재한다.
이를 방지하기 위해 TimeStamp
와 함께 각 유저의 UID를 조합해 이름을 생성한다.
val fileName = uid + timeStamp
이 경우 파일 이름에 UID
가 추가되며, 정보가 노출 될 가능성이 있기 때문에 이를 막기 위해 SHA-256
방식을 사용해 해싱을 진행해 최종적으로 파일 이름을 만들도록 작성했다.
val fileName = (this + timeStamp).toHash()
private fun String.toHash(): String {
val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(this.toByteArray())
return hash.joinToString("") { "%02x".format(it) }
}
Copyright 2024. Team Kolown All Rights Reserved.
- ✅ [기술 결정] Camera
- ✅ [기술 결정] Image Load
- ✅ [기술 결정] UI Toolkit - Copmpose
- ✅ [기술 결정] 데이터 별 UID 생성
- ✅ [기술 결정] Debounce & Paging 사용해서 검색 구현
- ✅ [기술 결정] Google Login
- ✅ [기술 결정] 스켈레톤 UI
- ⚙ [기술 분석] DI
- ⚙ [기술 분석] Image Compress
- ⚙ [기술 분석] 이미지 리사이징
- ⚙ [기술 분석] CameraX API
- ⚙ [기술 분석] Firebase & 랜덤 로딩
- ⚙ [기술 분석] ViewModel 공유
- ⚙ [기술 분석] Firestore 쿼리 전략
- ⚙ [트러블 슈팅] Chip with TextField(Custom with IntrinsicSize)
- ⚙ [트러블 슈팅] WindowInset
- ⚙ [트러블 슈팅] UI 실시간 반영
- ⚙ [트러블 슈팅] IME Padding
- ⚙ [트러블 슈팅] PagingSource reset
- ⚙ [트러블 슈팅] SharedFlow - SnackBar
- ⚙ [트러블 슈팅] Camera와 Lifecycle 동기화