현재까지 진행한 일기장 어플은 재부팅하면 일기 데이터가 전부 사라집니다. 그래서 데이터를 내부 또는 외부 데이터베이스에 저장해야하는데 이전에 sqlite3로 내부 저장소를 구현해본 적 있으므로, 어느 플렛폼에서나 로그인만 한다면 일기를 꺼내 볼 수 있도록 외부 데이터베이스를 구현하려고 합니다. 구현은 Firebase의 Firestore를 사용하도록 하겠습니다.
테스트 모드로 선택 후 가장 가까운 리전인 서울을 선택했습니다. 리전은 서비스를 할 지역에 따라 선택해야합니다.
이전 Auth 때 이미 Pod init을 했으므로 podFile에 pod Firebase/Firestore
를 추가하고 다시 pod install
했습니다.
Firesotre은 NoSQL입니다. 즉 동적으로 필드를 추가할 수 있고 데이터 간의 관계를 정의하지 않습니다.
Firestore는 Collection과 Document로 데이터베이스를 정의합니다. 이 구조는 마치 JSON과 같이 key-value 쌍을 가집니다.
Collection은 여러 Document를 가집니다. Document 마다 여러 필드로 데이터를 표현하고 Document도 Collection을 가질 수 있습니다.
이 어플에서 필요한 것은 사용자 UID마다 여러 일기를 저장시키는 구조입니다.
그래서 위와 같이 users에 uid를 포함하고 uid는 diarys 컬렉션을 포함하도록 했습니다.
uid 도큐먼트는 nickname 필드를 생성했고 diary 도큐먼트는 날짜, 내용 등 필드를 생성했습니다.
지금까지는 콘솔로 조작하여 도큐먼트를 생성했는데 이제는 어플에서 생성하도록 만들겠습니다.
import FirebaseFirestore
class DBViewModel : NSObject {
let db = Firestore.firestore()
func createUser(uid:String, nickname:String){
db.collection("users").document(uid).setData(["nickname": nickname]){
err in
if let err = err {
print("Error Occured from addDocument : \(err)")
}
else{
print("Adding Document is Success!")
}
}
}
}
DBViewModel은 DB와 관련된 작업을 수행하는 ViewModel입니다.
이 클래스는 Firestore.firestore()를 통해 db 작업을 수행할 객체가 있습니다.
db.collection("users").document(uid).setData(["nickname": nickname])
: uid 값을 가진 document가 없더라도 document를 생성하고 setData의 딕셔너리대로 필드를 생성합니다. class SignInViewController : UIViewController{
...
let dbViewModel = DBViewModel()
...
@IBAction func signInButtonClicked(_ sender: Any) {
...
authViewModel.signIn(email: email, password: password) { user, error in
if let user = user {
...
self.dbViewModel.createUser(uid: user.user.uid, nickname: nickname)
}
...
}
}
}
회원가입을 할 때 DB에 UID와 닉네임 정보가 생성되야하므로 SignInVC에 dbViewModel을 추가했습니다.
회원 가입 시에 UID 생성과 동시에 nickname 필드 생성이 되었습니다.
다음 글에서는 UID 도큐먼트에 diarys 컬렉션 생성 후 diary 도큐먼트도 생성해보도록 하겠습니다.