본문 바로가기
Project/MUNGCHI

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

by developerBeluga 2024. 1. 29.
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
반응형

댓글