거의 알고리즘 일기장

React Native를 이용한 사이드 프로젝트 만들기 -9. firebase auth에 있는 user info 데이터 firestore로 데이터 마이그레이션하기 (with 오늘의 그림일기) 본문

react-native

React Native를 이용한 사이드 프로젝트 만들기 -9. firebase auth에 있는 user info 데이터 firestore로 데이터 마이그레이션하기 (with 오늘의 그림일기)

건우권 2023. 5. 2. 00:10

요즘 계속해서 프로젝트를 수정하고 있는데, 기존에 생각안하고 짠 부분이 많아서ㅠ 건드려야 할 부분이 많다.

왜 그랬니..

그 중 하나가 auth 과정을 firebase auth만 사용하면서 그 user정보를 firebase auth에다가만 넣어둔 상황이다 ㅎㅎ

이 user 정보 데이터들이 firestore에 있어야 이제 뭔가 이후작업을 하기 편하기 때문에, 이 작업을 하였다.

 

(작은 프로젝트에서는 auth만 이용한다고 해도 문제가 될건 없다. displayname, photoUrl 등은 넣어둘수 있다. 하지만, 더 많은 유저정보를 저장하고 싶다거나 firebase console에서는 이 정보들을 볼수 없는 문제가 있어서 바꾸게 되었다.)


어떻게 할것인가?

사실 이 부분은 간단한 일이다.

auth에 있는 모든 친구들을 firestore의 users collection에 때려 박아 넣으면 될일이다.

 

1. firebase의 서비스어카운트에서 key를 json 형식으로 다운받는다.

https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk?hl=ko 

 

로그인 - Google 계정

이메일 또는 휴대전화

accounts.google.com

2. migration script를 작성한다.

const admin = require('firebase-admin');

var serviceAccount = require('./너의 서비스 어카운트키.json');

// 다운로드한 서비스 계정 키 파일의 경로를 사용할것.
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: '너의 database url',
});

const auth = admin.auth();
const firestore = admin.firestore();

// 사용자 데이터를 가져오고 Firestore에 저장하는 함수
async function migrateUsers() {
  let users = [];
  let nextPageToken;

  // 모든 사용자를 가져옵니다.
  do {
    const result = await auth.listUsers(1000, nextPageToken);
    users = users.concat(result.users);
    nextPageToken = result.pageToken;
  } while (nextPageToken);

  console.log(`Migrating ${users.length} users to Firestore...`);

  // 가져온 사용자 데이터를 Firestore에 저장합니다.
  const batch = firestore.batch();
  let count = 0;

  for (const user of users) {
    const userRef = firestore.collection('users').doc(user.uid);
    batch.set(
      userRef,
      {
      	//재량것
		displayName: user.displayName,
        email: user.email,
        photoURL: user.photoURL,
        uid: user.uid,
      }
    );

    count++;

    if (count === 500) {
      // 한 번에 최대 500개의 작업만 가능하므로, 일괄 처리를 나누어서 실행합니다.
      await batch.commit();
      count = 0;
    }
  }

  if (count > 0) {
    await batch.commit();
  }

  console.log('Migration completed!');
}

// 마이그레이션을 시작합니다.
migrateUsers().catch((error) => {
  console.error('Error during migration:', error);
});

3. 성공을 즐긴다.

호~우


신기능 하나 넣으려고 할때마다 1년전의 내가 막아선다.ㅋㅋ

이래서 레거시가 어려운가보다.

반응형
Comments