[firebase, node.js] 데이터 마이그레이션 세팅하기

ekil·2024년 7월 25일
0

flutter, firebase로 웹앱을 개발하고 있다.
개발하다 보면 데이터 구조가 바뀌는 일이 있다.
쌓인 데이터가 다 테스트 데이터면 모두 날리고 새로 시작하면 되지만, 이미 쌓여있는 실제 데이터가 있다면 기존 데이터를 새 구조에 맞게 마이그레이션해줘야 한다.

데이터 마이그레이션을 할 때는 나는 node.js를 이용하는데 (firestore에 바로 접근 가능하고 빠름!)
세팅이 되어 있으면 그냥 하면 되는데
노트북이 (또) 포맷된 뒤로 잘 세팅해둔 node.js 백업을 놓쳤다는 걸 뒤늦게 깨달았다..

검색과 ai의 힘을 빌려 세팅을 완료했다.

0. node, npm 설치

brew install node
  • node가 설치되어 있는지 확인할 땐 버전 확인 명령어 이용
node -v

1. 폴더 만들기

원하는 위치에 폴더를 만들고 (ex: 프로젝트명_data)

2. 프로젝트 초기화

npm init -y

-> package.json 파일 자동 생성

3. firebase-admin 패키지 설치

npm install firebase-admin

4. serviceAccount.json 파일 추가

: 파이어베이스 프로젝트 관리자 권한을 가진 서비스 계정 키 파일임

  • 프로젝트 폴더에 serviceAccount.json 파일을 저장해뒀다면 그걸 복사 붙여넣기 해 사용하면 됨
  • 없으면, firestore에서 직접 다운로드 해야 함
    파이어베이스 > 프로젝트 설정 > 서비스 계정 > 새 비공개 키 생성, JSON 다운로드
    (나는 1번 케이스여서 지금은 이렇게 안했다. 하게 되면 세부 정보를 추가하겠음)
    모두 같은 폴더 안에 넣고,

5. 마이그레이션 파일 추가

마이그레이션을 수행할 js 파일을 추가함 (ex: mig_data.js)
firebase의 Admin SDK 설명 문서 참고

var admin = require("firebase-admin");

// Fetch the service account key JSON file contents
var serviceAccount = require("path/to/serviceAccountKey.json");

// Initialize the app with a service account, granting admin privileges
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  // The database URL depends on the location of the database
  databaseURL: "https://DATABASE_NAME.firebaseio.com"
});

// As an admin, the app has access to read and write all data, regardless of Security Rules
const firestore = admin.firestore();

6. 마이그레이션 코드 작성

찾으려는 문서의 경로는 firestore. 뒤에 컬렉션 단위부터 시작하면 된다.
변수로 저장해두면 접근하기 편하다.

var ref = firestore
  .collection("YOUR_COLLECTION_NAME")
  .doc("YOU_DOCUMENT_NAME")
  .collection("YOUR_SUB_COLLECTION_NAME);

잘 동작하는지 테스트하기 위해 원하는 조건을 걸어서 문서를 불러온 뒤 console.log 해본다.

// title이 '240725'이고 reg_uid가 '12345'인 문서 찾기
ref.where("title", "==", "240725").where("reg_uid", "==", "12345").get().then((snapshot) => {
  snapshot.forEach((doc) => {
  	// enable이 true일 경우에만, content 필드의 값을 출력하도록 함
    if (doc.data().enable == true) {
        console.log(doc.id, "=>", doc.data().content); 
    }
  });
}).catch((err) => {
  	console.log("Error getting documents", err);
  }
);

7. 코드 실행

터미널을 열고,

node 파일명.js

제대로 실행된다면 일치하는 데이터의 content 필드 값을 출력해줄 것이다!

profile
좋아하는 일을 잘함으로써 먹고살고 싶은 프론트엔드 개발자입니다.

0개의 댓글