ActivityActivity는 앱의 UI와 관련된 로직을 관리하고, ViewModel을 통해 비즈니스 로직과 상호 작용합니다.Activity는 ViewModel의 인스턴스를 생성하고 UI 요소에서 사용될 데이터를 관찰합니다. Android Jetpack의 ViewModelProvider를 사용해 ViewModel을 인스턴스화하며, 이 인스턴스는 Composable이나 UI 요소에서 필요한 데이터를 제공합니다.
class MyActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val userInfoViewModel: UserInfoViewModel = viewModel() // ViewModel 인스턴스화
MyAuthPage(navController = rememberNavController(), userInfoViewModel = userInfoViewModel)
}
}
}
ViewModelViewModel은 UI의 데이터를 관리하고, 필요한 비즈니스 로직을 처리합니다. Repository에 있는 데이터 요청 메서드를 호출하여 데이터를 가져오고, 이를 UI가 사용할 수 있는 형태로 노출합니다.Activity 또는 Composable 내에서 인스턴스화되며, 주로 UI 요소에서 데이터를 가져오거나 관찰할 때 호출됩니다.
class UserInfoViewModel(private val repository: UserInfoRepository) : ViewModel() {
private val _userInfo = MutableStateFlow<UserInfo?>(null)
val userInfo: StateFlow<UserInfo?> = _userInfo
fun fetchUserInfo() {
viewModelScope.launch {
_userInfo.value = repository.getUserInfo()
}
}
}
RepositoryRepository는 데이터 소스를 관리하는 계층으로, API나 데이터베이스와의 상호작용을 추상화합니다. ViewModel에 필요한 데이터를 제공하며, 데이터 요청 메서드와 에러 처리를 포함합니다.Repository의 메서드는 ViewModel에서 호출됩니다. ViewModel이 데이터 요청을 할 때 Repository를 통해 데이터에 접근하며, 보통 suspend 함수를 통해 비동기로 데이터를 가져옵니다.
class UserInfoRepository(private val apiService: ApiService) {
suspend fun getUserInfo(): UserInfoResponseDTO? {
return try {
apiService.getUserInfo()
} catch (e: Exception) {
e.printStackTrace()
null
}
}
}
DTO (Data Transfer Object)DTO는 네트워크 또는 데이터베이스와 통신할 때 사용되는 데이터 형식을 정의합니다. API를 통해 받아온 데이터를 나타내며, 보통은 ViewModel에서 이를 도메인 모델로 변환하여 UI에서 사용할 수 있도록 합니다.DTO는 Repository의 메서드 호출 시 사용됩니다. Repository가 API 호출로 받은 데이터를 반환할 때 주로 DTO 형식으로 반환하며, ViewModel에서 UI용 모델로 변환하여 사용하거나 그대로 Composable에 전달합니다.
data class UserInfoResponseDTO(
val email: String,
val profileUrl: String,
val nickname: String
)
Activity가 ViewModel을 인스턴스화하여 UI와 상호작용할 데이터를 관찰합니다.ViewModel은 데이터를 가져오기 위해 Repository의 메서드를 호출하며, 비즈니스 로직과 데이터를 추상화하여 Activity/Composable에 전달할 준비를 합니다.Repository는 API에서 데이터를 가져오며, 이때 데이터는 주로 DTO 형식으로 표현됩니다. 이 DTO는 ViewModel이 UI에 맞게 필요한 데이터를 가공하도록 도와줍니다.Activity가 ViewModel 인스턴스를 생성합니다.ViewModel이 Repository의 getUserInfo()를 호출하여 데이터를 가져옵니다.Repository가 API에서 데이터를 받아 UserInfoResponseDTO로 반환합니다.ViewModel은 UserInfoResponseDTO를 UserInfo 모델로 변환(또는 그대로)하여 _userInfo에 저장하고 StateFlow로 노출합니다.Activity 또는 Composable이 collectAsState를 통해 userInfo를 관찰하여 UI에 반영합니다.이렇게 각 계층이 분리됨으로써 역할이 명확해지고, 데이터가 상하 관계를 통해 흐르는 구조가 됩니다.