Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

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

์šฐ๋ฆฌ๋Š” Dodo Pizza ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๋ฐ ํ‰๊ท  3์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ์ผ๋ถ€ "์šด์ด ์ข‹์€ ์‚ฌ๋žŒ๋“ค"์˜ ๊ฒฝ์šฐ 15~20์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปท ์•„๋ž˜์—๋Š” ํ–‰๋ณตํ•œ ๊ฒฐ๋ง์ด ์žˆ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ฑ์žฅ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ์ถ•์ ํ•œ ํ›„ ํ•จ๊ป˜ ํž˜์„ ํ•ฉ์ณ ๋ชจ๋“  ๊ฒƒ์„ ๊ณ ์นœ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
๋ฌธ์„œ์˜ ์ž‘์„ฑ์ž : ๋ง‰์‹ฌ ์นด์นœํ‚จ โ€” Dodo Pizza์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„์ด์ฝ˜์„ ํด๋ฆญํ•œ ํ›„ ์ฒซ ๋ฒˆ์งธ ํ™œ๋™์˜ onResume()๊นŒ์ง€ 15์ดˆ๋Š” ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์‹œ์ž‘ ์‹œ๊ฐ„์ด 20-XNUMX์ดˆ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

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

๋ฌธ์ œ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„

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

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

์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๋‚˜์š”? ์— ๋”ฐ๋ฅด๋ฉด ๊ตฌ๊ธ€ ๋ฌธ์„œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝœ๋“œ ์Šคํƒ€ํŠธ์— 5์ดˆ ๋ฏธ๋งŒ์ด ์†Œ์š”๋˜๋ฉด ์ด๋Š” "์ •์ƒ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ" ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. Dodo Pizza Android ์•ฑ ์ถœ์‹œ(Firebase ์ธก์ •ํ•ญ๋ชฉ์— ๋”ฐ๋ฆ„) _app_start) ์— ์ฝœ๋“œ ์Šคํƒ€ํŠธ ํ‰๊ท  3์ดˆ ์•ˆ์— โ€“ ๊ทธ๋“ค์ด ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ โ€œ์ข‹์ง€๋„, ๋”์ฐํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.โ€

๊ทธ๋Ÿฌ๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋ถˆ๋งŒ์ด ๋‚˜ํƒ€๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค! ์šฐ์„ , ์šฐ๋ฆฌ๋Š” "๋งค์šฐ, ๋งค์šฐ, ๋งค์šฐ ๊ธธ๋‹ค"๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ธก์ •ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์œ„ํ•ด Firebase ์ถ”์ ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ์‹œ์ž‘ ์ถ”์ .

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

์ด ํ‘œ์ค€ ์ถ”์ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Š” ์ˆœ๊ฐ„๊ณผ ์ฒซ ๋ฒˆ์งธ ํ™œ๋™์˜ onResume()์ด ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„ ์‚ฌ์ด์˜ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. Firebase ์ฝ˜์†”์—์„œ๋Š” ์ด ์ธก์ •ํ•ญ๋ชฉ์„ _app_start๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐํ˜€์กŒ๋‹ค:

  • ์ค‘์•™ ์ฝœ๋“œ ์‹œ์ž‘ ์‹œ๊ฐ„์ด 95์ดˆ ๋ฏธ๋งŒ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  20๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์€ ๊ฑฐ์˜ 5์ดˆ(์ผ๋ถ€๋Š” ๋” ๊ธธ๋‹ค)์ž…๋‹ˆ๋‹ค.
  • ์‹œ์ž‘ ์‹œ๊ฐ„์€ ์ผ์ •ํ•œ ๊ฐ’์ด ์•„๋‹ˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋•Œ๋กœ๋Š” ๋ฐฉ์šธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ๊ทœ๋ชจ๋ฅผ 90์ผ๋กœ ๋Š˜๋ ธ์„ ๋•Œ ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

๋‘ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

  1. ๋ญ”๊ฐ€๊ฐ€ ์ƒˆ๊ณ  ์žˆ์–ด์š”.
  2. ์ด "๋ฌด์–ธ๊ฐ€"๋Š” ๋ฆด๋ฆฌ์Šค ํ›„ ์žฌ์„ค์ •๋œ ๋‹ค์Œ ๋‹ค์‹œ ๋ˆ„์ถœ๋ฉ๋‹ˆ๋‹ค.

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

Realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ๋‚˜์š”?

์šฐ๋ฆฌ๋Š” ์ฒซ ๋ฒˆ์งธ ์„ค์น˜๋ถ€ํ„ฐ ํ™œ์„ฑ ์‚ฌ์šฉ ์ค‘์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜๋ช… ๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์šฉ์ด ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํ†ตํ•ด Realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ…Œํ†  ๋˜๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์—ด๋ฉด ๋” ์ž์„ธํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ๋ฆ„ ์ŠคํŠœ๋””์˜ค. ADB๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด Realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์„ธ์š”.

adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME}

์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณธ ๊ฒฐ๊ณผ ํŠน์ • ์œ ํ˜•์˜ ๊ฐœ์ฒด ์ˆ˜๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
๊ทธ๋ฆผ์€ ๋‘ ํŒŒ์ผ์— ๋Œ€ํ•œ Realm Studio์˜ ์ผ๋ถ€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์™ผ์ชฝ์€ ์„ค์น˜ ํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ฐ˜, ์˜ค๋ฅธ์ชฝ์€ ํ™œ์„ฑ ์‚ฌ์šฉ ํ›„์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ImageEntity ะธ MoneyType ํฌ๊ฒŒ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(์Šคํฌ๋ฆฐ์ƒท์€ ๊ฐ ์œ ํ˜•์˜ ๊ฐœ์ฒด ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค).

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฆ๊ฐ€์™€ ์‹œ์ž‘ ์‹œ๊ฐ„์˜ ๊ด€๊ณ„

ํ†ต์ œ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฆ๊ฐ€๋Š” ๋งค์šฐ ๋‚˜์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๊นŒ? ActivityManager๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. Android 4.4๋ถ€ํ„ฐ logcat์€ Displayed ๋ฌธ์ž์—ด๊ณผ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ํ™œ๋™ ๋ Œ๋”๋ง์ด ๋๋‚  ๋•Œ๊นŒ์ง€์˜ ๊ฐ„๊ฒฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  • ๊ฐ์ฒด ์ดˆ๊ธฐํ™”.
  • ํ™œ๋™ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”.
  • ๋ ˆ์ด์•„์›ƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง.

์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. -S ๋ฐ -W ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ADB๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ํ•จ๊ป˜ ํ™•์žฅ๋œ ์ถœ๋ ฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

adb shell am start -S -W ru.dodopizza.app/.MainActivity -c android.intent.category.LAUNCHER -a android.intent.action.MAIN

๊ฑฐ๊ธฐ์„œ ์žก์•„์˜ค๋ฉด grep -i WaitTime ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ด ์ง€ํ‘œ ์ˆ˜์ง‘์„ ์ž๋™ํ™”ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ž˜ํ”„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹ํšŸ์ˆ˜์— ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

๋™์‹œ์— 4MB์—์„œ 15MB๋กœ ์ฆ๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํฌ๊ธฐ์™€ ์ฆ๊ฐ€ ์‚ฌ์ด์—๋„ ๋™์ผํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด์ ์œผ๋กœ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ(์ฝœ๋“œ ์Šคํƒ€ํŠธ์˜ ์ฆ๊ฐ€์™€ ํ•จ๊ป˜) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ๊ฐ€ ๋ชจ๋‘ ์ฆ๊ฐ€ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์†์—๋Š” ๊ฐ€์„ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚จ์€ ๊ฒƒ์€ ์˜์กด์„ฑ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” "๋ˆ„์ถœ"์„ ์ œ๊ฑฐํ•˜๊ณ  ์ด๊ฒƒ์ด ์ถœ์‹œ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋Š์ž„์—†์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ด์œ 

"๋ˆ„์ˆ˜"๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์—, ๊ทธ๊ฒƒ์ด ์ฒ˜์Œ์— ๋‚˜ํƒ€๋‚œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Realm์ด ๋ฌด์—‡์ธ์ง€ ๊ธฐ์–ตํ•ด ๋ด…์‹œ๋‹ค.

Realm์€ ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. Android์˜ ORM ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— Realm์€ ์ตœ์†Œํ•œ์˜ ๋ณ€ํ™˜๊ณผ ๋งคํ•‘์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด Realm์˜ ๊ฐ•์ ์ด์ž ์‚ฌ๋ž‘๋ฐ›๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

(์ด ๊ธ€์˜ ๋ชฉ์ ์ƒ ์ด ์„ค๋ช…๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. Realm์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๋งํฌ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜ ์•„๋‹ˆ๋ฉด ๊ทธ๋“ค์˜ ์•„์นด๋ฐ๋ฏธ).

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(์˜ˆ: ๋‚ด๋ถ€์ ์œผ๋กœ SQL์ด ํฌํ•จ๋œ ORM ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณ„๋‹จ์‹ ๋ฐ์ดํ„ฐ ์‚ญ์ œ์™€ ๊ฐ™์€ ์ผ์ด ์ข…์ข… ์ฃผ์–ด์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Realm์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ณ„๋‹จ์‹ ์‚ญ์ œ ์—†์ด ๋ฐ์ดํ„ฐ ์œ ์ถœ

์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ณ„๋‹จ์‹ ์‚ญ์ œ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์œ ์ถœ๋˜๋‚˜์š”? ์ค‘์ฒฉ๋œ Realm ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
(๊ฑฐ์˜) ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค CartItemEntity:

@RealmClass
class CartItemEntity(
 @PrimaryKey
 override var id: String? = null,
 ...
 var name: String = "",
 var description: String = "",
 var image: ImageEntity? = null,
 var category: String = MENU_CATEGORY_UNKNOWN_ID,
 var customizationEntity: CustomizationEntity? = null,
 var cartComboProducts: RealmList<CartProductEntity> = RealmList(),
 ...
) : RealmObject()

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์žˆ๋Š” ์ œํ’ˆ์—๋Š” ์‚ฌ์ง„์„ ํฌํ•จํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ImageEntity, ๋งž์ถคํ˜• ์žฌ๋ฃŒ CustomizationEntity. ๋˜ํ•œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์žˆ๋Š” ์ƒํ’ˆ์€ ์ž์ฒด ์ƒํ’ˆ ์„ธํŠธ์™€ ์ฝค๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RealmList (CartProductEntity). ๋‚˜์—ด๋œ ๋ชจ๋“  ํ•„๋“œ๋Š” Realm ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ID๋ฅผ ๊ฐ€์ง„ ์ƒˆ ๊ฐ์ฒด(copyToRealm() / copyToRealmOrUpdate())๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ์ด ๊ฐ์ฒด๋ฅผ ์™„์ „ํžˆ ๋ฎ์–ด์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๋‚ด๋ถ€ ๊ฐœ์ฒด(image,customizationEntity ๋ฐ cartComboProducts)๋Š” ์ƒ์œ„ ๊ฐœ์ฒด์™€์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ•ญ๋ชฉ๊ณผ์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์ฝ๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ช…์‹œ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ์ „์ฒด "ํ…Œ์ด๋ธ”"์„ ์ง€์šฐ์ง€ ์•Š๋Š” ํ•œ). ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ "๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜"๋ผ๊ณ  ๋ถˆ๋ €์Šต๋‹ˆ๋‹ค.

Realm์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹๋ช…์‹œ์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ณ  ํ•ด๋‹น ์ž‘์—… ์ „์— ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val entity = realm.where(CartItemEntity::class.java).equalTo("id", id).findFirst()
if (first != null) {
 deleteFromRealm(first.image)
 deleteFromRealm(first.customizationEntity)
 for(cartProductEntity in first.cartComboProducts) {
   deleteFromRealm(cartProductEntity)
 }
 first.deleteFromRealm()
}
// ะธ ะฟะพั‚ะพะผ ัƒะถะต ัะพั…ั€ะฐะฝัะตะผ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” image,customizationEntity, cartComboProducts ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ์ค‘์ฒฉ๋œ Realm ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์ค‘์ฒฉ ๋ฃจํ”„์™€ ์‚ญ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

"๋น ๋ฅธ" ์†”๋ฃจ์…˜

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๊ฒฐ์ •ํ•œ ์ผ์€ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ด๊ฒƒ์ด ์›๋ž˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ์ž์‹์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ค‘์ฒฉ๋œ Realm ๊ฐ์ฒด ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

interface NestedEntityAware {
 fun getNestedEntities(): Collection<RealmObject?>
}

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ Realm ๊ฐ์ฒด์— ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค:

@RealmClass
class DataPizzeriaEntity(
 @PrimaryKey
 var id: String? = null,
 var name: String? = null,
 var coordinates: CoordinatesEntity? = null,
 var deliverySchedule: ScheduleEntity? = null,
 var restaurantSchedule: ScheduleEntity? = null,
 ...
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       coordinates,
       deliverySchedule,
       restaurantSchedule
   )
 }
}

ะ’ getNestedEntities ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํ•˜์œ„ ํ•ญ๋ชฉ์„ ๋‹จ์ˆœ ๋ชฉ๋ก์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ•˜์œ„ ๊ฐ์ฒด๋Š” NestedEntityAware ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ญ์ œํ•  ๋‚ด๋ถ€ Realm ๊ฐ์ฒด๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ScheduleEntity:

@RealmClass
class ScheduleEntity(
 var monday: DayOfWeekEntity? = null,
 var tuesday: DayOfWeekEntity? = null,
 var wednesday: DayOfWeekEntity? = null,
 var thursday: DayOfWeekEntity? = null,
 var friday: DayOfWeekEntity? = null,
 var saturday: DayOfWeekEntity? = null,
 var sunday: DayOfWeekEntity? = null
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       monday, tuesday, wednesday, thursday, friday, saturday, sunday
   )
 }
}

๋“ฑ๋“ฑ, ๊ฐ์ฒด ์ค‘์ฒฉ์ด ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ค‘์ฒฉ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•(ํ™•์žฅ์œผ๋กœ ๋งŒ๋“ค์–ด์ง) deleteAllNestedEntities ๋ชจ๋“  ์ตœ์ƒ์œ„ ๊ฐœ์ฒด์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. deleteNestedRecursively NestedEntityAware ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ค‘์ฒฉ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

fun <T> Realm.deleteAllNestedEntities(entities: Collection<T>,
 entityClass: Class<out RealmObject>,
 idMapper: (T) -> String,
 idFieldName : String = "id"
 ) {

 val existedObjects = where(entityClass)
     .`in`(idFieldName, entities.map(idMapper).toTypedArray())
     .findAll()

 deleteNestedRecursively(existedObjects)
}

private fun Realm.deleteNestedRecursively(entities: Collection<RealmObject?>) {
 for(entity in entities) {
   entity?.let { realmObject ->
     if (realmObject is NestedEntityAware) {
       deleteNestedRecursively((realmObject as NestedEntityAware).getNestedEntities())
     }
     realmObject.deleteFromRealm()
   }
 }
}

์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ์†”๋ฃจ์…˜์œผ๋กœ ๋ฎ์€ ๊ฐœ์ฒด๋Š” ์„ฑ์žฅ์„ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ ์ด์Šค์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ์žฅ์€ ๋‘”ํ™”๋˜์—ˆ์ง€๋งŒ ๋ฉˆ์ถ”์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

"์ •์ƒ์ ์ธ" ์†”๋ฃจ์…˜

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

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž์ฒด์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์–ธ๊ฐ€๊ฐ€ ์Šค์Šค๋กœ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐ ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๊ทธ๊ฒƒ์ด Realm ๊ฐ์ฒด์ธ์ง€ ๊ฐ์ฒด ๋ชฉ๋ก์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

RealmModel::class.java.isAssignableFrom(field.type)

RealmList::class.java.isAssignableFrom(field.type)

ํ•„๋“œ๊ฐ€ RealmModel ๋˜๋Š” RealmList์ธ ๊ฒฝ์šฐ ์ด ํ•„๋“œ์˜ ๊ฐ์ฒด๋ฅผ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๋ชจ๋“  ๊ฒƒ์€ ์œ„์—์„œ ํ•œ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋งŒ ์ž์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ณ„๋‹จ์‹ ์‚ญ์ œ ๋ฐฉ๋ฒ• ์ž์ฒด๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

fun <T : Any> Realm.cascadeDelete(entities: Collection<T?>) {
 if(entities.isEmpty()) {
   return
 }

 entities.filterNotNull().let { notNullEntities ->
   notNullEntities
       .filterRealmObject()
       .flatMap { realmObject -> getNestedRealmObjects(realmObject) }
       .also { realmObjects -> cascadeDelete(realmObjects) }

   notNullEntities
       .forEach { entity ->
         if((entity is RealmObject) && entity.isValid) {
           entity.deleteFromRealm()
         }
       }
 }
}

ํ™•๋Œ€ filterRealmObject Realm ๊ฐ์ฒด๋งŒ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ• getNestedRealmObjects ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ๋ชจ๋“  ์ค‘์ฒฉ๋œ Realm ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ์„ ํ˜• ๋ชฉ๋ก์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋™์ผํ•œ ์ž‘์—…์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ญ์ œ ์‹œ ๊ฐœ์ฒด์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. isValid, ์™œ๋ƒํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ์œ„ ๊ฐœ์ฒด๊ฐ€ ๋™์ผํ•œ ๊ฐœ์ฒด๋ฅผ ์ค‘์ฒฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ”ผํ•˜๊ณ  ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ID ์ž๋™ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

getNestedRealmObjects ๋ฉ”์†Œ๋“œ์˜ ์ „์ฒด ๊ตฌํ˜„

private fun getNestedRealmObjects(realmObject: RealmObject) : List<RealmObject> {
 val nestedObjects = mutableListOf<RealmObject>()
 val fields = realmObject.javaClass.superclass.declaredFields

// ะŸั€ะพะฒะตั€ัะตะผ ะบะฐะถะดะพะต ะฟะพะปะต, ะฝะต ัะฒะปัะตั‚ัั ะปะธ ะพะฝะพ RealmModel ะธะปะธ ัะฟะธัะบะพะผ RealmList
 fields.forEach { field ->
   when {
     RealmModel::class.java.isAssignableFrom(field.type) -> {
       try {
         val child = getChildObjectByField(realmObject, field)
         child?.let {
           if (isInstanceOfRealmObject(it)) {
             nestedObjects.add(child as RealmObject)
           }
         }
       } catch (e: Exception) { ... }
     }

     RealmList::class.java.isAssignableFrom(field.type) -> {
       try {
         val childList = getChildObjectByField(realmObject, field)
         childList?.let { list ->
           (list as RealmList<*>).forEach {
             if (isInstanceOfRealmObject(it)) {
               nestedObjects.add(it as RealmObject)
             }
           }
         }
       } catch (e: Exception) { ... }
     }
   }
 }

 return nestedObjects
}

private fun getChildObjectByField(realmObject: RealmObject, field: Field): Any? {
 val methodName = "get${field.name.capitalize()}"
 val method = realmObject.javaClass.getMethod(methodName)
 return method.invoke(realmObject)
}

๊ฒฐ๊ณผ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์ž‘์—…์— "๊ณ„๋‹จ์‹ ์‚ญ์ œ"๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฝ์ž… ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

override fun <T : Entity> insert(
 entityInformation: EntityInformation,
 entities: Collection<T>): Collection<T> = entities.apply {
 realmInstance.cascadeDelete(getManagedEntities(entityInformation, this))
 realmInstance.copyFromRealm(
     realmInstance
         .copyToRealmOrUpdate(this.map { entity -> entity as RealmModel }
 ))
}

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

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

๋…น์ƒ‰ ์„ ์€ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์˜ ์ž๋™ ๊ณ„๋‹จ์‹ ์‚ญ์ œ ์ค‘ ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹ํšŸ์ˆ˜์— ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ๋ฐ ๊ฒฐ๋ก 

๊ณ„์†ํ•ด์„œ ์ฆ๊ฐ€ํ•˜๋Š” Realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ž์ฒด์ ์ธ "๊ณ„๋‹จ์‹ ์‚ญ์ œ" ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ _app_start ์ธก์ •ํ•ญ๋ชฉ์„ ํ†ตํ•ด ์šฐ๋ฆฌ์˜ ๊ฒฐ์ •์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

๋ถ„์„์„ ์œ„ํ•ด 90์ผ์˜ ๊ธฐ๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์•™๊ฐ’๊ณผ ์‚ฌ์šฉ์ž์˜ 95๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๊ฐ์†Œํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๋” ์ด์ƒ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

Realm์˜ ๊ณ„๋‹จ์‹ ์‚ญ์ œ๊ฐ€ ์˜ค๋žœ ์ถœ์‹œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

1์ผ ์ฐจํŠธ๋ฅผ ๋ณด๋ฉด _app_start ์ธก์ •ํ•ญ๋ชฉ์ด ์™„์ „ํžˆ ์ ์ ˆํ•ด ๋ณด์ด๊ณ  XNUMX์ดˆ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ _app_start์˜ ์ค‘์•™๊ฐ’์ด 5์ดˆ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Firebase๊ฐ€ ์•Œ๋ฆผ์„ ๋ณด๋‚ธ๋‹ค๋Š” ์ ๋„ ์ถ”๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๊ฒƒ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๋“ค์–ด๊ฐ€์„œ ๋ช…์‹œ์ ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Realm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน๋ณ„ํ•œ ์ ์€ ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ํŽธ์˜์„ฑ, ORM ์†”๋ฃจ์…˜ ๋ฐ ๊ฐ์ฒด ์—ฐ๊ฒฐ๊ณผ์˜ ์œ ์‚ฌ์„ฑ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ณ„๋‹จ์‹ ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ์ค‘์ฒฉ๋œ ๊ฐœ์ฒด๊ฐ€ ๋ˆ„์ ๋˜์–ด "๋ˆ„์ถœ"๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์†๋„ ์ €ํ•˜๋‚˜ ์‹œ์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

Realm์—์„œ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์•„์ง ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€๋Š” ์•Š์ง€๋งŒ ์˜ค๋žซ๋™์•ˆ ์ด์•ผ๊ธฐ๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ะณะพะฒะพั€ัั‚ ะธ ะณะพะฒะพั€ัั‚. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ด๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ์ž„๋ฐ•ํ•œ ๋“ฑ์žฅ์— ๋Œ€ํ•œ ๋…ผ์˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Realm์—์„œ๋Š” ๊ณ„๋‹จ์‹ ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ์—†๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋””์ž์ธํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ Realm์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€