티스토리 뷰

개발/Cloud (GCP)

firestore 저장소 사용하기

Jaeyeon Baek 2018. 4. 15. 08:34

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
Firebase 시작하기  (0) 2018.04.07
프로젝트 종료하기  (0) 2018.03.10
Cloud TPU 사용하기  (1) 2018.02.15
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday