티스토리 뷰
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 에 변화를 바로 수신한다는 의미다. 해당 기능을 몰랐을 때는 firebase 의 Functions 를 이용해서 별도의 트리거를 만들어야 하는 줄 알았는데 그럴 필요조차 없다. 이제 다양한 데이터를 밀어넣고 잘 갖다쓰기만 하면 되는 세상이다.
(*) 참고자료: 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