UI의 역할은 화면에 애플리케이션 데이터를 표시하고 상호 작용의 기본 지점으로도 가능하다는 것입니다. (상호 작용의 예: 버튼누르기, 네트워크 응답)
실제 데이터와 UI에 표시되는 정보가 다를 수 있습니다.(예: 두 데이터 소스를 조합하여 표시하거나 일부만 표시하는 경우)

UI elements, State holders
NewsItemUiState 뉴스 아이템
title: 제목
body: 내용
bookmarked: 북마크 상태
data class NewsUiState(
val isSignedIn: Boolean = false,
val isPremium: Boolean = false,
val newsItems: List<NewsItemUiState> = listOf(),
val userMessages: List<Message> = listOf()
)
data class NewsItemUiState(
val title: String,
val body: String,
val bookmarked: Boolean = false,
...
)
이전 섹션에서는 UI 상태가 UI 렌더링에 필요한 세부정보가 포함된 변경 불가능한 스냅샷임을 확인했씁니다. 하지만 데이터의 동적 특성에 따라 상태는 시간이 지나면서 변경될 수 있으며 이는 앱을 채우는 데 사용되는 기본 데이터를 수정하는 사용자 상호작용이나 기타 이벤트로 이벤트로 인해 발생하기도 합니다.
여기서 중재 요소가 각 이벤트에 적용할 로직을 정의하고 UI 상태를 만들기 위해 지원데이터 소스에 필요한 변환을 실행하는 상호작용을 처리하는 이점이 있을 수 있습니다. 상호작용과 이에 따른 로직이 UI 자체에 포함될 수 있지만 UI가 이름에서 알 수 있는 것 이상의 역할(예 데이터 소유자, 생성자, 변환자)을 담당하기 시작하면 빠르게 복잡해 질 수 있습니다. 궁극적으로 UI 에 주는 부담을 줄여야합니다. UI 상태가 매우 단순하지 않은 이상 UI 역할은 오직 UI 상태를 사용 및 표시하는 것 이어야합니다. -> UDF 단방향 데이터 흐름
전체 화면이나 탐색 대상의 경우 일반적인 구현은 ViewModel의 인스턴스이지만 애플리케이션의 요구사항에 따라 간단한 클래스로도 충분할 수 있습니다.

단방향 데이터 흐름(UDF)의 작동 방식을 보여주는 다이어그램
Unidiredical Data Flow

사용자의 기사 북마크 요청은 상태 변경을 야기할 수 있는 이벤트의 예입니다.
상태 생성자의 경우 UI 상태의 모든 필드를 채우고 UI가 완전히 렌더링 되는데 필요한 이벤트를 처리하기 위해 모든 필수 로직을 정의하는 역할은 ViewModel이 담당합니다.
비지니스 로직: 앱 데이터에 대한 제품 요구사항의 구현입니다. 일반적으로 비지니스 로직은 UI레이어에 배치되지 않고 도메인 또는 데이터 레이어에 배치됩니다.
UI 동작 로직 또는 UI 로직: 화면에서 상태 변경을 표시하는 방법입니다. 예를 들어 Android Resource를 사용하여 화면에 표시할 올바른 텍스트를 가져오거나, 사용자가 버튼을 클릭할 때 특정 화면으로 이동하거나 토스트메시지 또는 스택바를 사용하여 화면에 사용자 메시지를 표시합니다.
특히 Context 같은 UI 유형의 경우 UI 로직은 ViewModel이 아닌 UI 에 있어야합니다. 테스트의 가능성을 높이고 문제 구분에 도움이 되도록 UI 로직을 다른 클래스에 위임하고자 하며 UI 가 복잡한 경우 간단한 클래스를 상태 홀더로 만들 수 있습니다. UI에서 생성된 간단한 클래스는 UI의 생명 주기를 따르기 따문에 Android SDK 종속 항목을 사용할 수 있습니다. ViewModel의 수명주기는 더 깁니다.
UDF 를 사용하여 상태 생성 관리를 하기 떄문에 스트림으로 간주할 수 있습니다. LiveData 또는 StateFlow와 같이 관찰 가능한 데이터 홀더에 UI 상태를 노출해야합니다.
class NewsViewModel(...) : ViewModel() {
val uiState: StateFlow<NewsUiState> = …
}
관찰 가능한 데이터 홀더로서의 LiveData에 관해서는 이 Codelab에서 소개합니다. Kotlin 흐름에 관한 비슷한 소개는 Android의 Kotlin 흐름을 참고하세요.