Project/MUNGCHI

#6 데이터 마이그레이션 하기

developerBeluga 2024. 1. 29. 16:30
728x90
반응형

 

 

 

 

 

 

구버전인 운영 서버와 신버전인 개발 서버의 데이터가 다르다면?

 

지난 11월에 운영 서버를 올렸다.

두달이 지난 지금 개발 서버와 격차가 벌어졌는데 가장 큰 문제가 생겼다.

 

바로 데이터 구조가 바뀌었다 홀리쉣!

개발 서버에선 기존 데이터들이 삭제되어 데이터 구조가 바뀜으로써 일어나는 이슈를 파악하지 못했다.

그렇다고 운영 서버의 데이터도 날려버릴 수 없고...

결국 데이터 마이그레이션을 하기로 결정했다.

 

 

 

데이터 마이그레이션 그거 어떻게 하는건데?

우선 데이터의 전과 후를 잘 알아야 한다.

그래야지 스크립트를 잘 짤 수 있다.

 

뭉치의 경우 workList에 큰 변화가 있었다.

// before
"workList": [
    "6566feee11",
    "656feee199",
    ...
 }
 
 //after
 "workList": [
    {
      "id": "6566feee11",
      "reason": "이건 나의 인생작",
      "tags": ["무협"],
    },
    ...
  ]

기존엔 작품 id만 담고 있는 Array<string>이었다.

현재는 작품 id, 작품 추천 이유 resason, 작품 tags를 담고 있는 Array<Obecjt>다.

대략적으로 어떻게 바꿔야 할지 감이 잡힌다.

 

그렇다면 혹시라도 있을 일을 방지하기 위해 기존 데이터를 백업해준다.

 

const { MongoClient, ObjectId } = require('mongodb');

// MongoDB 클라이언트 생성
const client = new MongoClient(process.env.MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true });

async function migrateData() {
  try {
    await client.connect();
    const database = client.db('m');
    const collection = database.collection('r');

    // 모든 문서 가져오기
    const documents = await collection.find({}).toArray();

    for (const doc of documents) {
      const updatedWorkList = doc.workList.map(workId => {
        return {
          id: workId,
          reason: '임시 이유',
          tags: '임시 태그',
          _id: new ObjectId()  // 새로운 ObjectId 생성
        };
      });

      // 문서 업데이트
      await collection.updateOne({ _id: doc._id }, { $set: { workList: updatedWorkList } });
    }
  } finally {
    // 클라이언트 닫기
    await client.close();
  }
}

migrateData().catch(console.error);

데이터 마이그레이션을 시킬 스크립트를 짠다.

스크립트를 짜면서 중요하다고 생각한건 데이터 구조를 정확히 아는거였다.

기존에 어떤 데이터를 어떻게 바꾸고 싶은지 안다면 스크립트는 쉽게 짤 수 있다.

(물론 현재 데이터 마이그레이션은 아주 간단해서 금방 끝났다)

 

해당 스크립트는 JavaScript로 짰다.

MongoDB에 연결하기 때문에 클라우드에 파일을 올리고 node (파일 이름).js을 해주니 잘 데이터 마이그레이션 됐다 👍

 

 

 

 

사이드 프로젝트하면서 별걸 다 해보네 😅

대체로 데이터 마이그레이션을 할 정도로 큰 일이 자주 일어나지 않는다.

 

데이터 마이그레이션을 해야한다는 걸 과거의 내가 알았다면 안했을 듯...

사이드 프로젝트라고 내 맘대로 데이터 구조 바꾸고 하니 이런 사태가 일어난 거 같다.

 

그래도 긍정적으로 생각하면 단순해도 데이터 마이그레이션 할 줄 알게 되었다는게 의미를 두기로 했다.

(하지만 딱히 경험해보고 싶진 않음 ㅋ...)

 

 

 

 

 

 

 

fin.

 

728x90
반응형