본문 바로가기
Xcode/Swift - PlayGround

PlayGround) FireBase 알아가기 1부 (설치&읽기&저장)

by 후르륵짭짭 2020. 8. 5.
728x90
반응형

 

안녕하세요 후르륵짭짭 입니다.

이번에는 FireBase를 이용해서 서버개발자 없이도 

데이터를 읽고 저장하는 방법에 대해서 알아보도록 하겠습니다.

일단 FireBase는 Goolge 것 입니다 ㅎㅎㅎㅎ

그래서 믿을 수 있죠!

FireBase는 그냥 서버 개발자 없이도 서버를 운영하게 해주는 좋은 서비스라고 생각하시면 됩니다!!

그럼 지금 부터 알아가보도록 하겠습니다.

 

** CocoaPods 설치하기 **

일단 FireBase를 이용하기 위해서는 CocoaPods를 이용해야합니다.

CocoaPods라고 한다면 외부 라이브러리를 다운 받아서 사용하게 할 수 있도록 도와주는 거라 생각하면 편한데요!

$ sudo gem install cocoapods

일단 터미널에 가서 이렇게 적어주세요!!

만약에 오류가 난다면 

minmong.tistory.com/84

 

Error installing cocoapods 설치 에러 오류 수정

Error installing cocoapods 설치 에러 오류 수정 안녕하세요 민몽입니다 :) 맥북의 xcode를 11로 업데이트하려다 보니.. Mac Os 버전이 한참 낮더라고요.. 이전 버전이 10.13이었어요. 그래서 주말에 Mac..

minmong.tistory.com

여기에서 나온 방법을 이용 해보도록 하세요!

이제 Firebase 홈페이지에 들어가서 "시작하기"를 누르고 시키시는거 그대로 하면 됩니다 ㅎㅎㅎ

firebase.google.com/?gclid=EAIaIQobChMIzOnElNSB6wIVpJvCCh1tHQfXEAAYASAAEgIzPfD_BwE

 

Firebase

Firebase는 고품질 앱을 빠르게 개발하고 비즈니스를 성장시키는 데 도움이 되는 Google의 모바일 플랫폼입니다.

firebase.google.com

어려울 수 있는 부분이 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

 

iOS에서 설치 및 설정  |  Firebase 실시간 데이터베이스

Firebase 실시간 데이터베이스는 클라우드 호스팅 데이터베이스입니다. 데이터는 JSON으로 저장되며 연결된 모든 클라이언트에 실시간으로 동기화됩니다. Android, iOS 및 자바스크립트 SDK로 교차 플�

firebase.google.com

그리고 나서 아래 처럼 코드를 작성해주시면 읽어오게 됩니다.

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

 

iOS에서 데이터 읽기 및 쓰기  |  Firebase 실시간 데이터베이스

FIRDatabaseReference 가져오기 데이터베이스에서 데이터를 읽거나 쓰려면 FIRDatabaseReference의 인스턴스가 필요합니다. Swiftvar ref: DatabaseReference! ref = Database.database().reference() Objective-C@property (strong, nonato

firebase.google.com

이미 여기에 다 설명이 있지만 내용을 담아 보도록 하겠습니다.

하나의 데이터만 읽어 올려고 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)

이렇게 구성되어 있는 것을 확인 할 수 있습니다.

 

내용이 많이 길었는데,,,,

저도 자주 이 글을 참고 할 것 같습니다.

모두 즐코콬 하세욤~~!!!

728x90
반응형

댓글