티스토리 뷰

firebase 는 실시간 데이터베이스Cloud Firestore 두 가지 타입의 저장소를 제공한다. 현재 (18.04.14) 기준으로 firestore 는 베타 기간이고 공식 문서에 따르면 아직 안정성은 실시간 데이터베이스에 비해 떨어질 수 있다고 하니 상용으로 운영할 생각이라면 여러가지 상황을 고려해야겠다. 하지만 그 강력함을 보면 사용하지 않을 이유가 있을까 싶다.

일단 두 종류의 데이터베이스에 대한 비교는 아래 페이지를 통해 확실하게 알 수 있다.
https://firebase.google.com/docs/firestore/rtdb-vs-firestore?hl=ko

여기서 우리는 node.js 기반으로 firestore 를 사용해 보도록 한다. 우선 firebase 에서 제공되는 데이터베이스는 모두 NoSQL 이고 firestore 의 데이터의 적재 스타일을 보면 collection - document - ( collection | field ) 와 같은 형식을 따른다. 통상적으로 NoSQL 에서 사용되는 용어들이다. 이해를 돕기위해 실제 firestore 에 저장된 데이터를 살펴보자.

한 개의 collection 을 등록해놓고 하위에 여러가지 document 를 추가했다. NoSQL 답게 데이터는 밀어넣는대로 들어간다. 자, 그럼 본격적으로 사용해보도록 하자.

npm 으로 firebase 모듈을 설치하도록 한다.

$ npm install firebase --save

뒤쪽에 --save 옵션을 넣는 이유는 npm init 을 통해 프로젝트를 시작했을 때 package.json 이 관리되게 되는데 이쪽에 dependencies 를 추가해주기 위해서다. 잘 이해가 안되면 우선 습관적으로 쓰는게 좋다. ( 관련된 부분은 별도의 포스팅을 찾아보기를 권한다 )

모듈 설치가 끝났으면 우리가 만드는 프로그램에서 firebase 로 접근하기 위한 인증 키 등을 등록해줘야 한다. 해당 키에 대한 정보는 firebase 프로젝트로 접근했을 때 노출되는 overview 에서 확인할 수 있다. 대략 아래와 같은 화면에서 사용할 프로그램을 선택하면 되는데 우리는 노드를 통한 웹 애플리케이션을 예제로 하고 있으므로 웹 앱에 Firebase 추가 버튼을 누르면 되겠다.

아래처럼 인증에 필요한 코드를 얻을 수 있다.

해당 키를 node 파일에 넣고 사용해주면 되는데 인증에 필요한 내용을 다루는 파일과 해당 파일을 기반으로 초기화를 진행하는 코드를 분리해서 사용하도록 해보자. 일단 인증키를 아래처럼 명시하도록 하자.

// firebaseConfig.js
export default {
	apiKey: "AIzaSyC7zsEP4XCMP_-HcpqPxG_L_Rv0JDtH1KY",
	authDomain: "livemsg-de622.firebaseapp.com",
	databaseURL: "https://livemsg-de622.firebaseio.com",
	projectId: "livemsg-de622",
	storageBucket: "livemsg-de622.appspot.com",
	messagingSenderId: "611585985356"
}

해당 파일을 읽어서 초기화하는 코드는 다음과 같이 작성하도록 한다.

// firebaseInit.js
import firebase from 'firebase'
import 'firebase/firestore'
import firebaseConfig from './firebaseConfig'
const firebaseApp = firebase.initializeApp(firebaseConfig)
export default firebaseApp.firestore()

살펴보면 firebaseInit.js 에서 firebseConfig.js 에 있는 키를 통해 파베를 초기화해주고 있다. 이제 우리는 firebaseInit.js 만 가져다 쓰면 된다. 노드에서는 아래 한줄로 처리된다.

import db from './firebaseInit';

이제 db 객체를 통해 firestore 에 접근이 가능하다.  여기서 몇 가지 예제를 더 살펴보자.

// document 추가
db.collection('cities').doc('new-city-id').set(data);
문서 이름을 생략하는 방법도 있다.
var newCityRef = db.collection('cities').doc();

// Later...
var setDoc = newCityRef.set({
    // ...
});
문서의 내용을 업데이트 하는 방법은 아래와 같다.
var cityRef = db.collection('cities').doc('DC');

// Set the 'capital' field of the city
var updateSingle = cityRef.update({ capital: true });
데이터의 삭제 방법은 delete() 을 사용한다.
var deleteDoc = db.collection('cities').doc('DC').delete();
특정 필드만 삭제할 수도 있다.
// Get the `FieldValue` object
var FieldValue = require('firebase-admin').firestore.FieldValue;

// Create a document reference
var cityRef = db.collection('cities').doc('BJ');

// Remove the 'capital' field from the document
var removeCapital = cityRef.update({
    capital: FieldValue.delete()
});
데이터는 아래와 같이 가져올 수 있다.
var citiesRef = db.collection('cities');
var allCities = citiesRef.get()
    .then(snapshot => {
        snapshot.forEach(doc => {
            console.log(doc.id, '=>', doc.data());
        });
    })
    .catch(err => {
        console.log('Error getting documents', err);
    });

기본적인 읽기 / 쓰기 / 수정에 대해서 살펴봤는데 쿼리 등을 이용한 더 다양한 방식은 아래 링크를 참고하도록 하자. 
https://firebase.google.com/docs/firestore/ 

참고로 onSnapshot() 을 이용하면 마치 pub/sub 에서의 subscribe 과 같이 사용할 수 있다. 이 말은 firestore 에 변화를 바로 수신한다는 의미다. 해당 기능을 몰랐을 때는 firebaseFunctions 를 이용해서 별도의 트리거를 만들어야 하는 줄 알았는데 그럴 필요조차 없다. 이제 다양한 데이터를 밀어넣고 잘 갖다쓰기만 하면 되는 세상이다. 

(*) 참고자료: https://www.youtube.com/watch?v=sYNjEzcOTOs



'개발 > Cloud (GCP)' 카테고리의 다른 글

Kubernetes Engine (GKE #3. 터미널 배포)  (2) 2018.05.06
firebase 인증 시작하기  (0) 2018.04.27
firestore 저장소 사용하기  (15) 2018.04.15
Firebase 시작하기  (0) 2018.04.07
프로젝트 종료하기  (0) 2018.03.10
Cloud TPU 사용하기  (1) 2018.02.15
댓글
  • 프로필사진 마틴 좋은 정보 감사합니다 :D 2018.04.23 12:40
  • 프로필사진 BlogIcon Jaeyeon Baek 마선생님의 방문에 몸 둘 바를 모르겠습니다. :-) 2018.04.23 21:09 신고
  • 프로필사진 BlogIcon 신용환 혹시 Firebase에서 storage와 realtime database를 동시에 사용할 수 있는지요? 2019.02.05 18:21 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 네 가능합니다. 2019.02.06 00:01 신고
  • 프로필사진 BlogIcon 신용환 댓글 고맙습니다.
    직접 해보니 둘 다 사용하는게 가능하네요.^^
    2019.02.09 11:14 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 감사합니다. :) 2019.02.09 11:15 신고
  • 프로필사진 BlogIcon fistful 궁금해서 검색했더니 재연님 블로그네요. :-) 2019.03.15 19:58 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 누구신지.. 도움이 되셨기를요 :) 2019.03.15 20:14 신고
  • 프로필사진 BlogIcon fistful 에구구구. 페이스북 정현석 정기욱 입니다 2019.03.15 20:15 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 아이쿠! 차려진것도 없이 누추한곳에 ㅎㅎ 감사합니다 :) 2019.03.15 20:20 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 아, 이게 PC로 보니까 프로필이랑 아이디 링크가 활성화 되네요. 아까는 모바일로 봐서 아무 정보를 확인할 수 없었습니다. 하하하 이놈에 티스토리 모바일팀 :-) 2019.03.16 01:58 신고
  • 프로필사진 jyd82 코딩을 이제 막 배우기 시작한지 2달차된 완전 초보입니다. firebase로 서버구축의 도움을 받는다면 프로토타입의 앱 서비스 테스트정도는 쉽게 해볼 수 있다고 들었습니다. 그래서 같이 배워보려고 하는데 기술하신 내용들이 생각보다 많이 생소하네요. 백엔드의 도움을 받을 수 있다고 하지만 완전 초보가 하기에는 공부해야 할 것들이 아주 많은 것 같은데...

    Firebase를 손쉽게 건드리기 위해서 최소한 알아야 하는 분야의 지식에 뭐가 있을까요?

    감사합니다. ^^
    2019.08.17 08:26
  • 프로필사진 BlogIcon Jaeyeon Baek 일단 여기서 언급한 파베가 확실히 현재 하시려는것에 확실한 대안이 되는지 보셔얄것 같고요. 위에 내용을 이해하기 위해서는 1) NoSQL에서 사용하는 용어와 개념 숙지 2) node.js 한스푼 정도 될 것 같네요.

    간단한 디비 목적으로 사용하시려거든 어쩌면 그냥 로컬 디비 설치해서 쓰는게 훨씬 더 다양한 언어로 된 예제를 찾으실 수 있을 것으로 기대됩니다. 더 쉽고요. :)

    1) 필요한 데이터베이스 종류를 확인해서 설치하고, 2) 해당디비에 연결하는 예제코드를 본인이 필요한 개발언어 위주로 검색해서 3) 갖다 붙여서 동작 확인하고 4) 코드가 어떤 의미인지 역으로 공부 하는게 좋지 않을까요? :)
    2019.08.17 09:30 신고
  • 프로필사진 jyd82 와 ~~ 댓글 달아주셔서 감사합니다. ^^

    그러면 일단 NoSQL과 node.js에 대해 먼저 공부해야겠네요..;;;지금 스위프트로 ios공부중이라서요...
    node.js는 자바스크립트의 연장선인 언어라고 들었는데 스위프트와 연결이 되는 것인가요??
    2019.08.17 10:37
  • 프로필사진 BlogIcon Jaeyeon Baek 아 그런 배경이시면 node.js는 필요 없습니다. 위 예제는 웹에서 파베를 연결하는거라서 자바스크립트 코드가 필요했던거고 iOS면 iOS쪽 예제 코드를 보시면 됩니다. :) 2019.08.17 11:02 신고
댓글쓰기 폼