1์ต๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ With Firestore
- #migration
- #firestore
- #firebase
Firestore ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ํ๋ฉฐ
ํ์ฌ Fromm ์ฑํ ์๋น์ค๋ ๋ด๋ถ์ ์ผ๋ก ๋ฆฌ๋ด์ผ ์์ ์ด ์งํ์ค์ ๋๋ค.
์ฌ์ฉ์ ์ฆ๊ฐ๋ก ์ธํด ๊ธฐ์กด ๊ตฌ์กฐ์์ ๋์ฉ๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ๊ณ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ด, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ฅ ๊ฐ๋ฅํ ์ํคํ ์ฒ๋ก ๊ฐํธํ๊ณ ์์ต๋๋ค.
๋ํ ํฅํ ์ฑํ ๊ธฐ๋ฅ ํ์ฅ์ ๊ณ ๋ คํ ์ค๊ณ์ ๊ฐ๋ฐ์ด ์งํ๋๊ณ ์์ต๋๋ค.
์ด ๊ณผ์ ์์ ๊ธฐ์กด Firebase db์ ์ ์ฅ๋ ์ฑํ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด Firebase ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ 1์ต ๊ฑด ์ด์์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ฃน๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์๊ตฌ์ฌํญ
๋ง์ด๊ทธ๋ ์ด์ ์์ ์๋ ๋ค์๊ณผ ๊ฐ์ ์๊ตฌ์ฌํญ์ด ์์์ต๋๋ค.
- ๊ธฐ์กด ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ์ฌ๋ฌ ๊ฐ์ Firestore db๋ฅผ ์์ฑํ๊ณ , ๊ฐ ํฌ์๊ฒ ํ ๋น๋ db id์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ๋ฐฐํด์ผ ํ๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ์ฝ๋๋ฅผ ์ฌ๋ฆด ์ธํ๋ผ๊ฐ ํ์ํ๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ๋์ค ์คํจํ๋๋ผ๋ ์์ ์ ์ผ๋ก ์ฌ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค.
์๋์์ ํ๋์ฉ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์์
๊ธฐ์กด ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
์ฑํ ๋ฆฌ๋ด์ผ ๊ณผ์ ์์ Firestore์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ์ ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.
๊ทธ๋๋ก ๋ค๋ฅธ db๋ก ์ฎ๊ธฐ๋ ์๊ตฌ์ฌํญ์ด์๋ค๋ฉด Firestore Export/Import ๋ฐฉ์์ ์ฌ์ฉํ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์์ด ๋ง์ ๊ฒฝ์ฐ ์ ์ฉํ ๋ฐฉ๋ฒ์ ๋๋ค.
ํ์ง๋ง ๊ธฐ์กด ๊ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ธํฐํ์ด์ค๋ก ๋ณํํ๋ ์์ ์ด ํ์ํ๋๋ฐ, ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๋ณํํ๋ ๋ก์ง์ ์ถ๊ฐํ์ฌ ์ฒ๋ฆฌํ์ต๋๋ค.
async #convertNewFanChatType({ message, databaseIds, data }: ConvertFunParamType) {
// ๊ธฐ์กด ์ธํฐํ์ด์ค์์ ์ ์ธํ ํ๋
const deleteFields = this.#DELETE_FIELDS_BASE_ARRAY.concat(['delete1, delete2', ...]);
// baseData์์ ๊ธฐ์กด ํ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐ
const newData: newChatType = {
...this.#convertBaseData(this.#deleteV1Field(data, deleteFields)),
userType: data.userType,
newField: data.new,
...
};
// ๋ง์ด๊ทธ๋ ์ด์
await this.#setFirestoreData(message.id, databaseIds, newData);
n๊ฐ์ db๋ฅผ ์์ฑํ๊ณ ๊ฐ ํฌ์๊ฒ ํ ๋น๋ db id์ ํด๋นํ๋ db๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ค.
๋ถํ๋ฅผ ๋ถ์ฐํ๊ธฐ ์ํด Firestore db๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํ๊ณ ๊ฐ ํฌ์๊ฒ ๊ณ ์ ํ db id๋ฅผ ํ ๋นํ์ต๋๋ค.
db id๋ ํฌ ํ ์ด๋ธ์ ์ถ๊ฐ๋ ๋ณ๋ ์ปฌ๋ผ์ผ๋ก ์ ์ฅ๋์๊ณ , ํฌ๋ณ๋ก ํ ๋น๋ db id๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ ํฌ์ ๋ฐ์ดํฐ๋ฅผ ํด๋น db๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค.
ํฌ ๋ฉ์์ง 1๊ฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ ๋๋ง๋ค ํด๋น ํฌ์ด ์ด๋ค db_id๋ฅผ ๊ฐ์ง๊ณ ์๋์ง rdb๋ฅผ ๊ณ์ ์กฐํํด์ผ ํด์, ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ Elasticache๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ณ ์ด๋ฅผ ํ์ฉํ์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ฝ๋๋ฅผ ์ฌ๋ฆด ์ธํ๋ผ๊ฐ ํ์ํ๊ณ ์คํจ ์์ ์ฒ๋ฆฌ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
3๋ฒ(์๋ํ ์ธํ๋ผ)๊ณผ 4๋ฒ(์์ ์ ์ธ ์คํจ ์ฒ๋ฆฌ)์ ์๋ก ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ด ํจ๊ป ์ค๋ช ํฉ๋๋ค.
1์ต ๊ฑด ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์์๊ธฐ ๋๋ฌธ์, Lambda ๋ฐฐ์น ์์ ๊ณผ SQS๋ฅผ ํ์ฉํ์ฌ ์๋ํํ์ต๋๋ค.
์ด ์์คํ ์ ์คํจ ์์๋ ๋ฐ์ดํฐ ์ ์ค ์์ด ์์ ํ๊ฒ ์ฌ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- 15๋ถ ๊ฐ๊ฒฉ ๋ฐฐ์น ์คํ
๋ง์ด๊ทธ๋ ์ด์ ์ด ์๋ฃ๋์ง ์์ ์ํฐ์คํธ๋ฅผ Elasticache์์ ์กฐํํฉ๋๋ค. ์ด๋ฏธ ์๋ฃ๋ ๊ฒฝ์ฐ ์กฐํ๋์ง ์์ต๋๋ค. - SQS๋ก ์์
์ ๋ฌ
๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด n๋ช ์ ์ํฐ์คํธ๋ฅผ SQS๋ก ์ ๋ฌํฉ๋๋ค. - Lambda๋ก ๋ง์ด๊ทธ๋ ์ด์
์คํ
SQS์์ ์ ๋ฌ๋ฐ์ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Lambda ํจ์๊ฐ ์คํ๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ๋๋ฌด ๋ง์ ์ํฐ์คํธ๋ฅผ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ฉด ๋คํธ์ํฌ ๋์ญํญ ์ ํ์ ๊ฑธ๋ฆฌ๊ฑฐ๋, Firestore write ์ ํ์ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. Lambda ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ๋ ค์ ๋์ญํญ์ ์ฆ๊ฐ์ํค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. Firestore์ ๊ฒฝ์ฐ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์๋ฃ๋๋ฉด ์๋ฃ ์ฌ๋ถ๋ฅผ Elasticache์ ์ ์ฅํ๊ณ ์ฌ๋์ผ๋ก ์๋ฆผ์ ๋ณด๋ ๋๋ค. - ์คํจ ์ ์์ ํ ์ฌ์์
๋ฐฐ์น ์คํ ์ ์ ์ ์ฅ์(new db)์ ๋ง์ง๋ง created_at ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์กด ์ ์ฅ์(old db)์์ ์กฐํํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ค์ ์คํจํ๋๋ผ๋ ๋ค์ ๋ฐฐ์น์์ ๋ฐ์ดํฐ์ ์ ์ค ์์ด ์ฌ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋๋ฌด ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ ์ Lambda์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ ์์ด, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฒดํฌํ๋ฉฐ ์กฐํ ์๋ฅผ ์กฐ์ ํ์ต๋๋ค.
๋ง์น๋ฉฐ
์ ๋ฐฉ์์ ํตํด ์ฑํ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ด๊ณ ํจ์จ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์์ต๋๋ค.
๊ธ์ ๊ด์ฌ์๊ฒ ์ฝ์ด์ฃผ์ ๋ชจ๋ ๋ถ๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.