기본 콘텐츠로 건너뛰기

[Firebase] 데이터 정합성을 위한 Cloud Function 적용 사례 - 2

Firebase Cloud Functions를 적용하게 되었던 배경을 이전 글에서 소개해드린 바가 있습니다.
그 글에 이어 Cloud Functions 적용기를 간단히 소개하고자 합니다.

순서는 다음과 같습니다.

1. Cloud Functions 개발 환경 구축
2. Cloud Functions 코드 작성
3. Deploy


좀더 상세한 내용을 원하시면 하기 링크를 참고하시기 바랍니다.
(본 글에서 다루는 내용보다 상세한 내용을 담고 있습니다.)
https://firebase.google.com/docs/functions/get-started
https://firebase.google.com/docs/functions/database-events

1. Cloud Functions 개발 환경 구축

먼저 Cloud Functions을 시작하기 위해서는 별도 개발 환경을 구축해야 합니다.
Cloud Functions은 Node.js를 기반으로 동작하는 것 같습니다.
따라서 다음 단계가 선행되어야 합니다.

  1. Node.js 설치 (v6.11.1 recommend)
  2. npm 설치
  3. Firebase CLI 설치


Node.js와 npm을 설치했다면 다음 명령어로 Firebase CLI를 설치할 수 있습니다.
npm install -g firebase-tools

Firebase CLI까지 설치가 되었다면 이제 Firebase Cloud Functions 프로젝트를 생성해야 합니다.
제가 개발 중인 프로젝트는 Android 모바일 어플리케이션이었습니다.
하지만 지금 작성하고자 하는 코드는 Android 앱이 아닌 Google Cloud 서버에 로드되어 동작할 코드이기 때문에
별도 프로젝트를 생성해야 합니다.


1.1 먼저 다음 명령어를 통해 Firebase tool 사용을 위한 인증을 완료합니다.

firebase login

1.2 원하는 경로에 원하는 이름으로 Directory를 생성하고, 다음 명령어로 초기화합니다.

firebase init functions

그럼 자동으로 몇몇 파일과 directory들이 생성됩니다.
myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed
자세한 내용은 다음 링크를 참조하시기 바랍니다.
https://firebase.google.com/docs/functions/get-started#set_up_and_initialize_functions_sdk

많은 파일들이 자동으로 생성되지만, 주목해야 할 파일은 functions/index.js 입니다.
바로 이 파일에 우리가 원하는 서버 사이드 코드를 작성하면 됩니다.


2. Cloud Functions 코드 작성

2.1 필수 Module Import 및 초기화

Firebase Realtime Database Trigger를 적용하기 위해 하기와 같이 필수 모듈을 Import 합니다.

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

2.2 Trigger 코드 작성

사실 Node.js는 커녕 Javascript도 익숙하지 않아 막연히 진입 장벽이 높을 거라 생각했는데,
코드를 작성하고 나니 이게 이렇게 쉬워도 되나 싶습니다.

  1. /users/{userId} 에 write event가 발생할 경우 
  2. groupUser 객체를 생성해서 
  3. /groups/{groupId}/userlist/{userId}/ 경로에 업데이트해주는 것이 전부입니다.


exports.saveUser = functions.database.ref('/users/{userId}')
    .onWrite(event => {
// Grab the current value of what was written to the Realtime Database.
const user = event.data.val();
console.log('[saveUser] - user: ', event.params.userId, user);

var groupUser = {
"birthYear" : user.birthYear,
"firstName" : user.firstName,
"id" : user.id,
"lastName" : user.lastName,
"profileUrl" : user.profileUrl,
};

event.data.ref.root.child('/groups/' + user.groupId + '/userlist/' + user.id).set(groupUser);
    });


3. Deploy

이제 Firebase Cloud Functions에 작성한 코드를 올리는 일만 남았습니다.
다음 명령어를 수행하면 작성한 코드가 로드되며 바로 이용 가능한 상태가 됩니다.
$ firebase deploy --only functions

이제 User 정보를 변경하면, Group의 groupUser 역시 변경/생성되는 마법같은 일이 일어날 겁니다.

댓글

이 블로그의 인기 게시물

[수경재배] 원룸 실내 상추 키우기 - 상추 파종

날이 조금 풀린 것도 같고, 실내 온도가 18도 정도는 되는 것 같아서 다시 실내 상추 키우기를 시작해보려고 합니다. 처음 시도했을 때에는 아는 것도 없고 따로 관심을 갖지 않고 될대로 되라는 식으로 키우는 바람에 큰 성과가 없었어요. 그래서 이번 두 번째 시도는 좀더 관심을 갖고 진행해보려고 합니다. 1. 먼저 상추 씨앗을 스폰지 위에 가지런히 올려줍니다. 씨앗을 2개 이상 올려준 이유는 혹여나 씨앗이 발아하지 못할 경우를 대비해서 입니다. 저 스폰지는 ' 수경재배 스펀지 '로 검색하면 쉽게 구입할 수 있습니다. 사진으로는 잘 안보이지만 십자가로 홈이 있어서 나중에 작물이 뿌리를 내릴 수 있어요.  2. 그리고 미리 준비한 그릇에 스펀지들을 넣어줍니다. 스펀지들이 물을 충분히 흡수 할 수 있도록 해주세요. 3. 그 위에 휴지를 얇게 얹고 다시 분무기로 물을 충분히 뿌려 줍니다. 씨앗이 바람에 날아가거나, 씨앗의 수분이 증발하거나, 등의 방해 요소로부터 보호해줄 수 있습니다. *그렇지만 너무 두껍게 휴지를 올려주지는 마세요. 새싹이 휴지를 뚫고 올라오지 못할 수도 있습니다! 일단 최초 파종은 이렇게 간단하게 끝이 납니다. 이제 몇일 지나게 되면 싹이 나올 겁니다! 이후 과정에 대해서 계속 포스팅하도록 하겠습니다. :)

미니 메추리 키우기 - 사육장 만들기

미니 메추리는 우리가 알고 있는 일반 메추리보다 조금 작은 개체입니다. 버튼퀼(버튼퀘일)이라고도 불리죠. 일반 메추리보다 작기도 하고 짝이 맞는 암수가 같이 있으면 그리 시끄럽지도 않습니다. 여러 모로 키우기가 좀더 수월하죠. 첫 번째 단계로 먼저 아이들이 지낼 집을 만들어 주었습니다. 사실 여러 고민을 많이 했어요 지금 소개하는 집을 만들기 전에는 120L 짜리 대형 리빙 박스로 집을 만들어 주었었죠. 값이 저렴하고 개량하는 것이 크게 어렵지 않기 때문에 많은 분들이 리빙 박스를 개조하여 집을 만들어 주고 있어요. 저 같은 경우는 보온을 생각해서 안쪽에는 단열재를 덧대기도 했죠. 하지만 사실 리빙 박스로 집을 만드는게 아주 쉽지만은 않아요. 물론 있는 그대로를 사용하신다면 어려울 건 전혀 없죠. 그런데 만약 전구를 달기 위해 구멍을 뚫거나, 환기 구멍을 뚫거나 기타 여러 필요에 의해 리빙 박스를 뜯어 고쳐야 한다면 이야기가 달라지죠. 저도 사실 이런 불편함에 고민고민을 하다가 오늘 소개해 드릴 두 번째 집과 같은 것을 생각하게 되었어요. 바로 시중에서 쉽게 구할 수 있는 종이 박스를 활용한 것인데요. 위쪽 뚜껑에는 구멍을 두 개를 뚫었어요. 작은 구멍은 온도 조절을 위한 전구 바로 위쪽으로 온도가 너무 올라갈 경우 온도 조절을 위해 뚫어 놓았고요.  아래 좀더 큰 구멍은 물, 먹이 등을 교체해주기 위한 구멍이에요.  정면에는 창을 내어 관찰할 수 있게 했어요. 지금은 저 가운데도 잘라내서 크게 창 하나로 만들었어요. 안쪽에는 온도계를 비치하여 내부 온도를 확인할 수 있게 해두었습니다. (지금 생각해보니 전구 바로 아래쪽에 위치한 탓에 제대로 된 온도 측정이 될지 모르겠네요;;;) 그리고 보셔서 아시겠지만, 내부 ...

[메추리 키우기] 스티로폼으로 정말 쉽게 부화기 만들기

미니 메추리 한 쌍을 기르고 나서는  거의 4일에 3번 정도 알을 낳고 있습니다. 가끔 휴란기를 짧게 짧게 갖는 경우도 있고요. 그 알 들이 처치 곤란이기도 하고, 부화시키는 것도 해보고 싶어서 부화기를 만들어야지.. 했는데  그놈의 스티로폼 박스를 구하지 못해 차일피일 미루고 있었습니다. 그러다 요 근래  같이 사는 순둥이와 오전 산책 중에 집 근처에 버려져 있는 박스를 발견했어요 ㅎㅎ (요놈이 순둥이 입니다 ㅎㅎ) 바로 들고 왔죠! 일단 물과 솔로 박박 닦아줬어요. 그리고 온도 조절을 위한 전구! 10w 정도로 샀는데, 일단 지금 쓰기에는 충분한 것 같아요. 관련 카페에서는 10w 2개를 쓰라고도 하는데요. 혹시 사용하다가 1개가 나가버리는 사고를 미연에 방지하기 위함입니다. 일단 저는 1개만 달았어요. 간단히 그냥 스티로폼 옆에 칼 집을 약간 내어서 선을 끼웠습니다. 참 대충 했죠 -0- 그리고 또 중요한 것. 바로 전란인데요. 간단히 알을 굴려주는 거라고 보면 될 것 같습니다. 알을 굴려주지 않으면  사람으로 치면 가만히 요지부동으로 누워있는 거라고 보시면 되겠는데요. 이럴 경우 알 속의 배아가 튼튼하게 정상적으로 자라지 못한다고 합니다. 그래서 실제 야생에서도 어미 새가 굴리기도 하고 뒤척인다고 해요. 나무젓가락과 돌아다니는 박스를 조금 잘라 어설프게 만들었습니다;;; 정말 대충 만들었죠;;; 처음에는 알들을 몇개 넣어둔 뒤 뚜껑을 완전히 덮었는데요. 온도를 측정해보니 40도 까지 올라가더군요. 적정 온도는 37~39도 정도라고 해서 일단 살짝 열어두니 온도 조절이 조금 되는 상황입니다. 물통은 습도 조절을 위해 넣어두었...