안녕하세요 후르륵짭짭 입니다.
이번에는 FireBase를 이용해서 서버개발자 없이도
데이터를 읽고 저장하는 방법에 대해서 알아보도록 하겠습니다.
일단 FireBase는 Goolge 것 입니다 ㅎㅎㅎㅎ
그래서 믿을 수 있죠!
FireBase는 그냥 서버 개발자 없이도 서버를 운영하게 해주는 좋은 서비스라고 생각하시면 됩니다!!
그럼 지금 부터 알아가보도록 하겠습니다.
** CocoaPods 설치하기 **
일단 FireBase를 이용하기 위해서는 CocoaPods를 이용해야합니다.
CocoaPods라고 한다면 외부 라이브러리를 다운 받아서 사용하게 할 수 있도록 도와주는 거라 생각하면 편한데요!
$ sudo gem install cocoapods
일단 터미널에 가서 이렇게 적어주세요!!
만약에 오류가 난다면
여기에서 나온 방법을 이용 해보도록 하세요!
이제 Firebase 홈페이지에 들어가서 "시작하기"를 누르고 시키시는거 그대로 하면 됩니다 ㅎㅎㅎ
firebase.google.com/?gclid=EAIaIQobChMIzOnElNSB6wIVpJvCCh1tHQfXEAAYASAAEgIzPfD_BwE
어려울 수 있는 부분이 pod init인데 현재 프로젝트로 들어가서
pod init -> pod install 을 해주세요!!! 그러면 아래와 같이 메시지가 나올 겁니다!!!
그리고 기존 프로젝트가 아닌 새로 생긴 프로젝트(하얀색)로 들어가서
아래와 같이 pod 'FireBase/Analytics' 를 추가해줍니다!!! ㅎㅎㅎㅎ
그리고 실행 시켜 주세요!!!
그럼 잘 될 겁니다!! ㅎㅎㅎ
** 하나의 데이터 읽어오기 **
일단 프로젝트가 생성이 되면 오른쪽 네비게이션 바에 개발 -> database로 들어갑니다.
그런 다음 데이터베이스 생성하기 누르시고, test로 생성하기 해주세요!! ㅎㅎㅎ
그러고 나서 데이터에 + 를 눌러서 key : value 로 넣어주시기 바랍니다!!
주의) key 값에 "key" 이렇게 해주면 안되더라고요. 그냥 key 값 이렇게 넣어주시면 됩나다. 자동으로 String 처리가 되는거 같아요.
이제 여기서 시키는대로 하시면 됩니다!
firebase.google.com/docs/database/ios/start?hl=ko
그리고 나서 아래 처럼 코드를 작성해주시면 읽어오게 됩니다.
import UIKit
import Firebase
class FireBaseViewController: UIViewController {
//firebase의 멘 headkey를 가져온다.
var headDB : DatabaseReference = Database.database().reference()
override func viewDidLoad() {
super.viewDidLoad()
readFireBaseData()
}
func readFireBaseData(){
headDB.child("First").observeSingleEvent(of: .value) { (snapshot) in
let value = snapshot.value as! String
print(value)
//결과 : Data
}
}
}
참고로 여기서
headDB.child("First").observeSingleEvent(of: .value) { (snapshot) in
let value = snapshot.value as! String
print(value)
}
이것은 맨 위의 헤드 데이터에서 자식 중에 Key 값이 "First" 인 놈을 찾고 관측된 하나의 데이터를 가져오겠다
라는 의미 입니다~~!!!
** 하나의 데이터 저장하기 **
Firebase에는 String, 숫자 , Array, Dictionary 총 4가지 타입이 저장 될 수 있습니다.
func writeFireBaseSingleData(){
headDB.child("Int").setValue(2020)
headDB.child("String").setValue("HururuekChapChap")
headDB.child("Dictionary").setValue(["name" : "HururuekChapChap" , "Year" : 2020])
headDB.child("Array").setValue(["Swift", "IOS", "Blog"])
}
이렇게 4가지의 타입에 대해서 FireBase에 저장하도록 했습니다.
여기서 Child 는 Key 값을 의미하는 겁니다.
그러니깐 "Array 라는 Key를 만들고 그 setValue 메소드로 배열 정보를 FireBase에 저장하겠다" 의미입니다.
(참고로, 같은 트리에 위치에서는 중복되어 Key를 저장 할 수 없습니다. 그래서 두번 저장 하려해도 한번만 저장 됩니다.)
그러면 아래와 같이 결과가 나옵니다.
그런데 여기서 주의 해야 할 것은 Array 같은 경우는 key 값이 0,1,2 이렇게 되어 있고
Dictionary 같은 경우는 key : value 로 되어 있습니다.
** 여러개 데이터 읽어오기 **
firebase.google.com/docs/database/ios/read-and-write?hl=ko
이미 여기에 다 설명이 있지만 내용을 담아 보도록 하겠습니다.
하나의 데이터만 읽어 올려고 FireBase를 사용 하는 것은 아니기 때문에, 코드를 적어 봅니다 ㅎㅎㅎ
func readFireBaseDatas(){
headDB.observe(.value) { (SnapShot) in
let value = SnapShot.value as! [String : Any]
for element in value{
if let Number = element.value as? Int {
print(Number)
}
else if let String = element.value as? String {
print(String)
}
else if element.value is Array<String>{
print(element.value)
}
else if element.value is [String:Any] {
print(element.value)
}
}
}
}
//결과
Data
HururuekChapChap
(
Swift,
IOS,
Blog
)
{
Year = 2020;
name = HururuekChapChap;
}
2020
이렇게 하면 복수의 데이터를 읽어 올 수 있습니다.
배열은 () 형태로 가져오고 딕셔너리는 {} 형태로 가져 온 것을 확인 할 수 있습니다.
** 복수의 데이터 저장하기 **
FireBase를 이용하는데 복수의 데이터도 저장해야겠죠??
그런데 문제가 있습니다.
FireBase는 일반적인 HTTP 통신에서 JSON 데이터를 송신 할 때 구조체를 Codable을 이용해서 data로 Encode 해서 보내주고 그랬지만
FireBase는 data로 인코딩이고 그런게 없습니다. 그래서 무조건 숫자, String, Dictionary, Array 만 가능합니다.
따라서 데이터를 보낼 때는 Dictionary 형태로 보내는게 일반적입니다.
struct Student{
let id : String
let major : String
let lector : [Lector]
var toDictionary : [String : Any]{
let lectorDictionary = lector.map { (element) -> [String : Any] in
return element.toDictionary
}
return ["major" : major , "lectors" : lectorDictionary]
}
//타입 프로퍼티 - SQL에서 AutoIncrement 용도로 만들었다.
static var id : Int = 0
}
struct Lector {
let teacher : String
let name : String
var toDictionary : [String : Any] {
return ["teacher" :teacher, "name" : name]
}
}
그래서 이렇게 구조체를 만들어 줍니다.
학생이라는 구조체에 Compute 프로퍼티를 만들고 그 Compute 프로퍼티는 딕셔너리를 반환 해줍니다.
(참고로 Compute 프로퍼티는 Stored 프로퍼티를 가공해서 반환해주는 친구들을 의미합니다.)
이제 FireBase로 보내주기 위해서 아래 처럼 코드를 적어줍니다.
func writeFireBaseDatas(){
let student1 = Student(id: "\(Student.id)", major: "컴퓨터공학", lector: [Lector(teacher: "MR.LEE", name: "IOS"), Lector(teacher: "MR.Kang", name: "Machine Learing")])
Student.id += 1
let student2 = Student(id: "\(Student.id)", major: "블로거", lector: [Lector(teacher: "짭짭", name: "티스토리"), Lector(teacher: "후르륵", name: "초보")])
Student.id += 1
headDB.child("Student").child(student1.id).setValue(student1.toDictionary)
headDB.child("Student").child(student2.id).setValue(student2.toDictionary)
}
학생 1과 학생 2를 만들어줍니다.
그리고 headDB에 "Student"라는 Key를 하나 만들어주고
그 Key 하위에 "학생 ID " Key를 만들어줍니다.
그리고 그 하위에 데이터를 저장하게 됩니다.
그럼 위의 사진 처럼 됩니다.
여기서 Student(딕셔너리) - Student.ID(딕셔너리) - Lector(배열) / major(String)
이렇게 구성되어 있는 것을 확인 할 수 있습니다.
내용이 많이 길었는데,,,,
저도 자주 이 글을 참고 할 것 같습니다.
모두 즐코콬 하세욤~~!!!
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround) Firebase 2부 (파싱&수정&삭제) (0) | 2020.08.09 |
---|---|
PlayGround) Closure 에 대해 알아보자 4부 (Enum&Gernics) (0) | 2020.08.05 |
PlayGround) Closure 에 대해서 알아보자 3부 (Escaping) (0) | 2020.08.04 |
PlayGround) Enum & Generics 에 대해서 알아보자! (0) | 2020.08.03 |
PlayGround) Struct 와 Class의 차이 그리고 Protocol (1) | 2020.07.23 |
댓글