1์–ต๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ With Firestore

2chan
  • #migration
  • #firestore
  • #firebase

Firestore ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹œ์ž‘ํ•˜๋ฉฐ

ํ˜„์žฌ Fromm ์ฑ„ํŒ… ์„œ๋น„์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฆฌ๋‰ด์–ผ ์ž‘์—…์ด ์ง„ํ–‰์ค‘์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ฆ๊ฐ€๋กœ ์ธํ•ด ๊ธฐ์กด ๊ตฌ์กฐ์—์„œ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ฐœํŽธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ–ฅํ›„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ํ™•์žฅ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„์™€ ๊ฐœ๋ฐœ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ๊ธฐ์กด Firebase db์— ์ €์žฅ๋œ ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด Firebase ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” 1์–ต ๊ฑด ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์š”๊ตฌ์‚ฌํ•ญ

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
  2. ์—ฌ๋Ÿฌ ๊ฐœ์˜ Firestore db๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ ํŒฌ์—๊ฒŒ ํ• ๋‹น๋œ db id์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค.
  3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆด ์ธํ”„๋ผ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  4. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„์ค‘ ์‹คํŒจํ•˜๋”๋ผ๋„ ์•ˆ์ •์ ์œผ๋กœ ์žฌ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜์—์„œ ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…

๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

์ฑ„ํŒ… ๋ฆฌ๋‰ด์–ผ ๊ณผ์ •์—์„œ 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๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์Šคํ…œ์€ ์‹คํŒจ ์‹œ์—๋„ ๋ฐ์ดํ„ฐ ์œ ์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์žฌ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. 15๋ถ„ ๊ฐ„๊ฒฉ ๋ฐฐ์น˜ ์‹คํ–‰
    ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์•„ํ‹ฐ์ŠคํŠธ๋ฅผ Elasticache์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ ์กฐํšŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. SQS๋กœ ์ž‘์—… ์ „๋‹ฌ
    ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด n๋ช…์˜ ์•„ํ‹ฐ์ŠคํŠธ๋ฅผ SQS๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  3. Lambda๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰
    SQS์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Lambda ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ์•„ํ‹ฐ์ŠคํŠธ๋ฅผ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ์ œํ•œ์— ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜, Firestore write ์ œํ•œ์— ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Lambda ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ฌ๋ ค์„œ ๋Œ€์—ญํญ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Firestore์˜ ๊ฒฝ์šฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋˜๋ฉด ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ Elasticache์— ์ €์žฅํ•˜๊ณ  ์Šฌ๋ž™์œผ๋กœ ์•Œ๋ฆผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  4. ์‹คํŒจ ์‹œ ์•ˆ์ „ํ•œ ์žฌ์‹œ์ž‘
    ๋ฐฐ์น˜ ์‹คํ–‰ ์‹œ ์ƒˆ ์ €์žฅ์†Œ(new db)์˜ ๋งˆ์ง€๋ง‰ created_at ์ดํ›„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์กด ์ €์žฅ์†Œ(old db)์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋„์ค‘์— ์‹คํŒจํ•˜๋”๋ผ๋„ ๋‹ค์Œ ๋ฐฐ์น˜์—์„œ ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค ์—†์ด ์žฌ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ ์‹œ Lambda์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์–ด, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ฒดํฌํ•˜๋ฉฐ ์กฐํšŒ ์ˆ˜๋ฅผ ์กฐ์ ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์œ„ ๋ฐฉ์‹์„ ํ†ตํ•ด ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์„ ๊ด€์‹ฌ์žˆ๊ฒŒ ์ฝ์–ด์ฃผ์‹  ๋ชจ๋“ ๋ถ„๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ