구버전인 운영 서버와 신버전인 개발 서버의 데이터가 다르다면?
지난 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.
'Project > MUNGCHI' 카테고리의 다른 글
#8 오랜만에 들어가는 바람에 까먹은 AWS ec2 서버 들어가는 법 (0) | 2024.05.24 |
---|---|
#7 가로 스크롤 만들기 - overflow 스크롤 안될 경우 (0) | 2024.01.31 |
#5 서버 백엔드 올리기 + AWS EC2, MongoDB, Redis (1) | 2023.11.25 |
#4 클라우드 업체 선택하기 - 돌고돌아 고향으로(?) (2) | 2023.11.24 |
#3 한시간 단위로 집계해서 Redis에 캐싱하기 (0) | 2023.11.10 |
댓글