Skip to content

๐Ÿค” Why

yangsooplus edited this page Jun 5, 2023 · 26 revisions

ํ”„๋กœ์ ํŠธ๋‚˜ ์Šคํฌ๋Ÿผ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ €ํฌ๊ฐ€ ์™œ ์ด๋Ÿฌํ•œ ์„ ํƒ์„ ํ–ˆ๋Š”์ง€ ๊ธฐ๋ก์„ ํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

Day01

โ“ Gradle -> KTS ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ–ˆ๋Š”์ง€

๊ณต์‹๋ฌธ์„œ - Groovy -> KTS
์šฐ์•„ํ•œ ํ˜•์ œ๋“ค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ - Gradle Kotlin DSL ์ด์•ผ๊ธฐ

  • Kotlin์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ•œ๋‹ค๋ฉด IDE์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฝ”๋“œ ์ž๋™์™„์„ฑ
    • ์˜ค๋ฅ˜์ฝ”๋“œ ๊ฐ•์กฐ

โ“ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ์‚ฌ์šฉ ์ด์œ 

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

โ“ ์‹ฑ๊ธ€ ์•กํ‹ฐ๋น„ํ‹ฐ vs ๋ฉ€ํ‹ฐ ์•กํ‹ฐ๋น„ํ‹ฐ

  • ์ƒ์„ธ ํ™”๋ฉด๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋˜๊ณ , ํˆด๋ฐ”๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ ์•กํ‹ฐ๋น„ํ‹ฐ ํ•„์š”

-> ๋ฉ€ํ‹ฐ ์•กํ‹ฐ๋น„ํ‹ฐ ์‚ฌ์šฉ


โ“ Koin vs Hilt(Dagger2)

image

  • Koin์€ ๋Ÿฐํƒ€์ž„์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.
    • ๋Ÿฐํƒ€์ž„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ์— ๋‚ด๊ฐ€ ์ฃผ์ž…์„ ํ•˜์ง€ ์•Š์•„๋„ ์•ฑ์€ ๋นŒ๋“œ๊ฐ€ ๋œ๋‹ค.
  • Hilt๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฃผ์ž…์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ๋งˆ์นœ๋‹ค.
    • Android X ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ๊ณต (ViewModel, WorkManager ๋“ฑ)
    • ๋ช…ํ™•ํ•œ Scope, ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ๊ฐ์†Œ(Dagger2 ์—์„œ ์ง์ ‘ Component๋ฅผ ๋งŒ๋“ค๊ณ  ์„ค์ •ํ•˜๋˜ ๊ณผ์ •์ด ๊ฐ„์†Œํ™”๋จ)
    • ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฃผ์ž…์„ ํ•˜๋ฏ€๋กœ ์•ฑ ์‹œ์ž‘์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฆ‰์‹œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” Koin ๋ณด๋‹ค Hilt๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ์œ ์ €๋Š” ๋” ๋น ๋ฅด๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์•ˆ์ •์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.


โ“ DI(Hilt) ์œ„์น˜

data vs app

  • ์šฐ๋ฆฌ ์กฐ์—์„œ ํ•ซํ•œ ์ฃผ์ œ์˜€๋‹ค.
  • data๋ ˆ์ด์–ด์— ์กด์žฌํ•ด์•ผ ํ• ์ง€ app๋ ˆ์ด์–ด์— ์กด์žฌํ•ด์•ผ ํ• ์ง€

์™œ data์— ์กด์žฌํ•ด์•ผ ํ•˜๋Š”์ง€๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์šฐ๋ฆฌ๊ฐ€ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ๋“ค์ด ๋Œ€๋ถ€๋ถ„์ด data, domain ๊ฐ์ฒด์ด๋‹ค.
  • data๋Š” domain์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ data ๋ ˆ์ด์–ด์— ๋‘๋Š” ๊ฒƒ์ด ์˜ณ๋‹ค.

app์— ์กด์žฌํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • app์ด ๋ชจ๋“  ๋ ˆ์ด์–ด๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์–ด๋–ค ์˜์กด์„ฑ์ด๋“  app์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋  provide๋Š” ๋Œ€๋ถ€๋ถ„์ด SingleTon(Application)์ธ๋ฐ ๊ทธ๋Ÿฌ๋ฉด Application๊ณผ ๊ฐ™์ด ์žˆ๋Š”๊ฒŒ ๋งž์ง€ ์•Š๋‚˜

๊ฒฐ๊ณผ์ ์œผ๋กœ app ๋ ˆ์ด์–ด์— ์žˆ์–ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ์ข€ ๋” ํƒ€๋‹นํ•˜๋‹ค๊ณ  ํŒ€๋‚ด์—์„œ ๊ฒฐ๋ก ์ด ๋‚ฌ์Šต๋‹ˆ๋‹ค.

โ“ minSDK

image

21 vs 23

21๋ฅผ ์„ ํƒ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

  • 98.8% ์˜ ์œ ์ €๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋” ๋งŽ์€ ๋ฒ„์ „์— ๋”ฐ๋ฅธ ๋Œ€์‘์„ ํ•™์Šต ํ•  ์ˆ˜ ์žˆ๋‹ค.

23๋ฅผ ์„ ํƒ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

  • 96.2% ๋กœ 2.6% ์ •๋„์˜ ์ฐจ์ด๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•™์Šต์ด ์•„๋‹Œ ์‹ค์ œ๋กœ ์ถœ์‹œํ•  ์•ฑ์ด๋‹ค
  • ์ง€๋ฌธ ์ธ์‹API๊ฐ€ SDK 23 ์ดํ›„ ๋ถ€ํ„ฐ ์ง€์›ํ•œ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ถœ์‹œ๊ฐ€ ๋ชฉํ‘œ์ด๊ธฐ ๋–„๋ฌธ์— 23๋ฒ„์ „ ์ด์ƒ์œผ๋กœ ๊ฒฐ์ •์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


โ“ Firebase Database ์˜ ์„ ํƒ

Realtime Database Vs Cloud Firestore

Realtime Database

  • ๋ฐ์ดํ„ฐ๋ฅผ JSON ํŠธ๋ฆฌ๋กœ ์ €์žฅ

    • ๋ณต์žกํ•œ ๊ณ„์ธต์ ์ธ ๋ฐ์ดํ„ฐ๋Š” ๋Œ€๊ทœ๋ชจ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์–ด๋ ค์›€
  • ์ œํ•œ๋œ ์ •๋ ฌ ๋ฐ ํ•„ํ„ฐ๋ง์ด ์žˆ๋Š” ์‹ฌ์ธต ์ฟผ๋ฆฌ

    • ์ •๋ ฌ์ด๋‚˜ ํ•„ํ„ฐ๋ง์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‘˜ ๋‹ค๋Š” ์•ˆ๋œ๋‹ค
    • ์ฟผ๋ฆฌ๋Š” ํ•ญ์ƒ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ ํ•œ๋‹ค
    • ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์ €ํ•˜ ๋œ๋‹ค
  • ํ™•์žฅ์‹œ ์ƒค๋”ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

    • ๋‹จ์ผ DB ๋‹น 200,000 ๊ฐœ์˜ ๋™์‹œ ์—ฐ๊ฒฐ ๋ฐ 1,000 write/s ์ด๋ฉฐ ๊ทธ ์ด์ƒ์œผ๋กœ ํ™•์žฅ ์‹œ DB๋ฅผ ๋ถ„ํ•  ํ•ด์•ผํ•œ๋‹ค
  • ๊ฐ€๊ฒฉ

    • ์ €์žฅ๋œ ํฌ๊ธฐ 15GB ๊ธฐ์ค€ $70

Cloud Firestore

  • Document๋ชจ์Œ์œผ๋กœ ์ €์žฅ

    • ๋ณต์žกํ•œ ๊ณ„์ธต์ •์ธ ๋ฐ์ดํ„ฐ๋Š” Document๋‚ด์˜ ํ•˜์œ„ Collection์„ ์ด์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๊ธฐ ์‰ฌ์›€
  • ๋ณตํ•ฉ ์ •๋ ฌ ๋ฐ ํ•„ํ„ฐ๋ง์ด ์žˆ๋Š” ์ธ๋ฑ์‹ฑ๋œ ์ฟผ๋ฆฌ

    • ๋‹จ์ผ ์ฟผ๋ฆฌ์—์„œ ํ•„ํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์†์„ฑ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌ์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Collection์˜ Document๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•˜์œ„ Collection์€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Indexing ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ ๊ฒฐ๊ณผ ํฌ๊ธฐ์— ๋น„๋ก€ํ•œ๋‹ค.
  • ์Šค์ผ€์ผ๋ง์€ ์ž๋™

    • 1,000,000๊ฐœ์˜ ๋™์‹œ ์—ฐ๊ฒฐ ๋ฐ 10,000 write/s ์ด๋ฉฐ Firebase ์—์„œ ํ•œ๋„๋ฅผ ๋Š˜๋ฆด ๊ณ„ํš
  • ๊ฐ€๊ฒฉ

    • ์ €์žฅ๋œ ํฌ๊ธฐ 15GiB ๊ธฐ์ค€ $2.52

image

์ถœ์‹œ ํ›„ DB ์˜ ๊ฐ€๊ฒฉ์ ์ธ ์ธก๋ฉด, ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ๋“ฑ์„ ์ด์œ ๋กœ Cloud Firestore๋ฅผ ์„ ํƒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Day02

โ“ Material3

ํ”„๋กœ์ ํŠธ์— ๋„์ž…์„ ํ•ด์•ผํ• ๊นŒ?

๋„์ž…ํ•˜๋ ค๋Š” ์ด์œ 

  • ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ๋„์ž…์— ๋Œ€ํ•œ ์‹œ๋„
  • ๊ฐ€์ด๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ๋ฐœํ•˜์—ฌ ์‹œ๊ฐ„ ๋‹จ์ถ•

๋„์ž…ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ด์œ 

  • Material3 ๋ฐฉ์‹์œผ๋กœ ๋””์ž์ธ์„ ์ž‘์—…ํ•˜๊ธฐ์— ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ๋‹ค.
  • ์ž‘์—…ํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด Material3์™€ ์–ด์šธ๋ฆฌ์ง€ ์•Š๋‹ค ํŒ๋‹จ

Material3๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •


โ“ ์ง€๋„์™€ ์žฅ์†Œ ๊ฒ€์ƒ‰ api

๋„ค์ด๋ฒ„ vs ์นด์นด์˜ค, ์–ด๋–ค Open Api๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

api๊ฐ€ ํ•„์š”ํ•œ ์š”๊ตฌ์‚ฌํ•ญ

  • ์‚ฌ์šฉ์ž ์œ„์น˜ ๋ฐ˜๊ฒฝ 500m ์ค‘ ์†Œ์ง€ ๊ธฐํ”„ํ‹ฐ์ฝ˜ ์‚ฌ์šฉ์ฒ˜๋ฅผ ์ง€๋„์— ํ‘œ์‹œ
  1. ์‚ฌ์šฉ์ž ํ˜„์žฌ ์ขŒํ‘œ ๊ธฐ์ค€ ๋ฐ˜๊ฒฝ 500m ๋‚ด ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰
  2. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ง€๋„์— ์ •๋ณด ํ‘œ์‹œ

๊ฒ€์ƒ‰

๋„ค์ด๋ฒ„ ์ง€์—ญ ๊ฒ€์ƒ‰ api

image

์นด์นด์˜ค ๋กœ์ปฌ api

image

์‚ฌ์šฉ์ž ํ˜„์žฌ ์ขŒํ‘œ ๊ธฐ์ค€ ๋ฐ˜๊ฒฝ 500m ๋‚ด ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ api๋Š” ์นด์นด์˜ค ๋กœ์ปฌ Api๋กœ ๋น ๋ฅด๊ฒŒ ๊ฒฐ์ •๋˜์—ˆ๋‹ค.

์ง€๋„

์žฅ์†Œ ๊ฒ€์ƒ‰ api๋ฅผ ์นด์นด์˜ค๋กœ ํ™•์ •๋œ ๋’ค ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค.

๐Ÿ’š ๋„ค์ด๋ฒ„ ์ง€๋„

์žฅ์ 

  • ์˜ˆ์˜๋‹ค.
  • ์œˆ๋„์šฐ ํ™˜๊ฒฝ์˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋„ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌด๋ฃŒ๋กœ ์›” 1์–ต๊ฑด ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์ผ 333๋งŒํšŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

๋‹จ์ 

  • ์นด์นด์˜ค, ๋„ค์ด๋ฒ„ ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ์— ๋‘˜ ๋‹ค ์•ฑ ๋“ฑ๋ก์„ ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ’› ์นด์นด์˜ค ์ง€๋„

์žฅ์ 

  • ์นด์นด์˜ค ๋กœ์ปฌ api๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊น€์— ๊ฐ™์ด ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ๋งฅ์ด ์•„๋‹Œ ํ™˜๊ฒฝ์—์„œ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๊ตฌ๋™ ๋ถˆ๊ฐ€ (ํ…Œ์ŠคํŠธ ๊ธฐ๊ธฐ๋กœ ๊ฐœ๋ฐœํ•ด์•ผํ•จ)
  • ๋ฌด๋ฃŒ๋กœ 1์ผ 300,000ํšŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์•ˆ ์˜ˆ๋ป์š”.

๊ฒ€์ƒ‰ api๋Š” REST API์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ ์ž์ฒด์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€๋Š” ์•Š์„ ๊ฒƒ ๊ฐ™์•„ ์˜ˆ์˜๋ฉด์„œ๋„ ์‚ฌ์šฉํšŸ์ˆ˜๊ฐ€ ๋งŽ๊ณ , ์—๋ฎฌ์—์„œ๋„ ๋Œ์•„๊ฐ€๋Š” ๋„ค์ด๋ฒ„์ง€๋„๋ฅผ ์„ ํƒํ–ˆ๋‹ค.

Day 03

โ“ ์ด๋ฏธ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถˆ๋Ÿฌ์™€์•ผ ํ• ๊นŒ?

Firebase ์™€ ๊ธฐ๊ธฐ์— ํŒŒ์ผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๊ณ , Firebase ์˜ ์š”์ฒญ ์ˆ˜(๋น„์šฉ)๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์— ์กด์žฌํ•œ๋‹ค๋ฉด ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋ ค๊ณ  ํ•œ๋‹ค

  • Firebase ์˜ Storage ์— ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ณ , Cloud Firestore(์ดํ•˜ FirebaseDB) ์— ์‚ฌ์šฉ์ž ๋ฐ ๊ธฐํ”„ํ‹ฐ์ฝ˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค
  • Room ์—๋Š” FirebaseDB Document ์˜ id ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ํŒŒ์ผ์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค

์ด๋ฏธ์ง€ ์ €์žฅ ๋ฐ ์š”์ฒญ ๋กœ์ง

  1. ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค
  2. ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํŒŒ์ด์–ด๋ฒ ์ด์Šค์— ์š”์ฒญํ•œ ํ›„ ๋ฃธ์— ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•œ ํ›„ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค

Data ๋ ˆ์ด์–ด์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”๋ฐ ํŒŒ์ผ์˜ ์œ ๋ฌด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” context ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ค ๋ ˆ์ด์–ด์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ง€ ๊ณ ๋ฏผ์ด์—ˆ๋‹ค.

  1. Network ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค๊ณ , Presentation๊ณผ Data ๋ ˆ์ด์–ด์—์„œ Network ๋ ˆ์ด์–ด๋ฅผ ์•Œ๊ฒŒ ํ•œ๋‹ค
  2. ํŒŒ์ผ์˜ ์œ ๋ฌด๋Š” Presentation ์—์„œ ํ•˜๊ณ , ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ Data ๋ ˆ์ด์–ด์— ์š”์ฒญํ•œ๋‹ค

โ“ ์ผ๋ฐ˜ ๊ธฐํ”„ํ‹ฐ์ฝ˜, ๊ธˆ์•ก๊ถŒ ๊ธฐํ”„ํ‹ฐ์ฝ˜ ๋ชจ๋ธ ๊ตฌ์กฐ

  • ์ถ”์ƒ ํด๋ž˜์Šค
  • ์ธํ„ฐํŽ˜์ด์Šค
  • sealed class
  • Boolean ์œผ๋กœ ๊ตฌ๋ถ„

๋ชจ๋“  ์†์„ฑ์ด ๋™์ผํ•˜๊ณ  ๊ธˆ์•ก๊ถŒ ์—ฌ๋ถ€๋งŒ ์ฐจ์ด๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— Boolean ์†์„ฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •

โ“ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์˜ฌ๋ฐ”๋ฅธ๊ฐ€?

ํ˜„์žฌ๋กœ์„œ๋Š” ํŒŒ์ด์–ด๋ฒ ์ด์Šค์™€ Room ์ด ๋™์ผํ•˜๊ณ  ๊ณ ์œ ํ•œ ์•„์ด๋””๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ด์–ด๋ฒ ์ด์Šค์˜ Document ID ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ”Œ๋กœ์šฐ๊ฐ€ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋ฅผ ํ•ญ์ƒ ๊ฑฐ์ณ์•ผ ํ–ˆ๊ณ , ์ด๋•Œ Network ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๊ฑฐ๋‚˜ ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์ ‘๊ทผ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฒฝ์šฐ Room ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋‹จ ๊ฐ€์ ธ์˜จ ํ›„ ๋™๊ธฐํ™” ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ–ˆ๋‹ค

ํ•˜์ง€๋งŒ ๊ณ ์œ ํ•œ ์•„์ด๋””๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•ด๊ฒฐ๋  ๋ฌธ์ œ์˜€๊ณ , ๋กœ๊ทธ์ธ ํ•œ ์œ ์ €๊ฐ€ ๊ณ ์œ ํ•œ ์•„์ด๋”” ๊ฐ’์„ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์•„์ด๋””์™€ ๊ธฐํ”„ํ‹ฐ์ฝ˜ ์•„์ด๋””๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ณ ์œ ํ•œ ์•„์ด๋””๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ํŒ๋‹จํ–ˆ๋‹ค

โ“ SNS ๋กœ๊ทธ์ธ ์–ด๋–ป๊ฒŒ ์ง€์›ํ• ๊นŒ

์œ„์˜ ๋ฌธ์ œ๋กœ ์ธํ•ด์„œ ์œ ์ €์˜ ๊ณ ์œ ํ•œ ์•„์ด๋””๋ฅผ ์–ป์–ด์•ผ ํ–ˆ๋‹ค.

๊ธฐ์กด์˜ SNS ๋กœ๊ทธ์ธ์€ Kakao, Naver, Google ์„ ์ง€์›ํ•˜๋„๋ก ๊ณ„ํšํ–ˆ์ง€๋งŒ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋Š” Kakao, Naver ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋ ‡๊ฒŒ ๋์„ ๋•Œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  1. ๊ฐ๊ฐ ๋กœ๊ทธ์ธ API ์—์„œ ๊ณ ์œ ํ•œ ์‹๋ณ„ ์ •๋ณด๋ฅผ ๋‚ด๋ ค์ฃผ๋Š” ์ง€ ํ™•์ธํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์ฝ˜์†”์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค
  2. ํŒŒ์ด์–ด๋ฒ ์ด์Šค์˜ ์ธ์ฆ ์‹œ์Šคํ…œ์œผ๋กœ Kakao์™€ Naver ์˜ ๊ณ ์œ  ์‹๋ณ„ ๋ฒˆํ˜ธ(ํ˜น์€ ์ด๋ฉ”์ผ)๋ฅผ ๋„˜๊ฒจ์„œ ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์ฝ˜์†”์—์„œ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•œ๋‹ค
  3. ์ผ๋‹จ์€ Google ๋กœ๊ทธ์ธ๋งŒ ์ง€์›ํ•œ๋‹ค

ํ˜„์žฌ๋Š” Google ๋กœ๊ทธ์ธ ๋งŒ ์ง€์›ํ•˜๋”๋ผ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๊ณผ ๋กœ๊ทธ์ธ ์ˆ˜๋‹จ์ด ๋‹ฌ๋ผ์ง„๋‹ค๊ณ  ํ•ด์„œ ์„œ๋น„์Šค์˜ ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”ํ›„์— ์ถ”๊ฐ€๋กœ ์ง€์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค

โ“ ๊ธฐํ”„ํ‹ฐ์ฝ˜์˜ ID ๋Š” ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ ํ• ๊นŒ?

  • ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๊ณ ์œ ์˜ ID ๊ฐ€ ์žˆ๊ณ , ๊ธฐํ”„ํ‹ฐ์ฝ˜ ๋งˆ๋‹ค ๊ณ ์œ ์˜ ID ๊ฐ€ ์žˆ๋‹ค
  • ์‚ฌ์šฉ์ž์˜ ID ๋Š” ๋กœ๊ทธ์ธ API์—์„œ ์œ ์ผ์„ฑ์„ ์ง€์›ํ•ด์ค€๋‹ค๊ณ  ํ•ด๋„ ๊ธฐํ”„ํ‹ฐ์ฝ˜์˜ ID ๋Š” ๊ฒน์น  ์œ„ํ—˜์ด ์žˆ๋‹ค

๋‹ค์Œ์˜ ์˜๊ฒฌ๋“ค์ด ๋‚˜์™”๋‹ค

  1. ์‚ฌ์šฉ์ž์˜ ID ์™€ ๊ธฐํ”„ํ‹ฐ์ฝ˜์˜ ID ๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ์œ ์ผํ•œ ID ๋ฅผ ๋งŒ๋“ค์ž
  2. ๊ธฐํ”„ํ‹ฐ์ฝ˜์˜ UUID ๋ฅผ ์‚ฌ์šฉํ•˜์ž

1๋ฒˆ ์˜๊ฒฌ์€ ์‚ฌ์šฉ์ž์˜ ID ๋ฅผ ๋”ฐ๋กœ ๋‘ฌ์•ผ ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ๊ธฐํ”„ํ‹ฐ์ฝ˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๊ฐ€ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค

๋ฐ˜๋ฉด 2๋ฒˆ ์˜๊ฒฌ์€ UUID ๋งŒ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ธฐํ”„ํ‹ฐ์ฝ˜์˜ ID ๋งŒ์œผ๋กœ๋„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ณ , ์ •๋ณด๋„ ์ค‘๋ณต๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 2๋ฒˆ ์˜๊ฒฌ์„ ๋”ฐ๋ฅด๊ธฐ๋กœ ํ–ˆ๋‹ค

UUID ๊ฐ€ ๊ฒน์น  ํ™•๋ฅ 

  • UUID ๋Š” 36 ์ž๋ฆฌ์˜ ์ˆซ์ž + ์•ŒํŒŒ๋ฒณ ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค
  • UUID ๋Š” ์ด 340,282,366,920,938,463,463,374,607,431,768,211,456 ๊ฐœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค
  • ์ˆ˜์‹ญ ์กฐ ๊ฐœ์˜ UUID(v4)๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋‹จ ํ•˜๋‚˜์˜ ์ค‘๋ณต๋  ํ™•๋ฅ ์€ ์ธ๊ฐ„์ด ๋งค๋…„ ํ•˜๋Š˜์—์„œ ์šด์„์— ๋งž์„ ํ™•๋ฅ ๊ณผ ๊ฐ™๋‹ค
  • ๊ทธ ํ™•๋ฅ ์€ 0.00000000006% ์ด๋‹ค
  • ์ถœ์ฒ˜: UUID ๊ฐ€ ๊ฒน์น  ํ™•๋ฅ 

Day08

์ง€๋„๋ฅผ ์บ์‹ฑํ•˜๋Š” ์ด์œ 

์™œ ์ง€๋„๋ฅผ ์บ์‹ฑํ•˜๊ฒŒ ๋์„๊นŒ

Day18

๋‹ค์ด์–ผ๋กœ๊ทธ(+๋ทฐ๋ชจ๋ธ)๋ฅผ ์žฌํ™œ์šฉํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ 

๋ฌธ์ œ ์ƒํ™ฉ

์Šค๋‚ต๋ฐ”, ํ† ์ŠคํŠธ, ๋‹ค์ด์–ผ๋กœ๊ทธ, ํ”„๋ž˜๊ทธ๋จผํŠธ ๋“ฑ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žฌํ™œ์šฉํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ทฐ๋ชจ๋ธ์„ ๊ฐ€์ง€๋Š” ๋ฐ”ํ…€์‹œํŠธ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋ฐ”ํ…€์‹œํŠธ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด์•„์„œ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ณ , ํ•„์š”ํ•  ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ show ํ•˜๋ฉด์„œ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋‹ค์ด์–ผ๋กœ๊ทธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ViewModel ์—์„œ viewModelScope.launch ๋ธ”๋ก์„ ํƒ€์ง€ ์•Š์•„์„œ ์›ํ•˜๋Š” ๋™์ž‘์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์˜€๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  1. ๋ทฐ๋ชจ๋ธ์„ by viewModels() ๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋•Œ (์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ) ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ๊ฐ์ฒด String ์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ณ  ViewModelStore ์— ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”๋‹ค
  2. ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” BottomSheetDialogFragment ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๊นŒ

๋ฐ”ํ…€์‹œํŠธ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ show() ํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ฌด๋ฆฌ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค ํ•˜๋”๋ผ๋„ ์ •์ƒ์ ์œผ๋กœ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํƒ€๊ฒŒ๋œ๋‹ค. ์ฆ‰, ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋‹ซ์œผ๋ฉด์„œ onDestroy ๊ฐ€ ๋˜๊ณ , ์ด ๊ณผ์ •์—์„œ ViewModel ๋„ onCleared ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋‹ค์‹œ show() ํ•˜๋ฉด ๋˜‘๊ฐ™์€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํƒ„๋‹ค. ํ•˜์ง€๋งŒ ์ด๋•Œ ViewModel ์€ init ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

image

Etc

โ“ SharedPreferences? DataStore?

SharedPreferences๊ฐ€ ๊ฐ€์กŒ๋˜ ๋ฌธ์ œ

  • UI Thread์— ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ
    • commit() ๋™์ž‘์—์„œ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœ๋œ Thread์—์„œ ํŒŒ์ผ์„ ์“ด๋‹ค.
    • ๊ทธ์™€ ๋™์‹œ UI Thread์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค ๐Ÿ˜จ ๊ถŒ์žฅ๋˜์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค๋ฉด UI Thread๊ฐ€ Blockํ•˜๋ฉด์„œ ๋ฒ„๋ฒ…์ด๊ฑฐ๋‚˜ ANR ๋ฐœ์ƒ์˜ ์œ„ํ—˜์„ฑ์ด ์กด์žฌํ•œ๋‹ค.
  • Runtime Exception ์— ์ทจ์•ฝ
    • Exception์— ๋Œ€ํ•œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์ง€ ์•Š์Œ.
    • ๋Ÿฐํƒ€์ž„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด.. ์•ฑ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋œ๋‹ค.

DataStore๊ฐ€ ๊ฐ€์ง„ ์ด์ 

  • ๋น„๋™๊ธฐ API ์ง€์›
    • Kotlin Coroutine, Flow๋ฅผ ์ง€์›ํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์ด๊ณ  ์ผ๊ด€๋œ ํŠธ๋žœ์žญ์…˜ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ
    • IO Dispatcher๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•œ๋‹ค.
  • Strong Consistency ๋ณด์žฅ
    • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”์ถœ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Transaction API ์ œ๊ณต
  • Proto DataStore์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด type safey ์ง€์›

๐Ÿ’ก SharedPreferences์˜ ๋ฌธ์ œ์  ๋ณด์™„๋˜์—ˆ๊ณ  Flow๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์—์„œ Flow๋ฅผ ์ ๊ทน ์‚ฌ์šฉํ•˜๋Š” ์‚ก์—๊ฒŒ DataStore์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†๋‹ค!

โœ๏ธ BEEP Tech Blog

๋ฐ•๋ช…๋ฒ”

์–‘์ˆ˜์ง„

๊น€๋ช…์„

์ด์ง€ํ›ˆ

๐Ÿ‘พ BEEP

๐Ÿ—ฃ Ground Rule

โœ๏ธ Conventions

โš™๏ธ Setting

๐ŸŒฑ Daily Scrum

week 1
week 2
week 3
week 4
week 5
week 6
Clone this wiki locally