Swift 일기장 개발 일기 9 (Firebase Firestore 하위 collection에서 Document 생성)

송민준·2023년 1월 17일
0

일기장 개발 일기

목록 보기
9/11

이번 글은 이전 글의 연장입니다. 이전 글에서는 오직 users collection에서 uid라는 document에 닉네임 필드를 생성했었죠.
이번에는 그 document에 diarys라는 collection에서 diary document를 생성해보도록 하겠습니다. 이를 하위 컬렉션이라고 부르더라고요.

살펴보기

VC들(MainVC, CreateVC)을 언급한지 꽤 됬으므로 다시 설명하자면 CreateVC는 날짜, 내용, 이미지를 받아서 MainVC의 delegate function을 호출하는 VC이며 MainVC는 작성한 일기를 보여주고 DiaryListVM을 통해 리스트를 갱신합니다.
여태까지 저장이랍시고 DiaryListVM에 리스트를 통해 저장해왔습니다. 제가 손봐야되는 곳은 DiaryListVM 입니다.
오늘은 DiaryListViewModel에서 create할 때 db도 같이 create 해보겠습니다.

DBViewModel

class DBViewModel : NSObject {
    let db = Firestore.firestore()
    ...
    func makeDocument(uid:String, date:Date, emotion: String?, content: String, imageData: Data?){
        var ref: DocumentReference?
        ref = db.collection("users").document(uid).collection("diarys").addDocument(data:
                                                                                        ["date" : Timestamp(date: date),
                                                                                         "emotion" : emotion ?? "",
                                                                                         "content" : content,
                                                                                        ])
        { err in
            if let err = err {
                print("Error adding document: \(err)")
            } else {
                print("Document added with ID: \(ref!.documentID)")
            }
        }
    }
    ...
}
  • db.collection("users").document(uid).collection("diarys").addDocument(data: : 하위 컬렉션을 정의하고 도큐먼트를 생성합니다. 즉 users 컬렉션의 uid라는 도큐먼트에서 하위 컬렉션인 diarys를 정의하고 그 안에 도큐먼트를 생성합니다.
    - db.collection("cities").document("LA").setData 를 통해 도큐먼트의 이름을 지정할 수 있지만 저는 사용하지 않았습니다. 그 이유는 일기에 제목이 있는 것도 아니라서 적절한 도큐먼트의 ID를 얻기 위해 addDocument()로 무작위 document ID를 얻었습니다.
    • 다른 이유는 이후에 작성할 Image를 Firebase Store에 저장할 때 사용할 고유한 ID가 필요했기 때문입니다. user마다 고유한 uID가 있듯이 user의 diary에서 고유한 documentID가 있어야합니다.

DiaryListViewModel

class DiaryListViewModel: NSObject{
    let dbViewModel = DBViewModel()
    ...
    func createDiaryData(uid:String, date:Date, emotion: String?, content: String, imageData:Data?){
        ...
        
        dbViewModel.makeDocument(uid: uid, date: date, emotion: emotion, content: content, imageData: imageData)
        ...
    }
    ...
}
  • dbViewModel.makeDocument(): dbViewModel의 makeDocument를 호출합니다.

테스트

결과로 맨위를 보시면 users > {uID} > diarys > {docID} 순으로 되어 하위 컬렉션이 적절하게 생성되었음을 알 수 있고
자동생성된 document ID와 필드(date, emotion, content)를 확인할 수 있습니다.

Image는 Firestore가 아닌 Firebase Storage에 생성하도록 할 것 입니다. 따라서 다음 내용은 Firebase Storage 설치와 이미지 업로드가 되겠습니다.

profile
개발자

0개의 댓글