Loose Coupling : 시스템의 구성 요소들이 서로 최소한의 의존성을 가지도록 설계하는 것
유지관리, 품질, 견고성, 테스트 등을 개선하고 코드 충돌을 최소화하여 프로젝트에 일관성을 부여해 빠르게 업무를 시작하고 효율을 높일수 있다.
MVVM Architecture

UI Layer(Presentation Layer)
Data Layer
Domain Layer
정의
Model
View
ViewModel
데이터 바인딩의 목적은 앱 레이아웃의 XML(View)를 앱 코드에 저장된 데이터(ViewModel 인스턴스)와 연동시키는데 주목적
코딩 방식이 아닌 선언적 방식을 사용하여 레이아웃의 UI 구성 요소를 앱의 데이터 소스에 바인딩(상호연동) 하여 자동으로 UI의 데이터 변화를 유지하는 목적
구성 (build.gradle)
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt’ //BR (Binding Resource)를 생성하기 위해 필요
}
buildFeatures {
dataBinding true
//viewBinding true
}
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="mainViewModel"
type="data_binding.ui.main.MainViewModel" />
</data>
<RelativeLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="64dp"
tools:context=".ui.main.MainFragment">
, , , ,
</RelativeLayout>
</layout>
LiveData는 비동기 흐름(rx, Coroutine Flow)을 지원하지 않는다.
Coroutine Flow는 값을 순차적으로 방출(emit)
StateFlow의 특징
Flow -> StateFlow 변경 시 stateln(scope, started, initialValue) 연산자를 사용
interface SharedFlow<out T> : Flow<T> {
, , ,
}
interface StateFlow<out T> : SharedFlow<T> {
, , ,
}
class NewsRemoteDataSource(...,
private val externalScope: CoroutineScope,
) {//flow 는 기본적으로 Cold
val latestNews: Flow<List<ArticleHeadline>> = flow { //flow 는 기본적으로 Cold
...
}.stateIn( //Hot flow 로 변환
scope = externalScope, //생산된 데이터를 소비할 코루틴(보통 ViewModel Scope)
replay = 0, //새로운 소비자가 추가되면 그 전 방출한 값을 다시 보낼 것인지 여부
started = SharingStarted.WhileSubscribed(5000) //소비가 없을 시 5초 간 발행 후 생산을 멈춤
//started = SharingStarted.Eargly //소비가 없을 시 즉시 생산을 멈춤
initialValue = Result.Loading //초기값 설정
)
}