티스토리 뷰

반응형

안녕하세요 Ick입니다!

 

이번 글에서는 요즘 앱 개발을 할 때 쉽게 백엔드를 구성하는 방법인 Firebase를 사용하는 방법 정리하려고 합니다!

Firebase에는 두 가지 DB가 있는데 Firestore, realtime Database입니다.

두 개의 차이점을 읽어보니 Firestore가 더 좋아 보여서 Firestore의 사용법을 정리해보려고 합니다.

우선 iOS 앱과 Firebase를 연결하는 방법은 여기를 확인해주세요!

 

Firestore를 사용하기 전에 먼저 Firestore를 생성해야 합니다.

여기를 눌러서 만들어 주시면 됩니다.

만들고 나면 아래와 같이 빈 데이터 베이스가 나타납니다.

그런 뒤 Xcode에서 여기서 하라는 걸 다 해주시면 사용할 수 있습니다.

 

데이터 구조 이해하기

Firestore에는 Collection, Document라는 데이터가 존재합니다.

간단하게 설명하자면 Collection은 폴더 이름, Document는 Collection안에 있는 자료라고 보면 됩니다.

Document에는 다양한 정보가 담길 수 있으며 이를 Field라고 합니다.

위의 그림은 Firebase에서 Firestore의 구조를 설명할 때 보여주는 그림인데 이 그림이 Firestore의 구조를 아주 잘 설명하고 있는 거 같아 가져왔습니다.

데이터 추가하기

import FirebaseFirestore

let db = Firestore.firestore()

Firestore를 사용하려면 위와 같이 라이브러리를 import 해주시고 Firestore 인스턴스를 하나 만들어야합니다.

 

// Document 이름 자동생성
db.collection("Test1").addDocument(data: [:]) { err in
    if let err = err {
        print(err)
    } else {
        print("Success")
    }
}

// Document 이름 직접 만들기
db.collection("Test2").document("ExampleDocument1").setData([:]) { err in
    if let err = err {
        print(err)
    } else {
        print("Success")
    }
}

위와 같이 어떤 컬렉션에 빈 문서를 만들 수 있습니다. 만약 문서의 이름을 직접 만들고 싶다면 위의 코드 중 아래에 있는 것을 사용하시면 됩니다! 그럼 잘 추가되었는지 확인해볼까요?

위와 같이 잘 추가된 것을 볼 수 있습니다.

저는 보통 문서의 이름을 제가 직접 만들고 싶어서 이름을 직접 만드는 코드를 주로 사용하는 거 같아요.

이때 주의할 점은 이름을 똑같이 만들고 setData 메서드를 사용하면 기존의 데이터를 모두 없애고 새로 쓰는 작업이기 때문에 문서를 처음 만들 때만 setData 메서드를 사용해주셔야 합니다!

Document 내부에 맵이나 배열 만들기

이렇게 만들어진 컬렉션에 이번에는 맵, 배열을 만들어보겠습니다.

// Array 추가하기
let path = db.collection("Test2").document("ExampleDocument1")
path.updateData(["Array": []])

// Map 추가하기
let path = db.collection("Test2").document("ExampleDocument1")
db.collection("Test2").document("ExampleDocument1")
path.updateData(["Map": [:]])

이렇게 잘 추가된 것을 볼 수 있습니다.

Document 내부 배열에 데이터 추가

이번에는 아까 만든 배열에 데이터를 추가해보겠습니다.

// 배열에 데이터 추가

let path = db.collection("Test2").document("ExampleDocument1")
path.updateData(["Array" : FieldValue.arrayUnion(["Data1", "Data2"])])

잘 추가된 것을 볼 수 있습니다!

Document 내부 배열 데이터 삭제

이번에는 아까 만든 배열에 추가한 데이터를 수정해보겠습니다.

먼저 배열 속의 요소를 삭제하는 방법입니다.

// 배열 속 데이터 삭제

let path = db.collection("Test2").document("ExampleDocument1")
path.updateData(["Array" : FieldValue.arrayRemove(["Data1"])])

 

Document 내부 배열 데이터 수정

그럼 이번에는 데이터를 수정해보겠습니다.

저는 서버에 저장된 배열 데이터에 인덱스로 접근해서 바로 수정하고 싶었는데...

아직은 방법이 없는 것인지 제가 부족한 탓인지... 우선 이런 방법으로 구현했습니다.

만약 더 좋은 방법이 있다면 알려주세요 ㅠ.ㅠ

let path = db.collection("Test2")

path.getDocuments { (snapshot, err) in
    if let err = err {
        print(err)
    } else {
        guard let snapshot = snapshot else { return }
        for document in snapshot.documents {
            if document.documentID == "ExampleDocument1" {
            	// 배열 데이터를 가져온다.
                guard var data = document["Array"] as? [String] else { return }
                // 배열 데이터를 수정한다.
                data[0] = "UpdateData"
                // 서버의 배열 데이터를 수정된 데이터로 수정한다.
                path.document("ExampleDocument1").updateData(["Array" : data])
            }
        }
    }
}

이렇게 하면 배열의 인덱스에 접근하여 수정은 가능하지만.. 만약 데이터의 크기가 커진다면 자원이 많이 들 거 같아 좋은 방법은 아닌 거 같습니다. 후에 더 좋은 방법을 발견한다면 수정하도록 하겠습니다.

 

Document 내부 딕셔너리(맵)에 데이터 추가

그럼 이번에는 딕셔너리(맵)에도 데이터를 추가해보겠습니다.

// 딕셔너리(맵)에 데이터 추가
let path = db.collection("Test2").document("ExampleDocument1")
path.updateData(["Map" : ["Key1" : "Value1", "Key2" : "Value2"]])

Document 내부 딕셔너리(맵)에 데이터 삭제

이번에는 딕셔너리(맵)에 있는 데이터를 삭제해보겠습니다.

딕셔너리도 아까 배열과 마찬가지로 서버에 있는 딕셔너리 데이터에 Key값으로 바로 접근하여 수정하고 싶었지만...

아직은 방법을 찾지 못해 아까와 비슷한 방식으로 구현했습니다.

let path = db.collection("Test2")

path.getDocuments { (snapshot, err) in
    if let err = err {
        print(err)
    } else {
        guard let snapshot = snapshot else { return }
        for document in snapshot.documents {
            if document.documentID == "ExampleDocument1" {
            	// 서버에 저장된 딕셔너리 데이터를 가져온다.
                guard var data = document["Map"] as? [String : String] else { return }
                // 딕셔너리 데이터를 직접 삭제
                data["Key1"] = nil
                // 원하는 아이템이 삭제된 딕셔너리를 다시 서버에 저장
                path.document("ExampleDocument1").updateData(["Map" : data])
            }
        }
    }
}

위와 같이 삭제가 되는 것을 볼 수 있습니다.

Document 내부 딕셔너리(맵)에 데이터 수정

아까 삭제하는 방법과 비슷한 방법으로 딕셔너리(맵)의 데이터를 수정해보겠습니다.

수정 전의 데이터입니다.

let path = db.collection("Test2")

path.getDocuments { (snapshot, err) in
    if let err = err {
        print(err)
    } else {
        guard let snapshot = snapshot else { return }
        for document in snapshot.documents {
            if document.documentID == "ExampleDocument1" {
                // 서버의 딕셔너리 데이터를 가져온다.
                guard var data = document["Map"] as? [String : String] else { return }
                // 딕셔너리 데이터를 수정한다.
                data["Key1"] = "Update Value1"
                data["Key2"] = "Update Value2"
                // 수정된 딕셔너리 데이터를 서버에 저장한다.
                path.document("ExampleDocument1").updateData(["Map" : data])
            }
        }
    }
}

잘 수정된 것을 볼 수 있습니다!

 

이렇게 데이터들을 추가, 수정, 삭제해봤습니다.

아직 수정과 삭제 부분에서는 지원되지 않는 것인지 원하는 방식대로 할 수는 없었습니다.

다른 좋은 방법이 있다면 알려주시면 감사하겠습니다.

 

우선 이렇게 간단하게 데이터들을 저장해둘 수 있다는 점은 Firebase의 대단함인 거 같습니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함