๐Ÿ’ป๐Ÿ’€/๊ฐœ๋ฐœ

[Firebase] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— CSV ํŒŒ์ผ Importํ•˜๊ธฐ

db2 2021. 8. 9. 16:51

Firebase๋ž€

Firebase๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ํ•„์š” ์—†์ด ์ฆ‰, ์„œ๋ฒ„๋ฆฌ์Šค๋กœ ๋น ๋ฅด๊ฒŒ ์›น์•ฑ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ๊ทธ ์‚ฌ์ „ ์ž‘์—…์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ Mock ๋ฐ์ดํ„ฐ๋ฅผ Firebase์— importํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿ›‘ ์ด๋ ‡๊ฒŒ importํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ๋ฎ์–ด์”Œ์›Œ์ ธ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ๋ฐ์ดํ„ฐ์™€ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„  ์•ˆ๋œ๋‹ค!

1. CSV โ†’ JSON ๋ณ€ํ™˜

Firebase ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— importํ•˜๊ธฐ ์œ„ํ•ด์„  JSON ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์ผ์ผ์ด JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋ฏธ์นœ ์ง“์— ๊ฐ€๊น๋‹ค. ๋‹คํ–‰ํžˆ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” CSVJSON์ด๋ผ๋Š” ๋ฉ‹์ง„ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค. ๋ณ€ํ™˜ ๋ฐฉ๋ฒ•๋„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค.

  1. CSV ํŒŒ์ผ์„ ์—ด๊ณ  ์ „์ฒด ๋ณต์‚ฌ(CTRL + A)
  2. CSVJSON์— ๋ถ™์—ฌ๋„ฃ๊ธฐ
  3. Convert
  4. Download

2. Realtime Database

Realtime Database์— importํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๋‹ค.

  1. ์ผ€๋ฐฅ ๋ฉ”๋‰ด - import JSON
  2. Browse - JSON ํŒŒ์ผ ์—…๋กœ๋“œ
  3. Import

3. Firestore Database

๋ฐ˜๋ฉด์— Firestore Database๋Š” Realtime Database์™€ ๋‹ฌ๋ฆฌ ํŽ˜์ด์ง€์— import/exportํ•˜๋Š” ๋ฉ”๋‰ด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— node-firestore-import-export ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ Node.js ์„ค์น˜์™€ npm ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

a) private key ์ƒ์„ฑ

Firestore์— import/export๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  private key ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค. ์•„๋ž˜์˜ ๊ณผ์ •์„ ๋”ฐ๋ฅด๋ฉด private key ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” JSON ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

  1. Project settings - Service accounts
  2. Generate new private key
  3. Generate key

b) JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ˆ˜์ •

Realtime Database๋Š” ๋‹จ์ˆœ JSON ํŠธ๋ฆฌ ํ˜•์‹์˜ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด์ง€๋งŒ, Firebase Database๋Š” ์ปฌ๋ ‰์…˜ ํ˜•์‹์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์—์„œ ๋ณ€ํ™˜ํ•œ JSON ํŒŒ์ผ์„ ์ปฌ๋ ‰์…˜ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

Firebase์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” NoSQL๊ธฐ๋ฐ˜์ด๊ณ , NoSQL์€ Document ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋‹ค. ์ด๋Š” Database - Collection - Document - Field ๊ณ„์ธต์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, RDBMS์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์•„๋ž˜์˜ ์‚ฌ์ง„์œผ๋กœ ์‰ฝ๊ฒŒ ๋น„๊ต, ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ถœ์ฒ˜: https://kciter.so/posts/about-mongodb

์ง์ ‘ Firestore์— ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ–ˆ๋‹ค. TABLE_TEST๋ผ๋Š” Collection(ํ…Œ์ด๋ธ”)์ด ์žˆ๊ณ , ๊ทธ ์•ˆ์— ํ•˜๋‚˜์˜ Document(ํ–‰)๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ ์•ˆ์—๋Š” name์ด๋ผ๋Š” Field(์ปฌ๋Ÿผ)๊ฐ€ ์กด์žฌํ•œ๋‹ค. NoSQL์€ ๋™์  ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— RDBMS์™€ ๋‹ฌ๋ฆฌ Document๋งˆ๋‹ค ๋‹ค๋ฅธ Field๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ(๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์…‹ํŒ…ํ•ด๋†“์„ ํ•„์š”๊ฐ€ ์—†๋‹ค), Field์˜ ๊ฐ’์œผ๋กœ ๋˜ Collection์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค!

Firestore์˜ ๊ตฌ์กฐ๊ฐ€ ์ด๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์•ž์„œ ๋งŒ๋“ค์—ˆ๋˜ JSONํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค. ๊ธฐ์กด์˜ JSON ํŒŒ์ผ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ Document(ํ–‰)๋“ค์ด ๋ฐฐ์—ด ๊ตฌ์กฐ๋กœ ๋‹ด๊ฒจ์žˆ์„ ๊ฒƒ์ด๋‹ค.

[
  {
    "id": 0,
    "name": "dnb",
    "age": 10
  },
  {
    "id": 1,
    "name": "qer",
    "age": 20
  }
]

์—ฌ๊ธฐ์— Collection(ํ…Œ์ด๋ธ”)๋ช…์„ ์ถ”๊ฐ€ํ•ด์ฃผ์ž. __collections__ ๊ฐ์ฒด ์•ˆ์— Collection(ํ…Œ์ด๋ธ”) ํ‚ค๋ฅผ ๋ช…์‹œํ•˜๊ณ , ๊ทธ ๊ฐ’์œผ๋กœ Documents(ํ–‰) ๋ฐฐ์—ด์„ ๋‹ด์•„์ค€๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ๋‘ ๊ฐœ์˜ Documents(ํ–‰)์„ ๊ฐ€์ง„ TABLE_TEST๋ผ๋Š” Collection(ํ…Œ์ด๋ธ”)์ด ๋งŒ๋“ค์–ด์งˆ ๊ฒƒ์ด๋‹ค.

{
  "__collections__": {
    "TABLE_TEST": [
      {
        "id": 0,
        "name": "dnb",
        "age": 10
      },
      {
        "id": 1,
        "name": "qer",
        "age": 20
      }
    ]
  }
}

c) node-firestore-import-export

๋งˆ์ง€๋ง‰์œผ๋กœ node-firestore-import-export๋ฅผ ์‚ฌ์šฉํ•ด importํ•˜๋Š” ์ž‘์—…์ด๋‹ค. ๋จผ์ € ํŒจํ‚ค์ง€๋ฅผ ์ „์—ญ์— ์„ค์น˜ํ•œ๋‹ค.

# npm
npm install -g node-firestore-import-export

# yarn
yarn global add node-firestore-import-export

๊ทธ๋ฆฌ๊ณ  cmd์ฐฝ์—์„œ JSONํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” ํด๋”๋กœ ์ด๋™ํ•œ ํ›„, ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•œ๋‹ค. ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฎ์–ด์”Œ์›Œ์ง„๋‹ค๋Š” ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ ์ง„ํ–‰ํ•˜๊ฒ ๋ƒ๋Š” ์งˆ๋ฌธ์ด ๋‚˜์˜ค๋Š”๋ฐ y๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ณ„์†ํ•œ๋‹ค.

firestore-import --accountCredentials <private_keyํŒŒ์ผ๋ช…>.json --backupFile <dataํŒŒ์ผ๋ช…>.json

cmd์ฐฝ์— ์ดˆ๋ก์ƒ‰ All done ๋ฌธ๊ตฌ๋ฅผ ํ™•์ธํ•˜๋ฉด import ์™„๋ฃŒ!