Firebase-tools: Firestore ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋ฎฌ๋ ˆ์ดํ„ฐ: ๋ฐ์ดํ„ฐ์„ธํŠธ๋กœ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”

์— ๋งŒ๋“  2019๋…„ 03์›” 12์ผ  ยท  39์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: firebase/firebase-tools

๋ฐ์ดํ„ฐ์„ธํŠธ๋กœ Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ์žฌ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๊ด„ ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” 120๊ฐœ ์ž‘์—…(ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ธํŠธ)์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ๊ฑฐ์˜ 3์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์Šค๋ƒ…์ƒท์—์„œ Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋Œ€๊ทœ๋ชจ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

emulator-suite database firestore feature request

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ(์ฆ‰, "์‹œ๋“œ" ๋ฐ์ดํ„ฐ๋กœ ์ดˆ๊ธฐํ™”)์€ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์—†์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์•ฝ๊ฐ„ ์ˆ˜๋™์ ์ด๋ฉฐ ํ›„์† ๋ฆด๋ฆฌ์Šค์—์„œ ๋” ๋‚˜์€ ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

๋ชจ๋“  39 ๋Œ“๊ธ€

์ดˆ๊ธฐํ™” ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค "์Šค๋ƒ…์ƒท"์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋กœ์ปฌ์—์„œ firestore ๋ฐ ํ•จ์ˆ˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” DB๋ฅผ ์‹œ๋“œํ•˜๋ฉด ๋งŽ์€ firestore ํ•จ์ˆ˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ธฐ๋Šฅ ๋˜๋Š” ๋” ๋‚˜์€ Firestore ๋ฐ์ดํ„ฐ ์ง€์†์„ฑ์„ ๋””์Šคํฌ์— ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•จ์ˆ˜ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๋“œํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋ฐœ์‚ฌ. ์ž„์‹œ๋ฐฉํŽธ์œผ๋กœ ์šฐ๋ฆฌ๋Š” "ํšŒ์ „
off" ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ํŠน์ˆ˜ ํ˜ธ์ถœ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
ํŠน์ • ํ…Œ์ŠคํŠธ์—๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ์žฅ๊ธฐ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ˆ˜์ž…/์ˆ˜์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2019๋…„ 10์›” 12์ผ ํ† ์š”์ผ ์˜ค์ „ 11์‹œ 54๋ถ„ Wyatt Ades [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค "์Šค๋ƒ…์ƒท"์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
์ดˆ๊ธฐํ™”. ํ˜„์žฌ Firestore ๋ฐ ๊ธฐ๋Šฅ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋กœ์ปฌ์— ์žˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ DB๋ฅผ ์‹œ๋“œํ•˜๋ฉด
์˜ firestore ํ•จ์ˆ˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ
์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋” ์ข‹์€ ์ ์€ ๋ฐ์ดํ„ฐ ์ง€์†์„ฑ์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/firebase/firebase-tools/issues/1167?email_source=notifications&email_token=ACATB2VEE7BBI75HECFTE23QOIMOLA5CNFSM4G5NG5X2YY3PNVWWK3TUL52HS4DFVEXG43NVMVBW
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ACTB2WHUTO43JISN54J4U3QOIMOLANCNFSM4G5NG5XQ
.

๋„ค, ์ง€๊ธˆ์œผ๋กœ์„œ๋Š” ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•„์ง ์ด์— ๋Œ€ํ•œ ์ด์ •ํ‘œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ ์ด ํŒ€์— ๋Œ€ํ•ด ์ง€๊ธˆ ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ๋” ํ™œ๋™์ ์ด๊ณ  ๋ฐ˜์‘์ด ๋น ๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Firestore db์™€ ํ•จ๊ป˜ ์ด ๋ฒ”์œ„์— ์‹ค์‹œ๊ฐ„ db๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@anantanandgupta ์•„์ง ์ด์ •ํ‘œ๊ฐ€ ์—†์ง€๋งŒ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๊ณต๊ฐœํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋ฒ”์œ„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋” ์‰ฝ์ง€๋งŒ(JSON ํ˜•์‹) Cloud Functions๋ฅผ "์ผ์‹œ ์ค‘์ง€"ํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ(์ฆ‰, "์‹œ๋“œ" ๋ฐ์ดํ„ฐ๋กœ ์ดˆ๊ธฐํ™”)์€ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์—†์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์•ฝ๊ฐ„ ์ˆ˜๋™์ ์ด๋ฉฐ ํ›„์† ๋ฆด๋ฆฌ์Šค์—์„œ ๋” ๋‚˜์€ ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

@ryanpbrewster "์‹œ๋“œ" ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@SamyPesse ์ด๊ฒƒ์€ Emulator JAR ์ž์ฒด ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ( @ryanpbrewster๊ฐ€ ๋งํ–ˆ๋“ฏ์ด) ์‹ค์ œ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด firebase-tools ๋ฅผ ํ†ตํ•ด API๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š”์ง€ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์€์— ํ”Œ๋ž˜๊ทธ ์„ ํ˜ธ firebase ๋ช…๋ น์— ํ•„๋“œ firebase.json ๋˜๋Š” ๋ญ”๊ฐ€?

๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•„์ง ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ง€์นจ์ด ๋Œ€๋žต์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ

ํ”„๋กœ๋•์…˜ Firestore ์ธ์Šคํ„ด์Šค ๋˜๋Š” ๋กœ์ปฌ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋ถ€ํŒ…ํ•˜๊ณ  ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์›ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

curl "localhost:8080/emulator/v1/projects/ryanpbrewster-test:export" \
  -d '{"database": "projects/ryanpbrewster-test/databases/(default)","export_directory":"."}' \
  -H "Content-Type: application/json

firestore_export_1576524691/ ์™€ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋คํ”„ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์‚ฐ ์ˆ˜์ถœ

Google Cloud Storage ๋ฒ„ํ‚ท์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ AppEngine ๋ฒ„ํ‚ท ryanpbrewster-test.appspot.com ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šด์˜

gcloud firestore export gs://ryanpbrewster-test.appspot.com/firestore-export

Firestore๋Š” ํ”„๋กœ๋•์…˜ ๋ฐ์ดํ„ฐ์˜ ์ „์ฒด ์‚ฌ๋ณธ์„ Google Cloud Storage์— ๋คํ”„ํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ --collection-ids ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ปฌ๋ ‰์…˜ ์ง‘ํ•ฉ์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™„๋ฃŒ๋˜๋ฉด ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ).

gsutil cp -r gs://ryanpbrewster-test.appspot.com/firestore-export .

๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

ํ˜„์žฌ๋กœ์„œ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

java -jar ~/.cache/firebase/emulators/cloud-firestore-emulator-v1.10.2.jar \
  --seed_from_export=firestore_export_1576524691/firestore_export_1576524691.overall_export_metadata

๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๋ฉด ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ๋กœ๋Š” .overall_export_metadata ํŒŒ์ผ์˜ ์œ„์น˜์ด๋ฉฐ ๋‚ด๋ณด๋‚ด๊ธฐ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ์—์„œ Firestore ๋ฐ์ดํ„ฐ๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Firebase ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ŠˆํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๊ณ ํ•˜๋ฉด. ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ํฌํŠธ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฏ€๋กœ Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FIRESTORE_EMULATOR_HOST ๋ณ€์ˆ˜๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์„ค์ •๊นŒ์ง€ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ ์‹œ๋“œ ๊ฒฝ๋กœ๋„ ๋ช…๋ น์„ ๋”ฐ๋ผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ๋„์›€์ด ๋˜๊ณ  firebase emulators:start --firestore_seed_from_export = \path\to\seed\file ์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@prgwar ์˜ ์ œ์•ˆ์— +1. ์ด ์‹œ์ž‘ Firestore๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ œํ’ˆ๊ตฐ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ํ•จ์ˆ˜๋Š” "โš  ํ•จ์ˆ˜: Cloud Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ Firestore์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ํ”„๋กœ๋•์…˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ" ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@prgwar ์ œ์•ˆ firebase ๋ช…๋ น์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. jar ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ด๋ฉฐ ์‹ค์ œ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์žฅ๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@ srolfe26 ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. Cloud Functions ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. firebase init emulators ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ๋‹ค์Œ firebase emulators:start ๋‹ค์‹œ ์‹คํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

๋™๋ฃŒ WSL(1 ๋˜๋Š” 2) ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ช…๋ น์— --host 0.0.0.0 ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

java -jar ~/.cache/firebase/emulators/cloud-firestore-emulator-v1.10.2.jar \
  --seed_from_export=firestore_export_1576524691/firestore_export_1576524691.overall_export_metadata \
  --host 0.0.0.0

์‚ฌ์šฉ์˜ '@prgwar๊ฒ ์Šต๋‹ˆ๊นŒ ์ œ์•ˆ --firestore_seed_from_export =๋ฐ›์•„๋“ค์—ฌ์งˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ๊ธฐ๊บผ์ด PR์„ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์ด ๊ตด๋Ÿฌ๊ฐ€๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋™์ผํ•œ seed_from_export ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

@spencerwhyte ์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ €๋Š” ์ง€๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  Firestore์™€ RTDB, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜์˜ ๋ชจ๋“  ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ง€์›ํ•  ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

  • "๋ฐฑ์—…"์€ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ํด๋”์ž…๋‹ˆ๋‹ค.

    • ํ‘œ์ค€ ํ˜•์‹์˜ ๊ฐœ๋ณ„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฐฑ์—… ๋ฌถ์Œ

    • ์ด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋‹จ์ผ metadata.json ํŒŒ์ผ

  • ์‹œ๋“œ๋กœ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. firebase emulators:start --import="./folder-with-backup"
  • ์‹คํ–‰ ์ค‘์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•˜๋ ค๋ฉด ์‹คํ–‰ ์ค‘์ธ ๋™์•ˆ ์ƒˆ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  firebase emulators:export

๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ํ˜„์žฌ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ์œ ์—ฐํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ”ผ๋“œ๋ฐฑ์— ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ž…๋‹ˆ๋‹ค.

@samtstern ๋ฐ˜๊ฐ‘ ์Šต๋‹ˆ๋‹ค!

์ด ๋””์ž์ธ์€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ ํ˜•์‹/๋ฐฑ์—… ํ˜•์‹์ด ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์™„๋ฒฝํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์˜ ๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ํ˜•์‹์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ผ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‚ด์•„๋‚จ์•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. --import ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ง€์›์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์ผ์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ์— firebase emulators:exec ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ exec ์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ํ•œ ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@spencerwhyte

1) ์˜ˆ, ๊ฐ€๋Šฅํ•œ ํ•œ ํ”„๋กœ๋•์…˜๊ณผ ๋™์ผํ•œ ํ˜•์‹์„ ํ™•์‹คํžˆ ๊ณ ์ˆ˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Firestore์˜ ๊ฒฝ์šฐ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ ํ˜•์‹์„ ์ง€์›ํ•˜๊ณ  RTDB์˜ ๊ฒฝ์šฐ ๊ฑฐ๋Œ€ํ•œ json ํŒŒ์ผ์ด ๋ฉ๋‹ˆ๋‹ค.
2) ์˜ˆ, ์šฐ๋ฆฌ๋Š” emulators:exec --import ์ง€์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

PR #1968์€ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ(ํ˜„์žฌ Firestore์—๋งŒ ํ•ด๋‹น, Realtime Database๊ฐ€ ๊ณง ์ œ๊ณต๋  ์˜ˆ์ •์ž„) ๋‹ค์Œ CLI ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค( 7.14.0 ).

์ด ๊ธฐ๋Šฅ์€ 7.14.0 ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค ... ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์˜๊ฒฌ์„ ์•Œ๋ ค์ฃผ์„ธ์š”! ์ง€๊ธˆ์€ Firestore๋งŒ ์žˆ์ง€๋งŒ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋‹ค์Œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์–ด๋””์—๋‚˜ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ Google Cloud Storage ๋ฒ„ํ‚ท(๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ) ์—†์ด ํ”„๋กœ๋•์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
ํด๋ผ์šฐ๋“œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—์„œ ๋ณต์ œ๋œ ๋ฐ์ดํ„ฐ ์—†์ด ๋กœ์ปฌ์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@shaimo ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ์ž‘์—…์ด ์กฐ๊ธˆ

ํ”„๋กœ๋•์…˜์—์„œ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด Cloud Storage ๋ฒ„ํ‚ท์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” Google ์„œ๋ฒ„ ์–ด๋”˜๊ฐ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” "๊ด€๋ฆฌ๋˜๋Š”" ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๊ทธ๋Ÿฐ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๋Œ€์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Firebase ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ Cloud Storage ๋ฒ„ํ‚ท์ด ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ์ผ๋ถ€ ๋ฌด๋ฃŒ ํ• ๋‹น๋Ÿ‰์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Firebase ์ฝ˜์†”์˜ ์Šคํ† ๋ฆฌ์ง€ ์„น์…˜์œผ๋กœ ์ด๋™ํ•˜์—ฌ ํ™•์ธํ•˜์„ธ์š”.

@samtstern ๋ฌธ์„œ์— ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ธ์Šคํ„ด์Šค๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

์ด์ œ ์—ฌ๊ธฐ์— ์ƒˆ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://firebase.google.com/docs/emulator-suite/install_and_configure#startup

ํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‘ ๊ฐœ์˜ ํ„ฐ๋ฏธ๋„ ์ฐฝ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ํ„ฐ๋ฏธ๋„ 1 ๊ณผ ํ„ฐ๋ฏธ๋„ 2 ๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‹œ์ž‘

ํ„ฐ๋ฏธ๋„ 1

$ firebase emulators:start
# ...

์ €์žฅํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ช‡ ๊ฐœ ๊ตฌ์ถ•ํ•œ ํ›„ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„ 2

$ firebase emulators:export ./mydirectory
# ...

์ด์ œ ./mydirectory ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ฑฐ๊ธฐ์—์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ์ง€์‹œํ•˜์‹ญ์‹œ์˜ค.

ํ„ฐ๋ฏธ๋„ 1

$ firebase emulators:start --import=./mydirectory
# ...

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ!

@samtstern firebase emulators:start --import ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋‚ด๋ณด๋‚ด๊ธฐ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‚˜์š”?
emulators:start --import๊ฐ€ firebase-export-metadata.json์„ ์ฐพ๊ณ  ์žˆ์ง€๋งŒ firestore-export/firestore-export.overall_export_metadata๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@landonj ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ emulators:export ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋กœ์ปฌ ํŒŒ์ผ์ด ์•„๋‹Œ ํ”„๋กœ๋•์…˜ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก JSON ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ง ์—๋ฎฌ๋ ˆ์ดํ„ฐ์šฉ RTDB ์‹œ๋”ฉ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@FergyKay ์•„์ง ์•„๋ฌด๊ฒƒ๋„ ์—†์ง€๋งŒ ์—ฌ๊ธฐ๋ฅผ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/firebase/firebase-tools/issues/2079

์ด๊ฒƒ์€ ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค

@landonj ์™€ ๋˜‘๊ฐ™์€ ์ผ์„

@samtstern์ด ๋งํ•œ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค...

๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์–ด?

bdw.. ํŒŒ์ผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค!

firebase emulators:start --debug --only firestore,functions --import=/Users/ridermansb/Projects/meve.ai/backups/emulator-data

[2020-05-31T13:31:23.601Z] com.google.cloud.datastore.core.exception.DatastoreException: ์ „์ฒด ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:225)
com.google.cloud.datastore.emulator.impl.ExportImportUtil.fetchEntities(ExportImportUtil.java:54)
com.google.cloud.datastore.emulator.firestore.CloudFirestore.main(CloudFirestore.java:89)
{"metadata":{"emulator":{"name":"firestore"},"message":"com.google.cloud.datastore.core.exception.DatastoreException: ์ „์ฒด ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.\n\tat com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:225)\n\tat com.google.cloud.datastore.emulator.impl.ExportImportUtil.fetchEntities(ExportImportUtil.java:54)\n \tat com.google.cloud.datastore.emulator.firestore.CloudFirestore.main(CloudFirestore.java:89)\n"}}
[2020-05-31T13:31:23.602Z] ์›์ธ: java.io.FileNotFoundException: /Users/ridermansb/Projects/meve.ai/backups/emulator-data/Users/ridermansb/Projects/meve.ai/backups/ 2020-05-31/2020-05-31/2020-05-31T13:19:28_6168.overall_export_metadata (ํ•ด๋‹น ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†์Œ)
{"metadata":{"emulator":{"name":"firestore"},"message":"๋ฐœ์ƒ ์›์ธ: java.io.FileNotFoundException: /Users/ridermansb/Projects/meve.ai/backups/emulator-data /Users/ridermansb/Projects/meve.ai/backups/2020-05-31/2020-05-31/2020-05-31T13:19:28_6168.overall_export_metadata (ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์—†์Œ)\n"}}
[2020-05-31T13:31:23.603Z] java.base/java.io.FileInputStream.open0(๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ)
java.base/java.io.FileInputStream.open(FileInputStream.java:213)
java.base/java.io.FileInputStream์— ์žˆ์Šต๋‹ˆ๋‹ค.(ํŒŒ์ผ์ž…๋ ฅ์ŠคํŠธ๋ฆผ.java:155)
com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:215)
... 2 ๊ฐœ ๋”
{"metadata":{"emulator":{"name":"firestore"},"message":"\tat java.base/java.io.FileInputStream.open0(๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ)\n\tat java.base/ java.io.FileInputStream.open(FileInputStream.java:213)\n\tat java.base/java.io.FileInputStream.(FileInputStream.java:155)\n\tat com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:215)\n\t... 2๊ฐœ ๋”\n"}}

์˜ค๋ฅ˜: firestore: Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: 1

@landonj ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ emulators:export ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋กœ์ปฌ ํŒŒ์ผ์ด ์•„๋‹Œ ํ”„๋กœ๋•์…˜ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก JSON ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? gcloud ๋ฒ„ํ‚ท์„ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๋จผ์ € ๋‚ด๋ณด๋‚ด๊ธฐ ๋‚ด์šฉ์„ ๋กœ์ปฌ๋กœ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด๋–ค ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

> firebase emulators:start
> firebase emulators:export ~/emulator-data/
> # close the emulator
> gcloud firestore export gs://xxxxx-xxxxx-xxxxx/emulator/
> gsutil cp -r gs://xxxxx-xxxxx-xxxxx/emulator ~/emulator-data/
> firebase emulators:start --only firestore --import /home/gugahoi/emulator-data/emulator/ --debug
[2020-06-01T10:04:36.492Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2020-06-01T10:04:36.493Z] > authorizing via signed-in user
i  emulators: Starting emulators: firestore {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: firestore"}}
[2020-06-01T10:04:36.510Z] [hub] writing locator at /tmp/hub-flux-development.json
i  emulators: Shutting down emulators. {"metadata":{"emulator":{"name":"hub"},"message":"Shutting down emulators."}}
i  hub: Stopping emulator hub {"metadata":{"emulator":{"name":"hub"},"message":"Stopping emulator hub"}}
[2020-06-01T10:04:36.825Z] Error: ENOENT: no such file or directory, open '/home/gugahoi/emulator-data/emulator/firebase-export-metadata.json'
    at Object.openSync (fs.js:458:3)
    at Object.readFileSync (fs.js:360:35)
    at Object.<anonymous> (/home/gugahoi/.nvm/versions/node/v12.16.3/lib/node_modules/firebase-tools/lib/emulator/controller.js:183:44)
    at Generator.next (<anonymous>)
    at fulfilled (/home/gugahoi/.nvm/versions/node/v12.16.3/lib/node_modules/firebase-tools/lib/emulator/controller.js:5:58)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

Error: An unexpected error has occurred.

์œ„์˜ ๋‚ด์šฉ์ด ์•ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ firebase-exports-metadata.json ํŒŒ์ผ์„ ๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ–ˆ์Šต๋‹ˆ๋‹ค.

> cat firebase-export-metadata.json
{"version":"8.4.1","firestore":{"version":"1.11.4","path":"emulator","metadata_file":"emulator/emulator.overall_export_metadata"}}

๋‹ค์Œ์€ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

gugahoi:~/emulator-data > tree .
.
โ”œโ”€โ”€ emulator
โ”‚ย ย  โ”œโ”€โ”€ all_namespaces
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ all_kinds
โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ all_namespaces_all_kinds.export_metadata
โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ output-0
โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ output-1
โ”‚ย ย  โ””โ”€โ”€ emulator.overall_export_metadata
โ”œโ”€โ”€ firebase-export-metadata.json
โ”œโ”€โ”€ firebase-export-metadata.json.bak
โ””โ”€โ”€ firestore_export
    โ””โ”€โ”€ firestore_export.overall_export_metadata

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์—๋ฎฌ๋ ˆ์ดํ„ฐ UI์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค

์—๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์ตœ์ข… ์ถœ๋ ฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์˜ค๋ฅ˜ ์—†์ด ์‹คํ–‰๋˜์ง€๋งŒ ๋‚ด ๋ฐ์ดํ„ฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

> firebase emulators:start --only firestore --import /home/gugahoi/emulator-data/ --debug
[2020-06-01T11:31:34.256Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2020-06-01T11:31:34.257Z] > authorizing via signed-in user
i  emulators: Starting emulators: firestore {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: firestore"}}
[2020-06-01T11:31:34.274Z] [hub] writing locator at /tmp/hub-flux-development.json
i  firestore: Importing data from /home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata {"metadata":{"emulator":{"name":"firestore"},"message":"Importing data from /home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata"}}
[2020-06-01T11:31:34.302Z] Ignoring unsupported arg: projectId {"metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: projectId"}}
[2020-06-01T11:31:34.303Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: auto_download"}}
[2020-06-01T11:31:34.303Z] Starting Firestore Emulator with command {"binary":"java","args":["-Duser.language=en","-jar","/home/gugahoi/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.4.jar","--host","localhost","--port",8080,"--seed_from_export","/home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata","--rules","/home/gugahoi/projects/flux/flux/firestore.rules"],"optionalArgs":["port","webchannel_port","host","rules","functions_emulator","seed_from_export"],"joinArgs":false} {"metadata":{"emulator":{"name":"firestore"},"message":"Starting Firestore Emulator with command {\"binary\":\"java\",\"args\":[\"-Duser.language=en\",\"-jar\",\"/home/gugahoi/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.4.jar\",\"--host\",\"localhost\",\"--port\",8080,\"--seed_from_export\",\"/home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata\",\"--rules\",\"/home/gugahoi/projects/flux/flux/firestore.rules\"],\"optionalArgs\":[\"port\",\"webchannel_port\",\"host\",\"rules\",\"functions_emulator\",\"seed_from_export\"],\"joinArgs\":false}"}}
i  firestore: Firestore Emulator logging to firestore-debug.log {"metadata":{"emulator":{"name":"firestore"},"message":"Firestore Emulator logging to \u001b[1mfirestore-debug.log\u001b[22m"}}
[2020-06-01T11:31:35.197Z] API endpoint: http://localhost:8080
 {"metadata":{"emulator":{"name":"firestore"},"message":"API endpoint: http://localhost:8080\n"}}
[2020-06-01T11:31:35.198Z] If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:

   export FIRESTORE_EMULATOR_HOST=localhost:8080

Dev App Server is now running.

 {"metadata":{"emulator":{"name":"firestore"},"message":"If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:\n\n   export FIRESTORE_EMULATOR_HOST=localhost:8080\n\nDev App Server is now running.\n\n"}}
[2020-06-01T11:31:35.322Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"ui"},"message":"Ignoring unsupported arg: auto_download"}}
[2020-06-01T11:31:35.322Z] Ignoring unsupported arg: port {"metadata":{"emulator":{"name":"ui"},"message":"Ignoring unsupported arg: port"}}
[2020-06-01T11:31:35.323Z] Starting Emulator UI with command {"binary":"node","args":["/home/gugahoi/.cache/firebase/emulators/ui-v1.0.0/server.bundle.js"],"optionalArgs":[],"joinArgs":false} {"metadata":{"emulator":{"name":"ui"},"message":"Starting Emulator UI with command {\"binary\":\"node\",\"args\":[\"/home/gugahoi/.cache/firebase/emulators/ui-v1.0.0/server.bundle.js\"],\"optionalArgs\":[],\"joinArgs\":false}"}}
i  ui: Emulator UI logging to ui-debug.log {"metadata":{"emulator":{"name":"ui"},"message":"Emulator UI logging to \u001b[1mui-debug.log\u001b[22m"}}
[2020-06-01T11:31:35.395Z] Web / API server started at http://localhost:4000
 {"metadata":{"emulator":{"name":"ui"},"message":"Web / API server started at http://localhost:4000\n"}}

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ โœ”  All emulators ready! View status and logs at http://localhost:4000 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Emulator  โ”‚ Host:Port      โ”‚ View in Emulator UI             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Firestore โ”‚ localhost:8080 โ”‚ http://localhost:4000/firestore โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  Other reserved ports: 4400, 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.

@gugahoi ๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์ด ํ•ด๊ฒฐ์ฑ…์„ https://gist.github.com/bkuri/36cef71bcf30a5416b1c353cb81f38ed

ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ๋“œํ•˜๋Š” ์ž‘์€ bash ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ๋‚ด๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋Œ€์ƒ ๊ฒฝ๋กœ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: ./seed-storage.sh my-project /tmp/export .

BTW, ์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ผ๋ฐ˜์ ์ธ ์šฉ์˜์ž( firebase , gcloud ๋ฐ gsutil ) ์™ธ์—๋„ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๋‘ ๊ฐ€์ง€ ๋„๊ตฌ( lsof ๋ฐ screen )์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. gsutil ), ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :+1:

์–ด์จŒ๋“  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ firestore ๊ธฐ๋Šฅ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ ค๋ฉด?

@bkuri ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ Firestore ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์ฝ˜์†”์— ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ค์ •/์„ค์น˜์— ์ด์ƒํ•œ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@gugahoi ๋•๋ถ„์— ํ”„๋กœ๋•์…˜์—์„œ ๋กœ์ปฌ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ์ปฌ๋ ‰์…˜์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‚ด ๋กœ์ปฌ Firebase ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‹œ์ž‘: firebase emulators:start
  3. ์ œ๊ณต๋œ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ http://localhost :4000/firestore์˜ GUI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๋ชจํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. __ ์ปฌ๋ ‰์…˜ ์‹œ์ž‘_ ๋ฐ __๋ฌธ์„œ ์ถ”๊ฐ€_.
  4. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ๋กœ ์ด ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ: emulators:export ./mydirectory
  5. _Firebase Database / Cloud Firestore_์— ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹จ์ผ ์ปฌ๋ ‰์…˜์„ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. gcloud firestore export gs://my-project-bucket-id.appspot.com --collection-ids=myCollection ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์ด์ œ _Firebase Storage_ ์•„๋ž˜์— ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์ด๋ฆ„์œผ๋กœ ์ง€์ •๋œ ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค(์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด)
  6. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํด๋”๋ฅผ ๋กœ์ปฌ ๋“œ๋ผ์ด๋ธŒ์— ๋‹ค์šด๋กœ๋“œ: gsutil cp -r gs://my-project-bucket-id.appspot.com/myCollection ./production_data_export ์ฐธ๊ณ : Windows ํ™˜๊ฒฝ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค... _gsutil_์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. _"OSError: ํŒŒ์ผ ์ด๋ฆ„, ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„ ๋˜๋Š” ๋ณผ๋ฅจ ๋ ˆ์ด๋ธ” ๊ตฌ๋ฌธ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค."_ ํด๋”์— Windows์˜ ํด๋” ์ด๋ฆ„์— ๋Œ€ํ•ด ์ž˜๋ชป๋œ ๋ฌธ์ž(์˜ˆ: ์ฝœ๋ก )๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋˜๋Š” ์ด ์˜ค๋ฅ˜: _"OSError: Invalid argument.9.0 B]"_ ํด๋”์˜ ๋‚ด๋ถ€ ํŒŒ์ผ์—๋„ ์ž˜๋ชป๋œ ๋ฌธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ. ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋กœ์ปฌ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด gsutil mv gs://my-project-bucket-id.appspot.com/2020-05-22T02:01:06_86152 gs://my-project-bucket-id.appspot.com/myCollection ์™€ ๊ฐ™์ด ์œ ํšจํ•œ Windows ์ด๋ฆ„(์˜ˆ: ์ฝœ๋ก  ์ œ๊ฑฐ)์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  7. ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋กœ์ปฌ ๋‚ด๋ณด๋‚ด๊ธฐ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฐฉํ•˜์—ฌ ํด๋” ์ด๋ฆ„์„ firestore_export ๋ฐ”๊พธ๊ณ  ๋กœ์ปฌ ๋‚ด๋ณด๋‚ด๊ธฐ ํด๋”์—์„œ firebase-export-metadata.json ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ์–ป์€ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
$ tree .
.
โ”œโ”€โ”€ local_data_export
โ”‚   โ”œโ”€โ”€ firebase-export-metadata.json
โ”‚   โ””โ”€โ”€ firestore_export
โ”‚       โ”œโ”€โ”€ all_namespaces
โ”‚       โ”‚   โ””โ”€โ”€ all_kinds
โ”‚       โ”‚       โ”œโ”€โ”€ all_namespaces_all_kinds.export_metadata
โ”‚       โ”‚       โ””โ”€โ”€ output-0
โ”‚       โ””โ”€โ”€ firestore_export.overall_export_metadata
โ””โ”€โ”€ production_data_export
    โ”œโ”€โ”€ firebase-export-metadata.json
    โ””โ”€โ”€ firestore_export
        โ”œโ”€โ”€ all_namespaces
        โ”‚   โ””โ”€โ”€ kind_myCollection
        โ”‚       โ”œโ”€โ”€ all_namespaces_kind_myCollection.export_metadata
        โ”‚       โ”œโ”€โ”€ output-0
        โ”‚       โ””โ”€โ”€ output-1
        โ””โ”€โ”€ firestore_export.overall_export_metadata

8 directories, 9 files
  1. ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ํ”„๋กœ๋•์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋กœ์ปฌ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. firebase emulators:start --import=./mock_up_data/production_data_export/
  2. ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋Š” http://localhost :4000/firestore/์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ง€์นจ์ด ๋„์›€์ด ๋  ๋งŒํผ ๋ช…ํ™•ํ–ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. Firebase ์ง์›์˜ ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ์†”๋ฃจ์…˜์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์—…๋ฐ์ดํŠธ: ์œ„์˜ ์„ค๋ช…์—์„œ ์ง€์นจ์„ ๊ฒŒ์‹œํ–ˆ์„ ๋•Œ WSL2์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜์ง€๋งŒ Ubuntu์—์„œ๋Š” ๋™์ผํ•œ ๋‹จ๊ณ„๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. WSL2์— ๊ฐ„์„ญํ•˜๋Š” ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ๋•์…˜์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด Firestore์— 7000๊ฐœ์˜ Google ์‹œํŠธ ํ–‰์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๋•์…˜์—์„œ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ธฐ๋Šฅ์„ ํŽธ์ง‘ํ•˜์—ฌ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์ดˆ๊ณผ๋˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ™•์ธํ–ˆ๊ณ  ๋กœ์ปฌ ์—๋ฎฌ๋ ˆ์ดํ„ฐ Firestore ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋กœ์ปฌ ๋ฐฑ์—…์„ ํ”„๋กœ๋•์…˜์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@nvanhoesel ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ ํ˜•์‹์€ ํ”„๋กœ๋•์…˜ ๋ฐ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ด๋ฏ€๋กœ Firestore์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก Google Cloud Storage๋กœ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ง์ ‘ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰