Skip to content

✅ [기술 결정] 데이터 별 UID 생성

박봉팔 edited this page Dec 4, 2024 · 1 revision

데이터 별 고유 ID생성

각 타입 별 데이터는 다른 데이터의 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이름으로 생성된 필드가 없을 시에는 필드를 새롭게 생성한다.



이미지 저장을 위한 고유 이름 생성

FirebaseStorage에 파일을 업로드 하려면 파일의 이름을 지정해야 하는데, 만약 파일의 이름이 같을 경우 이전의 파일을 덮어쓰게 된다.
따라서 사용자의 이미지가 저장 될 때는 각 파일의 이름이 고유해야 다른 이미지를 덮어쓰는 불상사를 막을 수 있다.


1. TimeStamp를 사용

사용자가 업로드를 하는 순간의 경우 각각의 시간이 고유한 값이기 때문에 TimeStamp를 사용해 이름을 지정해 준다.

val timeStamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))

2. UID를 추가

만약 유저가 많을 경우에는 정말 엄청난 확률이지만 동시간에 업로드를 진행할 수 있기 때문에 이름이 겹칠 가능성이 존재한다.
이를 방지하기 위해 TimeStamp와 함께 각 유저의 UID를 조합해 이름을 생성한다.

val fileName = uid + timeStamp

3. Hashing

이 경우 파일 이름에 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) }
}
Clone this wiki locally