Swift 일기장 개발 일기 8 (Firebase Firestore Create)

송민준·2023년 1월 17일
0

일기장 개발 일기

목록 보기
8/11
post-thumbnail

현재까지 진행한 일기장 어플은 재부팅하면 일기 데이터가 전부 사라집니다. 그래서 데이터를 내부 또는 외부 데이터베이스에 저장해야하는데 이전에 sqlite3로 내부 저장소를 구현해본 적 있으므로, 어느 플렛폼에서나 로그인만 한다면 일기를 꺼내 볼 수 있도록 외부 데이터베이스를 구현하려고 합니다. 구현은 Firebase의 Firestore를 사용하도록 하겠습니다.

설치


테스트 모드로 선택 후 가장 가까운 리전인 서울을 선택했습니다. 리전은 서비스를 할 지역에 따라 선택해야합니다.


이전 Auth 때 이미 Pod init을 했으므로 podFile에 pod Firebase/Firestore를 추가하고 다시 pod install 했습니다.

NoSQL

Firesotre은 NoSQL입니다. 즉 동적으로 필드를 추가할 수 있고 데이터 간의 관계를 정의하지 않습니다.

Firestore는 Collection과 Document로 데이터베이스를 정의합니다. 이 구조는 마치 JSON과 같이 key-value 쌍을 가집니다.
Collection은 여러 Document를 가집니다. Document 마다 여러 필드로 데이터를 표현하고 Document도 Collection을 가질 수 있습니다.

이 어플에서 필요한 것은 사용자 UID마다 여러 일기를 저장시키는 구조입니다.

그래서 위와 같이 users에 uid를 포함하고 uid는 diarys 컬렉션을 포함하도록 했습니다.
uid 도큐먼트는 nickname 필드를 생성했고 diary 도큐먼트는 날짜, 내용 등 필드를 생성했습니다.

지금까지는 콘솔로 조작하여 도큐먼트를 생성했는데 이제는 어플에서 생성하도록 만들겠습니다.

ViewModel

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의 딕셔너리대로 필드를 생성합니다.
  • document도 그렇고 collection도 그렇고 따로 생성하는 코드가 없어도 생성이 되더라고요.

ViewController

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 도큐먼트도 생성해보도록 하겠습니다.

profile
개발자

0개의 댓글