[Android App Architecture] Data Layer

์žฅ์„ฑ์ค€ยท2023๋…„ 4์›” 9์ผ
0

Android App Architecture

๋ชฉ๋ก ๋ณด๊ธฐ
3/3
post-thumbnail

๐Ÿ’กํ•ด๋‹น ๊ธ€์€ ์•ฑ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์ด ๊ธ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ ์ˆ˜์ง€์‹์„ ํ•„์š”๋กœํ•ฉ๋‹ˆ๋‹ค.

  • MVVM
  • Coroutine
  • Flow
  • LiveData
  • StateFlow
  • Retrofit
  • Room

Data Layer

UI Layer๋Š” ์ƒํƒœ ๋ฐ UI Logic์ด ํฌํ•จ๋˜์ง€๋งŒ, Data Layer๋Š” Business Logic์ด ํฌํ•จ๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค.

Business Logic์€ ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ, ์ €์žฅ, ๋ณ€๊ฒฝ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
UseCase, ์—…๋ฌด ๊ทœ์น™, ํ•ต์‹ฌ ๋กœ์ง๊ณผ ๊ฐ™์€ ๋‹จ์–ด๋กœ๋„ ์ข…์ข… ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.


Repository

Data Layer๋Š” 0๊ฐœ ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ DataSource๋ฅผ ํฌํ•จํ•˜๋Š” Repository๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
์•ฑ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ณ„๋กœ Repository๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ์˜ํ™”์— ๊ด€๋ จ๋œ Repository๋Š” MoviesRepository, ๊ฒฐ์ œ์™€ ๊ด€๋ จ๋œ Repository๋Š” PaymentsRepository์™€ ๊ฐ™์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Repository์˜ ์—ญํ™œ

  • ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋ฐ์ดํ„ฐ ๋…ธ์ถœ
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ•œ ๊ณณ์— ์ง‘์ค‘
  • ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๊ฐ„์˜ ์ถฉ๋Œ ํ•ด๊ฒฐ
  • ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ถ”์ƒํ™”
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํฌํ•จ

DataSource

ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ, ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ํ•˜๋‚˜์˜ DataSource๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
DataSource๋Š” ์•ฑ๊ณผ ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ ˆ์ด์–ด๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์ง์ ‘ ์•ก์„ธ์Šคํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ์ง„์ž…์ ์€ ํ•ญ์ƒ ์ €์žฅ์†Œ ํด๋ž˜์Šค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ViewModel์—์„œ๋Š” Repository๋ฅผ ํ†ตํ•ด DataSource๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์—ฌ๊ธฐ์—์„œ ๋…ธ์ถœ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ•œ ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class ExampleRepository(
    private val exampleRemoteDataSource: ExampleRemoteDataSource, // network
    private val exampleLocalDataSource: ExampleLocalDataSource // database
) { /* ... */ }

์ด๋ฆ„ ์ง€์ • ๊ทœ์น™

Repository์˜ ์ด๋ฆ„ ์ง€์ • ๊ทœ์น™

๋ฐ์ดํ„ฐ ์œ ํ˜• + ์ €์žฅ์†Œ

DataSource์˜ ์ด๋ฆ„ ์ง€์ • ๊ทœ์น™

๋ฐ์ดํ„ฐ ์œ ํ˜• + ์†Œ์Šค ์œ ํ˜• + DataSource

์†Œ์Šค ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๊ตฌํ˜„์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ Remote, Local์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์„ธ๋ถ€์ •๋ณด์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
ex) UserDaoDataSource, UserApiDataSource, UserSharedPreferencesDataSource


๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๋””์Šคํฌ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ

๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” Room

๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Room์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” Datastore

๋กœ์ปฌ์— ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ DataStore๋ฅผ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SharedPreferences๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  Datastore๋กœ ์ด์ „ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” File

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

WorkManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ์˜ˆ์•ฝ

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

WorkManager๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๊ธฐ๊ธฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•„๋„ ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์˜คํ”„๋ผ์ธ ์šฐ์„  ์•ฑ

์˜คํ”„๋ผ์ธ ์šฐ์„  ์•ฑ์€ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์—†์–ด๋„ ์•ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ ๋˜๋Š” ์ค‘์š”ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•ฑ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „๋ถ€๋ฅผ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋Š” ์•ฑ์„ ์˜คํ”„๋ผ์ธ ์šฐ์„  ์•ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ˆ์ •์ ์ธ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์—†์ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฆ‰์‹œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฃฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ ์“ฐ๊ธฐ, ๋™๊ธฐํ™”, ์ถฉ๋Œ์— ๊ด€ํ•œ ์ •๋ณด๋Š” ๊ณต์‹๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์€ ์ž๋ฃŒ

https://developer.android.com/topic/architecture?hl=ko
https://developer.android.com/courses/android-basics-kotlin/course
https://github.com/android/sunflower/tree/main
https://fastcampus.co.kr/dev_red_ksr

profile
Backend Engineer

0๊ฐœ์˜ ๋Œ“๊ธ€